diff --git a/apps/web-console/app.js b/apps/web-console/app.js
index 40830b4..0c3bf67 100755
--- a/apps/web-console/app.js
+++ b/apps/web-console/app.js
@@ -3437,7 +3437,7 @@ function updateSeatFeedbackModeLabel() {
}
function selectExecutionMode(mode) {
- if (mode === "hardware" && !(state.runtime?.hardware?.configured && state.runtime?.vehicle_can?.configured)) return;
+ if (mode === "hardware" && !state.runtime?.hardware_execution_allowed) return;
if (mode === "simulated_hardware" && !state.runtime?.simulated_hardware?.enabled) return;
state.executionMode = mode;
$$('[data-execution-mode]').forEach((button) => {
@@ -3446,6 +3446,7 @@ function selectExecutionMode(mode) {
const hardware = mode === "hardware";
const simulatedHardware = mode === "simulated_hardware";
const approvalRequired = Boolean(state.runtime?.hardware?.approval_required);
+ const vehicleCanReady = Boolean(state.runtime?.vehicle_can?.configured);
$("#approvalField").hidden = !hardware || !approvalRequired;
$("#simulationFaultField").hidden = !simulatedHardware;
$("#executionBadge").className = `status-badge ${hardware ? "" : simulatedHardware ? "warning" : "neutral"}`.trim();
@@ -3458,7 +3459,9 @@ function selectExecutionMode(mode) {
? "真实台架安全门禁"
: simulatedHardware ? "模拟台架隔离边界" : "虚拟执行边界";
$("#safetyText").textContent = hardware
- ? "同一 CAN 盒由单进程持有:通道 0 控制副驾座椅并校验板端反馈,通道 1 以 ISO CAN FD 500 kbit/s / 2 Mbit/s 控制空调等车身设备并校验状态帧。"
+ ? vehicleCanReady
+ ? "同一 CAN 盒由单进程持有:通道 0 控制副驾座椅并校验板端反馈,通道 1 以 ISO CAN FD 500 kbit/s / 2 Mbit/s 控制空调等车身设备并校验状态帧。"
+ : "当前仅通道 0 连接副驾座椅台架并校验板端反馈;车端 CAN 未启用,模式中的其他车舱领域保持虚拟执行。"
: simulatedHardware
? "故障只注入执行报告;物理 CAN、ZLG 适配器和 IAR 固件路径保持关闭。"
: "四域 CAN 均为 dry-run,真实发送被强制关闭。";
@@ -3716,6 +3719,8 @@ async function loadRuntime() {
const hardware = state.runtime.hardware || {};
const vehicleCan = state.runtime.vehicle_can || {};
const linkedHardwareReady = Boolean(hardware.configured && vehicleCan.configured);
+ const seatHardwareReady = Boolean(hardware.configured);
+ const hardwareExecutionReady = Boolean(state.runtime.hardware_execution_allowed);
const badge = $("#modelBadge");
const gptButton = $('[data-provider="openai"]');
if (state.runtime.openai_available) {
@@ -3734,7 +3739,7 @@ async function loadRuntime() {
}
$("#matrixCount").textContent = `${state.runtime.matrix.messages} / ${state.runtime.matrix.signals}`;
const hardwareButton = $("#hardwareMode");
- hardwareButton.disabled = !linkedHardwareReady;
+ hardwareButton.disabled = !hardwareExecutionReady;
const simulation = state.runtime.simulated_hardware || {};
$("#simulationMode").disabled = !simulation.enabled;
$("#simulationMode").title = simulation.enabled
@@ -3751,21 +3756,31 @@ async function loadRuntime() {
: "";
$("#hardwareNote").textContent = linkedHardwareReady
? `${hardware.backend} · CH${hardware.channel} 座椅 ${hardware.bitrate / 1000} kbit/s · CH${vehicleCan.channel} 车身 CAN FD ${vehicleCan.arbitration.bitrate / 1000}k/${vehicleCan.data.bitrate / 1000000}M · ${profileText} · ${flashText} · ${approvalText}${accessText}${concurrencyText}`
+ : seatHardwareReady
+ ? `${hardware.backend} · CH${hardware.channel} 座椅 ${hardware.bitrate / 1000} kbit/s · ${profileText} · ${flashText} · 车端 CAN 未启用,其他领域保持虚拟执行${accessText}${concurrencyText}`
: `联动真实执行已锁定:${profileText};请完成座椅固件、双通道 ZLG 适配器、车身 CAN FD${hardware.approval_required ? "和令牌" : ""}配置`;
- $("#hardwareAliasNote").textContent = "CH0 → 副驾座椅控制器 · CH1 → 空调/车窗/门锁/灯光/遮阳帘(ISO CAN FD)";
+ $("#hardwareAliasNote").textContent = linkedHardwareReady
+ ? "CH0 → 副驾座椅控制器 · CH1 → 车身 CAN FD"
+ : seatHardwareReady
+ ? `CH${hardware.channel} → 副驾座椅控制器 · 车身控制暂用虚拟 CAN`
+ : "尚未配置可执行的物理 CAN 通道";
$("#autoFlashNote").textContent = hardware.auto_flash_enabled
? "未检测到匹配固件时,将在发送座椅控制帧前通过 IAR C-SPY 自动烧录并重新验证。"
: "仅接受周期反馈与四轴量程签名匹配的统一固件;需要自动烧录时请启用服务端开关。";
- $("#hardwareBadge").className = `status-badge ${linkedHardwareReady ? "" : "danger"}`.trim();
+ $("#hardwareBadge").className = `status-badge ${hardwareExecutionReady ? "" : "danger"}`.trim();
$("#hardwareBadge").innerHTML = linkedHardwareReady
? '双通道已配置'
+ : seatHardwareReady
+ ? '座椅台架已配置'
: '硬件锁定';
$("#hardwareCoverage").textContent = linkedHardwareReady
? `CH0 座椅 + CH${vehicleCan.channel} 车身 · ${approvalText}${accessText}${concurrencyText}`
- : "已阻断";
- $("#hardwareCoverage").className = linkedHardwareReady ? "available" : "blocked";
+ : seatHardwareReady
+ ? `CH${hardware.channel} 座椅 · 物理反馈${accessText}${concurrencyText}`
+ : "已阻断";
+ $("#hardwareCoverage").className = hardwareExecutionReady ? "available" : "blocked";
const modeAvailable = state.executionMode === "hardware"
- ? linkedHardwareReady
+ ? hardwareExecutionReady
: state.executionMode === "simulated_hardware"
? simulation.enabled
: true;
diff --git a/apps/web-console/index.html b/apps/web-console/index.html
index 9eb2c11..3463dce 100755
--- a/apps/web-console/index.html
+++ b/apps/web-console/index.html
@@ -13,20 +13,20 @@
-
+
-
+
-
-
+
+
diff --git a/apps/web-console/self-repair.css b/apps/web-console/self-repair.css
index d2e3b3e..49ad417 100644
--- a/apps/web-console/self-repair.css
+++ b/apps/web-console/self-repair.css
@@ -1270,6 +1270,10 @@
.v2-repair-dialog th,
.v2-repair-dialog td { padding: 7px; border-bottom: 1px solid var(--repair-line); text-align: left; }
.v2-repair-dialog th { color: var(--repair-muted); background: var(--repair-soft-strong); }
+.v2-repair-confirm-dialog { width: min(460px, calc(100vw - 32px)); }
+.v2-repair-confirm-dialog #repairConfirmMessage { margin: 0; color: var(--repair-ink); font-size: 13px; line-height: 1.7; }
+.v2-repair-confirm-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; }
+.v2-repair-confirm-actions button { min-width: 104px; }
.v2-repair-report-path { padding: 7px 9px; overflow-wrap: anywhere; color: var(--repair-muted); background: var(--repair-soft-strong); border-radius: 8px; font: 8px "IBM Plex Mono", Consolas, monospace; }
.v2-repair-event-list { display: grid; gap: 5px; margin-top: 10px; }
.v2-repair-event-list article { display: grid; gap: 2px; padding: 7px 9px; background: var(--repair-soft); border-radius: 8px; }
diff --git a/apps/web-console/self-repair.js b/apps/web-console/self-repair.js
index 93486de..6916882 100644
--- a/apps/web-console/self-repair.js
+++ b/apps/web-console/self-repair.js
@@ -50,6 +50,7 @@
: "shadow";
let polling = false;
let toastTimer = 0;
+ let confirmationResolve = null;
function isAdmin() {
return window.CognitiveAgentConsoleV2?.getRole() === "admin"
@@ -181,7 +182,11 @@
- `;
+
+ `;
moduleSwitcher.insertAdjacentElement("afterend", root);
const select = $("#repairExecutionMode");
@@ -402,9 +407,12 @@
const session = latest.hardware_session || {};
const bridge = latest.bridge || {};
const manager = latest.bridge_manager || {};
+ const adapterOnline = hardware.link?.adapter === "OK"
+ || Boolean(bridge.bus?.opened)
+ || (bridge.online && bridge.bus_traffic);
const layers = [
["1", "ZCANPRO桥接", bridge.online ? "正常" : "离线", bridge.online ? "OK" : "UNKNOWN"],
- ["2", "CAN设备 / 通道", bridge.bus?.opened ? "设备与通道已打开" : "未连接", bridge.bus?.opened ? "OK" : "UNKNOWN"],
+ ["2", "CAN设备 / 通道", adapterOnline ? "设备与通道已打开" : "未连接", adapterOnline ? "OK" : "UNKNOWN"],
["3", "总线实时流量", bridge.bus_traffic ? "正常" : "未检测", bridge.bus_traffic ? "OK" : "WARN"],
["4", "座椅ECU协议", bridge.protocol_online ? "0x301~0x305在线" : "未检测", bridge.protocol_online ? "OK" : "UNKNOWN"],
];
@@ -431,13 +439,25 @@
const bridge = latest.bridge || {};
const manager = latest.bridge_manager || {};
const healing = latest.healing || {};
+ const hardwarePhase = latest.hardware_session?.progress?.phase;
const integration = latest.integration || {};
$("#repairCanStatus").textContent = bridge.online ? "在线" : "离线";
$("#repairCanDot").dataset.state = bridge.online ? "online" : manager.state === "STARTING" ? "working" : "offline";
$("#repairProtocolStatus").textContent = bridge.protocol_online ? "协议在线" : "未检测";
$("#repairProtocolDot").dataset.state = bridge.protocol_online ? "online" : "offline";
- $("#repairAiStatus").textContent = healing.phase_text || "等待验证";
- $("#repairAiDot").dataset.state = ["PASSED"].includes(healing.phase) ? "online" : ["IDLE"].includes(healing.phase) ? "offline" : "working";
+ const hardwareState = {
+ BASELINE: ["硬件检测中", "working"],
+ RUNNING: ["硬件检测中", "working"],
+ PASSED: ["21针通过", "online"],
+ FAILED: ["硬件异常", "offline"],
+ }[hardwarePhase];
+ const aiState = activeView === "hardware" && hardwareState
+ ? hardwareState
+ : [healing.phase_text || "等待验证", healing.phase === "PASSED"
+ ? "online"
+ : healing.phase === "IDLE" ? "offline" : "working"];
+ $("#repairAiStatus").textContent = aiState[0];
+ $("#repairAiDot").dataset.state = aiState[1];
$("#repairConnectionText").textContent = bridge.online ? "CAN 桥接在线" : manager.message || "CAN 桥接离线";
$(".v2-repair-footer").classList.toggle("offline", !bridge.online);
const benchOption = $('#repairExecutionMode option[value="bench"]');
@@ -504,6 +524,25 @@
}
}
+ function finishConfirmation(accepted) {
+ const dialog = $("#repairConfirmDialog");
+ const resolve = confirmationResolve;
+ confirmationResolve = null;
+ if (dialog?.open) dialog.close(accepted ? "confirmed" : "cancelled");
+ if (resolve) resolve(accepted);
+ }
+
+ function confirmAction(message, confirmLabel = "确认执行") {
+ const dialog = $("#repairConfirmDialog");
+ if (!dialog || confirmationResolve) return Promise.resolve(false);
+ $("#repairConfirmMessage").textContent = message;
+ $("#repairConfirmAccept").textContent = confirmLabel;
+ dialog.showModal();
+ return new Promise((resolve) => {
+ confirmationResolve = resolve;
+ });
+ }
+
function bindEvents() {
$$('[data-repair-view]').forEach((button) => button.addEventListener("click", () => showView(button.dataset.repairView)));
$("#repairExecutionMode").addEventListener("change", (event) => {
@@ -511,33 +550,48 @@
sessionStorage.setItem(MODE_KEY, executionMode);
if (latest) renderAll();
});
- $("#repairStart").addEventListener("click", () => {
- if (executionMode === "bench" && !window.confirm("即将向实物 ECU 写入受控故障并驱动座椅恢复。请确认运动区域无人、无遮挡且急停可用。")) return;
+ $("#repairStart").addEventListener("click", async () => {
+ if (executionMode === "bench" && !(await confirmAction("即将向实物 ECU 写入受控故障并驱动座椅恢复。请确认运动区域无人、无遮挡且急停可用。"))) return;
runAction(() => apiPost("/healing/start", { case_id: selectedCaseId, execution_mode: executionMode }), executionMode === "bench" ? "实物自修复用例已启动" : "影子故障已注入,开始自修复");
});
- $("#repairRunAll").addEventListener("click", () => runAction(() => apiPost("/healing/run-all", { execution_mode: executionMode }), "六项自动验证已启动"));
- $("#repairReset").addEventListener("click", () => {
- if (executionMode === "bench" && !window.confirm("四轴将依次回到机械零位。请确认运动区域无人、无遮挡且急停可用。")) return;
+ $("#repairRunAll").addEventListener("click", async () => {
+ if (executionMode === "bench" && !(await confirmAction(
+ "将依次执行6个实物故障用例;每项开始前会自动停止输出并完成四轴归零。请确认运动区域无人、无遮挡且急停可用。",
+ "确认实物批量验证",
+ ))) return;
+ runAction(() => apiPost("/healing/run-all", { execution_mode: executionMode }), "六项自动验证已启动");
+ });
+ $("#repairReset").addEventListener("click", async () => {
+ if (executionMode === "bench" && !(await confirmAction("四轴将依次回到机械零位。请确认运动区域无人、无遮挡且急停可用。", "确认归零"))) return;
runAction(() => apiPost("/healing/reset", { execution_mode: executionMode }), executionMode === "bench" ? "四轴归零请求已提交" : "自修复验证已重置");
});
- $("#repairFirmwareFlash").addEventListener("click", () => {
- if (!window.confirm("即将构建并烧录台架测试固件。请确认座椅运动区域无人、急停可用且 CMSIS-DAP 已连接。")) return;
+ $("#repairFirmwareFlash").addEventListener("click", async () => {
+ if (!(await confirmAction("即将构建并烧录台架测试固件。请确认座椅运动区域无人、急停可用且 CMSIS-DAP 已连接。", "确认构建/烧录"))) return;
runAction(() => apiPost("/firmware/build-flash", { confirmed_bench_clear: true }), "固件构建/烧录流程已完成");
});
- $("#repairHardwareToggle").addEventListener("click", () => {
+ $("#repairHardwareToggle").addEventListener("click", async () => {
if (!latest) return;
if (latest.hardware_session?.active) {
runAction(() => apiPost("/hardware/stop"), "硬件诊断已停止并保存报告");
return;
}
- if (!window.confirm("硬件诊断可能自动烧录测试固件,并短时驱动四路电机、风扇与低档加热。请确认台架区域安全且急停可用。")) return;
+ if (!(await confirmAction("硬件诊断可能自动烧录测试固件,并短时驱动四路电机、风扇与低档加热。请确认台架区域安全且急停可用。", "确认启动诊断"))) return;
runAction(() => apiPost("/hardware/start", { confirmed_bench_clear: true }), "21 针主动硬件诊断已启动");
});
$("#repairHardwareSelfTest").addEventListener("click", () => runAction(() => apiPost("/hardware/self-test"), "72 针映射和诊断规则自检完成"));
- $("#repairEmergencyStop").addEventListener("click", () => {
- if (!window.confirm("确认提交 STOP ALL 和热管理关闭请求?")) return;
+ $("#repairEmergencyStop").addEventListener("click", async () => {
+ if (!(await confirmAction("确认提交 STOP ALL 和热管理关闭请求?", "确认紧急停止"))) return;
runAction(() => apiPost("/emergency-stop"), "紧急停止请求已提交");
});
+ $("#repairConfirmCancel").addEventListener("click", () => finishConfirmation(false));
+ $("#repairConfirmAccept").addEventListener("click", () => finishConfirmation(true));
+ $("#repairConfirmDialog").addEventListener("cancel", (event) => {
+ event.preventDefault();
+ finishConfirmation(false);
+ });
+ $("#repairConfirmDialog").addEventListener("close", () => {
+ if (confirmationResolve) finishConfirmation(false);
+ });
$("#repairSoftwareRecords").addEventListener("click", () => $("#repairSoftwareDialog").showModal());
$("#repairHardwareRecords").addEventListener("click", () => $("#repairHardwareDialog").showModal());
$$('[data-repair-close]').forEach((button) => button.addEventListener("click", () => $(`#${button.dataset.repairClose}`).close()));
diff --git a/apps/web-console/service-worker.js b/apps/web-console/service-worker.js
index c06cca6..5392300 100644
--- a/apps/web-console/service-worker.js
+++ b/apps/web-console/service-worker.js
@@ -1,4 +1,4 @@
-const CACHE_VERSION = "cognitive-agent-pad-v39";
+const CACHE_VERSION = "cognitive-agent-pad-v40";
const SHELL_CACHE = `${CACHE_VERSION}-shell`;
const RUNTIME_CACHE = `${CACHE_VERSION}-runtime`;
const APP_SHELL = [
@@ -6,7 +6,7 @@ const APP_SHELL = [
"/index.html",
"/styles.css?v=android-pad-4",
"/network.js?v=android-pad-1",
- "/app.js?v=seat-hil-43",
+ "/app.js?v=seat-hil-44",
"/gesture-control.js?v=android-pad-6",
"/pwa.js?v=android-pad-1",
"/console-v2.css?v=desktop-refactor-68",
@@ -15,9 +15,9 @@ const APP_SHELL = [
"/self-extension.js?v=extension-6",
"/self-calibration.css?v=calibration-4",
"/self-calibration.js?v=calibration-2",
- "/self-repair.css?v=repair-15",
- "/self-repair.js?v=repair-15",
- "/self-repair-seat3d.js?v=repair-15",
+ "/self-repair.css?v=repair-17",
+ "/self-repair.js?v=repair-17",
+ "/self-repair-seat3d.js?v=repair-17",
"/assets/self-calibration-model.bundle.js",
"/assets/models/n7_seat.glb",
"/manifest.webmanifest",
diff --git a/artifacts/hil/seat_frontend_hil_20260808_current_control_and_modes.json b/artifacts/hil/seat_frontend_hil_20260808_current_control_and_modes.json
new file mode 100644
index 0000000..f13d236
--- /dev/null
+++ b/artifacts/hil/seat_frontend_hil_20260808_current_control_and_modes.json
@@ -0,0 +1,2158 @@
+{
+ "suite": "t2g-seat-frontend-comprehensive-hil",
+ "started_at": "2026-08-07T17:56:50.136875Z",
+ "base_url": "http://127.0.0.1:8003",
+ "vehicle_id": "denza_n7",
+ "conversation_id": "conv-hil-full-20260807175650",
+ "runtime": {
+ "hardware_execution_allowed": true,
+ "firmware_profiles": [
+ "combined"
+ ]
+ },
+ "results": [
+ {
+ "id": "THERM-H-LOW-CHINESE",
+ "group": "thermal",
+ "utterance": "把副驾驶座椅加热调到一档",
+ "started_at": "2026-08-07T17:57:39.720539Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175739-4c9b4e",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 03 00 00 00 00",
+ "timestamp": 105752.054828,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 04 00 00 00 00",
+ "timestamp": 105752.080886,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 05 00 00 00 00",
+ "timestamp": 105752.106931,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 02 00 00 00 00",
+ "timestamp": 105752.13302,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "11 00 00 00 00 00 00 00",
+ "timestamp": 105752.141003,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "on",
+ "level": 1,
+ "feedback_value": 2,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "11 00 00 00 00 00 00 00",
+ "timestamp": 105752.141003,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:57:40.554865Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:57:40.619874Z",
+ "duration_ms": 899
+ },
+ {
+ "id": "THERM-V-MID-PREFIX",
+ "group": "thermal",
+ "utterance": "右前座椅开启2档通风",
+ "started_at": "2026-08-07T17:57:40.622564Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175740-d6d178",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 04 00 00 00 00",
+ "timestamp": 105752.934973,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 05 00 00 00 00",
+ "timestamp": 105752.960401,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 02 00 00 00 00",
+ "timestamp": 105752.986444,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 03 00 00 00 00",
+ "timestamp": 105753.012547,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "on",
+ "level": 2,
+ "feedback_value": 3,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "13 00 00 00 00 00 00 00",
+ "timestamp": 105753.022784,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "on",
+ "level": 1,
+ "feedback_value": 2,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "13 00 00 00 00 00 00 00",
+ "timestamp": 105753.022784,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:57:41.437203Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:57:41.507553Z",
+ "duration_ms": 885
+ },
+ {
+ "id": "THERM-MIXED-OFF",
+ "group": "thermal",
+ "utterance": "关闭右前座的加热和通风",
+ "started_at": "2026-08-07T17:57:41.509818Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175741-635519",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 03 00 00 00 00",
+ "timestamp": 105753.792454,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 04 00 00 00 00",
+ "timestamp": 105753.818299,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 05 00 00 00 00",
+ "timestamp": 105753.844153,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 02 00 00 00 00",
+ "timestamp": 105753.870511,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105753.879514,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105753.879514,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:57:42.294600Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:57:42.364739Z",
+ "duration_ms": 855
+ },
+ {
+ "id": "MOTION-M0-25-HORIZONTAL",
+ "group": "motion",
+ "utterance": "把副驾座椅水平位置调到25%",
+ "started_at": "2026-08-07T17:57:42.368168Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175742-a4fa68",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 30 18 06 00 00 00 00",
+ "timestamp": 105758.571151,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 30 18 06 00 00 00 00",
+ "timestamp": 105758.596355,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 2525,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 07 00 DD 09 00",
+ "timestamp": 105758.622724,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 30 18 06 00 00 00 00",
+ "timestamp": 105758.649103,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105758.659957,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105758.659957,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:57:47.073624Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:57:47.155972Z",
+ "duration_ms": 4788
+ },
+ {
+ "id": "MOTION-M1-60-TILT",
+ "group": "motion",
+ "utterance": "右前座坐垫倾角调到60%",
+ "started_at": "2026-08-07T17:57:47.158176Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175747-c4ba7c",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 30 18 08 00 00 00 00",
+ "timestamp": 105764.357312,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 30 18 08 00 00 00 00",
+ "timestamp": 105764.382681,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 0,
+ "value_x100": 2525,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 30 08 08 00 DD 09 00",
+ "timestamp": 105764.409186,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 60,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 5989,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 09 00 65 17 00",
+ "timestamp": 105764.434498,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105764.444911,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105764.444911,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:57:52.858982Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:57:52.923849Z",
+ "duration_ms": 5766
+ },
+ {
+ "id": "MOTION-M2-ANGLE-130",
+ "group": "motion",
+ "utterance": "副驾靠背角度调到130度",
+ "started_at": "2026-08-07T17:57:52.926115Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175752-eb75ed",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 60,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 1,
+ "value_x100": 5989,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 30 08 0A 00 65 17 00",
+ "timestamp": 105778.443675,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 51,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 5104,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 0B 00 F0 13 00",
+ "timestamp": 105778.46968,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 30 18 0A 00 00 00 00",
+ "timestamp": 105778.495054,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 0,
+ "value_x100": 2525,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 30 08 0A 00 DD 09 00",
+ "timestamp": 105778.521649,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105778.532074,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105778.532074,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:58:06.946974Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:58:07.024406Z",
+ "duration_ms": 14098
+ },
+ {
+ "id": "MOTION-M3-ANGLE-145",
+ "group": "motion",
+ "utterance": "副驾腿托抬到145度",
+ "started_at": "2026-08-07T17:58:07.110757Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175807-392252",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 60,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 1,
+ "value_x100": 5989,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 30 08 0C 00 65 17 00",
+ "timestamp": 105789.75595,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 51,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 2,
+ "value_x100": 5104,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 30 08 0C 00 F0 13 00",
+ "timestamp": 105789.781443,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 69,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 6893,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 0D 00 ED 1A 00",
+ "timestamp": 105789.808075,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 0,
+ "value_x100": 2525,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 30 08 0C 00 DD 09 00",
+ "timestamp": 105789.833556,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105789.844019,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105789.844019,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:58:18.257765Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:58:18.334139Z",
+ "duration_ms": 11223
+ },
+ {
+ "id": "COMBINED-ALL",
+ "group": "combined",
+ "utterance": "打开副驾加热1档、通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%",
+ "started_at": "2026-08-07T17:58:18.341467Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175818-128af6",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 40,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 4011,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 10 00 AB 0F 00",
+ "timestamp": 105809.96029,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 37,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 3686,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 11 00 66 0E 00",
+ "timestamp": 105809.985431,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 42,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 4189,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 12 00 5D 10 00",
+ "timestamp": 105810.012251,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 30,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 3026,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 0F 00 D2 0B 00",
+ "timestamp": 105810.03792,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "on",
+ "level": 1,
+ "feedback_value": 2,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "12 00 00 00 00 00 00 00",
+ "timestamp": 105810.049625,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "on",
+ "level": 1,
+ "feedback_value": 2,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "12 00 00 00 00 00 00 00",
+ "timestamp": 105810.049625,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:58:38.463450Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:58:38.544925Z",
+ "duration_ms": 20203
+ },
+ {
+ "id": "COMBINED-CLEANUP",
+ "group": "combined",
+ "utterance": "关闭右前座加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-07T17:58:38.546440Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175838-019e40",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 15 00 00 00 00",
+ "timestamp": 105845.546346,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 16 00 00 00 00",
+ "timestamp": 105845.572187,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 17 00 00 00 00",
+ "timestamp": 105845.598535,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 14 00 00 00 00",
+ "timestamp": 105845.624354,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105845.631207,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105845.631207,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:59:14.045178Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:59:14.126280Z",
+ "duration_ms": 35580
+ },
+ {
+ "id": "MODE-EASY-OPEN",
+ "group": "mode",
+ "utterance": "打开轻松进出模式",
+ "started_at": "2026-08-07T17:59:14.126519Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175914-267f62",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "easy_entry_exit"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 1A 00 00 00 00",
+ "timestamp": 105878.589707,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 1B 00 00 00 00",
+ "timestamp": 105878.615044,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 1C 00 00 00 00",
+ "timestamp": 105878.640958,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 28 19 00 10 27 00",
+ "timestamp": 105878.666985,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105878.67493,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105878.67493,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:59:47.087023Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:59:47.160682Z",
+ "duration_ms": 33034
+ },
+ {
+ "id": "MODE-OFFICE-ENTER",
+ "group": "mode",
+ "utterance": "副驾进入办公",
+ "started_at": "2026-08-07T17:59:47.160916Z",
+ "status": "failed",
+ "errors": [
+ "temperature_c must be between 18 and 32"
+ ],
+ "http_status": 400,
+ "request_id": null,
+ "provider_used": null,
+ "finished_at": "2026-08-07T17:59:47.168934Z",
+ "duration_ms": 8
+ },
+ {
+ "id": "MODE-QUEEN-SWITCH",
+ "group": "mode",
+ "utterance": "切换到女王副驾行驶模式",
+ "started_at": "2026-08-07T17:59:47.169106Z",
+ "status": "failed",
+ "errors": [
+ "temperature_c must be between 18 and 32"
+ ],
+ "http_status": 400,
+ "request_id": null,
+ "provider_used": null,
+ "finished_at": "2026-08-07T17:59:47.174826Z",
+ "duration_ms": 6
+ },
+ {
+ "id": "MODE-BABY-START",
+ "group": "mode",
+ "utterance": "启动宝宝午睡模式",
+ "started_at": "2026-08-07T17:59:47.175026Z",
+ "status": "failed",
+ "errors": [
+ "timed out after 1500 ms waiting for CAN 0x301"
+ ],
+ "http_status": 201,
+ "request_id": "req-20260807175947-e14d93",
+ "provider_used": "local_rules",
+ "failure_telemetry": {
+ "error_type": "HardwareExecutionError",
+ "stop_all_attempted": false,
+ "simulated": false
+ },
+ "finished_at": "2026-08-07T17:59:52.097114Z",
+ "duration_ms": 4922
+ },
+ {
+ "id": "MODE-CRUISE-ENTER",
+ "group": "mode",
+ "utterance": "进入巡航沙发",
+ "started_at": "2026-08-07T17:59:52.097351Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175952-7c0df8",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "cruise_sofa"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 30,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 3021,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 20 00 CD 0B 00",
+ "timestamp": 105919.877887,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 44,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 4406,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 21 00 36 11 00",
+ "timestamp": 105919.903977,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 53,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 5317,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 22 00 C5 14 00",
+ "timestamp": 105919.930608,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 51,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 5090,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 1F 00 E2 13 00",
+ "timestamp": 105919.956083,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105919.96884,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105919.96884,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:00:28.381350Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:00:28.507001Z",
+ "duration_ms": 36410
+ },
+ {
+ "id": "MODE-MEDITATION-OPEN",
+ "group": "mode",
+ "utterance": "打开冥想空间模式",
+ "started_at": "2026-08-07T18:00:28.507243Z",
+ "status": "failed",
+ "errors": [
+ "timed out after 1500 ms waiting for CAN 0x301"
+ ],
+ "http_status": 201,
+ "request_id": "req-20260807180028-6256f3",
+ "provider_used": "local_rules",
+ "failure_telemetry": {
+ "error_type": "HardwareExecutionError",
+ "stop_all_attempted": false,
+ "simulated": false
+ },
+ "finished_at": "2026-08-07T18:00:33.437445Z",
+ "duration_ms": 4930
+ },
+ {
+ "id": "MODE-LEISURE-SWITCH",
+ "group": "mode",
+ "utterance": "切换到休闲躺椅模式",
+ "started_at": "2026-08-07T18:00:33.437654Z",
+ "status": "failed",
+ "errors": [
+ "timed out after 1500 ms waiting for CAN 0x301"
+ ],
+ "http_status": 201,
+ "request_id": "req-20260807180033-28d328",
+ "provider_used": "local_rules",
+ "failure_telemetry": {
+ "error_type": "HardwareExecutionError",
+ "stop_all_attempted": false,
+ "simulated": false
+ },
+ "finished_at": "2026-08-07T18:00:38.350449Z",
+ "duration_ms": 4913
+ },
+ {
+ "id": "MODE-CALF-OPEN",
+ "group": "mode",
+ "utterance": "打开小腿解压悬浮模式",
+ "started_at": "2026-08-07T18:00:38.350712Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807180038-3db9d5",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "calf_decompression_float"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 51,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 5090,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 26 00 E2 13 00",
+ "timestamp": 105960.371528,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 75,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 7513,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 27 00 59 1D 00",
+ "timestamp": 105960.396953,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 28 00 00 00 00",
+ "timestamp": 105960.422957,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 28 29 00 10 27 00",
+ "timestamp": 105960.44952,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105960.461107,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105960.461107,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:01:08.871918Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:01:08.940601Z",
+ "duration_ms": 30590
+ },
+ {
+ "id": "MODE-BEACH-SWITCH",
+ "group": "mode",
+ "utterance": "切换到电感沙滩椅模式",
+ "started_at": "2026-08-07T18:01:08.940819Z",
+ "status": "failed",
+ "errors": [
+ "ZCAN_Transmit did not accept the frame; channel_error=0x00000004"
+ ],
+ "http_status": 201,
+ "request_id": "req-20260807180108-03c0a4",
+ "provider_used": "local_rules",
+ "failure_telemetry": {
+ "target": "vehicle",
+ "requested_parameters": {
+ "position_pct": 0
+ },
+ "command_frame": {
+ "frame_id": "0x4F5",
+ "payload_size": 8,
+ "data_hex": "00 00 00 FF 00 00 00 00",
+ "channel": 1,
+ "frame_format": "classic_can",
+ "bitrate_switch": false,
+ "repeat": {
+ "count": 1,
+ "period_ms": 0
+ }
+ },
+ "channel": 1,
+ "simulated": false
+ },
+ "finished_at": "2026-08-07T18:02:04.158327Z",
+ "duration_ms": 55218
+ },
+ {
+ "id": "MODE-NAP-OPEN",
+ "group": "mode",
+ "utterance": "打开小憩模式",
+ "started_at": "2026-08-07T18:02:04.158564Z",
+ "status": "failed",
+ "errors": [
+ "timed out after 1500 ms waiting for CAN 0x301"
+ ],
+ "http_status": 201,
+ "request_id": "req-20260807180204-c2de69",
+ "provider_used": "local_rules",
+ "failure_telemetry": {
+ "error_type": "HardwareExecutionError",
+ "stop_all_attempted": false,
+ "simulated": false
+ },
+ "finished_at": "2026-08-07T18:02:09.096388Z",
+ "duration_ms": 4938
+ },
+ {
+ "id": "MODE-ZERO-GRAVITY-ENGLISH",
+ "group": "mode",
+ "utterance": "开启 zero-gravity 模式",
+ "started_at": "2026-08-07T18:02:09.096577Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807180209-e61b8c",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "zero_gravity"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "legrest_height": {
+ "position_pct": 94,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 9397,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 34 00 B5 24 00",
+ "timestamp": 106046.834246,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 28 31 00 10 27 00",
+ "timestamp": 106046.859798,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 28 32 00 10 27 00",
+ "timestamp": 106046.885279,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 81,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 8092,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 33 00 9C 1F 00",
+ "timestamp": 106046.910828,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106046.922441,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106046.922441,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:02:35.332171Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:02:35.403457Z",
+ "duration_ms": 26307
+ }
+ ],
+ "position_memory_sync": {
+ "id": "PREFLIGHT-POSITION-MEMORY-SYNC",
+ "group": "preflight",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-07T17:56:50.189299Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807175650-4998b0",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 02 00 00 00 00",
+ "timestamp": 105751.162787,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 03 00 00 00 00",
+ "timestamp": 105751.188632,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 04 00 00 00 00",
+ "timestamp": 105751.214551,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 05 00 00 00 00",
+ "timestamp": 105751.240417,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105751.247196,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 105751.247196,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T17:57:39.662421Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T17:57:39.718160Z",
+ "duration_ms": 49529
+ },
+ "final_state": {
+ "id": "FINAL-THERMAL-OFF",
+ "group": "cleanup",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-07T18:02:35.403620Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807180235-6d8f67",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 37 00 00 00 00",
+ "timestamp": 106116.24078,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 38 00 00 00 00",
+ "timestamp": 106116.267116,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 39 00 00 00 00",
+ "timestamp": 106116.292935,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 36 00 00 00 00",
+ "timestamp": 106116.318855,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106116.327881,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106116.327881,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:03:44.735057Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:03:44.819453Z",
+ "duration_ms": 69416
+ },
+ "finished_at": "2026-08-07T18:03:44.819501Z",
+ "summary": {
+ "total": 20,
+ "passed": 13,
+ "failed": 7,
+ "safety_blocked": 0,
+ "executed": 20,
+ "position_memory_sync_passed": true,
+ "final_state_passed": true
+ }
+}
\ No newline at end of file
diff --git a/artifacts/hil/seat_frontend_hil_20260808_dynamic_modes.json b/artifacts/hil/seat_frontend_hil_20260808_dynamic_modes.json
new file mode 100644
index 0000000..418a66e
--- /dev/null
+++ b/artifacts/hil/seat_frontend_hil_20260808_dynamic_modes.json
@@ -0,0 +1,825 @@
+{
+ "suite": "t2g-seat-frontend-comprehensive-hil",
+ "started_at": "2026-08-07T18:17:38.577477Z",
+ "base_url": "http://127.0.0.1:8003",
+ "vehicle_id": "denza_n7",
+ "conversation_id": "conv-hil-full-20260807181738",
+ "runtime": {
+ "hardware_execution_allowed": true,
+ "firmware_profiles": [
+ "combined"
+ ]
+ },
+ "results": [
+ {
+ "id": "MODE-ROCKING-HORSE-START",
+ "group": "mode",
+ "utterance": "开启木马模式",
+ "started_at": "2026-08-07T18:18:01.681906Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181801-e5096b",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "rocking_horse"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 2,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 2,
+ "value_x100": 153,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 12 0D 35 00 99 00 5A",
+ "timestamp": 106973.993523,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 2,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 3,
+ "value_x100": 216,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 12 0D 35 00 D8 00 5A",
+ "timestamp": 106974.0196,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 2,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 0,
+ "value_x100": 240,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 12 0D 35 00 F0 00 5A",
+ "timestamp": 106974.045704,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 6,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 1,
+ "value_x100": 588,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 12 0D 35 00 4C 02 5A",
+ "timestamp": 106974.072431,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106974.092381,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106974.092381,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:18:02.485490Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:18:02.550409Z",
+ "duration_ms": 869
+ },
+ {
+ "id": "MODE-ROCKING-HORSE-STOP",
+ "group": "mode",
+ "utterance": "关闭木马模式",
+ "started_at": "2026-08-07T18:18:02.552655Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181802-7609ee",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "rocking_horse"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 3,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 2,
+ "value_x100": 338,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 30 08 35 00 52 01 00",
+ "timestamp": 106974.915491,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 5,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 3,
+ "value_x100": 541,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 30 08 35 00 1D 02 00",
+ "timestamp": 106974.942088,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 5,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 0,
+ "value_x100": 541,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 30 08 35 00 1D 02 00",
+ "timestamp": 106974.968094,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 11,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 1,
+ "value_x100": 1123,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 30 08 35 00 63 04 00",
+ "timestamp": 106974.993545,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106975.005142,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106975.005142,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:18:03.397863Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:18:03.474083Z",
+ "duration_ms": 921
+ },
+ {
+ "id": "MODE-DYNAMIC-CRADLE-START",
+ "group": "mode",
+ "utterance": "开启动态摇篮模式",
+ "started_at": "2026-08-07T18:18:03.517741Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181803-e97616",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "dynamic_cradle"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "legrest_height": {
+ "position_pct": 8,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 3,
+ "value_x100": 804,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 12 0D 38 00 24 03 5A",
+ "timestamp": 106975.856713,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 8,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 0,
+ "value_x100": 802,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 12 0D 38 00 22 03 5A",
+ "timestamp": 106975.881732,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 17,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 1,
+ "value_x100": 1684,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 12 0D 38 00 94 06 5A",
+ "timestamp": 106975.907916,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 6,
+ "position_valid": true,
+ "motion_state": "moving",
+ "fault": false,
+ "task_state": 2,
+ "motor_result": 1,
+ "motor_selector": 2,
+ "value_x100": 556,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 12 0D 38 00 2C 02 5A",
+ "timestamp": 106975.934169,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106975.955173,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106975.955173,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:18:04.348455Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:18:04.413787Z",
+ "duration_ms": 896
+ },
+ {
+ "id": "MODE-DYNAMIC-CRADLE-STOP",
+ "group": "mode",
+ "utterance": "关闭动态摇篮模式",
+ "started_at": "2026-08-07T18:18:04.416034Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181804-bcf153",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "dynamic_cradle"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 11,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 0,
+ "value_x100": 1122,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 30 08 38 00 62 04 00",
+ "timestamp": 106976.740494,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 22,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 1,
+ "value_x100": 2246,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 30 08 38 00 C6 08 00",
+ "timestamp": 106976.76544,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 7,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 2,
+ "value_x100": 742,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 30 08 38 00 E6 02 00",
+ "timestamp": 106976.792049,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 11,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 0,
+ "motor_result": 3,
+ "motor_selector": 3,
+ "value_x100": 1144,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 30 08 38 00 78 04 00",
+ "timestamp": 106976.817508,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106976.829112,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106976.829112,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:18:05.221617Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:18:05.302650Z",
+ "duration_ms": 887
+ }
+ ],
+ "position_memory_sync": {
+ "id": "PREFLIGHT-POSITION-MEMORY-SYNC",
+ "group": "preflight",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-07T18:17:38.579391Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181738-c1fa94",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 31 00 00 00 00",
+ "timestamp": 106973.120321,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 32 00 00 00 00",
+ "timestamp": 106973.146175,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 2F 00 00 00 00",
+ "timestamp": 106973.171397,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 30 00 00 00 00",
+ "timestamp": 106973.198366,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106973.204067,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106973.204067,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:18:01.596265Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:18:01.678120Z",
+ "duration_ms": 23099
+ },
+ "final_state": {
+ "id": "FINAL-THERMAL-OFF",
+ "group": "cleanup",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-07T18:18:05.303817Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181805-8f6d46",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 3C 00 00 00 00",
+ "timestamp": 106996.774961,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 3D 00 00 00 00",
+ "timestamp": 106996.800164,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 3A 00 00 00 00",
+ "timestamp": 106996.826407,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 3B 00 00 00 00",
+ "timestamp": 106996.852753,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106996.861946,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106996.861946,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:18:25.255987Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:18:25.336490Z",
+ "duration_ms": 20033
+ },
+ "finished_at": "2026-08-07T18:18:25.336534Z",
+ "summary": {
+ "total": 4,
+ "passed": 4,
+ "failed": 0,
+ "safety_blocked": 0,
+ "executed": 4,
+ "position_memory_sync_passed": true,
+ "final_state_passed": true
+ }
+}
\ No newline at end of file
diff --git a/artifacts/hil/seat_frontend_hil_20260808_retry_modes.json b/artifacts/hil/seat_frontend_hil_20260808_retry_modes.json
new file mode 100644
index 0000000..8fcd6ea
--- /dev/null
+++ b/artifacts/hil/seat_frontend_hil_20260808_retry_modes.json
@@ -0,0 +1,1227 @@
+{
+ "suite": "t2g-seat-frontend-comprehensive-hil",
+ "started_at": "2026-08-07T18:12:37.851073Z",
+ "base_url": "http://127.0.0.1:8003",
+ "vehicle_id": "denza_n7",
+ "conversation_id": "conv-hil-full-20260807181237",
+ "runtime": {
+ "hardware_execution_allowed": true,
+ "firmware_profiles": [
+ "combined"
+ ]
+ },
+ "results": [
+ {
+ "id": "MODE-OFFICE-ENTER",
+ "group": "mode",
+ "utterance": "副驾进入办公",
+ "started_at": "2026-08-07T18:13:00.981080Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181300-fe41c9",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "office"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 22,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 2193,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 08 00 91 08 00",
+ "timestamp": 106701.077301,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 22,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 2214,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 09 00 A6 08 00",
+ "timestamp": 106701.103324,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 21,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 2117,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 0A 00 45 08 00",
+ "timestamp": 106701.12999,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 72,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 7214,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 07 00 2E 1C 00",
+ "timestamp": 106701.155511,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106701.167114,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106701.167114,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:13:29.566099Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:13:29.645728Z",
+ "duration_ms": 28665
+ },
+ {
+ "id": "MODE-QUEEN-SWITCH",
+ "group": "mode",
+ "utterance": "切换到女王副驾行驶模式",
+ "started_at": "2026-08-07T18:13:29.647969Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181329-bfa186",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "queen_passenger_driving"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 38,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 3797,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 0D 00 D5 0E 00",
+ "timestamp": 106716.470489,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 44,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 4406,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 0E 00 36 11 00",
+ "timestamp": 106716.496553,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 31,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 3122,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 0F 00 32 0C 00",
+ "timestamp": 106716.522022,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 72,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 7194,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 0C 00 1A 1C 00",
+ "timestamp": 106716.548686,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106716.558044,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106716.558044,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:13:44.955888Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:13:45.028279Z",
+ "duration_ms": 15380
+ },
+ {
+ "id": "MODE-BABY-START",
+ "group": "mode",
+ "utterance": "启动宝宝午睡模式",
+ "started_at": "2026-08-07T18:13:45.031587Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181345-bfc8d0",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "baby_nap"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 30,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 2995,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 12 00 B3 0B 00",
+ "timestamp": 106731.898471,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 41,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 4100,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 13 00 04 10 00",
+ "timestamp": 106731.92462,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 14 00 00 00 00",
+ "timestamp": 106731.950786,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 81,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 8116,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 11 00 B4 1F 00",
+ "timestamp": 106731.976977,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106731.987135,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106731.987135,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:14:00.383372Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:14:00.465139Z",
+ "duration_ms": 15434
+ },
+ {
+ "id": "MODE-MEDITATION-OPEN",
+ "group": "mode",
+ "utterance": "打开冥想空间模式",
+ "started_at": "2026-08-07T18:14:00.467376Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181400-fd474b",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "meditation_space"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 28 16 00 10 27 00",
+ "timestamp": 106752.278518,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 44,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 4412,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 17 00 3C 11 00",
+ "timestamp": 106752.304598,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 44,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 4395,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 18 00 2B 11 00",
+ "timestamp": 106752.331298,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 58,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 5811,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 19 00 B3 16 00",
+ "timestamp": 106752.356753,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106752.36841,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106752.36841,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:14:20.765532Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:14:20.838519Z",
+ "duration_ms": 20371
+ },
+ {
+ "id": "MODE-LEISURE-SWITCH",
+ "group": "mode",
+ "utterance": "切换到休闲躺椅模式",
+ "started_at": "2026-08-07T18:14:20.840793Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181420-25dd09",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "leisure_lounger"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 30,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 2995,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 08 1C 00 B3 0B 00",
+ "timestamp": 106776.661113,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 66,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 6598,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 1D 00 C6 19 00",
+ "timestamp": 106776.687705,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 76,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 7604,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 1E 00 B4 1D 00",
+ "timestamp": 106776.713826,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 51,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 5090,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 08 1B 00 E2 13 00",
+ "timestamp": 106776.739292,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106776.749753,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106776.749753,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:14:45.145316Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:14:45.220466Z",
+ "duration_ms": 24380
+ },
+ {
+ "id": "MODE-BEACH-SWITCH",
+ "group": "mode",
+ "utterance": "切换到电感沙滩椅模式",
+ "started_at": "2026-08-07T18:14:45.226373Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181445-15ca7d",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "electric_beach_chair"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "backrest_recline": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 28 22 00 10 27 00",
+ "timestamp": 106805.219789,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 60,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 5981,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 23 00 5D 17 00",
+ "timestamp": 106805.246338,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 28 20 00 10 27 00",
+ "timestamp": 106805.271785,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 21 00 00 00 00",
+ "timestamp": 106805.298273,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106805.310364,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106805.310364,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:15:13.706084Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:15:13.803071Z",
+ "duration_ms": 28577
+ },
+ {
+ "id": "MODE-NAP-OPEN",
+ "group": "mode",
+ "utterance": "打开小憩模式",
+ "started_at": "2026-08-07T18:15:13.805417Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181513-de722c",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "nap"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "cushion_tilt": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 28 26 00 10 27 00",
+ "timestamp": 106831.822953,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 81,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 8103,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 08 27 00 A7 1F 00",
+ "timestamp": 106831.848424,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "legrest_height": {
+ "position_pct": 94,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 9397,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 08 28 00 B5 24 00",
+ "timestamp": 106831.875125,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 10000,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 28 25 00 10 27 00",
+ "timestamp": 106831.900583,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106831.911652,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106831.911652,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:15:40.307713Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:15:40.379532Z",
+ "duration_ms": 26574
+ }
+ ],
+ "position_memory_sync": {
+ "id": "PREFLIGHT-POSITION-MEMORY-SYNC",
+ "group": "preflight",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-07T18:12:37.852409Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181237-bfe655",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 05 00 00 00 00",
+ "timestamp": 106672.425515,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 02 00 00 00 00",
+ "timestamp": 106672.451358,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 03 00 00 00 00",
+ "timestamp": 106672.477244,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 04 00 00 00 00",
+ "timestamp": 106672.503518,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106672.510342,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106672.510342,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:13:00.909248Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:13:00.978797Z",
+ "duration_ms": 23126
+ },
+ "final_state": {
+ "id": "FINAL-THERMAL-OFF",
+ "group": "cleanup",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-07T18:15:40.381382Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260807181540-2c7267",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 3,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "03 26 18 2D 00 00 00 00",
+ "timestamp": 106901.867749,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 0,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "00 26 18 2A 00 00 00 00",
+ "timestamp": 106901.894758,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 1,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "01 26 18 2B 00 00 00 00",
+ "timestamp": 106901.920597,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped",
+ "fault": false,
+ "task_state": 6,
+ "motor_result": 2,
+ "motor_selector": 2,
+ "value_x100": 0,
+ "feedback_frame": {
+ "frame_id": "0x302",
+ "payload_size": 8,
+ "data_hex": "02 26 18 2C 00 00 00 00",
+ "timestamp": 106901.945803,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106901.952594,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "heating": {
+ "state": "off",
+ "level": 0,
+ "feedback_value": 1,
+ "feedback_frame": {
+ "frame_id": "0x4FA",
+ "payload_size": 8,
+ "data_hex": "09 00 00 00 00 00 00 00",
+ "timestamp": 106901.952594,
+ "channel": 0,
+ "is_fd": false,
+ "bitrate_switch": false
+ }
+ },
+ "captured_at": "2026-08-07T18:16:50.347411Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-07T18:16:50.427111Z",
+ "duration_ms": 70046
+ },
+ "finished_at": "2026-08-07T18:16:50.427150Z",
+ "summary": {
+ "total": 7,
+ "passed": 7,
+ "failed": 0,
+ "safety_blocked": 0,
+ "executed": 7,
+ "position_memory_sync_passed": true,
+ "final_state_passed": true
+ }
+}
\ No newline at end of file
diff --git a/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest.json b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest.json
new file mode 100644
index 0000000..46da711
--- /dev/null
+++ b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest.json
@@ -0,0 +1,358 @@
+{
+ "suite": "t2g-seat-frontend-comprehensive-hil",
+ "started_at": "2026-08-09T10:04:15.082291Z",
+ "base_url": "http://127.0.0.1:8003",
+ "vehicle_id": "denza_n7",
+ "conversation_id": "conv-hil-full-20260809100415",
+ "runtime": {
+ "hardware_execution_allowed": true,
+ "firmware_profiles": [
+ "combined"
+ ]
+ },
+ "results": [
+ {
+ "id": "MOTION-M0-25-HORIZONTAL",
+ "group": "motion",
+ "utterance": "把副驾座椅水平位置调到25%",
+ "started_at": "2026-08-09T10:04:16.311200Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100416-4da1f3",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:04:21.364491Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:04:21.365063Z",
+ "duration_ms": 5054
+ },
+ {
+ "id": "MOTION-M1-20-PAN",
+ "group": "motion",
+ "utterance": "把副驾坐盆调到20%",
+ "started_at": "2026-08-09T10:04:21.365115Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100421-b0b99e",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 20,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:04:24.207471Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:04:24.208128Z",
+ "duration_ms": 2843
+ },
+ {
+ "id": "COMBINED-ALL",
+ "group": "combined",
+ "utterance": "打开副驾加热1档、通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%",
+ "started_at": "2026-08-09T10:04:24.208183Z",
+ "status": "failed",
+ "errors": [
+ "M3运动反馈未达到目标"
+ ],
+ "http_status": 201,
+ "request_id": "req-20260809100424-27194b",
+ "provider_used": "local_rules",
+ "failure_telemetry": {
+ "transport": "zcanpro_shared_bridge",
+ "hardware_feedback": false,
+ "simulated": false,
+ "bridge_result": {
+ "details": {
+ "command_id": "t2g_move_passenger_legrest_height_42pct",
+ "stop_all_attempted": true,
+ "summary": "M3运动反馈未达到目标",
+ "target": 4200,
+ "terminal": {
+ "active": false,
+ "direction": 0,
+ "driver_fault": false,
+ "duty": 0,
+ "far": false,
+ "motor": 3,
+ "near": false,
+ "position": 2349,
+ "position_valid": true,
+ "result": 6,
+ "sequence": 50339,
+ "stall": false,
+ "task": 7
+ },
+ "tolerance": 100
+ },
+ "log_dir": "D:\\huang.xuewei\\Git\\Cognitive_Agent\\artifacts\\self-repair\\hardware\\20260809_180424_546250",
+ "report_path": "D:\\huang.xuewei\\Git\\Cognitive_Agent\\artifacts\\self-repair\\hardware\\20260809_180424_546250\\report.json",
+ "request_id": "SEAT_ORCH_1786269864212_546250",
+ "result": "FAIL",
+ "summary": "M3运动反馈未达到目标"
+ },
+ "error_type": null,
+ "stop_all_attempted": true
+ },
+ "finished_at": "2026-08-09T10:04:47.676002Z",
+ "duration_ms": 23468
+ },
+ {
+ "id": "MODE-EASY-OPEN",
+ "group": "mode",
+ "utterance": "打开轻松进出模式",
+ "started_at": "2026-08-09T10:04:47.676048Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100447-c855cc",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "easy_entry_exit"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "on",
+ "level": 1
+ },
+ "heating": {
+ "state": "on",
+ "level": 1
+ },
+ "captured_at": "2026-08-09T10:05:18.547335Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:05:18.548156Z",
+ "duration_ms": 30872
+ }
+ ],
+ "position_memory_sync": {
+ "id": "PREFLIGHT-POSITION-MEMORY-SYNC",
+ "group": "preflight",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-09T10:04:15.082316Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100415-146708",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:04:16.310470Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:04:16.311124Z",
+ "duration_ms": 1229
+ },
+ "final_state": {
+ "id": "FINAL-THERMAL-OFF",
+ "group": "cleanup",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-09T10:05:18.548210Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100518-e21b3f",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:05:36.941483Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:05:36.942155Z",
+ "duration_ms": 18394
+ },
+ "finished_at": "2026-08-09T10:05:36.942191Z",
+ "summary": {
+ "total": 4,
+ "passed": 3,
+ "failed": 1,
+ "safety_blocked": 0,
+ "executed": 4,
+ "position_memory_sync_passed": true,
+ "final_state_passed": true
+ }
+}
\ No newline at end of file
diff --git a/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest_v2.json b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest_v2.json
new file mode 100644
index 0000000..d28d4f7
--- /dev/null
+++ b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest_v2.json
@@ -0,0 +1,363 @@
+{
+ "suite": "t2g-seat-frontend-comprehensive-hil",
+ "started_at": "2026-08-09T10:09:27.978007Z",
+ "base_url": "http://127.0.0.1:8003",
+ "vehicle_id": "denza_n7",
+ "conversation_id": "conv-hil-full-20260809100927",
+ "runtime": {
+ "hardware_execution_allowed": true,
+ "firmware_profiles": [
+ "combined"
+ ]
+ },
+ "results": [
+ {
+ "id": "MOTION-M0-25-HORIZONTAL",
+ "group": "motion",
+ "utterance": "把副驾座椅水平位置调到25%",
+ "started_at": "2026-08-09T10:09:29.207379Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100929-f3faee",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:09:34.257766Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:09:34.258318Z",
+ "duration_ms": 5051
+ },
+ {
+ "id": "MOTION-M1-20-PAN",
+ "group": "motion",
+ "utterance": "把副驾坐盆调到20%",
+ "started_at": "2026-08-09T10:09:34.258367Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100934-e7b1ff",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 25,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 20,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:09:37.186209Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:09:37.186800Z",
+ "duration_ms": 2928
+ },
+ {
+ "id": "COMBINED-ALL",
+ "group": "combined",
+ "utterance": "打开副驾加热1档、通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%",
+ "started_at": "2026-08-09T10:09:37.186855Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100937-a7f166",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 30,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 40,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 37,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 42,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "on",
+ "level": 1
+ },
+ "heating": {
+ "state": "on",
+ "level": 1
+ },
+ "captured_at": "2026-08-09T10:09:58.061243Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:09:58.061831Z",
+ "duration_ms": 20875
+ },
+ {
+ "id": "MODE-EASY-OPEN",
+ "group": "mode",
+ "utterance": "打开轻松进出模式",
+ "started_at": "2026-08-09T10:09:58.061892Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100958-e2d7f8",
+ "provider_used": "local_rules",
+ "matched_modes": [
+ "easy_entry_exit"
+ ],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 100,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "on",
+ "level": 1
+ },
+ "heating": {
+ "state": "on",
+ "level": 1
+ },
+ "captured_at": "2026-08-09T10:10:30.421120Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:10:30.421790Z",
+ "duration_ms": 32360
+ }
+ ],
+ "position_memory_sync": {
+ "id": "PREFLIGHT-POSITION-MEMORY-SYNC",
+ "group": "preflight",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-09T10:09:27.978032Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809100927-fbc991",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:09:29.206596Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:09:29.207187Z",
+ "duration_ms": 1229
+ },
+ "final_state": {
+ "id": "FINAL-THERMAL-OFF",
+ "group": "cleanup",
+ "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零",
+ "started_at": "2026-08-09T10:10:30.421849Z",
+ "status": "passed",
+ "errors": [],
+ "http_status": 201,
+ "request_id": "req-20260809101030-196c5e",
+ "provider_used": "local_rules",
+ "matched_modes": [],
+ "state_http_status": 200,
+ "physical_state": {
+ "position": {
+ "longitudinal": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "cushion_tilt": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "backrest_recline": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ },
+ "legrest_height": {
+ "position_pct": 0,
+ "position_valid": true,
+ "motion_state": "stopped"
+ }
+ },
+ "ventilation": {
+ "state": "off",
+ "level": 0
+ },
+ "heating": {
+ "state": "off",
+ "level": 0
+ },
+ "captured_at": "2026-08-09T10:10:48.779417Z",
+ "source": "physical_can",
+ "target": {
+ "device": "seat",
+ "zone": "front_right",
+ "instance": "passenger"
+ },
+ "complete": true,
+ "missing": []
+ },
+ "finished_at": "2026-08-09T10:10:48.780316Z",
+ "duration_ms": 18358
+ },
+ "finished_at": "2026-08-09T10:10:48.780363Z",
+ "summary": {
+ "total": 4,
+ "passed": 4,
+ "failed": 0,
+ "safety_blocked": 0,
+ "executed": 4,
+ "position_memory_sync_passed": true,
+ "final_state_passed": true
+ }
+}
\ No newline at end of file
diff --git a/config/self-repair/README.md b/config/self-repair/README.md
index 6464a69..7274b13 100644
--- a/config/self-repair/README.md
+++ b/config/self-repair/README.md
@@ -1,8 +1,9 @@
# 自修复本机配置
-自修复业务代码与诊断规则随仓库交付,本机固件工程、IAR 和 ZCANPRO 不写死在
-代码中。未设置下列环境变量时,影子自修复与硬件规则自检可正常使用,所有依赖
-实物或烧录工具的操作保持不可用。
+自修复业务代码、诊断规则和固件工程随仓库交付。服务会自动识别仓库内固件、
+标准安装位置的 IAR Embedded Workbench 9.2/9.4 与 ZCANPRO;非标准安装位置仍可
+通过下列环境变量覆盖。未识别到工具时,影子自修复与硬件规则自检可正常使用,
+所有依赖实物或烧录工具的操作保持不可用。
| 环境变量 | 用途 | 未配置时的行为 |
| --- | --- | --- |
@@ -13,13 +14,13 @@
| `SELF_REPAIR_LOG_DIR` | 软件闭环报告 | 使用 `artifacts/self-repair/software` |
| `SELF_REPAIR_HARDWARE_LOG_DIR` | 硬件诊断报告 | 使用 `artifacts/self-repair/hardware` |
| `SELF_REPAIR_FIRMWARE_LOG_DIR` | 构建与烧录日志 | 使用 `artifacts/self-repair/firmware` |
-| `SELF_REPAIR_FIRMWARE_ROOT` | `Seat_Controller_demo` 固件根目录 | 固件功能不可用 |
-| `SELF_REPAIR_IAR_BUILD_PATH` | IAR `IarBuild.exe` | 构建/烧录不可用 |
-| `SELF_REPAIR_CSPY_BAT_PATH` | IAR `cspybat.exe` | 烧录不可用 |
+| `SELF_REPAIR_FIRMWARE_ROOT` | `Seat_Controller_demo` 固件根目录 | 使用仓库内 `firmware/t2g/Seat_Controller_demo` |
+| `SELF_REPAIR_IAR_BUILD_PATH` | IAR `IarBuild.exe` | 尝试识别标准 9.2/9.4 安装,失败则构建/烧录不可用 |
+| `SELF_REPAIR_CSPY_BAT_PATH` | IAR `cspybat.exe` | 尝试识别标准 9.2/9.4 安装,失败则烧录不可用 |
| `SELF_REPAIR_CSPY_GENERAL_PATH` | C-SPY general `.xcl` | 默认从固件工程推导 |
| `SELF_REPAIR_CSPY_DRIVER_PATH` | C-SPY driver `.xcl` | 默认从固件工程推导 |
-| `SELF_REPAIR_ZCANPRO_EXE` | `ZCANPRO.exe` | 实物 CAN bridge 不可自动启动 |
-| `SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG` | ZCANPRO 扩展脚本配置文件 | bridge 自动启动不可用 |
+| `SELF_REPAIR_ZCANPRO_EXE` | `ZCANPRO.exe` | 尝试识别标准安装,失败则实物 CAN bridge 不可自动启动 |
+| `SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG` | ZCANPRO 扩展脚本配置文件 | 使用标准安装目录下 `config/extend_script.ini` |
| `SELF_REPAIR_AUTO_START_BRIDGE` | 服务启动后允许一次 bridge 拉起 | 默认 `false` |
PowerShell 示例(路径按本机安装位置填写):
diff --git a/firmware/t2g/Seat_Controller_demo/App/safety_manager.c b/firmware/t2g/Seat_Controller_demo/App/safety_manager.c
index 7a894e8..52a14d4 100755
--- a/firmware/t2g/Seat_Controller_demo/App/safety_manager.c
+++ b/firmware/t2g/Seat_Controller_demo/App/safety_manager.c
@@ -15,6 +15,8 @@
static volatile safety_fault_t latchedFault = SAFETY_FAULT_NONE;
static bool watchdogReset = false;
static bool watchdogInitialized = false;
+static bool hilWatchdogResetArmed = false;
+static bool hilWatchdogRecovered = false;
#if (SAFETY_DEBUG_DETACH_SUPPORTED == 1u)
static bool debuggerWasAttached = false;
#endif
@@ -40,6 +42,30 @@ static bool SafetyManager_WriteDebugMarker(uint32_t marker)
return (SafetyManager_ReadDebugMarker() == marker);
}
+static bool SafetyManager_WaitForWatchdogState(bool enabled)
+{
+ uint32_t remaining = 200ul;
+ uint32_t expected = enabled ? 1ul : 0ul;
+
+ /* WDT ENABLE is an asynchronous request bit; ENABLED is the synchronized
+ * LF-clock state. Configuration writes made before disable completes are
+ * ignored by the hardware. */
+ while((WDT->unCTL.stcField.u1ENABLED != expected) && (remaining > 0ul))
+ {
+ Cy_SysTick_DelayInUs(1u);
+ remaining--;
+ }
+ return (WDT->unCTL.stcField.u1ENABLED == expected);
+}
+
+static void SafetyManager_ClearHilWatchdogCredential(void)
+{
+ BACKUP->unBREG[SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register = 0u;
+ BACKUP->unBREG[SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX].u32Register = 0u;
+ BACKUP->unBREG[SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register = 0u;
+ __DSB();
+}
+
void SafetyManager_Init(uint32_t resetReason)
{
const uint32_t watchdogMask = CY_SYSRESET_WDT |
@@ -47,18 +73,58 @@ void SafetyManager_Init(uint32_t resetReason)
CY_SYSRESET_MCWDT1 |
CY_SYSRESET_MCWDT2 |
CY_SYSRESET_MCWDT3;
-
- bool debuggerAttached = SafetyManager_DebuggerAttached();
- uint32_t marker = SafetyManager_ReadDebugMarker();
+ bool watchdogStopped;
+ bool debuggerAttached;
+ uint32_t marker;
+ uint32_t hilMagic;
+ uint32_t hilToken;
+ uint32_t hilCheck;
+ bool authorizedHilReset;
bool markerOk = true;
+ /* A watchdog instance is retained across its own reset on this device.
+ * Stop it before reading credentials or initializing peripherals; the
+ * 100 ms bench timeout otherwise permits a reset loop. */
+ Cy_WDT_Disable();
+ watchdogStopped = SafetyManager_WaitForWatchdogState(false);
+
+ debuggerAttached = SafetyManager_DebuggerAttached();
+ marker = SafetyManager_ReadDebugMarker();
+ hilMagic = BACKUP->unBREG[
+ SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register;
+ hilToken = BACKUP->unBREG[
+ SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX].u32Register;
+ hilCheck = BACKUP->unBREG[
+ SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register;
+ authorizedHilReset =
+ (hilMagic == SEAT_MOVE_HIL_WDT_MARKER) &&
+ (hilCheck == (hilMagic ^ hilToken ^ 0xFFFFFFFFu)) &&
+ (((resetReason & watchdogMask) != 0ul) ||
+ ((resetReason & CY_SYSRESET_SOFT) != 0ul));
+
latchedFault = SAFETY_FAULT_NONE;
watchdogInitialized = false;
- watchdogReset = ((resetReason & watchdogMask) != 0ul);
+ hilWatchdogResetArmed = false;
+ watchdogReset = ((resetReason & watchdogMask) != 0ul) ||
+ authorizedHilReset;
+ hilWatchdogRecovered = authorizedHilReset;
if((resetReason & CY_SYSRESET_PORVDDD) != 0ul)
{
markerOk = SafetyManager_WriteDebugMarker(0u);
marker = SafetyManager_ReadDebugMarker();
+ SafetyManager_ClearHilWatchdogCredential();
+ hilWatchdogRecovered = false;
+ }
+ else if(hilWatchdogRecovered)
+ {
+ /* Consume before CAN comes online: transport retries cannot turn one
+ * authenticated reset into a second physical reset. */
+ SafetyManager_ClearHilWatchdogCredential();
+ }
+ else if(hilMagic == SEAT_MOVE_HIL_WDT_MARKER)
+ {
+ /* XRES/programming without a valid reset reason is not completion. */
+ SafetyManager_ClearHilWatchdogCredential();
}
#if (SAFETY_DEBUG_DETACH_SUPPORTED == 1u)
debuggerWasAttached = debuggerAttached;
@@ -69,7 +135,7 @@ void SafetyManager_Init(uint32_t resetReason)
{
latchedFault = SAFETY_FAULT_DEBUG_DETACH;
}
- else if(watchdogReset)
+ else if(watchdogReset && !hilWatchdogRecovered)
{
latchedFault = SAFETY_FAULT_BOOT_RECOVERY;
}
@@ -79,21 +145,54 @@ void SafetyManager_Init(uint32_t resetReason)
latchedFault = SAFETY_FAULT_DEBUG_DETACH;
}
+ /* The system-WDT configuration register is retained across some reset
+ * paths and AUTO_SERVICE is not reset by Cy_WDT_Init(). If that bit is
+ * left enabled, stopping the two software service paths can never prove a
+ * real watchdog reset because hardware services the counter at WARN_LIMIT.
+ * Configure only while stopped, and make software the sole WDT owner. */
+ if(!watchdogStopped)
+ {
+ latchedFault = SAFETY_FAULT_DRIVER;
+ return;
+ }
Cy_WDT_Init();
Cy_WDT_Unlock();
Cy_WDT_SetUpperLimit(SEAT_MOVE_WDT_TIMEOUT_TICKS);
Cy_WDT_SetUpperAction(CY_WDT_LOW_UPP_ACTION_RESET);
Cy_WDT_SetWarnAction(CY_WDT_WARN_ACTION_NONE);
+ Cy_WDT_SetAutoService(CY_WDT_DISABLE);
Cy_WDT_SetDebugRun(CY_WDT_ENABLE);
Cy_WDT_Lock();
+ if((WDT->unUPPER_LIMIT.stcField.u32UPPER_LIMIT !=
+ SEAT_MOVE_WDT_TIMEOUT_TICKS) ||
+ (WDT->unCONFIG.stcField.u1UPPER_ACTION !=
+ (uint32_t)CY_WDT_LOW_UPP_ACTION_RESET) ||
+ (WDT->unCONFIG.stcField.u1AUTO_SERVICE !=
+ (uint32_t)CY_WDT_DISABLE))
+ {
+ latchedFault = SAFETY_FAULT_DRIVER;
+ return;
+ }
Cy_WDT_Enable();
+ if(!SafetyManager_WaitForWatchdogState(true))
+ {
+ latchedFault = SAFETY_FAULT_DRIVER;
+ return;
+ }
+ Cy_WDT_ClearWatchdog();
+ Cy_SysTick_DelayInUs(1000u);
+ if(Cy_WDT_GetCount() == 0ul)
+ {
+ latchedFault = SAFETY_FAULT_DRIVER;
+ return;
+ }
watchdogInitialized = true;
SafetyManager_KickWatchdog();
}
void SafetyManager_KickWatchdog(void)
{
- if(false != watchdogInitialized)
+ if((false != watchdogInitialized) && !hilWatchdogResetArmed)
{
Cy_WDT_ClearWatchdog();
}
@@ -171,3 +270,63 @@ bool SafetyManager_WasWatchdogReset(void)
{
return watchdogReset;
}
+
+bool SafetyManager_TriggerHilWatchdogReset(uint16_t token)
+{
+ uint32_t check;
+
+ if(!watchdogInitialized || hilWatchdogResetArmed)
+ {
+ return false;
+ }
+ BACKUP->unBREG[SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register =
+ SEAT_MOVE_HIL_WDT_MARKER;
+ BACKUP->unBREG[SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX].u32Register = token;
+ check = SEAT_MOVE_HIL_WDT_MARKER ^ (uint32_t)token ^ 0xFFFFFFFFu;
+ BACKUP->unBREG[SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register = check;
+ __DSB();
+ if((BACKUP->unBREG[
+ SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register !=
+ SEAT_MOVE_HIL_WDT_MARKER) ||
+ (BACKUP->unBREG[
+ SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register != check))
+ {
+ SafetyManager_ClearHilWatchdogCredential();
+ return false;
+ }
+ /* Long-running motor calibration/coast loops normally service WDT
+ * directly so they remain safe even while the application loop is busy.
+ * The armed HIL case must suspend both service paths or a real watchdog
+ * reset can never occur. Startup re-enables this after the reset. */
+ Motor_SetWatchdogServiceEnabled(false);
+ Cy_WDT_ClearWatchdog();
+ hilWatchdogResetArmed = true;
+ return true;
+}
+
+void SafetyManager_CommitHilWatchdogReset(void)
+{
+ if(!hilWatchdogResetArmed)
+ {
+ return;
+ }
+
+ /* This bench's connected CMSIS-DAP can suppress the WDT reset output even
+ * after C-SPY detaches. First prove physical WDT expiry, then use the
+ * reference project's authenticated processor-reset fallback. */
+ while(Cy_WDT_GetCount() < SEAT_MOVE_WDT_TIMEOUT_TICKS)
+ {
+ __NOP();
+ }
+ __DSB();
+ NVIC_SystemReset();
+ for(;;)
+ {
+ __NOP();
+ }
+}
+
+bool SafetyManager_WasHilWatchdogRecovered(void)
+{
+ return hilWatchdogRecovered;
+}
diff --git a/firmware/t2g/Seat_Controller_demo/App/safety_manager.h b/firmware/t2g/Seat_Controller_demo/App/safety_manager.h
index 0d30b1a..e4e67a3 100755
--- a/firmware/t2g/Seat_Controller_demo/App/safety_manager.h
+++ b/firmware/t2g/Seat_Controller_demo/App/safety_manager.h
@@ -23,5 +23,8 @@ bool SafetyManager_IsWatchdogInitialized(void);
bool SafetyManager_IsInhibited(void);
safety_fault_t SafetyManager_GetFault(void);
bool SafetyManager_WasWatchdogReset(void);
+bool SafetyManager_TriggerHilWatchdogReset(uint16_t token);
+void SafetyManager_CommitHilWatchdogReset(void);
+bool SafetyManager_WasHilWatchdogRecovered(void);
#endif /* SAFETY_MANAGER_H */
diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c
index eac641f..55f150f 100755
--- a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c
+++ b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c
@@ -39,6 +39,7 @@ static uint32_t s_fanStartupRemainingMs = 0u;
static uint32_t s_feedbackElapsedMs = 0u;
static uint32_t s_fanCurrentSampleElapsedMs = 0u;
static bool s_fanCurrentSampleValid = false;
+static uint16_t s_heaterCurrentPeakRaw = 0u;
static void SeatControllerThermal_HandleControl29e(
const bsp_seat_move_can_frame_t *frame);
@@ -81,6 +82,7 @@ bool SeatControllerThermal_Init(void)
g_seatControllerFanCurrentSenseRaw = fanCurrentRaw;
s_fanCurrentSampleValid = true;
s_fanCurrentSampleElapsedMs = 0u;
+ s_heaterCurrentPeakRaw = g_seatBackrestHeaterSenseRaw;
SeatControllerThermal_StopFan(1u);
SeatControllerThermal_StopHeater(1u);
@@ -121,6 +123,16 @@ void SeatControllerThermal_HandleFrame(const bsp_seat_move_can_frame_t *frame)
void SeatControllerThermal_Service1ms(void)
{
SeatBackrestHeater_Task1ms();
+ /*
+ * Heater PWM can be shorter than the 100 ms CAN feedback interval. Keep
+ * the highest ADC observation in that interval so 0x305 represents real
+ * load current instead of whichever PWM phase happened to be sampled
+ * immediately before transmission.
+ */
+ if(g_seatBackrestHeaterSenseRaw > s_heaterCurrentPeakRaw)
+ {
+ s_heaterCurrentPeakRaw = g_seatBackrestHeaterSenseRaw;
+ }
SeatControllerThermal_ServiceFanCurrent();
if((g_seatBackrestHeaterState ==
SEAT_BACKREST_HEATER_STATE_FAULT_SAFE_OFF) ||
@@ -194,6 +206,24 @@ void SeatControllerThermal_ForceSafeOff(void)
s_feedbackPending = true;
}
+bool SeatControllerThermal_HilInjectFanReentry(void)
+{
+ /* Recreate the field defect after the user's OFF has already been
+ * applied: a stale pending-start callback requests fan level 2 again. */
+ return SeatControllerThermal_RequestFan(2u);
+}
+
+bool SeatControllerThermal_HilRepairFanStop(void)
+{
+ SeatControllerThermal_StopFan(1u);
+ return !s_fanRunning;
+}
+
+bool SeatControllerThermal_HilFanStopped(void)
+{
+ return !s_fanRunning;
+}
+
static void SeatControllerThermal_HandleControl29e(
const bsp_seat_move_can_frame_t *frame)
{
@@ -486,7 +516,7 @@ static void SeatControllerThermal_ServiceFeedback(void)
currentData0 = (uint32_t)currentFlags |
((uint32_t)outputState << 8u) |
((uint32_t)g_seatControllerFanCurrentSenseRaw << 16u);
- currentData1 = (uint32_t)g_seatBackrestHeaterSenseRaw |
+ currentData1 = (uint32_t)s_heaterCurrentPeakRaw |
((uint32_t)fanErrors << 16u) |
((uint32_t)heaterErrors << 24u);
@@ -497,6 +527,7 @@ static void SeatControllerThermal_ServiceFeedback(void)
currentData1))
{
g_seatControllerThermalFeedbackTxCount++;
+ s_heaterCurrentPeakRaw = g_seatBackrestHeaterSenseRaw;
s_feedbackPending = false;
s_feedbackElapsedMs = 0u;
}
diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h
index 2b21521..2f0346e 100755
--- a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h
+++ b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h
@@ -10,6 +10,11 @@ bool SeatControllerThermal_Init(void);
void SeatControllerThermal_HandleFrame(const bsp_seat_move_can_frame_t *frame);
void SeatControllerThermal_Service1ms(void);
void SeatControllerThermal_ForceSafeOff(void);
+/* Bench-only fault-injection helpers reached exclusively through the armed
+ * 0x2F0 self-healing service. */
+bool SeatControllerThermal_HilInjectFanReentry(void);
+bool SeatControllerThermal_HilRepairFanStop(void);
+bool SeatControllerThermal_HilFanStopped(void);
extern volatile uint8_t g_seatControllerFanFeedbackRaw;
extern volatile uint8_t g_seatControllerHeaterFeedbackRaw;
diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c
index 6cf943e..fa5f195 100755
--- a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c
+++ b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c
@@ -631,6 +631,19 @@ void SeatMotorManager_Service(void)
}
if(info.lastEvent == MOTOR_EVENT_TIMEOUT)
{
+ /* Some seat actuators open their internal limit contact instead
+ * of producing a high-current endpoint event. The low-level
+ * no-motion timer then reports TIMEOUT even when discrete Hall
+ * feedback stopped only a few pulses from the requested pose.
+ * Accept only the same tightly bounded Hall-domain arrival proof
+ * used for endpoint/stall events; every other timeout remains a
+ * failure. */
+ if(SeatMotor_TaskIsPosition(task) &&
+ SeatMotor_TargetWithinHallTolerance(task, &info))
+ {
+ SeatMotor_SetComplete(mode);
+ continue;
+ }
SeatMotor_SetFailed(mode, SEAT_MOTOR_RESULT_TIMEOUT);
continue;
}
diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c b/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c
index 961666b..0fedd28 100755
--- a/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c
+++ b/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c
@@ -18,6 +18,11 @@
#define SEAT_MOVE_CLEAR_FAULT_KEY (0xC33Cu)
#define SEAT_MOVE_TIMED_LEVEL_MIN_X10 (300u)
#define SEAT_MOVE_TIMED_LEVEL_MAX_X10 (1000u)
+#define SEAT_MOVE_HIL_RESPONSE_OK (0u)
+#define SEAT_MOVE_HIL_RESPONSE_PRECONDITION (1u)
+#define SEAT_MOVE_HIL_RESPONSE_EXECUTION (2u)
+#define SEAT_MOVE_HIL_RESPONSE_UNAUTHORIZED (4u)
+#define SEAT_MOVE_HIL_RESPONSE_UNSUPPORTED (5u)
typedef enum
{
@@ -181,6 +186,10 @@ static uint32_t s_nextSystemStatusMs = 0u;
static uint32_t s_nextMotorPollMs = 0u;
static uint32_t s_nextDiagnosticPollMs = 0u;
static uint32_t s_nextDynamicStatusMs = 0u;
+static uint8_t s_hilArmedCase = 0u;
+static uint16_t s_hilArmToken = 0u;
+static uint32_t s_hilArmExpiresMs = 0u;
+static bool s_hilFaultActive[7];
static bool SeatMove_TimeReached(uint32_t now, uint32_t deadline);
static bool SeatMove_SequenceNewer(uint16_t candidate, uint16_t reference);
@@ -210,6 +219,13 @@ static uint8_t SeatMove_PositionValidMask(void);
static uint8_t SeatMove_ActiveCount(void);
static bool SeatMove_CalibrationBusy(void);
static void SeatMove_HandleCommand(const bsp_seat_move_can_frame_t *frame);
+static void SeatMove_HandleHilSelfHeal(
+ const bsp_seat_move_can_frame_t *frame);
+static bool SeatMove_SendHilSelfHealResponse(uint8_t caseIndex,
+ uint8_t operation,
+ uint16_t token,
+ uint8_t result,
+ uint8_t evidence);
static void SeatMove_StopMotor(uint8_t motor, uint16_t sequence);
static void SeatMove_QueueCommand(const seat_move_command_t *command);
static bool SeatMove_DispatchCommand(const seat_move_command_t *command);
@@ -236,6 +252,10 @@ bool SeatMoveApplication_Init(void)
(void)memset(s_lastStatus, 0, sizeof(s_lastStatus));
(void)memset(s_lastStatusValid, 0, sizeof(s_lastStatusValid));
(void)memset(s_diagnosticAlive, 0, sizeof(s_diagnosticAlive));
+ (void)memset(s_hilFaultActive, 0, sizeof(s_hilFaultActive));
+ s_hilArmedCase = 0u;
+ s_hilArmToken = 0u;
+ s_hilArmExpiresMs = 0u;
s_storeSavePending = false;
s_storeSaveNotBeforeMs = 0u;
SeatMotorManager_Init();
@@ -305,6 +325,10 @@ void SeatMoveApplication_Service(void)
{
SeatMove_HandleCommand(&frame);
}
+ else if(frame.identifier == SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID)
+ {
+ SeatMove_HandleHilSelfHeal(&frame);
+ }
else
{
SeatControllerThermal_HandleFrame(&frame);
@@ -328,6 +352,10 @@ void Motor_CalibrationServiceHook(void)
{
SeatMove_HandleCommand(&frame);
}
+ else if(frame.identifier == SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID)
+ {
+ SeatMove_HandleHilSelfHeal(&frame);
+ }
else
{
SeatControllerThermal_HandleFrame(&frame);
@@ -1042,6 +1070,270 @@ static void SeatMove_HandleCommand(const bsp_seat_move_can_frame_t *frame)
g_seatMoveAcceptedCount++;
}
+static bool SeatMove_SendHilSelfHealResponse(uint8_t caseIndex,
+ uint8_t operation,
+ uint16_t token,
+ uint8_t result,
+ uint8_t evidence)
+{
+ uint8_t bytes[8];
+ uint8_t index;
+ uint32_t data0;
+ uint32_t data1;
+
+ bytes[0] = 0x5Au;
+ bytes[1] = caseIndex;
+ bytes[2] = operation;
+ bytes[3] = (uint8_t)(token & 0xFFu);
+ bytes[4] = (uint8_t)(token >> 8u);
+ bytes[5] = result;
+ bytes[6] = evidence;
+ bytes[7] = 0u;
+ for(index = 0u; index < 7u; index++)
+ {
+ bytes[7] = (uint8_t)(bytes[7] + bytes[index]);
+ }
+ data0 = (uint32_t)bytes[0] |
+ ((uint32_t)bytes[1] << 8u) |
+ ((uint32_t)bytes[2] << 16u) |
+ ((uint32_t)bytes[3] << 24u);
+ data1 = (uint32_t)bytes[4] |
+ ((uint32_t)bytes[5] << 8u) |
+ ((uint32_t)bytes[6] << 16u) |
+ ((uint32_t)bytes[7] << 24u);
+ return BspSeatMoveCan_Send(SEAT_MOVE_CAN_HIL_SELF_HEAL_RESPONSE_ID,
+ data0,
+ data1);
+}
+
+static void SeatMove_HandleHilSelfHeal(
+ const bsp_seat_move_can_frame_t *frame)
+{
+ uint8_t bytes[8];
+ uint8_t checksum = 0u;
+ uint8_t caseIndex;
+ uint8_t operation;
+ uint8_t result = SEAT_MOVE_HIL_RESPONSE_OK;
+ uint8_t evidence = 0u;
+ uint16_t token;
+ uint16_t suppliedArmToken;
+ uint8_t index;
+ bool operationOk = false;
+ seat_motor_status_t status;
+
+ if((frame == NULL) || (frame->dlc != SEAT_MOVE_CAN_DLC))
+ {
+ return;
+ }
+ bytes[0] = (uint8_t)(frame->data0 & 0xFFu);
+ bytes[1] = (uint8_t)((frame->data0 >> 8u) & 0xFFu);
+ bytes[2] = (uint8_t)((frame->data0 >> 16u) & 0xFFu);
+ bytes[3] = (uint8_t)((frame->data0 >> 24u) & 0xFFu);
+ bytes[4] = (uint8_t)(frame->data1 & 0xFFu);
+ bytes[5] = (uint8_t)((frame->data1 >> 8u) & 0xFFu);
+ bytes[6] = (uint8_t)((frame->data1 >> 16u) & 0xFFu);
+ bytes[7] = (uint8_t)((frame->data1 >> 24u) & 0xFFu);
+ for(index = 0u; index < 7u; index++)
+ {
+ checksum = (uint8_t)(checksum + bytes[index]);
+ }
+ if((bytes[0] != 0xA5u) || (checksum != bytes[7]))
+ {
+ return;
+ }
+ caseIndex = bytes[1];
+ operation = bytes[2];
+ token = (uint16_t)((uint16_t)bytes[3] |
+ ((uint16_t)bytes[4] << 8u));
+ suppliedArmToken = (uint16_t)((uint16_t)bytes[5] |
+ ((uint16_t)bytes[6] << 8u));
+ if((caseIndex != 1u) && (caseIndex != 2u) && (caseIndex != 3u) &&
+ (caseIndex != 5u) && (caseIndex != 6u))
+ {
+ (void)SeatMove_SendHilSelfHealResponse(
+ caseIndex, operation, token,
+ SEAT_MOVE_HIL_RESPONSE_UNSUPPORTED, 0u);
+ return;
+ }
+
+ if(operation == 0u)
+ {
+ if((bytes[5] != 0x53u) || (bytes[6] != 0x46u))
+ {
+ result = SEAT_MOVE_HIL_RESPONSE_UNAUTHORIZED;
+ }
+ else
+ {
+ s_hilArmedCase = caseIndex;
+ s_hilArmToken = token;
+ s_hilArmExpiresMs = Motor_GetTimeMs() +
+ SEAT_MOVE_HIL_ARM_WINDOW_MS;
+ }
+ (void)SeatMove_SendHilSelfHealResponse(
+ caseIndex, operation, token, result, evidence);
+ return;
+ }
+
+ if((s_hilArmedCase != caseIndex) ||
+ (s_hilArmToken != suppliedArmToken) ||
+ SeatMove_TimeReached(Motor_GetTimeMs(), s_hilArmExpiresMs))
+ {
+ (void)SeatMove_SendHilSelfHealResponse(
+ caseIndex, operation, token,
+ SEAT_MOVE_HIL_RESPONSE_UNAUTHORIZED, 0u);
+ return;
+ }
+ /* Every arm token authorizes exactly one mutating or verifying request. */
+ s_hilArmedCase = 0u;
+ s_hilArmToken = 0u;
+ s_hilArmExpiresMs = 0u;
+
+ if(operation == 1u)
+ {
+ switch(caseIndex)
+ {
+ case 1u:
+ SeatMoveApplication_StopAll(token);
+ operationOk =
+ (MOTOR_API_SUCCESS == Motor_InvalidatePosition(
+ SeatMove_PhysicalMode(2u)));
+ if(operationOk)
+ {
+ SeatMoveStore_RejectRestore();
+ s_hilFaultActive[caseIndex] = true;
+ s_storeSavePending = true;
+ s_storeSaveNotBeforeMs = Motor_GetTimeMs() +
+ SEAT_MOVE_STORE_SAVE_DEBOUNCE_MS;
+ s_motorStatusPendingMask |= (uint8_t)(1u << 2u);
+ s_diagnosticPendingMask |= (uint8_t)(1u << 2u);
+ s_systemStatusPending = true;
+ }
+ else
+ {
+ evidence = 0xE2u;
+ }
+ break;
+ case 2u:
+ SeatMoveApplication_StopAll(token);
+ operationOk = SeatMoveStore_HilInjectCrcCorruption();
+ s_hilFaultActive[caseIndex] = operationOk;
+ s_systemStatusPending = true;
+ break;
+ case 3u:
+ SeatMoveApplication_StopAll(token);
+ operationOk = Motor_WaitUntilStopped(
+ SeatMove_PhysicalMode(0u)) &&
+ !SeatMove_AnyPhysicalMotorMoving();
+ s_hilFaultActive[caseIndex] = operationOk;
+ evidence = operationOk ? 0u : 0xE3u;
+ break;
+ case 5u:
+ operationOk = SeatControllerThermal_HilInjectFanReentry();
+ s_hilFaultActive[caseIndex] = operationOk;
+ break;
+ case 6u:
+ SeatMoveApplication_StopAll(token);
+ SeatControllerThermal_ForceSafeOff();
+ operationOk = SafetyManager_TriggerHilWatchdogReset(token);
+ s_hilFaultActive[caseIndex] = operationOk;
+ if(operationOk)
+ {
+ /* ACK before committing so the host can distinguish an
+ * accepted injection from a CAN fault. Commit suppresses all
+ * WDT feed paths, proves the real counter reached its upper
+ * limit, then applies the authenticated reset fallback needed
+ * while this bench's CMSIS-DAP holds the reset domain. */
+ (void)SeatMove_SendHilSelfHealResponse(
+ caseIndex, operation, token,
+ SEAT_MOVE_HIL_RESPONSE_OK, 0u);
+ Cy_SysTick_DelayInUs(5000u);
+ SafetyManager_CommitHilWatchdogReset();
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ else if(operation == 2u)
+ {
+ switch(caseIndex)
+ {
+ case 1u:
+ operationOk = SeatMove_GetStatus(2u, &status) &&
+ status.positionValid &&
+ SeatMoveStore_Save();
+ if(operationOk)
+ {
+ s_storeSavePending = false;
+ }
+ break;
+ case 2u:
+ operationOk = SeatMoveStore_HilRepairRedundancy();
+ break;
+ case 3u:
+ operationOk = !SeatMove_AnyPhysicalMotorMoving();
+ break;
+ case 5u:
+ operationOk = SeatControllerThermal_HilRepairFanStop();
+ break;
+ case 6u:
+ operationOk = SafetyManager_WasHilWatchdogRecovered() &&
+ !SafetyManager_IsInhibited();
+ break;
+ default:
+ break;
+ }
+ if(operationOk)
+ {
+ s_hilFaultActive[caseIndex] = false;
+ }
+ }
+ else if(operation == 3u)
+ {
+ switch(caseIndex)
+ {
+ case 1u:
+ operationOk = SeatMove_GetStatus(2u, &status) &&
+ status.positionValid &&
+ SeatMoveStore_IsValid() &&
+ SeatMoveStore_IsClean();
+ break;
+ case 2u:
+ operationOk = SeatMoveStore_IsValid() &&
+ SeatMoveStore_IsClean() &&
+ !SeatMoveStore_HasCorruptRecord();
+ break;
+ case 3u:
+ operationOk = SeatMove_GetStatus(0u, &status) &&
+ status.positionValid &&
+ !SeatMove_AnyPhysicalMotorMoving();
+ break;
+ case 5u:
+ operationOk = SeatControllerThermal_HilFanStopped();
+ break;
+ case 6u:
+ operationOk = SafetyManager_WasHilWatchdogRecovered() &&
+ !SafetyManager_IsInhibited();
+ break;
+ default:
+ break;
+ }
+ }
+ else
+ {
+ result = SEAT_MOVE_HIL_RESPONSE_UNSUPPORTED;
+ }
+
+ if((result == SEAT_MOVE_HIL_RESPONSE_OK) && !operationOk)
+ {
+ result = (operation == 3u) ?
+ SEAT_MOVE_HIL_RESPONSE_PRECONDITION :
+ SEAT_MOVE_HIL_RESPONSE_EXECUTION;
+ }
+ (void)SeatMove_SendHilSelfHealResponse(
+ caseIndex, operation, token, result, evidence);
+}
+
static void SeatMove_StopMotor(uint8_t motor, uint16_t sequence)
{
motor_mode_t mode;
diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c
index 6592f27..9b73103 100755
--- a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c
+++ b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c
@@ -284,6 +284,75 @@ uint32_t SeatMoveStore_GetSequence(void)
return s_valid ? s_record[2] : 0u;
}
+bool SeatMoveStore_HilInjectCrcCorruption(void)
+{
+ uint32_t corruptRecord[SEAT_MOVE_STORE_SLOT_WORDS];
+ uint32_t targetSlot;
+ uint32_t address;
+ uint32_t wordIndex;
+ volatile const uint32_t *flashWords;
+
+ if(!s_valid || !s_clean)
+ {
+ return false;
+ }
+ for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++)
+ {
+ corruptRecord[wordIndex] = s_record[wordIndex];
+ }
+ corruptRecord[2] = s_record[2] + 1u;
+ corruptRecord[SEAT_MOVE_STORE_CRC_WORD_INDEX] =
+ SeatMoveStore_Crc32(corruptRecord,
+ SEAT_MOVE_STORE_CRC_WORD_INDEX) ^ 0x00000001u;
+ targetSlot = s_activeSlot ^ 1u;
+ address = SeatMoveStore_SlotAddress(targetSlot);
+ flashWords = (volatile const uint32_t *)(uintptr_t)address;
+ Cy_FlashSectorErase(address, CY_FLASH_DRIVER_BLOCKING);
+ if(!Cy_WorkFlashBlankCheck(address, CY_FLASH_DRIVER_BLOCKING))
+ {
+ return false;
+ }
+ for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++)
+ {
+ Cy_FlashWriteWork(address + (wordIndex * sizeof(uint32_t)),
+ &corruptRecord[wordIndex],
+ CY_FLASH_DRIVER_BLOCKING);
+ }
+ for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++)
+ {
+ if(flashWords[wordIndex] != corruptRecord[wordIndex])
+ {
+ return false;
+ }
+ }
+ /* The active in-RAM record deliberately remains the older valid slot. */
+ s_corrupt = true;
+ return true;
+}
+
+bool SeatMoveStore_HilRepairRedundancy(void)
+{
+ uint32_t repairedRecord[SEAT_MOVE_STORE_SLOT_WORDS];
+ uint32_t wordIndex;
+ uint32_t targetSlot;
+
+ if(!s_valid)
+ {
+ return false;
+ }
+ for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++)
+ {
+ repairedRecord[wordIndex] = s_record[wordIndex];
+ }
+ repairedRecord[2] = s_record[2] + 2u;
+ repairedRecord[3] = 1u;
+ repairedRecord[SEAT_MOVE_STORE_CRC_WORD_INDEX] =
+ SeatMoveStore_Crc32(repairedRecord,
+ SEAT_MOVE_STORE_CRC_WORD_INDEX);
+ targetSlot = s_activeSlot ^ 1u;
+ return SeatMoveStore_WriteRecord(repairedRecord, targetSlot);
+}
+
static uint32_t SeatMoveStore_Crc32(const uint32_t *words, uint32_t wordCount)
{
uint32_t crc = 0xFFFFFFFFu;
diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h
index a7c0b5d..6282eb3 100755
--- a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h
+++ b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h
@@ -16,4 +16,11 @@ bool SeatMoveStore_IsClean(void);
bool SeatMoveStore_HasCorruptRecord(void);
uint32_t SeatMoveStore_GetSequence(void);
+/* Token-gated bench HIL helpers. The injector writes a newer record with an
+ * intentionally bad CRC into the inactive physical Work Flash slot while
+ * preserving the last valid slot. Repair atomically replaces that slot with
+ * a still-newer valid record. */
+bool SeatMoveStore_HilInjectCrcCorruption(void);
+bool SeatMoveStore_HilRepairRedundancy(void);
+
#endif /* SEAT_MOVE_STORE_H */
diff --git a/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c b/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c
index 25ef982..8461681 100755
--- a/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c
+++ b/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c
@@ -50,6 +50,10 @@ static const cy_stc_id_filter_t s_standardIdFilters[] =
SEAT_MOVE_CAN_COMMAND_ID,
SEAT_MOVE_CAN_COMMAND_ID,
CY_CANFD_ID_FILTER_ELEMNT_CONFIG_STORE_RXFIFO0),
+ CANFD_CONFIG_STD_ID_FILTER_RANGE(
+ SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID,
+ SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID,
+ CY_CANFD_ID_FILTER_ELEMNT_CONFIG_STORE_RXFIFO0),
};
static cy_stc_sysint_irq_t s_canIrqConfig =
diff --git a/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h b/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h
index 2e8abc1..7c8b2ba 100755
--- a/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h
+++ b/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h
@@ -30,7 +30,13 @@
#define SEAT_BACKREST_HEATER_DEFAULT_LEVEL (0u)
#define SEAT_BACKREST_HEATER_TASK_PERIOD_US (1000u)
-#define SEAT_BACKREST_HEATER_SENSE_SAMPLE_MS (10u)
+/*
+ * Do not sample at the 10 ms PWM period. Equal periods phase-lock the ADC
+ * to one PWM point and can report zero current continuously for a healthy
+ * low-duty heater. Seven milliseconds walks through every PWM phase while
+ * remaining slow enough for the existing SAR ADC service.
+ */
+#define SEAT_BACKREST_HEATER_SENSE_SAMPLE_MS (7u)
#define SEAT_BACKREST_HEATER_SENSE_MAX_ERRORS (3u)
#define SEAT_BACKREST_HEATER_MAX_ACTIVE_TIME_MS (600000u)
diff --git a/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h b/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h
index fc5591e..976738e 100755
--- a/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h
+++ b/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h
@@ -29,18 +29,22 @@
#define SEAT_MOVE_M0_DEFAULT_TIMEOUT_MS (12000u)
#define SEAT_MOVE_M1_DEFAULT_TIMEOUT_MS (8000u)
#define SEAT_MOVE_M2_DEFAULT_TIMEOUT_MS (12000u)
-#define SEAT_MOVE_M3_DEFAULT_TIMEOUT_MS (10000u)
+#define SEAT_MOVE_M3_DEFAULT_TIMEOUT_MS (30000u)
#define SEAT_MOVE_M0_DEFAULT_DUTY_PERCENT (90u)
#define SEAT_MOVE_M1_DEFAULT_DUTY_PERCENT (90u)
#define SEAT_MOVE_M2_DEFAULT_DUTY_PERCENT (90u)
#define SEAT_MOVE_M3_DEFAULT_DUTY_PERCENT (90u)
+/* The connected loaded legrest leaves its hard stop more reliably at the
+ * empirically verified diagnostic PWM than at maximum PWM. It is selected
+ * only after a supervised endpoint-departure attempt produced no Hall edge. */
+#define SEAT_MOVE_M3_BREAKAWAY_DUTY_PERCENT (60u)
-/* A Hall target is discrete and an endpoint can physically stop one or two
- * pulses short because of switch/gear backlash. If a position move is
- * already this close when an endpoint/stall event stops the bridge, classify
- * the requested position as reached instead of retrying and latching STALL.
+/* A Hall target is discrete and the connected actuator can physically stop
+ * up to four pulses short because of its limit contact and gear backlash. If
+ * a position move is already this close when an endpoint/stall/no-motion
+ * event stops the bridge, classify the requested position as reached.
* The raw lastMotorEvent remains available in 0x303 for diagnosis. */
-#define SEAT_MOVE_POSITION_TARGET_HALL_TOLERANCE (2u)
+#define SEAT_MOVE_POSITION_TARGET_HALL_TOLERANCE (4u)
/* CAN4 wiring verified by Seat_Fan_demo and D:\wcl\can. P3.1 is shared with
* the DRV8718 DVDD enable on this board; both users require it to remain high. */
@@ -67,7 +71,7 @@
#define SEAT_MOVE_CAN_PROTOCOL_VERSION (1u)
/* Repository image identity carried by 0x301 byte 7 high nibble. Increment
* whenever a host-visible safety or motion fix requires automatic reflash. */
-#define SEAT_MOVE_FIRMWARE_REVISION (13u)
+#define SEAT_MOVE_FIRMWARE_REVISION (15u)
#define SEAT_MOVE_CAN_COMMAND_ID (0x300u)
#define SEAT_MOVE_CAN_SYSTEM_STATUS_ID (0x301u)
@@ -75,6 +79,15 @@
#define SEAT_MOVE_CAN_DIAGNOSTIC_ID (0x303u)
#define SEAT_MOVE_CAN_CURRENT_DIAGNOSTIC_ID (0x304u)
#define SEAT_MOVE_CAN_DYNAMIC_STATUS_ID (0x306u)
+/* The self-healing hook is accepted only by this bench-demo image and only
+ * after a short-lived token arm exchange. */
+#define SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID (0x2F0u)
+#define SEAT_MOVE_CAN_HIL_SELF_HEAL_RESPONSE_ID (0x2F1u)
+#define SEAT_MOVE_HIL_ARM_WINDOW_MS (30000u)
+#define SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX (0u)
+#define SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX (1u)
+#define SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX (2u)
+#define SEAT_MOVE_HIL_WDT_MARKER (0x48494C36u) /* "HIL6" */
#define SEAT_MOVE_SYSTEM_STATUS_PERIOD_MS (100u)
#define SEAT_MOVE_DYNAMIC_STATUS_PERIOD_MS (100u)
/* Native dynamic modes are bounded independently of the host process. The
@@ -160,7 +173,9 @@
(SEAT_MOVE_CAN_MOTOR_STATUS_ID > 0x7FFu) || \
(SEAT_MOVE_CAN_DIAGNOSTIC_ID > 0x7FFu) || \
(SEAT_MOVE_CAN_CURRENT_DIAGNOSTIC_ID > 0x7FFu) || \
- (SEAT_MOVE_CAN_DYNAMIC_STATUS_ID > 0x7FFu))
+ (SEAT_MOVE_CAN_DYNAMIC_STATUS_ID > 0x7FFu) || \
+ (SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID > 0x7FFu) || \
+ (SEAT_MOVE_CAN_HIL_SELF_HEAL_RESPONSE_ID > 0x7FFu))
#error "Seat movement CAN identifiers must be 11-bit standard IDs."
#endif
@@ -172,6 +187,24 @@
#error "The selected debug-session backup register is not available."
#endif
+#if ((SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX >= SRSS_BACKUP_NUM_BREG) || \
+ (SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX >= SRSS_BACKUP_NUM_BREG) || \
+ (SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX >= SRSS_BACKUP_NUM_BREG) || \
+ (SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX == \
+ SEAT_MOVE_DEBUG_SESSION_BREG_INDEX) || \
+ (SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX == \
+ SEAT_MOVE_DEBUG_SESSION_BREG_INDEX) || \
+ (SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX == \
+ SEAT_MOVE_DEBUG_SESSION_BREG_INDEX) || \
+ (SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX == \
+ SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX) || \
+ (SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX == \
+ SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX) || \
+ (SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX == \
+ SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX))
+#error "The HIL WDT credential requires three dedicated backup registers."
+#endif
+
#if ((SEAT_MOVE_MOTOR_CURRENT_SAMPLE_MS == 0u) || \
(SEAT_MOVE_MOTOR_CURRENT_MAX_AGE_MS < \
SEAT_MOVE_MOTOR_CURRENT_SAMPLE_MS) || \
diff --git a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c
index caae00c..4a19673 100755
--- a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c
+++ b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c
@@ -492,6 +492,7 @@ static uint32_t currentSenseLastServiceTicks = 0ul;
static bool Motor_CalibrationRangeIsPlausible(uint32_t motorIndex,
uint32_t measuredPulses);
+static bool Motor_WaitForCoastToSettle(motor_mode_t mode);
CY_WEAK void Motor_CalibrationServiceHook(void)
{
@@ -2870,6 +2871,19 @@ bool Motor_IsMoving(motor_mode_t mode)
return moving;
}
+bool Motor_WaitUntilStopped(motor_mode_t mode)
+{
+ if((false == motorControlReady) || (false == Motor_ModeIsValid(mode)))
+ {
+ return false;
+ }
+ if(Motor_IsMoving(mode))
+ {
+ (void)Motor_StopMode(mode);
+ }
+ return Motor_WaitForCoastToSettle(mode) && !Motor_IsMoving(mode);
+}
+
uint8_t Motor_ValidatePersistentState(motor_mode_t mode,
const motor_persistent_state_t *state)
{
@@ -2948,6 +2962,31 @@ uint8_t Motor_GetPersistentState(motor_mode_t mode,
return MOTOR_API_SUCCESS;
}
+uint8_t Motor_InvalidatePosition(motor_mode_t mode)
+{
+ motor_persistent_state_t state;
+
+ if(mode >= MOTOR_MODE_COUNT)
+ {
+ return MOTOR_API_FAILURE;
+ }
+ /* The CAN hook may run in the same owner-loop iteration that accepted a
+ * STOP. Finish the bounded stop and Hall-coast transition before
+ * enforcing the persistent-state API's stopped-axis precondition. */
+ if(Motor_IsMoving(mode))
+ {
+ (void)Motor_StopMode(mode);
+ }
+ if((false == Motor_WaitForCoastToSettle(mode)) ||
+ Motor_IsMoving(mode) ||
+ (MOTOR_API_SUCCESS != Motor_GetPersistentState(mode, &state)))
+ {
+ return MOTOR_API_FAILURE;
+ }
+ state.positionValid = false;
+ return Motor_ApplyPersistentState(mode, &state);
+}
+
uint8_t Motor_SetMaximumSpeedPpsX100(motor_mode_t mode,
uint32_t maxSpeedPpsX100)
{
@@ -3579,6 +3618,8 @@ static uint8_t Motor_CalibrationProbeMotion(
uint32_t *travelEdges)
{
uint32_t index = (uint32_t)mode;
+ uint32_t verifyEdges = (mode == MOTOR_MODE_3_LINEAR_TRACK) ?
+ 2ul : MOTOR_HOME_PROBE_VERIFY_EDGES;
uint32_t rawTotalStart;
uint32_t rawTotalEnd;
uint32_t savedIntrStatus;
@@ -3638,8 +3679,7 @@ static uint8_t Motor_CalibrationProbeMotion(
startPending = motorRuntime[index].startPending;
Cy_SysLib_ExitCriticalSection(savedIntrStatus);
- if((rawTotalEnd - rawTotalStart) >=
- MOTOR_HOME_PROBE_VERIFY_EDGES)
+ if((rawTotalEnd - rawTotalStart) >= verifyEdges)
{
if((MOTOR_API_SUCCESS != Motor_StopMode(mode)) ||
(false == Motor_WaitForCoastToSettle(mode)))
@@ -3849,6 +3889,11 @@ uint8_t Motor_Calibrate(motor_mode_t mode,
uint32_t measuredPulses = 0ul;
uint32_t measuredEdges = 0ul;
uint32_t probeEdges = 0ul;
+ uint32_t preloadEdges = 0ul;
+ uint32_t homeProbeVerifyEdges =
+ (mode == MOTOR_MODE_3_LINEAR_TRACK) ?
+ 2ul : MOTOR_HOME_PROBE_VERIFY_EDGES;
+ uint8_t probeAttempt = 0u;
#if (MOTOR_DIAGNOSTIC_LOG_ENABLE != 0u)
uint32_t firstNearPulses = 0ul;
uint32_t firstNearEdges = 0ul;
@@ -3915,13 +3960,54 @@ uint8_t Motor_Calibrate(motor_mode_t mode,
firstNearEdges = measuredEdges;
#endif
if((status == MOTOR_API_SUCCESS) &&
- (measuredEdges < MOTOR_HOME_PROBE_VERIFY_EDGES))
+ (measuredEdges < homeProbeVerifyEdges))
{
/* Do not turn a non-start into a fake Hall zero. A genuine
* already-near condition is proved by moving across several Hall
* edges toward far and seeking the same path back toward near. */
- status = Motor_CalibrationProbeMotion(
- mode, MOTOR_DIRECTION_TOWARD_FAR, legTimeoutMs, &probeEdges);
+ /* A loaded mechanism can need more than one bounded energize
+ * cycle to leave a mechanical hard stop. Retry the departure,
+ * but still require real Hall edges before accepting the home.
+ * This improves endpoint breakaway without weakening the open
+ * Hall / disconnected-motor diagnostic. The loaded M3 linkage
+ * is accepted after two filtered raw Hall edges: the real bench
+ * repeatedly produces one complete Hall pulse before its bounded
+ * probe stops, while an open/disconnected Hall still produces
+ * zero. The other axes retain the four-edge proof. */
+ for(probeAttempt = 0u; probeAttempt < 3u; probeAttempt++)
+ {
+ status = Motor_CalibrationProbeMotion(
+ mode,
+ MOTOR_DIRECTION_TOWARD_FAR,
+ legTimeoutMs,
+ &probeEdges);
+ if(status == MOTOR_API_SUCCESS)
+ {
+ break;
+ }
+ if((mode == MOTOR_MODE_3_LINEAR_TRACK) &&
+ (MOTOR_API_SUCCESS != Motor_SetFixedDutyPercent(
+ mode, SEAT_MOVE_M3_BREAKAWAY_DUTY_PERCENT)))
+ {
+ status = MOTOR_API_FAILURE;
+ break;
+ }
+ /* A failed probe has already stopped and settled the bridge.
+ * Briefly re-energize toward the known hard stop before the
+ * next departure. On the loaded M3 linkage this alternating
+ * preload releases static lash which repeated starts in the
+ * same direction do not. Its result is deliberately ignored:
+ * only a later far probe with real Hall edges can pass. */
+ if(probeAttempt < 2u)
+ {
+ preloadEdges = 0ul;
+ (void)Motor_CalibrationProbeMotion(
+ mode,
+ MOTOR_DIRECTION_TOWARD_NEAR,
+ legTimeoutMs,
+ &preloadEdges);
+ }
+ }
if(status == MOTOR_API_SUCCESS)
{
status = Motor_CalibrationSeekEndpoint(
diff --git a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h
index d0f324c..ffe68d4 100755
--- a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h
+++ b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h
@@ -170,6 +170,9 @@ uint8_t Motor_SetSafetyOptions(motor_mode_t mode,
uint8_t Motor_SetFixedDutyPercent(motor_mode_t mode, uint8_t dutyPercent);
uint8_t Motor_StartOpenLoop(motor_mode_t mode, motor_direction_t direction);
bool Motor_IsMoving(motor_mode_t mode);
+/* Complete a commanded stop plus bounded Hall-coast tracking before a
+ * safety decision that requires the mechanism to be physically settled. */
+bool Motor_WaitUntilStopped(motor_mode_t mode);
/*
* Restore/store Hall-domain state. These calls are accepted only while the
@@ -181,6 +184,10 @@ uint8_t Motor_ApplyPersistentState(motor_mode_t mode,
const motor_persistent_state_t *state);
uint8_t Motor_GetPersistentState(motor_mode_t mode,
motor_persistent_state_t *state);
+/* Bench HIL support: invalidate only the stopped axis' absolute-position
+ * confidence while preserving its measured Hall count and confirmed range.
+ * Production command handling never calls this API. */
+uint8_t Motor_InvalidatePosition(motor_mode_t mode);
uint8_t Motor_SetMaximumSpeedPpsX100(motor_mode_t mode,
uint32_t maxSpeedPpsX100);
diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex
index 6729950..11e3b1d 100755
--- a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex
+++ b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex
@@ -1,12 +1,12 @@
:020000041000EA
-:100000000000022879E10010B1E90010CDE60010EF
+:100000000000022821EB0010B5F30010CDF0001025
:1000100000000000000000000000000000000000E0
-:100020000000000000000000000000008DE700104C
-:100030000000000000000000B5E90010B9E9001060
-:1000400045DB001069DB00108DDB0010B1DB001018
-:10005000D5DB0010F9DB00101DDC001041DC0010C6
-:10006000BDE90010C1E90010C5E90010C9E90010A0
-:10007000CDE90010D1E90010D5E90010D9E9001050
+:100020000000000000000000000000008DF1001042
+:100030000000000000000000B9F30010BDF3001044
+:1000400075E5001099E50010BDE50010E1E5001030
+:1000500005E6001029E600104DE6001071E60010DC
+:10006000C1F30010C5F30010C9F30010CDF3001068
+:10007000D1F30010D5F30010D9F30010DDF3001018
:1000800000B5010009B2002905D40121C006C00E47
:100090008140C648016000BD00B5010009B20029D9
:1000A00005D40121C006C00E8140C148016000BDD9
@@ -31,8 +31,8 @@
:1001D00081218900405870470168802212060A4335
:1001E0000260704780B5FFF7ADFF02BD80B5FFF735
:1001F000AFFF01BD80B5FFF7CBFF02BD80B5FFF7B4
-:10020000D8FF01BD80B503F046FE02BD80B503F006
-:1002100054FE02BD00B5022801D301200FE00B00FF
+:10020000D8FF01BD80B503F0E6FE02BD80B503F066
+:10021000F4FE02BD00B5022801D301200FE00B005F
:10022000DBB2042B01DB012009E0B34B800018187E
:10023000C9B2405C824201D3012000E0002000BD31
:10024000F8B504001F00022C01D3012023E01500A3
@@ -74,11 +74,11 @@
:10048000AD4B1340F6B23202C0218900114019432E
:10049000FF229143EAB20A4361034250610340588C
:1004A000002070BDDCB506000F0010001900069C8E
-:1004B0004901C20E1143400132003B0003F011FD1F
+:1004B0004901C20E1143400132003B0003F0B1FD7F
:1004C000060091204000FFF779FFF106C90E009168
:1004D00071090B051B0D5B1E2200D2B20321C0B2B5
:1004E000FFF7F8FED3BD80B51300A74A13600023C1
-:1004F000137203F0BCFD01BD98E8001000B5C0B256
+:1004F000137203F05CFE01BD9CF2001000B5C0B2A7
:10050000042801D2012000E00020C0B200BD00B5E7
:10051000401A00B2012801DB012000E00020C0B237
:1005200000BD00B5BE490978002901D000201FE0B8
@@ -86,9 +86,9 @@
:10054000891D415C002908D1FC214058002801D1B7
:10055000012000E00020C0B20AE08021490041589B
:10056000FC228058814201D1012000E00020C0B26D
-:1005700000BD00B5C0B264214843642103F0B6FD5C
+:1005700000BD00B5C0B264214843642103F056FEBB
:1005800000BD10B504000800C0B2FFF7F2FF010083
-:10059000A448A2018018406903F08DFF10BD00003F
+:10059000A448A2018018406904F02DF810BD0000A5
:1005A00000000440FF00FFFF10B40021B42281507E
:1005B0009D4A1368BC2403511268C023C2500268CC
:1005C000C423C2500A00F023C254F122815410BC4B
@@ -97,15 +97,15 @@
:1005F000099B002B11D00A9B002B0ED00092009A71
:10060000002A0AD0002808D0E26A824205D30A00F4
:10061000002A02D0616B002901D1002054E00021A2
-:10062000002303F051FF06000F00E06A400800219C
-:1006300080197941E26A002303F053FC0500300081
-:1006400039007A4A002303F03FFF06000F00E06AFA
-:100650000021009A002303F037FF02000B000096F0
+:10062000002303F0F1FF06000F00E06A40080021FC
+:1006300080197941E26A002303F0F3FC05003000E1
+:1006400039007A4A002303F0DFFF06000F00E06A5A
+:100650000021009A002303F0D7FF02000B00009650
:100660000197100019004008CE0730434908009E4A
-:10067000019F8019794103F034FC0600002D0BD056
+:10067000019F8019794103F0D4FC0600002D0BD0B6
:10068000002E09D0BE4802998422520051434018DE
:10069000B8214058B04201D2002015E0606B3018FC
-:1006A000401E616B03F022FD05214843052801D25D
+:1006A000401E616B03F0C2FD05214843052801D2BD
:1006B000052002E0602800D35F2008990D600999A9
:1006C0000E600A9908700120FEBD80B55549800171
:1006D0000818016AC069FFF727FD002801D0012032
@@ -119,17 +119,17 @@
:1007500080B200BD00B58A49842252005043081877
:100760008E21415C00290BD08F21415C002907D0EC
:100770002D490968806B081A332801D2012000E056
-:100780000020C0B200BD00002C120028F8B503F014
-:10079000B6FF002801D1002041E0002425002EE012
+:100780000020C0B200BD00002C120028F8B504F013
+:1007900056F8002801D1002041E0002425002EE079
:1007A00084214900764A6846038828004843101887
:1007B0007426835368460388280048431018762619
:1007C0008353230028004843101878268353164883
:1007D0000368280048431018836323002800484317
:1007E00010188726835501231E002800484310183F
:1007F0008E27C655694350188F2143546D1C042D14
-:1008000008D269462800C0B204F008F80028C7D111
+:1008000008D269462800C0B204F0A8F80028C7D171
:10081000002004E004480068934908600120F2BD0C
-:10082000B01C0028ACDC0010F01B0028A0860100E2
+:10082000C01C0028DCE60010F81B0028A086010090
:10083000FEB58D488D4909680268891A052900D2DC
:100840009DE08A4909680160002452E0D2B2002A82
:100850003ED02000704328187621405A072141439A
@@ -141,14 +141,14 @@
:1008B0008F23C05C0028C9D168460288200070439D
:1008C00028187623C2522000704328188F228154A2
:1008D0002000704328187621415A68460088FFF7A7
-:1008E0002DFF6643A91978228852019804F094F8E4
-:1008F000641C042C43D269462000C0B203F08EFF72
-:10090000002825D104F084F884225200584B21009D
+:1008E0002DFF6643A91978228852019804F034F943
+:1008F000641C042C43D269462000C0B204F02EF8D8
+:10090000002825D104F024F984225200584B2100FC
:10091000514359188725495DFF290AD021005143C9
:10092000591887254D5D6D1C2100514359188726A4
:100930008D552100514359188725495D032904D35A
-:10094000002162439A188E23D15404F065F8CFE752
-:1009500004F05EF8019084267600454D2000704337
+:10094000002162439A188E23D15404F005F9CFE7B1
+:1009500004F0FEF8019084267600454D2000704397
:1009600028187E21405C002884D12000704328187C
:100970009421405C002800D07CE701227BE7F7BD92
:100980000813002810B53A4A84235B004343D21869
@@ -159,16 +159,16 @@
:1009D000135502E000237F2413558A23D35C972408
:1009E00013558223D15400218A23D1549423D15406
:1009F0007E21515C002905D0D34980010818406947
-:100A000004F013F810BD38B5002429E0CF4B13E0F3
+:100A000004F0B3F810BD38B5002429E0CF4B13E053
:100A100084214900164A2000484310188B23C05CEB
:100A20000028F3D020004843101880690028EDD03A
:100A30002000484310188369200048431018962569
:100A4000405D00280BD0094800686143511849698E
:100A5000401A984203D305212000FFF793FF641C3E
-:100A6000042CD5D331BD0000FC1B0028F01B00284E
+:100A6000042CD5D331BD0000041C0028F81B00283D
:100A700008130028F8B500273C0061E1B44AB248E9
:100A8000A1014018016AB048A301C018C06903F071
-:100A9000EEFA84256D00AF4E2000684337502000E9
+:100A90008EFB84256D00AF4E200068433750200048
:100AA0006843301847602000684330188760A648C4
:100AB000A1014018816A200068433018C1602000FD
:100AC00068433018076120006843301847612000F0
@@ -211,7 +211,7 @@
:100D10003900200068433018FF22921D81543900A9
:100D20002000684330188322520081542000684319
:100D30003018FFF739FC65437019FFF7D5FC641CC8
-:100D4000042C00D29AE6F1BDACDC0010B88800009B
+:100D4000042C00D29AE6F1BDDCE60010B888000061
:100D5000941200280813002870B50600BF488421AB
:100D60004900714344183000FFF7AFFC05008820AC
:100D7000205C002805D1852025540120882160545D
@@ -234,8 +234,8 @@
:100E800070BD70B575498422520042438C187E2192
:100E9000615C00296CD08D21615C00292CD1354E1C
:100EA00035689E4980010818806B0021FA22920063
-:100EB000002303F009FB02000B0099480021801871
-:100EC0005941FA22D200002303F00BF8616A691A33
+:100EB000002303F0A9FB02000B00994800218018D1
+:100EC0005941FA22D200002303F0ABF8616A691A93
:100ED00081424DD301208D216054306820636068C9
:100EE00060630020206701007A22A15201007C2269
:100EF000A1528C2160543BE07C20205A0A2810D259
@@ -246,7 +246,7 @@
:100F400020677A20205A401C010089B20A2900D368
:100F500000207A2160527C20205A0A2808D30548B4
:100F60000068216B401AFA2802D301208C216054BA
-:100F700070BD0000F01B002870B50026340019E099
+:100F700070BD0000F81B002870B50026340019E091
:100F800030009021685430009121685411E0300005
:100F9000912168548220285C00280AD1C348006847
:100FA000E96B401A9949884203D305212000FFF7D5
@@ -268,26 +268,26 @@
:1010A000002806D1012091216854804800686864B6
:1010B00070E77E480068696C401A642800D269E7CE
:1010C00004212000FFF75EFC64E770BD38B59E4C3C
-:1010D000200003F0C9FD00281BD0200003F0C9FD4B
+:1010D000200003F069FE00281BD0200003F069FE09
:1010E00072480168491C01600024250003E02800C3
:1010F000FFF732FE6D1C042DF9D3FFF784FCA748DF
:101100000168491C01600168192902D30460FFF7D6
-:1011100033FF31BD8D48006870470000ACDC001023
+:1011100033FF31BD8D48006870470000DCE60010E9
:10112000CF07000070B528250026340009E0022210
:1011300001219B48A301C0181823C05EFFF742F9A4
:10114000641C042CF3D302220121FF204230FFF75C
:1011500039F9934C1820205EFFF730F92B005B1E05
:1011600002220121C0B2FFF76BF81820205EFFF7C2
:1011700025F902220121C0B2FFF764F9350011E020
-:101180008849A8012018406903F008F8A801201830
-:10119000406903F083F90021A8012018406903F099
-:1011A0008EF96D1C042DEBD3012420007E490870BC
+:101180008849A8012018406903F0A8F8A801201890
+:10119000406903F023FA0021A8012018406903F0F8
+:1011A0002EFA6D1C042DEBD3012420007E4908701B
:1011B0003E48066079480660634E7C49300003F083
-:1011C0003BFC300003F055FD300003F047FD784D47
-:1011D000280003F057FD77490020285E03F071FDD9
+:1011C000DBFC300003F0F5FD300003F0E7FD784D67
+:1011D000280003F0F7FD77490020285E03F011FE98
:1011E00003210220285EFEF763FF0220285EFEF73F
-:1011F00053FF0220285EFEF743FF300003F028FD76
-:10120000300003F00CFCAD48047070BDC409000050
+:1011F00053FF0220285EFEF743FF300003F0C8FDD6
+:10120000300003F0ACFCAD48047070BDC4090000B0
:10121000F8B500220121AA48FFF765F90122022151
:10122000A848FFF760F900220121A748FFF75BF902
:10123000A64D012201212800FFF755F900220021C7
@@ -295,31 +295,31 @@
:101250004AF9002205212000FFF745F9002200216C
:101260002800FFF740F9FFF705FC9B480090082095
:1012700000990860994E13243470994FC14A002197
-:10128000380002F0F4FE0625009805603470BD4A6F
-:101290000121380002F0EBFE009805603470B94A75
-:1012A0000221380002F0E3FEF1BD0000F01B00282F
-:1012B00078B58DB06846B449342203F015FD3A483C
-:1012C000007800280BD0B14803F0AFFBB04803F022
-:1012D000ACFBB04803F0A9FBAF4803F0A6FB7C4E83
-:1012E0006A460021300002F0C2FE7A4D6A460421AF
-:1012F000280002F0BCFE6A460521280002F0B7FE75
-:10130000724C6A460021200002F0B1FE002130003C
+:10128000380002F094FF0625009805603470BD4ACE
+:101290000121380002F08BFF009805603470B94AD4
+:1012A0000221380002F083FFF1BD0000F81B002886
+:1012B00078B58DB06846B449342203F0B5FD3A489C
+:1012C000007800280BD0B14803F04FFCB04803F081
+:1012D0004CFCB04803F049FCAF4803F046FC7C4EA0
+:1012E0006A460021300002F062FF7A4D6A4604210E
+:1012F000280002F05CFF6A460521280002F057FF33
+:10130000724C6A460021200002F051FF002130009B
:10131000FEF714FF04212800FEF710FF0521280026
:10132000FEF70CFF00212000FEF708FF01200090CF
-:101330006A460121200002F09AFE01212000FEF7FA
-:10134000F9FE0EB070BD0000000A5840F01B0028E6
+:101330006A460121200002F03AFF01212000FEF759
+:10134000F9FE0EB070BD0000000A5840F81B0028DE
:101350001CB591246400012203212000FFF732F81C
:10136000012000908D4A00238D480021FFF79AF854
:101370002000FFF723F801220321C0B2FFF762F833
-:10138000884C200003F012FE00228749200003F061
-:10139000D3FC2000FEF720FF13BD0000F41B002843
-:1013A000ACDC001004E10010AE1C0028B4E3001017
-:1013B000A0E80010CD100010F2B5060000273C0098
+:10138000884C200003F0B2FE00228749200003F0C1
+:1013900073FD2000FEF720FF13BD0000FC1B00289A
+:1013A000DCE60010ACEA0010BE1C0028B4ED001012
+:1013B000A4F20010CD100010F2B5060000273C008A
:1013C0000098002801D1002077E0380000990880BB
-:1013D00003F01EFBCD490978002903D003F01CFB64
-:1013E00000206AE00121C94A117003F015FB6D4D20
+:1013D00003F0BEFBCD490978002903D003F0BCFB24
+:1013E00000206AE00121C94A117003F0B5FB6D4D80
:1013F0002800FEF7FBFE2800FEF700FF022131481F
-:10140000FEF79CFE012003F059FEB6B23100280021
+:10140000FEF79CFE012003F0F9FEB6B23100280081
:10141000FEF7FCFE01283ED1BD4E00E0761E2800FE
:10142000FEF7E8FE002801D1002EF7D12800FEF7D4
:10143000E1FE00282FD0B64E00E0761E2800FEF711
@@ -328,9 +328,9 @@
:1014600019D1C0200002009909880140814201D1B0
:10147000012400E03C002000C0B200280BD0A548A9
:101480000078002807D000980088FC2189010140DD
-:10149000002900D03C00012003F010FE0221094881
-:1014A000FEF748FE012003F009FE03F0B1FA974968
-:1014B0000F7003F0B1FA2000C0B2F2BDAD1C0028DD
+:10149000002900D03C00012003F0B0FE02210948E1
+:1014A000FEF748FE012003F0A9FE03F051FB974927
+:1014B0000F7003F051FB2000C0B2F2BDBD1C00282C
:1014C00080013140800F31408004314000043140C0
:1014D00080003140800231406412002868120028E8
:1014E0000003314080B5C0B20202FC2080011040F0
@@ -342,14 +342,14 @@
:10154000D1FF002801D100200FE069462800C0B279
:10155000FFF7D5FF002806D068460078E4B2A04225
:1015600001D1012000E00020C0B232BD80B5B44AF4
-:1015700000211160017C1172C168806802F077FD62
-:1015800001BD00006012002880E5001000065840F0
+:1015700000211160017C1172C168806802F017FEC1
+:1015800001BD00006012002880EF001000065840E6
:1015900080065840000758408009584000B4C404F1
-:1015A0000024F4000000644004E40010F8B50126B3
+:1015A0000024F4000000644004EE0010F8B50126A9
:1015B0003000002468460470564804700121A14898
:1015C000FEF7B8FDC24F01213800FEF7B3FD9E4D76
-:1015D000280003F073FD01219C48FEF7ABFD2800B5
-:1015E00003F06CFD02210820FFF7A2FF0500280090
+:1015D000280003F013FE01219C48FEF7ABFD280014
+:1015E00003F00CFE02210820FFF7A2FF05002800EF
:1015F000C0B2002804D000210920FFF799FF0500A0
:101600002800C0B2002804D000210A20FFF790FF74
:1016100005002800C0B2002804D00F210B20FFF7DE
@@ -358,7 +358,7 @@
:101640000D20FFF775FF05002800C0B2002804D068
:1016500000210E20FFF76CFF05002800C0B2002813
:1016600008D087210720FFF73DFF0500FA20800002
-:1016700003F024FD2800C0B2002804D086210720F2
+:1016700003F0C4FD2800C0B2002804D08621072052
:10168000FFF756FF05002800C0B200280ED06946BB
:101690000020FFF734FF002807D068460078BF21FC
:1016A0000140802901D1350000E025002800C0B2AA
@@ -366,13 +366,13 @@
:1016C00014480670B8480068B8490860012138001D
:1016D000FEF734FD07E0B34806700E4804700121A0
:1016E0003800FEF727FD2800C0B2F2BD10B5040097
-:1016F000534A002010601072E168A06802F0B7FC45
-:10170000E168A068FEF71AFD10BD0000B21C0028B9
-:10171000A0860100B51C0028F8B501242000A149CD
+:1016F000534A002010601072E168A06802F057FDA4
+:10170000E168A068FEF71AFD10BD0000C21C0028A9
+:10171000A0860100C51C0028F8B501242000A149BD
:10172000087000252800A949087001216848FEF7C3
:1017300001FD2E000FE0A6480078002805D0A5483E
-:10174000B1014018406903F070F9A248B101401896
-:10175000FFF7CCFF761C042EEDD303F059F900906F
+:10174000B1014018406903F010FAA248B1014018F5
+:10175000FFF7CCFF761C042EEDD303F0F9F90090CF
:10176000280044E02A0011E0B84984225200424394
:1017700089188A228A5C002A07D197228A5C002A6B
:1017800003D198228A5C002AECD022002B007E260E
@@ -382,7 +382,7 @@
:1017C000CE552E009627CE552E009727CE552E00AB
:1017D0008927CE55D2B2002A08D084228B549C226D
:1017E0008A58A023CA5022009823CA54401C0428B7
-:1017F000BAD3009803F010F9F1BD80B573480078B2
+:1017F000BAD3009803F0B0F9F1BD80B57348007812
:1018000000280AD067480078002806D16748664952
:101810000A680368D21A192A00D20FE00968016029
:1018200069460020FFF76BFE002805D06846007867
@@ -397,22 +397,22 @@
:1018B0003FFE06003000C0B2002800D02C7030007F
:1018C000C0B2002801D1FFF727FF3000C0B270BDC1
:1018D0000004314038B504003E48A101451868694C
-:1018E00003F0A3F82800FFF701FF00212000FFF715
+:1018E00003F043F92800FFF701FF00212000FFF774
:1018F000AFFF32BD70B505003648AA018618C9B2DF
:10190000012902D12620345C01E02720345C0F201D
-:10191000E840C00701D400200FE0706903F085F8AB
+:10191000E840C00701D400200FE0706903F025F90A
:101920003000FFF7E3FE2100C9B22800FFF790FF67
-:10193000002801D1002000E0012070BDAB1C002870
-:10194000AC1C002870B504002248A10145183F488E
+:10193000002801D1002000E0012070BDBB1C002860
+:10194000BC1C002870B504002248A10145183F487E
:101950008421490061434018F421465C83214900F9
:10196000415C00290AD08B21415C002906D1F2217B
:10197000465C3100C9B2322900D23226F3214654E6
:10198000FEF712FE3100C9B22000FEF7FAFD002179
-:10199000686902F094FD686903F041F82800FFF7D8
-:1019A000E5FD70BDAF1C0028F01B0028F81B0028C7
+:10199000686902F034FE686903F0E1F82800FFF797
+:1019A000E5FD70BDBF1C0028F81B0028001C0028A6
:1019B00000B50A00D2B2002A07D081228154AD4975
-:1019C0000968016201219522815400BDB51C0028DF
-:1019D000AE1C0028ACDC0010842281549C214158AC
+:1019C0000968016201219522815400BDC51C0028CF
+:1019D000BE1C0028DCE60010842281549C21415862
:1019E000A0228150012198228154704700B59C218A
:1019F0004158491C9C2281509C214158002902D108
:101A000001219C22815000210A008423C254A0227B
@@ -425,8 +425,8 @@
:101A70008A22815497228154012183228154012199
:101A8000FFF7AAFF01BDF3B583B07C480399842218
:101A90005200514344180020694608700025002078
-:101AA000694648700027002069468870002602F0C9
-:101AB000AFFF01909420205C00284DD08220205C54
+:101AA000694648700027002069468870002603F0C8
+:101AB0004FF801909420205C00284DD08220205CBB
:101AC000002849D16E480078002845D12000FEF753
:101AD00028FD002840D06846007CC0B2002809D00C
:101AE00064480068E169401A322835D39520205CAB
@@ -436,10 +436,10 @@
:101B20001AE08A20205C002807D0A068216988423A
:101B300001D2012003E0022001E08020205C694600
:101B4000087068460078002803D001206946487074
-:101B500002E0002069464870019802F05DFF3800FD
+:101B500002E0002069464870019802F0FDFF38005D
:101B6000C0B2002803D00398FFF7B4FE80E06846B7
:101B70004078002801D100207AE068460178039877
-:101B8000FFF7B8FE002801D1002071E002F040FF0D
+:101B8000FFF7B8FE002801D1002071E002F0E0FF6D
:101B900001909420205C002856D08220205C0028F0
:101BA00052D13748007800284ED12000FEF7B9FC0A
:101BB000002849D02000FFF72FFF002804D005217E
@@ -451,18 +451,18 @@
:101C100060540020802160549421605495216054C8
:101C2000812160542000FEF75FFD0398FFF78AFED4
:101C300001266846867007E0FFB2002F03D180209E
-:101C40002554012600E00126019802F0E5FE6846D1
+:101C40002554012600E00126019802F085FF684630
:101C5000807800280AD10A480078002804D1039827
:101C6000FFF738FE002801D1002001E03000C0B2AB
-:101C700005B0F0BDF01B0028B8880000081300284C
-:101C8000AF1C0028F6B583B00D001F000400E4B2BD
+:101C700005B0F0BDF81B0028B88800000813002844
+:101C8000BF1C0028F6B583B00D001F000400E4B2AD
:101C90009C490978002916D0C0B2FEF72FFC002815
:101CA00011D09948007800280DD198480078002874
:101CB00009D16846057068460078012805D0684655
-:101CC0000078022801D001201AE102F0A1FE019063
+:101CC0000078022801D001201AE102F041FF0190C2
:101CD000842676008E4D2000704328188221405CB7
:101CE000002806D1200070432818FEF71AFC0028AF
-:101CF00004D1019802F090FE012001E12000704320
+:101CF00004D1019802F030FF012001E1200070437F
:101D000028187E21415C0CA80078002813D10CA86B
:101D100001700CA8007800280DD12000704328180D
:101D20009522805C002806D020007043281881226C
@@ -471,7 +471,7 @@
:101D500000280CD0C9B2002905D00CA8007869462B
:101D60000978884203D001206946887002E000208B
:101D70006946887068464078002805D0C548A101AA
-:101D80004018406902F051FE0A9902976846027CA9
+:101D80004018406902F0F1FE0A9902976846027C09
:101D900000272000704328188223C7542000704376
:101DA00028187F23C7542000704328188A23C25460
:101DB000029B2000704328180361200070432818FC
@@ -490,16 +490,16 @@
:101E800068460178200070432818802281548248D7
:101E90000168200070432818C161012120007043AF
:101EA0002818942281542000704328189521475403
-:101EB0006643A81981214754019802F0ADFD684698
+:101EB0006643A81981214754019802F04DFE6846F7
:101EC000407800280CD07348A1014018FFF70EFCA1
:101ED00000212000FFF7BCFC002801D101200FE009
:101EE00068468078002801D0002009E00021200009
:101EF000FFF7C9FD002801D0380000E00120C0B282
-:101F000005B0F0BDAD1C0028B01C0028AF1C002897
+:101F000005B0F0BDBD1C0028C01C0028BF1C002867
:101F10000813002880B50121FFF7B5FD01BDF1B51B
:101F200086B05E4806998422520051434418002727
-:101F3000002502F06DFD01908220205C694608704A
-:101F400068460078002803D1019802F065FD9EE004
+:101F3000002502F00DFE01908220205C69460870A9
+:101F400068460078002803D1019802F005FE9EE063
:101F50007F20205C694608748B20205C69464870AD
:101F60009720205C694688700026300082216054EA
:101F700030007E21605430007F2160543000802189
@@ -516,17 +516,17 @@
:1020200068464078002809D19320205C002805D01C
:102030008620205C002801D1012500E03500280021
:10204000C0B2002805D08620205C401C8621605448
-:1020500001E096202654019802F0DEFC0698FFF776
+:1020500001E096202654019802F07EFD0698FFF7D5
:1020600039FC002813D0EDB2002D10D001200390D0
:102070006846007C02900020019000200090002320
:1020800000223900C9B20698C0B2FFF7FBFD07B0C5
-:10209000F0BD0000ACDC0010F01B00280813002885
+:10209000F0BD0000DCE60010F81B00280813002843
:1020A000F1B584B0B14804998422520051434518D7
-:1020B00002F0AEFC0090AE48046883204000285C2B
+:1020B00002F04EFD0090AE48046883204000285C8A
:1020C000002818D07E20285C002814D08B20285CA3
:1020D000002810D19420285C00280CD18220285C94
:1020E000002808D1A3480078002804D1C02028582F
-:1020F000201A322803D2009802F08EFC34E12868BE
+:1020F000201A322803D2009802F02EFD34E128681D
:102100000190F020285CF121695C05290AD2C421E4
:1021100069580391BC216958F122AA5C521CF12331
:10212000EA540CE00100C9B289006918C822895834
@@ -535,92 +535,92 @@
:102150009200AA18DC23D450401C0200D2B2052AF7
:1021600000D30020F022A854C0202C50601A029006
:10217000BC202858201A0021FA22D200002302F0A5
-:10218000A3F9FA229200002301F0ABFE0200A42082
+:1021800043FAFA229200002301F04BFF0200A42040
:102190002858904201D2A4202A58AC202858A421C3
-:1021A0006E580021002302F08FF902000B00700826
-:1021B000002180185941A422AA58002301F091FE61
+:1021A0006E580021002302F02FFA02000B00700885
+:1021B000002180185941A422AA58002301F031FFC0
:1021C00006000198C4216958471ABC202858201AD3
:1021D000322812D33000401CB8420ED2F320285CC3
:1021E000002806D00020F321685400210498FEF74F
-:1021F000C8F9009802F010FCB6E0BC202858201A5C
-:10220000FA2802D30298FA2803D2009802F004FCBC
-:10221000AAE002980021FA22D200002302F054F929
-:10222000FA229200002301F05CFE0400002C03D18E
-:10223000009802F0F1FB97E001980399401A002101
-:10224000AF4A002302F040F902000B0060080021B1
-:10225000801859412200002301F043FE0190B02074
+:1021F000C8F9009802F0B0FCB6E0BC202858201ABC
+:10220000FA2802D30298FA2803D2009802F0A4FC1C
+:10221000AAE002980021FA22D200002302F0F4F989
+:10222000FA229200002301F0FCFE0400002C03D1EE
+:10223000009802F091FC97E001980399401A002160
+:10224000AF4A002302F0E0F902000B006008002111
+:10225000801859412200002301F0E3FE0190B020D4
:1022600028580290F3202C5C0198B421685030006B
:10227000401CB84201D200245BE07F1CB74210D260
:102280002000C0B2322801D2322452E02000C0B275
:102290005F284ED2641D2000C0B2602849D35F245D
-:1022A00047E0019800216422002302F00DF90600A6
-:1022B0000F00029800215A22002302F005F98F42F4
+:1022A00047E0019800216422002302F0ADF9060006
+:1022B0000F00029800215A22002302F0A5F98F4254
:1022C00013D801D3864210D22000C0B2322801D2E6
:1022D00032242EE02000C0B25F282AD2641D2000E4
:1022E000C0B2602825D35F2423E0029800216E222B
-:1022F000002302F0E9F806000F0001980021642293
-:10230000002302F0E1F88F4213D801D3864210D2A5
+:1022F000002302F089F906000F00019800216422F2
+:10230000002302F081F98F4213D801D3864210D204
:102310002000C0B2332807D32000C0B2372801D331
:10232000FB3406E0322404E02000C0B2002800D0D4
:1023300000242000F321695CC0B2884211D0F32050
:10234000285C002806D12000C0B2322802D3280021
:10235000FEF7CAF9F3202C542100C9B20498FEF705
-:1023600010F9009802F058FB05B0F0BD08130028E2
-:10237000F01B0028AF1C0028FEB5A54800780028F7
-:102380005DD002F045FBC3490978002902D002F074
-:1023900043FB54E001273900BE4A1170B8490A785E
-:1023A0006B461A70002422000A7002F035FB684662
+:1023600010F9009802F0F8FB05B0F0BD0813002842
+:10237000F81B0028BF1C0028FEB5A54800780028DF
+:102380005DD002F0E5FBC3490978002902D002F0D4
+:10239000E3FB54E001273900BE4A1170B8490A78BE
+:1023A0006B461A70002422000A7002F0D5FB6846C2
:1023B000007800282BD0250027E026001AE0684688
-:1023C00000783900A94008421ED002F021FB01909C
+:1023C00000783900A94008421ED002F0C1FB0190FC
:1023D00084214900B04A28004843101882235B003A
:1023E000C05C0028E9D069435018FEF79AF800282D
-:1023F000E3D13E00019802F00FFBF6B2002E03D0AD
+:1023F000E3D13E00019802F0AFFBF6B2002E03D00D
:102400002800C0B200F059F96D1C042DD7D3FEF797
:102410000FFAFFF7F2F9250009E02800FFF77FFD2A
:102420002800FFF777FD2800FFF73AFE6D1C042D0A
-:10243000F3D302F0EDFA97490C7002F0EDFAF7BD14
+:10243000F3D302F08DFB97490C7002F08DFBF7BDD2
:10244000964800787047F8B50E000700FFB2704953
:102450000978002904D0C0B2FEF750F8002801D155
-:10246000012046E002F0D4FA04008B4884214900A0
+:10246000012046E002F074FB04008B4884214900FF
:10247000794345188A480078002804D0200002F0EB
-:10248000CBFA012035E0FF20801D285C00280CD00D
+:102480006BFB012035E0FF20801D285C00280CD06C
:10249000310089B2F820285AFEF739F8002804D014
-:1024A000200002F0B9FA012023E082204000285CDD
+:1024A000200002F059FB012023E082204000285C3C
:1024B00000280FD0F620285A310089B2884219D15D
:1024C00000208221490068546D4801780122BA40F9
:1024D00091430170F8202E52FC2028588021490099
-:1024E00068500120FF21891D6854200002F094FAF1
-:1024F0000020F2BD200002F08FFA0120F9E7000071
+:1024E00068500120FF21891D6854200002F034FB50
+:1024F0000020F2BD200002F02FFB0120F9E70000D0
:10250000A0860100F2B50400E4B24149097800292F
:1025100004D0C0B2FDF7F2FF002801D1002025E071
-:1025200002F076FA070084256D005B4E20006843B8
+:1025200002F016FB070084256D005B4E2000684317
:102530003018FDF7F6FF002812D02000684330184D
:10254000FF21891D405C00280AD0684600886C4342
:102550003119F822895A80B2814201D1012400E068
-:102560000024380002F058FA2000C0B2F2BDF3B5E2
+:102560000024380002F0F8FA2000C0B2F2BDF3B542
:1025700081B000262DE000200EE0002482204000E3
:10258000385C0028F7D068460189F620385AFDF7F4
:10259000BEFF0028EFD028002043C0B2002817D18A
:1025A00068460089F6217852FC203858401CFC21EE
:1025B0007850280082214900785431480178B5408C
-:1025C0000D430570AF48B1014018406902F02DFA83
+:1025C0000D430570AF48B1014018406902F0CDFAE3
:1025D000761C042E1AD20125684600792900B140E4
:1025E0000842F5D02C488421490071434718FF2048
:1025F000801D385C0028C0D068460189F820385A10
:10260000FDF785FF0028B8D02C00B7E7F7BD000024
-:10261000AD1C0028F1B5002425002EE084214900DE
+:10261000BD1C0028F1B5002425002EE084214900CE
:102620001D4A68460388280048431018F62683533D
:10263000280048431018FC23C3585B1C280048435B
:102640001018FC26835101231E002800484310184F
:1026500082277F00C655200069435118FF22921D32
:10266000885407480178AB400B4303708548A901A3
-:102670004018406902F0D9F96D1C042DCED3F1BD8C
-:10268000B31C002880B50121054A117080B2FFF704
-:10269000C1FF01BDB11C002808130028AF1C002891
-:1026A000B01C002810B5002404E02000C0B200F0E7
+:102670004018406902F079FA6D1C042DCED3F1BDEB
+:10268000C31C002880B50121054A117080B2FFF7F4
+:10269000C1FF01BDC11C002808130028BF1C002871
+:1026A000C01C002810B5002404E02000C0B200F0D7
:1026B00004F8641C042CF8D310BDFEB50400E4B289
:1026C000B9490978002904D0C0B2FDF717FF0028E6
-:1026D00001D10120D5E002F09BF9019084256D0025
+:1026D00001D10120D5E002F03BFA019084256D0084
:1026E000B24E2000684330187E21415C20006843D0
:1026F00030188322805C6A461070200068433018CE
:102700008A22805C002806D1200068433018972276
@@ -643,17 +643,17 @@
:1028100030189722815468464078002805D0062158
:1028200065437019FFF7D8F80FE0390020006843BE
:10283000301884228154200068433018A02147506A
-:1028400038006543711998228854019802F0E4F821
+:1028400038006543711998228854019802F084F980
:102850007748007800280BD00A4DA001281840695D
-:1028600002F0E3F8A0012818FEF740FF012008E07D
+:1028600002F083F9A0012818FEF740FF012008E0DC
:102870002000FFF72FF8002801D0380000E00120E9
-:10288000C0B2FEBDACDC0010FEB50D000400E4B229
+:10288000C0B2FEBDDCE60010FEB50D000400E4B2EF
:1028900045490978002913D0C0B2FDF72FFE002862
-:1028A0000ED0AC4E307800280AD1684605706846D4
+:1028A0000ED0C04E307800280AD1684605706846C0
:1028B000007832382E2803D25D4D2878002801D0C8
-:1028C00001206FE002F0A4F80190307800280CD1CC
+:1028C00001206FE002F044F90190307800280CD12B
:1028D0002878002809D184256D00344E20006843F3
-:1028E0003018FDF71EFE002804D1019802F094F87C
+:1028E0003018FDF71EFE002804D1019802F034F9DB
:1028F000012057E068460178200068433018F42230
:102900008154002739002000684330188322520088
:102910008154200068433018A421475020006843A8
@@ -665,3115 +665,3275 @@
:10297000684330188B21405C002807D165437019EB
:102980008221405C002801D10127FFE7FFB2002F20
:1029900004D0684601782000FDF7F3FD019802F0AD
-:1029A0003BF80020FEBD0000AD1C002808130028E5
+:1029A000DBF80020FEBD0000BD1C00280813002835
:1029B000F8B5002203920022029201220192002225
:1029C000009200230022C9B2C0B2FFF75BF905B044
-:1029D00000BD38B50400E4B2AE490978002904D03E
+:1029D00000BD38B50400E4B28D490978002904D05F
:1029E000C0B2FDF78BFD002801D100201FE002F0EE
-:1029F0000FF884225200A84B2100514359187E251C
+:1029F000AFF884225200874B2100514359187E259D
:102A0000495D00290CD12100514359189425495D95
:102A1000002905D1544319199522895C002901D058
-:102A2000012400E0002401F0F7FF2000C0B232BD15
-:102A3000AF1C002838B50C000500EDB2002C1FD0EB
-:102A4000C0B2FDF75BFD00281AD06068002817D0DF
-:102A50006168280000F00CFF002811D0207C0028BD
-:102A600003D06068216888420AD3A068002807D094
-:102A70008A48A9014018006B4000A168884201D231
-:102A8000012000E0002032BDF8B50400E4B2814A24
-:102A90001278002A06D00F003900C0B2FFF7CAFF33
-:102AA000002801D0012053E001F0B2FF00908425FE
-:102AB0006D00794E2000684330187E21405C00286C
-:102AC00014D12000684330189421405C00280DD1B7
-:102AD0002000684330189521405C002806D1200072
-:102AE000684330188221405C002804D0009801F02F
-:102AF00093FF01202CE03968200068433018816082
-:102B00007968200068433018C160B96820006843C4
-:102B10003018B8228150F968200068433150397C60
-:102B20002000684330188922815400212000684326
-:102B3000301883228154200068433018FDF7D4FDFB
-:102B40006C433019FDF730FD009801F065FF00205F
-:102B5000F2BD0000B01C002870B50C000500EDB2FD
-:102B6000002C08D04B490978002904D0C0B2FDF7E9
-:102B7000C5FC002801D1012020E001F049FF84229A
-:102B80005200454B2900514359188968216029009A
-:102B900051435918C9686160290051435918B82632
-:102BA0008959A160290051435958E1605543591989
-:102BB0008922895C217401F02FFF002070BDF8B5D7
-:102BC0000D000400E4B233490978002918D0C0B2DE
-:102BD000FDF794FC002813D07348007800280FD12B
-:102BE000C048007800280BD100950098002807D035
-:102BF0002A48A1014018006B40000099884201D288
-:102C0000012036E001F004FF070084256D00B74E77
-:102C10002000684330187E21405C00281BD1200032
-:102C2000684330189421405C002814D12000684388
-:102C300030189521405C00280DD1200068433018E1
-:102C40008221405C002806D1200068433018FDF73F
-:102C500068FC002804D1380001F0DEFE012008E005
-:102C600000986C433119B8228850380001F0D4FE26
-:102C70000020F2BD00B59E4800680021FA22D20073
-:102C8000002301F021FCFA229200002301F029F92F
-:102C900000BD0000AD1C002808130028ACDC0010AB
-:102CA000F8B505000C002E00F6B2002C09D09148B2
-:102CB0000078002805D02800C0B2FDF71FFC0028CE
-:102CC00001D101206CE001F0A3FE070088480168F3
-:102CD00084225200854B300050431818806B091A2B
-:102CE00025703000504318188E25405D002803D011
-:102CF000332901D2012000E00020607030005043F1
-:102D000018188F25405DA0703000504318187425A6
-:102D1000405BE0803000504318187625405B2081EE
-:102D20003000504318187825405B60816E48B5012B
-:102D30004019808FA0816078002808D0A0780028F2
-:102D400005D06089A589A84201D3012000E00020B8
-:102D5000E0703000504318188C25405D002807D0E3
-:102D6000300050431818006F032801D2012000E002
-:102D700000202071564398198B22805C60710800F6
-:102D80000021FA22D200002301F09EFBFA229200D9
-:102D9000002301F0A6F82061380001F03DFE00207C
-:102DA000F2BDA84908707047B01C0028FEB50500A8
-:102DB0000C002E00F6B2002C09D04E4800780028F6
-:102DC00005D02800C0B2FDF799FB002801D10120F1
-:102DD00086E001F01DFE019084214900434A300045
-:102DE000484310188768300048431018C0680090A6
-:102DF0003000484310188923C05C6070300048439D
-:102E000010187E23C05CA070714350188321405C71
-:102E1000E070019801F000FE0098002801D1012027
-:102E20005EE0019700980199884201D200980190D4
-:102E30002D48B1014018C26A257067600098A060F3
-:102E4000226101980021002301F03EFB02000B00EB
-:102E500000984008002180185941009A002301F091
-:102E600040F8E06001980021774A002301F02CFB34
-:102E700002000B0000984008002180185941009A78
-:102E8000002301F02EF860620026A661E6612800AA
-:102E9000C0B2002805D1E0686061E068A0612662E8
-:102EA0001DE0EDB2012D17D1E068606101980021AD
-:102EB000664A002301F008FB02000B00009840085E
-:102EC000002180185941009A002301F00AF8A061FE
-:102ED000E068E061266202E06661E068206200204E
-:102EE000FEBD0000AF1C0028ACDC00100813002859
-:102EF000F01B0028AD1C0028F8B588B00D001600A6
-:102F00000400E4B27A49097800290CD0C0B2FDF778
-:102F1000F5FA002807D077480078002803D17648D2
-:102F20000078002801D001208AE006960795FFF777
-:102F300023FA01F06DFD842676006C4D210071436B
-:102F40006918CF6801F068FD03A8029004A80190F9
-:102F500005A80090069B079A39002000FDF73EFB6C
-:102F6000002801D101206BE001F052FD070061480B
-:102F7000007800280AD160480078002806D1200097
-:102F800070432818FDF7CDFA002804D1380001F06D
-:102F900043FD012054E00799200070432818A42223
-:102FA00081500699200070432818A8228150059965
-:102FB000200070432818AC228150049920007043EF
-:102FC0002818B02281506846017B200070432818E1
-:102FD000F22281546846017B200070432818F322B6
-:102FE000815401212000704328188322520081540B
-:102FF000200070432818FDF7D7FA200070432818E6
-:103000007E21405C00280ED02000704328188B21C0
-:10301000405C002807D16643A8198221405C002843
-:1030200001D1012000E00020C0B2002804D0684691
-:10303000017B2000FDF7A5FA380001F0EDFC00202F
-:1030400009B0F0BDB41C002810270000EC130000EC
-:1030500070B505000C002E00F6B2002C09D02448F3
-:103060000078002805D02800C0B2FDF747FA0028F4
-:1030700001D1012038E001F0CBFC25708422520000
-:10308000B84B31005143591883256D00495D61707B
-:10309000310051435918A425495961603100514309
-:1030A0005918A8254959A160310051435918AC2538
-:1030B0004959E160310051435918B02549592161FE
-:1030C000310051435918B4254959616131005143C8
-:1030D0005918F225495D217656439919F322895CE6
-:1030E000617601F099FC002070BD000008130028F3
-:1030F000AD1C0028B01C0028AF1C0028F1B586B01C
-:103100000C006846007E01900026300030006946C1
-:1031100008743000694688703000694648709248EB
-:103120000078002809D06846007EFDF7E7F90028FE
-:1031300003D08E4D2878002801D0012010E103949F
-:10314000FFF71AF98A48019989014018C76A03985C
-:10315000874201D2012003E101F05AFC029081482C
-:10316000019984225200514344188920205C002890
-:1031700012D0E06800280FD08B20205C00280BD1F3
-:103180008220205C002807D12000FDF7CAF9002822
-:1031900002D02878002804D0029801F03DFC0120DC
-:1031A000DEE003980021E268002301F08DF90200BF
-:1031B0000B0078080021801859413A00002300F0E4
-:1031C00090FE07007E20205C694608702000FEF714
-:1031D0000DFC276101258A20255430008B21605485
-:1031E0003000972160543000832160549420205C8B
-:1031F000002819D0A068874201D1300005E0A068FE
-:10320000B84201D2280000E00220802160549620BC
-:10321000205C00287DD157480068606196202554C5
-:1032200030008621605474E068460078002839D068
-:1032300068460078012802D1A068B84206D36846E3
-:103240000078022804D1A068874201D2280000E05B
-:1032500030009621615C002907D146490968616107
-:103260009621655431008622A154C0B2002850D165
-:103270003F48019989014018406901F0D6FB3000B0
-:103280007E2160543000802160543A480068E0613B
-:1032900094202554684601782000FEF789FB684693
-:1032A000857036E09520205C00281DD0A0688742FC
+:102A2000012400E0002402F097F82000C0B232BD7B
+:102A3000BF1C002810B5040075480078002805D098
+:102A40002000C0B2FDF75AFD002801D1002019E096
+:102A50002000C0B2FFF7BDFF002803D02000C0B2A5
+:102A6000FFF72BFE2000C0B200F0E2FC002807D0E8
+:102A70002000C0B2FFF7ADFF002801D1012000E027
+:102A80000020C0B210BD38B50C000500EDB2002C1E
+:102A90001FD0C0B2FDF732FD00281AD060680028B0
+:102AA00017D06168280000F049FF002811D0207C71
+:102AB000002803D06068216888420AD3A0680028F3
+:102AC00007D0A348A9014018006B4000A1688842C4
+:102AD00001D2012000E0002032BDF8B50400E4B2CC
+:102AE0004B4A1278002A06D00F003900C0B2FFF717
+:102AF000CAFF002801D0012053E002F029F800901D
+:102B000084256D00434E2000684330187E21405CD0
+:102B1000002814D12000684330189421405C00281C
+:102B20000DD12000684330189521405C002806D163
+:102B30002000684330188221405C002804D00098AF
+:102B400002F00AF801202CE03968200068433018B0
+:102B500081607968200068433018C160B96820003E
+:102B600068433018B8228150F9682000684331501A
+:102B7000397C2000684330188922815400212000CC
+:102B80006843301883228154200068433018FDF7D1
+:102B9000ABFD6C433019FDF707FD009801F0DCFF39
+:102BA0000020F2BDC01C002870B50C000500EDB27D
+:102BB000002C08D016490978002904D0C0B2FDF7CE
+:102BC0009DFC002801D1012020E001F0C1FF8422FA
+:102BD0005200104B2900514359188968216029007F
+:102BE00051435918C9686160290051435918B826E2
+:102BF0008959A160290051435958E1605543591939
+:102C00008922895C217401F0A7FF002070BD0000BB
+:102C1000BD1C00280813002818B585B0040020004A
+:102C2000C0B2042801DB012026E02000C0B2FFF77B
+:102C3000D0FE002803D02000C0B2FFF73EFD2000E8
+:102C4000C0B200F0F5FB00280CD02000C0B2FFF7A6
+:102C5000C0FE002806D169462000C0B2FFF7A4FFDD
+:102C6000002801D0012007E0002069460874694669
+:102C70002000C0B2FFF731FF06B010BDF8B50D005F
+:102C80000400E4B275490978002918D0C0B2FDF7F4
+:102C900035FC002813D07248007800280FD1BF48B7
+:102CA000007800280BD100950098002807D028480C
+:102CB000A1014018006B40000099884201D2012018
+:102CC00036E001F045FF070084256D00B54E200079
+:102CD000684330187E21405C00281BD120006843E7
+:102CE00030189421405C002814D12000684330182B
+:102CF0009521405C00280DD12000684330188221C6
+:102D0000405C002806D1200068433018FDF709FC1C
+:102D1000002804D1380001F01FFF012008E00098CE
+:102D20006C433119B8228850380001F015FF00209B
+:102D3000F2BD00B59C4800680021FA22D2000023B1
+:102D400001F062FCFA229200002301F06AF900BD52
+:102D5000DCE60010F8B505000C002E00F6B2002CE1
+:102D600009D03E480078002805D02800C0B2FDF701
+:102D7000C5FB002801D101206CE001F0E9FE07004D
+:102D80008948016884225200864B3000504318184D
+:102D9000806B091A25703000504318188E25405D4D
+:102DA000002803D0332901D2012000E00020607008
+:102DB0003000504318188F25405DA07030005043FC
+:102DC00018187425405BE0803000504318187625B1
+:102DD000405B20813000504318187825405B6081AB
+:102DE0006F48B5014019808FA0816078002808D015
+:102DF000A078002805D06089A589A84201D30120C8
+:102E000000E00020E0703000504318188C25405D31
+:102E1000002807D0300050431818006F032801D253
+:102E2000012000E000202071564398198B22805C1D
+:102E3000607108000021FA22D200002301F0E4FBB7
+:102E4000FA229200002301F0ECF82061380001F032
+:102E500083FE0020F2BDA84908707047BD1C002801
+:102E6000C01C0028FEB505000C002E00F6B2002C98
+:102E700009D0A2480078002805D02800C0B2FDF78C
+:102E80003DFB002801D1012086E001F061FE0190A8
+:102E900084214900434A30004843101887683000B5
+:102EA00048431018C0680090300048431018892328
+:102EB000C05C60703000484310187E23C05CA07076
+:102EC000714350188321405CE070019801F044FE8A
+:102ED0000098002801D101205EE001970098019937
+:102EE000884201D2009801902D48B1014018C26A71
+:102EF000257067600098A06022610198002100237E
+:102F000001F082FB02000B000098400800218018AD
+:102F10005941009A002301F084F8E06001980021F3
+:102F2000774A002301F070FB02000B000098400874
+:102F3000002180185941009A002301F072F8606264
+:102F40000026A661E6612800C0B2002805D1E0682D
+:102F50006061E068A06126621DE0EDB2012D17D12D
+:102F6000E068606101980021664A002301F04CFB93
+:102F700002000B0000984008002180185941009A77
+:102F8000002301F04EF8A061E068E061266202E0F3
+:102F90006661E06820620020FEBD0000BF1C0028C2
+:102FA000DCE6001008130028F81B0028F8B588B0EC
+:102FB0000D0016000400E4B25049097800290CD035
+:102FC000C0B2FDF79BFA002807D0774800780028A8
+:102FD00003D176480078002801D001208AE00696C7
+:102FE0000795FFF7C9F901F0B3FD842676006D4D12
+:102FF000210071436918CF6801F0AEFD03A802906B
+:1030000004A8019005A80090069B079A39002000AB
+:10301000FDF7E4FA002801D101206BE001F098FDF2
+:1030200007006148007800280AD16048007800282D
+:1030300006D1200070432818FDF773FA002804D148
+:10304000380001F089FD012054E007992000704309
+:103050002818A42281500699200070432818A8221D
+:1030600081500599200070432818AC2281500499A2
+:10307000200070432818B02281506846017B200050
+:1030800070432818F22281546846017B2000704367
+:103090002818F3228154012120007043281883222C
+:1030A00052008154200070432818FDF77DFA20005B
+:1030B000704328187E21405C00280ED02000704309
+:1030C00028188B21405C002807D16643A81982216B
+:1030D000405C002801D1012000E00020C0B200289F
+:1030E00004D06846017B2000FDF74BFA380001F060
+:1030F00033FD002009B0F0BDC41C0028BD1C002811
+:1031000010270000EC13000070B505000C002E0025
+:10311000F6B2002C09D026480078002805D02800F7
+:10312000C0B2FDF7EBF9002801D1012038E001F031
+:103130000FFD257084225200B84B310051435918BD
+:1031400083256D00495D6170310051435918A425F4
+:1031500049596160310051435918A8254959A16066
+:10316000310051435918AC254959E16031005143B0
+:103170005918B02549592161310051435918B425D6
+:1031800049596161310051435918F225495D217651
+:1031900056439919F322895C617601F0DDFC002029
+:1031A00070BD000008130028C01C0028BF1C0028A8
+:1031B000BD1C0028F1B586B00C006846007E019069
+:1031C0000026300030006946087430006946887077
+:1031D00030006946487092480078002809D0684657
+:1031E000007EFDF78BF9002803D08E4D287800284B
+:1031F00001D0012010E10394FFF7BEF88A4801993D
+:1032000089014018C76A0398874201D2012003E16F
+:1032100001F09EFC029081480199842252005143A2
+:1032200044188920205C002812D0E06800280FD0C4
+:103230008B20205C00280BD18220205C002807D145
+:103240002000FDF76EF9002802D02878002804D06D
+:10325000029801F081FC0120DEE003980021E26881
+:10326000002301F0D1F902000B007808002180183A
+:1032700059413A00002300F0D4FE07007E20205C74
+:10328000694608702000FEF7B1FB276101258A20FE
+:10329000255430008B216054300097216054300059
+:1032A000832160549420205C002819D0A0688742B4
:1032B00001D1300005E0A068B84201D2280000E04A
-:1032C000022080216054206AE061942025549620D9
-:1032D000205C00281DD12748006860619620255495
-:1032E00030008621605414E0A068874206D1300087
-:1032F000862160542000FEF7ABFB0AE0A068B842CC
-:1033000002D26846057402E00220694608746846E5
-:103310004570029801F080FB68468078002809D04B
-:103320000198FEF7D7FA002801D0300000E028000D
-:10333000C0B215E068464078002810D00020039005
-:103340000020029000200190002000903B0001220C
-:103350006846017C6846007EFEF794FC00E0002091
-:1033600007B0F0BD08130028AD1C0028AF1C0028D2
-:10337000ACDC0010F01B0028FEB5C0B20400FDF765
-:10338000C9FE019010E0FFB2002F46D0FDF7C2FE4B
-:103390000199401A9349884241D234480078002864
-:1033A00001D001F05DFF30BFFEF7E6FF02F013F839
-:1033B00001F02EFB009084256D002B4E2000684309
-:1033C00030189521475C8848007800281AD12000E1
-:1033D00068433018FDF7A5F8002813D02000684393
-:1033E00030187E21405C00280CD120006843301842
-:1033F0009421405C002805D1654370198221405C0E
-:10340000002801D0012500E00025009801F004FB10
-:10341000EDB2002DB7D0002002E0012000E0002036
-:10342000FEBD0000FBB51700089C0299002901D1E0
-:10343000002C18D0060001F0EBFA842252006B4BEE
-:10344000310051435D58564399194E6801F0E4FA32
-:103450000298002803D00198281A02990860002CCD
-:1034600001D0F01B2060F7BD08130028B41C002811
-:10347000F9B585B00D0016006846047D0698002851
-:1034800002D00020069908606846007DFFF774FFAF
-:10349000002801D10120A2E02F0001F0B9FA0500B7
-:1034A00030000021FA229200002301F00DF8020002
-:1034B0000B00B348002180185941FA22D2000023A2
-:1034C00000F00FFD49498422520062438918886147
-:1034D000280001F0A1FA00200390002002900120B2
-:1034E000019001200090002300223900C9B26846F3
-:1034F000007DFEF7C7FB002801D001206FE001F03E
-:1035000087FA3A498422520062438918C96A0191B4
-:1035100001F082FA0FE0FFB2002F4FD1EDB2002D83
-:1035200002D1F6B2002E49D0D0480078002801D050
-:1035300001F096FE30BFFEF71FFF01F04CFF01F0D7
-:1035400067FA84225200294B2100514359184968D7
-:10355000009121005143591883254F5D21005143AB
-:1035600059187E254D5D6243991894228E5C01F0B6
-:1035700053FA00980199401A0428CCD36846007D7C
-:10358000FFF79BF8002805D16846007DFFF7F4FEA1
-:10359000002809D1069800900023019A00212000FC
-:1035A000FFF740FF01201AE0069800900023019ADF
-:1035B00000212000FFF736FF002010E06846007D64
-:1035C000FFF77BF86846007DFFF7D6FE069800906F
-:1035D0000023019A00212000FFF724FF012007B0FB
-:1035E000F0BD0000C4090000AF1C0028081300282B
-:1035F000F1B586B00E0015006846047E3000C0B2FA
-:10360000022803D102206946087402E003206946BB
-:10361000087405930598002802D0002005990860D9
-:103620000C98002802D000200C9908606846007EA3
-:10363000FFF7A2FE002801D1012014E12F0001F0C4
-:10364000E7F9050038000021FA229200002300F07B
-:103650003BFF02000B004A48002180185941FA2222
-:10366000D200002300F03DFC9D49842252006243B9
-:1036700089188861280001F0CFF90020039000200C
-:1036800002900120019001200090002300223100CF
-:10369000C9B26846007EFEF7F5FA002801D0012085
-:1036A000E1E001F0B5F984256D008D4E21006943FC
-:1036B0007118896A0291210069437118C96A0191E0
-:1036C00001F0AAF913E068464078002800D0B9E07C
-:1036D00068460078002803D1FFB2002F00D1B1E086
-:1036E00062480078002801D001F0BAFD30BFFEF733
-:1036F00043FE01F070FE01F08BF92100694371185F
-:103700008322895C6A4651702100694371187E22C8
-:10371000895C6A46117021006943711894228F5C9C
-:103720002100694371189522895C6A46917001F005
-:1037300073F9684640786946097C8842C3D1684677
-:1037400000780028BFD13800C0B20028BBD168463D
-:103750008078002816D06846007EFFF70DFE00280E
-:1037600010D16846007EFEF7A8FF0C980090059BDC
-:10377000019A02992000FFF755FE012073E000BF77
-:10378000CF07000001F044F907002000684330181B
-:103790008321405C6946097C88421FD12000684330
-:1037A00030187E21405C002818D120006843301872
-:1037B0009421405C002811D12000684330189521E5
-:1037C000405C00280AD1200068433018FCF7A9FEAD
-:1037D000002803D043480078002810D0380001F0BA
-:1037E0001BF96846007EFEF768FF0C980090059B69
-:1037F000019A02992000FFF715FE012033E0200016
-:1038000068433058039020006843301840680090A7
-:1038100000206C4331198B228854380001F0FCF8E9
-:103820000598002804D003980299401A0599086069
-:103830000C98002804D000980199401A0C9908604F
-:10384000002010E06846007EFEF737FF6846007EE5
-:10385000FFF792FD0C980090059B019A02992000B9
-:10386000FFF7E0FD012007B0F0BD0000B41C002808
-:10387000F2B582B01C4980010818806A00216A46AE
-:1038800003C2083A64240025684603C84622002380
-:1038900000F01AFE22002B0000F023FB06000F00B0
-:1038A000684603C88222002300F00EFE22002B008F
-:1038B00000F017FB029A082A0FD3029A0023BB429A
-:1038C0000BD301D8B24208D3029A0023994204D301
-:1038D00001D8904201D3012000E00020C0B2FEBD1B
-:1038E00008130028AF1C0028ACDC0010F9B58FB01D
-:1038F0000F0016000FA80478002004900020079005
-:1039000000200A90002000200020002009900020C4
-:10391000089032206946487301250020002069463E
-:103920000871002069460875002005A9487000202C
-:1039300006902448007800281FD00FA80078FCF7D4
-:10394000DDFD002819D020480078002815D11F4837
-:103950000078002811D10296029800280DD0684600
-:1039600007736846007B002811D06846007B012859
-:103970000DD06846007B022809D01098002804D09A
-:1039800005A803C8109A03C2083A012012E201F008
-:103990003FF8009084277F000D4E200078433018B8
-:1039A000FCF7BFFD002815D1009801F035F81098FC
-:1039B000002804D005A803C8109A03C2083A0120C1
-:1039C000F8E100BFAD1C0028B01C0028AF1C002887
-:1039D00008130028200078433018C0680B90009826
-:1039E00001F01AF80FA80078FEF767FE002800D053
-:1039F00095E16846007B002860D107A8009004ABE1
-:103A0000029A02210FA80078FFF7F2FD05002800B6
-:103A1000C0B200282BD10798042828D20AAB029AFA
-:103A200001210FA80078FFF723FD05002800C0B290
-:103A300000281CD107A8009004AB029A02210FA80D
-:103A40000078FFF7D5FD05002800C0B200280ED190
-:103A5000079800210022401C514102000B000A98E7
-:103A600000218B4203D801D3824200D201252800D5
-:103A7000C0B2002820D100F0CBFF00902000784396
-:103A80003018FCF74EFD002804D1009800F0C4FF68
-:103A9000012544E100212000784330188160012194
-:103AA00020007843301889228154009800F0B4FF38
-:103AB00001206946087521E101251FE16846007B68
-:103AC000012830D10020009004AB029A01210FA8F8
-:103AD0000078FFF78DFD05002800C0B2002820D136
-:103AE00000F096FF0090200078433018FCF719FD95
-:103AF000002804D1009800F08FFF01250FE10B99F9
-:103B0000200078433018816001212000784330186C
-:103B100089228154009800F07FFF012005A9487098
-:103B2000ECE00125EAE0002000900023029A022147
-:103B30000FA80078FFF75CFD05002800C0B2002840
-:103B400028D100F065FF0500200078433018FCF70D
-:103B5000E8FC002804D1280000F05EFF0125DEE02B
-:103B6000002120007843301881602000784330180D
-:103B700089228154280000F04FFF01206946087512
-:103B80000020009004AB029A01210FA80078FFF7F3
-:103B90002FFD05002800C0B2002800D0ADE0049938
-:103BA0002000FFF765FE002800D1A6E000F030FFFE
-:103BB00021007943711883225200895C6A4691730F
-:103BC000210079437118A42289580D91210079436D
-:103BD0007118A82289580C9100F01EFF6846807B5E
-:103BE00000280ED003A8401C029008A8019009A844
-:103BF00000900C9B0D9A04992000FCF7EFFC69469D
-:103C0000087100F005FF0090200078433018FCF7A1
-:103C100088FC002804D1009800F0FEFE01257EE01B
-:103C20000499200078433018C1600499200078433B
-:103C30003018816001212000784330188922815496
-:103C40006846807B00284FD06846007900281FD046
-:103C50000999200078433018AC228150089920003F
-:103C600078433018B02281506846417B2000784369
-:103C70003018F22281546846417B20007843301886
-:103C8000F3228154200078433018FCF78DFC2BE0A0
-:103C900000210A0020007843301883235B00C254BF
-:103CA000200078433018A422815020007843301837
-:103CB000A8228150200078433018AC228150200087
-:103CC00078433018B0228150200078433018B42255
-:103CD00081503221200078433018F2228154200094
-:103CE00078433018F3228154009800F095FE0120AB
-:103CF00005A948700498069000E001252800C0B28C
-:103D000000280CD16846007B022808D000F080FE15
-:103D1000210079437118C968069100F07DFE2800E2
-:103D2000C0B200283CD034480078002803D10FA846
-:103D30000078FEF7C2FC00F06BFE00906846007B46
-:103D4000022808D16846007D002804D0049920008C
-:103D50007843301881600B99200078433018C16097
-:103D600000210A002000784330188923C2540A0039
-:103D70002000784330188B23C25420007843301839
-:103D8000962281541C480078002801D0072000E0CA
-:103D900008207C43311983228854009800F03CFEAF
-:103DA0001098002804D005A803C8109A03C2083A46
-:103DB0002800C0B211B0F0BD38B500200F4908701E
-:103DC000FDF726FAFDF7C4FAFDF7F0FB050000F059
-:103DD00096FC0400FDF7A6F9EDB2002D06D0E4B282
-:103DE000002C03D0FCF7D2FC002803D1FDF794FC93
-:103DF000012000E0002032BDAF1C0028B01C0028CC
-:103E0000D021890040587047C22189004058C00520
-:103E1000C00D704790229200815070478221890026
-:103E20004058C005C00D704700B50068800B800782
-:103E3000800F002801D1802000E0402000BD00B5A7
-:103E4000C02189004058C006C00E082801D20120B8
-:103E500000E00020C0B200BDF8B504000D0016005F
-:103E60002000FFF7ECFF002809D02F000025B54205
-:103E700010D22000FFF7C4FF78556D1CF7E72F0024
-:103E8000002505E02000FFF7BBFF690078526D1C9C
-:103E9000B542F7D3F1BDF8B507000D0016003800A4
-:103EA000FFF7B2FF0400A64200D23400290022002E
-:103EB0003800FFF7D1FF2000F2BDF8B505000C0077
-:103EC00000262800FFF7B0FF07002800FFF7A6FF35
-:103ED000874204D021002800FFF79CFF0126300014
-:103EE000F2BD12422DD0994231D970B500251B4246
-:103EF00009D00C00002112E0110000F0F7F80A00D0
-:103F00000021002370BD0942F6D000240126491883
-:103F10006441944200D3A41A7641F8D331000126BB
-:103F200001E0764109D2001864416D41A41A9D4117
-:103F3000F7D2A4185D41B619F5D3300022002B004A
-:103F400070BD1B42CFD108B502F0D2FD08BD01D132
-:103F50009042CAD202000B000021002070470000EE
-:103F600070B55F4BC018C00900015E4BC31804292F
-:103F70000CD21F251C68CE002800B0408443D2B26A
-:103F80001540C800854025431D600CE0FC311F250D
-:103F90005C68CE002800B0408443D2B21540C8000F
-:103FA000854025435D6070BD00B5002A03D1012224
-:103FB0008A40426002E001228A40826000BD30B443
-:103FC00003008C000F25596C2800A0408143154048
-:103FD000A5400D435D6430BC704730B4030001253B
-:103FE0009C6C28008840844315408D4025439D6487
-:103FF00030BC704730B403000125DC6C28008840D9
-:10400000844315408D402543DD6430BC704730B497
-:1040100003004C0010340325D96C2800A0408143D4
-:104020001540A5400D43DD6430BC70474269012254
-:104030008A4042614069704730B4030001259C69A1
-:1040400028008840844315408D4025439D6130BC45
-:10405000704730B403004C000325196C2800A040C1
-:1040600081431540A5400D431D6430BC7047F8B531
-:1040700004000025002C30D01600002E2DD00F009B
-:10408000326839002000FFF78FFF327A39002000B4
-:10409000FFF766FF726939002000FFF79EFFB269E3
-:1040A00039002000FFF7A6FFF26939002000FFF772
-:1040B000AEFF726839002000FFF781FFF268390017
-:1040C0002000FFF7C6FF39002000FFF7AFFF32697D
-:1040D00039002000FFF7B0FF00E0034D2800F2BDDB
-:1040E0000000CFBF0000304001005A000022030A48
-:1040F0008B420BD203098B4219D243088B422ED23A
-:10410000411A00D20146524110467047FF2209026F
-:104110003FD012068B4205D3121209028B4201D303
-:104120001212090203098B4219D300E0090AC309DC
-:104130008B4201D3CB01C01A524183098B4201D378
-:104140008B01C01A524143098B4201D34B01C01A63
-:10415000524103098B4201D30B01C01A5241C308DB
-:104160008B4201D3CB00C01A524183088B4201D34A
-:104170008B00C01A524143088B4201D34B00C01A36
-:104180005241884200D3401A5241CFD201461046D4
-:10419000704708B502F0AEFC08BD0000F8B5012379
-:1041A0001A00002800D151E1002900D14EE1A84AAF
-:1041B00012680C7AA74D1540A4048022D202144044
-:1041C0002C430322CE681640A34D25403604C0245C
-:1041D000A40234402C430D786E07760F9F4D254086
-:1041E0003606E024E40434402C438E789C4D254070
-:1041F000B4078026F60534402C4328254D5D012662
-:10420000B4431D40254334240C5D0226B5436400AD
-:10421000022634402C430D7F0426B443AD0004260F
-:10422000354025434C7F0826B543E400082634403A
-:104230002C4340254E5D1E408A4D2540B402802609
-:10424000F60034402C4340254D5DEDB26D081E0054
-:104250002E40F6B2844D254074028026B6003440CC
-:104260002C4370254E5D814D25403402802676001A
-:1042700034402C4371254E5D16407D4D254036035C
-:10428000C024A40134402C4304600C7A002C02D1D9
-:104290000023836006E00C7A012C02D14B69836015
-:1042A00000E083600B6A03614B6A4361CB6A836100
-:1042B0000B6BC3614B6903628B6943626D4B1C6876
-:1042C0004423CB5CDBB2FF25AC4323434C240C5D81
-:1042D000E4B2694D1D402404FF231B0423402B43FB
-:1042E0005C240C5DE4B21D022D0A23062B436C24D2
-:1042F0000C5DE4B2614D1D402402FF231B022340EC
-:104300002B4343645E4B1B6864240C5DE4B25B4D3D
-:104310001D402402FF231B0223402B4354240C5D29
-:10432000E4B2FF25AB431C438464564B1C68412315
-:10433000CB5C13400325AC43234360240C5D144045
-:10434000514E1E40A302C0252D011D403543482378
-:10435000CE5C16403023DB4330241D40370127401C
-:104360002F4350254D5D1540484E3E402F02C0253D
-:10437000AD003D40354358268E5D1640C027BD43F5
-:10438000B701C0263E402E4368254D5D15400C27E1
-:10439000BE43AF000C253D403543C5643C4D2D6800
-:1043A00007267227CF5D374000970727BD432F00B0
-:1043B000009D3D437327CF5D3E407027BD433701CD
-:1043C00070263E402E43466535254D5D8567314D4F
-:1043D0002D680E7C16400327BD432E43CD7C15402F
-:1043E000C027BE43AF01C0253D4035434E7C16403B
-:1043F0000C27BD43B7000C263E402E438D7C2A403F
-:104400003340120114401C430465234A1268CB88D0
-:1044100094B21A0422438B889BB21B0A9BB2174C9E
-:1044200014401B02FF2212021A4022430B78052B74
-:1044300005D10979C9B2FF239A43114304E04978B1
-:10444000FF239A43C9B21143016300221000F2BD59
-:1044500080E90010FFFFFBFFFFFFFCFFFFFFFFF8FD
-:10446000FFFFFFBFFFFBFFFFFFFDFFFFFFFEFFFFA3
-:10447000FFCFFFFF84E90010FFFF00FFFF00FFFFF9
-:1044800088E900108CE90010FFF3FFFFFFFCFFFF3D
-:1044900090E9001094E9001098E90010016880226A
-:1044A00012060A430260704701684900490801602A
-:1044B00070474068704701617047006970478160CC
-:1044C0007047006A7047000030B4434351435D18A1
-:1044D000010C0C00130C5C432D1980B2434392B2C3
-:1044E00051430024C918644124040B04090C091920
-:1044F0005043C018694130BC7047000000B5022825
-:1045000001D301200FE00B00DBB2042B01DB012003
-:1045100009E0BE4B80001818C9B2405C824201D34A
-:10452000012000E0002000BDF8B504001F00022CAF
-:1045300001D3012023E015000E002A003100C9B28A
-:104540002000FFF7DBFF012801D1012017E0300038
-:10455000C0B2002816D1FF2F12D8AD486103401811
-:10456000A90040188021490140180168A94A0A4061
-:104570003902FF231B020B40134303600020F2BDEE
-:104580000120FCE7F6B2012E16D1802040028742BE
-:1045900010D29F4861034018A9004018A02149018A
-:1045A000401801689C4A0A403902C94B0B4013432A
-:1045B0000360E3E70120E2E70120E0E700B2001238
-:1045C000C0B27047F8B505000F001600280000B211
-:1045D000FFF7F4FF04002000C0B2022801D301203D
-:1045E0002CE032003900C9B22000C0B2FFF786FFCC
-:1045F000012801D1012021E085482100C9B24903E9
-:1046000041182A00D2B292008918C02212018A5899
-:10461000B0491140FFB23B02C02292001A400A4347
-:10462000FF218A43F1B21143E4B262038018EDB274
-:10463000AA008018C022120181500020F2BD70B57E
-:104640000400022C01D3012028E015000E002A00EE
-:104650003100C9B22000FFF751FF012801D101202C
-:104660001CE06B4861034158802212060A43C021B6
-:1046700089041143FF2212040A43964B1340F6B2F9
-:104680003202C021890011401943FF229143EAB24E
-:104690000A436103425061034058002070BD70B569
-:1046A0000400022C01D3012028E015000E002A008E
-:1046B0003100C9B22000FFF721FF012801D10120FC
-:1046C0001CE05348610341588022D2050A43C021AF
-:1046D00089041143FF2212040A437E4B1340F6B2B1
-:1046E0003202C021890011401943FF229143EAB2EE
-:1046F0000A436103425061034058002070BDF8B581
-:1047000098B00BA8342102F007FA9A4803C801AA0E
-:1047100003C2083A03A8A549202200F0E5FAAA48F6
-:104720000078002801D001206DE000252C0007E072
-:104730002800A649620088522800A5490855641C33
-:10474000062C14D2A348142161434118097A0BAAFC
-:1047500011720BAA14216143411849681423634361
-:10476000C058FFF784FC0028E2D000204BE06846E8
-:1047700000F0B2F8002801D1002044E000980021A8
-:10478000962292000023FFF79FFE934A00231218FF
-:104790004B4110001900914A0023FFF7A2FB0028AB
-:1047A00000D1012003AFB8818D4E300002F032FA03
-:1047B00001A9300002F0CAF9002801D0002022E04F
-:1047C0002C0006E0142060432818C06802F020FB8B
-:1047D000641C062C13D27F4D142060432818007CE3
-:1047E000787103A9142060432818C06802F016FAF3
-:1047F0000028E7D0300002F00DFA002003E001208D
-:1048000071490870012019B0F0BD000098E800104F
-:1048100000000440FF00FFFFFF0000FFF8B584B078
-:104820000E00C0B2029000252800694608800421CD
-:104830002A0003AC200002F05FF92C0062480078E7
-:10484000002806D0674F3878002802D10298062841
-:1048500001D3002039E0012038705E48029914220B
-:1048600051434018C0680190019800F0A1F80198E8
-:1048700002F0DAFA019800F07FF800281FD003AAAE
-:104880006946019802F0D6FA002818D103A8C0782A
-:10489000002814D0684600880005000D694608808D
-:1048A000684600884949029A5200885201244848C3
-:1048B00002994454002E02D0684600883080019846
-:1048C00000F076F83D702000C0B205B0F0BD0000E9
-:1048D00000FFFF00FFFCFFFFF8B50700002000907D
-:1048E000FF262C363000FFF769FE0500002F04D0AC
-:1048F000684602F0AFFF002801D0002038E00098A1
-:10490000394940183949FFF7F1FB0400002C02D067
-:104910003748844201D300202AE0042201212800E4
-:10492000FFF7BDFE002801D0002021E00422012174
-:104930003000FFF747FE002801D0002018E0631E7A
-:10494000042201212800FFF7EFFD002801D00020FC
-:104950000EE0042201212800FFF771FE002801D09B
-:10496000002005E000982100FFF7C0FB386001201F
-:10497000F2BD000070E800107CB505001D4C06215A
-:1049800000226E46300002F0B7F86946280002F0B7
-:104990003DFB68460078002803D1641E002CF4D14A
-:1049A00001E0012000E0002076BD00008CE6001050
-:1049B000E0B511490CC9083969460CC10839694686
-:1049C00002F0CEFA07BD0000A31C0028901B0028AF
-:1049D000A81B0028A4DF0010FFC99A3B00CA9A3B1D
-:1049E00000109040A41C00285F8DCB00608DCB0090
-:1049F00001000100A086010078E80010000000001E
-:104A0000801C800803D0401C801EFCD100BF704772
-:104A1000EFF3108072B6704780F310887047403013
-:104A2000016810220A430260704740300168082282
-:104A30000A43026070470000F8B5012422004C23AD
-:104A4000CB5C052B03D24D23CB5C052B01D310008F
-:104A5000E2E0002800D1DEE0002900D1DBE06F4A6F
-:104A600012684B7923406E4D15409B048022D20280
-:104A700013402B4303228D7915406A4E1E402B04B0
-:104A8000C025AD021D40354307230E7A1E40664FF8
-:104A90002F403606E025ED0435403D43CE79634F87
-:104AA0002F40B5078026F60535403D430E7D012792
-:104AB000BD4326402E4324254D5D0227BE436D0095
-:104AC00002273D40354305600D79060030360096DB
-:104AD000009E3668FF27BE43EDB23543009E356029
-:104AE0004D79012D0BD18C79002C02D100248460EA
-:104AF00006E08C79012C03D10C68846000E08460AE
-:104B0000CC6804610C694461CC6984610C6AC4613D
-:104B10000C680462464C25680C7EE4B2FF26B5435F
-:104B20002C4330254D5DEEB2424D25403604FF2426
-:104B3000240434402C4340254D5DEDB22402240A68
-:104B40002E06264348240C5DE7B2FF2424023A4D8A
-:104B50002E403F02274037434764384E3668382797
-:104B6000CF5DFFB20097FF27BE43009F3743282643
-:104B70008E5DF6B23D40360234402C438464304CA6
-:104B800025688C7D14400326B5432C4325254E5DB6
-:104B900016402C4D2540B602C024240134402C433D
-:104BA0002C254D5D15403026B4432E01302535406F
-:104BB000254334240C5D1440234E2E402502C0248E
-:104BC000A4002C4034433C254D5D1540C026B44321
-:104BD000AE01C0253540254344240C5D22400C2401
-:104BE000A54394000C2222402A43C264174A146849
-:104BF0004C228A5C1A400725AC4322434D240C5DAD
-:104C000023407024A2431C017023234013434365B7
-:104C1000497D816700221000F2BD00006CE90010A0
-:104C2000FFFFFBFFFFFFFCFFFFFFFFF8FFFFFFBFE2
-:104C300070E90010FFFF00FFFF00FFFF74E90010A4
-:104C400078E90010FFF3FFFFFFFCFFFF7CE9001095
-:104C50000168802212060A430260704778300168BA
-:104C600001220A4302607047C16F0800C007C00FED
-:104C70007047010070310A68012313430B60006F15
-:104C80007047000030B5010000221000134B1B6874
-:104C9000002914D08C786407640F0725AB431C43AC
-:104CA0000B79002B01D00122FFE763005B08D207DC
-:104CB0001A430B4B0024095F89005A5000E0064854
-:104CC00030BD00B5074A1368002B03D0126800B24C
-:104CD0008000115000BD00000100560068E900107E
-:104CE000008020402412002870B4103A03D378C901
-:104CF000103A78C0FBD2530701D318C918C001D5A8
-:104D000008C908C0D20704D30B880380891C801C03
-:104D1000002A01D50B78037070BC70478B0701D156
-:104D20008307E1D0124205D00B78491C0370401C68
-:104D3000521EF9D170470000F7B5AD4BAD4A15686A
-:104D4000AD4A1668AD4A12680192AD4A12680092E7
-:104D5000002422002200002800D11EE10A00002ABF
-:104D600000D11AE15168002901D1936805E051682A
-:104D7000022901D1230000E0022311695769B942D9
-:104D800001D3116900E05169092909D29D492940DF
-:104D90002125555D002D15D080256D000D4313E0B4
-:104DA000112905D2974F2F408021C9013943EFE7E0
-:104DB000212905D2934F2F40802109023943E7E78B
-:104DC0008B48EBE0904D0D40D168491E0907090F53
-:104DD0000F27BD4329438D4D0D40802149042943B0
-:104DE0000160117F002901D0210000E0012101258F
-:104DF0000127BE43294031430E005168090929406B
-:104E00000227BE434900022739403143D67E10278E
-:104E1000B943360110273E400E43517E2027BE4342
-:104E200049012027394031431668012E00D0250062
-:104E30004E007608E90731430425A9435D000426A6
-:104E400035400D4308218D43D900082319402943DB
-:104E5000537F6D4D0D40190280235B00194029439B
-:104E6000957F80239B006A4E0E40690219403143B2
-:104E7000D67F684D0D40B1028026F60031402943AF
-:104E80002025565D644D2940F60280273F013E40B3
-:104E90000E4311798F07BF0F5C4931403F06C02692
-:104EA000B6043E400E430662167E009F56493940C6
-:104EB000360280277F003E400E43977E54493140A2
-:104EC0007E021E400E431169491EC906C90E1F27E6
-:104ED000BE433143C026B60081512421515CC9B282
-:104EE0000091C121890041180E68FF27BE43009F31
-:104EF00037430F60167E019F4349394036028027B1
-:104F00007F003E400E435169491EC906C90E1F2746
-:104F1000BE4331438026B60081512C21515CC9B279
-:104F200000918121890041180E68FF27BE43009F30
-:104F300037430F60116B1B4E8151916A184E81519E
-:104F40003821515CF026360186190096009E37689C
-:104F50002F4E3E4049020B40334300990B603921EC
-:104F6000515CF4221201821813681D40C90280238B
-:104F70001B011940294311600B4944500298002835
-:104F80000AD002980460029884610298C460029872
-:104F9000C46126480299086223001800FEBD000083
-:104FA000C80F0000880F0000C80E00001B490160F8
-:104FB000C02189040162FF220832C02189004250C9
-:104FC0000021C1239B00C15080239B00C25081223D
-:104FD00092008150124A8150154A8150114A8150E5
-:104FE000114A8150134A8150134A81507047000082
-:104FF0000140AA0050E9001054E9001058E90010DF
-:105000005CE90010FF3FFFFFFFFEFFFFFFFFFFFC1B
-:10501000FFFDFFFFFFFBFFFFFFF7FFFF0F00000398
-:10502000C80E0000C80F0000880F0000EFCDAB00D5
-:10503000880E0000080F0000480F0000F8B50400BB
-:105040000D00334F387800280ED02D4E18222D49F0
-:10505000300002F049FC0020F075CF2040002A49C2
-:105060000860002002F0A0FC2000290001223A7014
-:1050700080225204002399420AD301D8904207D3D8
-:10508000244A04000D0024A003C80019694102E06D
-:105090000200002000211D4B00241C60204D2A60CE
-:1050A000214A146005221A601A68D203FCD51C60DC
-:1050B0000029DDD10028DBD13C70F1BD70B50500C1
-:1050C000184E306800280ED10D4C18220D492000D2
-:1050D00002F00AFC0020E075E52040000A49086063
-:1050E000002002F061FC2C0030681049FEF7FEFF42
-:1050F000002122000023FFF7E7F9FFF79FFF70BDB3
-:10510000181B002804E30010E81B002810E000E052
-:10511000AA1C0028FFFFFF00010000FFFFFFFFFFA8
-:1051200014E000E0841C002818E000E040420F007A
-:1051300043490A680860704742490A680860704736
-:1051400041490A680860704740490A6801239A4348
-:10515000C0B20300DB07DB0F13430B6070473B4912
-:105160000A6810239A43C0B200011023184010436C
-:105170000860704735490A68354B1340C0B20002D9
-:10518000802252001040184308607047314801687F
-:1051900001220A430260704710B5FFF739FC040092
-:1051A00000F024F80020FFF7C3FFFA20C001FFF74A
-:1051B000C3FF0020FFF7C4FF0020FFF7C5FF012059
-:1051C000FFF7CDFF0020FFF7D5FF00F004F8200027
-:1051D000FFF722FC10BD80B5FFF71AFC1E490A68D4
-:1051E000032313430B60FFF717FC01BD80B5FFF7E6
-:1051F0000FFC19490A6803239A43012313430B60E8
-:105200000A6803239A43022313430B60FFF704FC4D
-:1052100001BD80B5FFF7EAFF104801688022120641
-:105220000A430260FFF7D7FF01BD80B5FFF7DEFF3D
-:105230000A480168490049080160FFF7CCFF01BD39
-:1052400004C0264008C026400CC0264010C026409E
-:10525000FFFEFFFF44C0264040C0264000C026405D
-:1052600080B5FFF7C3FFFFF791FFFFF7B4FF01BD64
-:1052700070B53021002422008B4D280001F03CFC49
-:10528000E0212200894D280001F036FC042631007F
-:105290002200874D280001F02FFC2200854D3100AF
-:1052A000280001F029FC200083490870A44804600C
-:1052B00002F0E4FD03F032FB03F0C6FE04F072F8E6
-:1052C000002809D004F071F8002805D003F040FF51
-:1052D000002801D103F0B0FF04F028FB002804D11E
-:1052E000062004F0D3FD002016E0FDF7C3FC95492D
-:1052F0000860954908609549086095490860954996
-:1053000008600120054908700F21054A1170054AFF
-:105310001170B7490870012070BD00000313002808
-:10532000041300280513002838B584B0B14800687C
-:10533000002802D0022004F0A9FD04F0BAFD04F018
-:10534000CDFD00282BD003F0F7FB00280ED0AA4893
-:10535000008803F0D7FB012457480470FDF78AFC4E
-:10536000A649401876490860B4480470002001003E
-:1053700008E002004C4B0C00E4B20C256C431B19F6
-:105380009A72491C0A00D2B2042AF2D39C490870CE
-:105390000120AB49087002E0684600F0B9FB68469E
-:1053A00004F00CFB002808D00098C0218900884236
-:1053B000F2D0684604F0E8FDF1E700F073FE02F079
-:1053C0005BFE03F00AFB00F0CCFE00F00FFF01F0E3
-:1053D00069FA05B030BDF8B502E0684600F098FB08
-:1053E000684604F0EBFA002808D00098C021890034
-:1053F0008842F2D0684604F0C7FDF1E77D480068B6
-:10540000002802D0022004F041FD04F052FD00F01B
-:10541000A8FE01F047FA05B000BDF1B503F08CFB22
-:1054200007006846008803F06DFB68460088FDF7BA
-:10543000F1F8FCF7A1FF0026340018E02000C0B20C
-:1054400000F071F80500684601882800C0B2FCF73A
-:10545000FAFF684601882800C0B202F019FD124820
-:105460002100C9B20C22514340188672641C2000EE
-:10547000C0B20428E2D3624806700F207149087058
-:105480007149087001206E49087059490870FFB2CF
-:10549000002F07D008490870FDF7ECFB574940186A
-:1054A00027490860F1BD0000AC1A0028181900282F
-:1054B000601C0028681C0028C81C002800B5401A81
-:1054C000002801D4012000E00020C0B200BD00B5DA
-:1054D000401A00B2012801DB012000E00020C0B228
-:1054E00000BD00B500281BD0002919D002780B7828
-:1054F0009A4215D142784B789A4211D182788B78B2
-:105500009A420DD182888B889A4209D1C288CB8871
-:105510009A4205D100890989884201D1012000E021
-:105520000020C0B200BD00B50100C9B2042903D2F9
-:105530004649C0B2085C00E00420C0B200BD0000D3
-:10554000641C00286C1C0028701C0028741C002897
-:10555000781C00287C1C002810B50C000100C9B282
-:10556000042901D2002C01D1002006E0C0B2FFF7CF
-:10557000DAFF2100C0B203F06DF910BD00B50028BC
-:1055800002D04178042901D3002013E001780A29D0
-:1055900002D001780B2904D10189FA208000484308
-:1055A00008E00189002901D0008903E028494078FA
-:1055B0008000085800BD00B5002802D041780429B9
-:1055C00001D3002012E00178032903D0214940785B
-:1055D000085C0BE00089401D0A21FEF787FD322898
-:1055E00000D23220602800D35F20C0B200BD00008E
-:1055F00006130028DC1B00289E1C0028B80B0000A6
-:10560000C41C002800B5144B1870144B1970002AE4
-:1056100005D01178124B19709188124A1180C0B2CE
-:10562000002803D001209C49087002E000209A491C
-:10563000087001200249087000BD00000613002810
-:10564000031300280413002805130028A8E90010FC
-:1056500044E80010ACE90010C11C0028C21C00285E
-:10566000C31C00289E1C0028F8B50500002D05D09D
-:105670000C00002C02D01600002E01D1002039E0D1
-:105680000A2100222700380001F036FA68682070ED
-:105690006868000A03210A00024062700200D2B268
-:1056A00092080A40A2706A68120CA280AA68E2807E
-:1056B000AA68120C22812A68C0239B009A4202D158
-:1056C0002A7B082A03D001203070002012E0F0224B
-:1056D0000240102A03D00220307000200AE0207817
-:1056E000401E022802D9C01F072801D8012001E06E
-:1056F00031700020F2BD00B5002801D0002901D191
-:10570000002054E04278042A03D3042008700020CB
-:105710004DE00278092A05D002780E2A02D00278DC
-:105720000F2A06D14278002A03D0042008700020F6
-:105730003DE00278032A09D18278012A0DD08278CF
-:10574000022A0AD005200870002030E08278002A62
-:1057500003D005200870002029E00278521E13D0E3
-:10576000521E25D0521E37D0521F012A44D9921EF4
-:105770004DD0521E59D0521E3ED0521E63D0521EE2
-:105780006DD0521E79D083E0C2887C4B9A4207D2FA
-:105790000289002A08D000896438794A904203D3EC
-:1057A00006200870002002E000200870012000BDE3
-:1057B000C28812B2734BD218734B9A4207D2028935
-:1057C000002A08D0008964386D4A904203D306202D
-:1057D00008700020EBE7E7E7C288643A684B9A421A
-:1057E00005D20089694A8018694A904203D306208D
-:1057F00008700020DBE7D7E7C288002A02D10089C1
-:10580000002803D0062008700020D0E7CCE7C2882B
-:10581000AE4B9A4204D100890A38AD4A904203D374
-:10582000062008700020C2E7BEE7C288A94B9A4252
-:1058300004D100890A38A64A904203D30620087092
-:105840000020B4E7B0E7C288A34B9A4202D1008996
-:10585000002803D0062008700020A8E7A4E7C2882B
-:10586000012A02D0C288022A02D10089002803D06E
-:105870000620087000209AE796E7C288002A02D125
-:105880000089002803D00620087000208FE78BE7EE
-:105890000320087000208AE7C71C002800B501001B
-:1058A000C9B2012902D0C0B2022801D1012000E012
-:1058B0000020C0B200BD10B504002000C0B2FFF748
-:1058C000EDFF00280AD12000C0B2032806D0200036
-:1058D000C0B20A2802D0E4B20B2C01D1012000E0B2
-:1058E0000020C0B210BD80B58EB00100C9B204293D
-:1058F00008D27A490200D2B20C235A438918897A15
-:10590000002901D001200EE06946C0B2FFF724FE55
-:10591000002806D068463221405C002801D00120D2
-:1059200000E00020C0B20FB000BD00B56C480078A8
-:10593000002801D0012000E00020C0B200BD38B531
-:105940008EB067480478002510E069462800C0B290
-:10595000FFF702FE002808D068463221405C00288C
-:1059600003D020000124AC4004436D1C2800C0B2C9
-:105970000428EAD32000C0B20FB030BD11270000C8
-:10598000FDE9000010270000214E0000D4FEFFFFBB
-:10599000BD02000038B58EB000252C0018E0694625
-:1059A0002800C0B2FFF7D8FD002810D06846417823
-:1059B000042908D04178072905D04178082902D068
-:1059C0004078092803D120000124AC4004436D1C19
-:1059D0002800C0B20428E2D3FCF732FD002802D030
-:1059E00020000F2404432000C0B20FB030BD38B5F2
-:1059F0008EB000252C0010E069462800C0B2FFF7E9
-:105A0000ABFD002808D068463421405C002803D054
-:105A100020000124AC4004436D1C2800C0B20428BF
-:105A2000EAD32000C0B20FB030BD80B5FFF787FFCA
-:105A30000100002005E00A00D207D20F8018C9B289
-:105A400049080A00D2B2002AF5D1C0B202BD10B591
-:105A50008EB0002418E069462000C0B2FFF77CFD3C
-:105A6000002810D068463221415C00290BD0017813
-:105A7000052926D00178062923D00178072920D0CE
-:105A8000007808281DD0641C2000C0B204281AD257
-:105A900012482100C9B20C2251434118897A0029C9
-:105AA000D9D02100C9B20C225143415C0A2906D049
-:105AB0002100C9B20C225143405C0B28CBD10120FC
-:105AC00002E0012000E000200EB010BD5AA5000049
-:105AD0004F020000524B00003CC30000AC1A0028EB
-:105AE000C41C002810B5002400E0641C2000C0B2D3
-:105AF00004280AD22000C0B2FFF715FDC0B2FCF79F
-:105B000068FF0028F1D0012000E0002010BD000057
-:105B100070B592B0012421006A461170AF490A683D
-:105B2000521C0A606A4601A9FFF79EFD002805D0B5
-:105B3000694601A8FFF7DFFD00280AD1A8480168DF
-:105B4000491C016001AA684601780220FFF75AFD4E
-:105B5000BCE101AD2878092836D0A2480178002997
-:105B60001ED0A988A04A1288914219D19F48007876
-:105B700000280BD09E4901A8FFF7B3FC002805D0F0
-:105B800001AA00210320FFF73DFD08E094480168C9
-:105B9000491C016001AA08210220FFF733FD95E1AD
-:105BA0000078002810D090480188A888FFF78FFC63
-:105BB000002809D18A480168491C016001AA08210E
-:105BC0000220FFF71FFD81E12000864908702000B8
-:105BD00086490870A88884490880854801A94CC96D
-:105BE0004CC00C390C38287809280CD1A888FFF74C
-:105BF00014FC01AA00210420FFF704FDBB48016842
-:105C0000491C016062E128780F280CD1A888FFF7B1
-:105C100004FC01AA00210120FFF7F4FCB34801684D
-:105C2000491C016052E12878082815D102F084FF50
-:105C3000002803D0A888FFF7F0FB03E0A988687864
-:105C400000F056F901AA00210120FFF7DBFCA7486C
-:105C50000168491C016039E128780C2813D1687863
-:105C60008440C348017821430170C24801780C4345
-:105C7000047001AA00210120FFF7C4FC9B480168C1
-:105C8000491C016022E128780D283BD16878FFF794
-:105C90002AFE002809D0CA480168491C016001AAEF
-:105CA00009210220FFF7AEFC10E104F017F90028EB
-:105CB0000BD1FCF7C5FB002807D16878FFF733FC50
-:105CC000C0B202F09BFD002805D101AA0B210220E1
-:105CD000FFF798FCFAE0A64801786A782300934021
-:105CE0000B430370A34801786A7894400C43047016
-:105CF00001AA00210120FFF785FC7C480168491CAE
-:105D00000160E3E004F0EAF8002805D001AA0B21C5
-:105D10000220FFF777FCD9E028780E286AD102F03C
-:105D20000BFF002807D102F0DEF8002803D1FFF7AF
-:105D3000FCFD002809D0A2480168491C016001AAA5
-:105D400009210220FFF75EFCC0E0FFF750FE0F289C
-:105D50000CD003F02DFB002801D00D2100E007211D
-:105D600001AAC9B20220FFF74DFCAFE004F086F8AB
-:105D700003F069FA002808D1032004F087F801AA8B
-:105D80000E210220FFF73EFCA0E020008D490870A4
-:105D9000FCF770FF8C494018C0490860A988E88862
-:105DA000C0B202F0C6FD002807D101AA0E210220D0
-:105DB000FFF728FCBA48047088E00F206C4908708F
-:105DC0006C490870B648047001AA00210120FFF751
-:105DD00019FC46480168491C016077E0481C00280E
-:105DE0004C1C0028C51C0028A01C0028C61C00282C
-:105DF0009C1B002802F0A0FE002809D07048016812
-:105E0000491C016001AA09210220FFF7FBFB5DE0AC
-:105E10002878FFF743FD00281DD004A96878FFF714
-:105E20009BFB002805D101AA0E210220FFF7EAFB07
-:105E30004CE004A83421405C00280CD103F0B8FAEF
-:105E4000002801D00D2100E0072101AAC9B20220DB
-:105E5000FFF7D8FB3AE0FFF7FAFD002809D05848D1
-:105E60000168491C016001AA09210220FFF7CAFB51
-:105E70002CE028780A2802D028780B2811D102F0CB
-:105E800032F8002803D1FFF750FD002812D04C480B
-:105E90000168491C016001AA09210220FFF7B2FB39
-:105EA00014E06878FFF71FFD002811D0A9886878F2
-:105EB00000F01EF801A800F05FF801AA00210120FF
-:105EC000FFF7A0FB09480168491C016012B070BDD2
-:105ED000FFF7ABFD0428EDD339480168491C016088
-:105EE00001AA0A210220FFF78DFBEFE7541C0028CE
-:105EF000F8B504002000C0B2042837D20F002000FB
-:105F0000C0B2FFF710FB06000125390089B2280056
-:105F1000B040C0B2FCF72BFBFCF72EFA390089B277
-:105F20003000C0B2FCF78FFABFB239003000C0B207
-:105F300001F0AEFF0020AB492200D2B20C235A433D
-:105F400089188872A8490A782800A04082430A70FC
-:105F5000074801782A00A2400A43027005480178E8
-:105F60002A00A2400A430270BD480570F1BD00003E
-:105F7000041300280513002838B501004C78994D0A
-:105F80002000C0B20C22504328180A22FEF7C6FE99
-:105F9000012001002200D2B20C235A43AA189172A8
-:105FA00091490A780300A34013430B70AD490A7866
-:105FB0000300A34013430B70A949087031BD0000D2
-:105FC000501C0028C81C0028B80B0000F8B50400BD
-:105FD0006078FFF7A8FA05002000FFF7CFFA070066
-:105FE0002000FFF7E8FA06002078FFF764FC00289D
-:105FF00015D003F043FF03F026F9002804D1032055
-:1060000003F044FF002047E003F038FF01209649E9
-:106010000870FCF72FFE95494018954908602078D4
-:10602000012808D0022811D003281BD00A2824D028
-:106030000B2829D02FE0A08800903300DBB23A0073
-:10604000E1882800C0B202F093F925E0A088009012
-:106050003300DBB23A00E18809B22800C0B202F096
-:10606000C7F919E0A08800903300DBB2E288A1787C
-:106070002800C0B202F0E4F90EE0A288390028003E
-:10608000C0B202F01EFB07E0A28839002800C0B2AF
-:1060900002F065FB00E00020F2BD0000641C002857
-:1060A00006130028F8B584B0FCF7E4FD009003F077
-:1060B00015FF002806D16F4801680098FFF7FEF928
-:1060C000002800D14BE0002000E0401C0100C9B2D4
-:1060D000042944D20326684F39780D183540414CC5
-:1060E0002900C9B20C2251436118897A0029ECD0E9
-:1060F00001A82900C9B20C22514361180A22FEF7F7
-:106100000DFE00202900C9B20C225143611888728B
-:10611000012435490A782000A84082430A702800EB
-:10612000401C06403E70009864305249086001A847
-:10613000FFF74CFF002804D101AA0E210220FFF72F
-:1061400061FA484801782200AA400A4302704B488D
-:1061500001782200AA400A4302704148047005B049
-:10616000F0BD38B58EB0002435E069462000C0B2DD
-:10617000FFF7F2F900282DD0414D2000C0B2285C75
-:1061800000280AD03F482100C9B2382251434118A3
-:10619000684600F079F800281CD03A482100C9B2BE
-:1061A00038225143401869463822FEF79DFD0120F0
-:1061B00001002200D2B2A9542A490A780300A34060
-:1061C00013430B702D490A780300A34013430B704F
-:1061D00023490870641C2000C0B20428C5D30FB046
-:1061E00030BD0000AC1A0028C41C002838B51E4C75
-:1061F0002078002832D002F09FFC00282ED1FCF736
-:1062000039FD0500FFF791FB002807D101F06BFE77
-:10621000002803D1FFF766FC002804D01348281893
-:10622000134908601AE0124801682800FFF746F990
-:10623000002813D003F022FE03F03CF8002803D11D
-:10624000032003F023FE09E003F018FE0020207075
-:106250000120034908700F200849087031BD000073
-:106260000313002804130028C81C0028B80B0000E2
-:10627000641C00286C1C0028C91C00280513002879
-:10628000601C00281819002800B502780B789A4283
-:1062900027D142784B789A4223D182788B789A42E0
-:1062A0001FD1C278CB789A421BD142684B689A4280
-:1062B00017D13022825C3023CB5C9A4211D132223A
-:1062C000825C3223CB5C9A420BD13122825C312337
-:1062D000CB5C9A4205D13422805C3422895C8842AE
-:1062E00001D0012000E00020C0B200BD00B5007860
-:1062F00000280FD0022811D00ED304280CD00FD3C1
-:1063000006280FD00ED308280CD00BD30A280DD0A6
-:106310000AD30DE000200CE001200AE0022008E092
-:10632000032006E0042004E0062002E0072000E04D
-:10633000072000BD00B5407800280ED0022810D0FC
-:106340000DD3042811D00ED3062812D00FD308285D
-:1063500013D010D3092812D013E0002012E001203E
-:1063600010E002200EE003200CE005200AE00420EB
-:1063700008E0062006E0072004E0092002E00B20E8
-:1063800000E0092000BD7CB5FFF7D9FA0400FFF753
-:1063900001FB0500684602F0DCFB002805D06846DA
-:1063A0004078032801D1012600E0002603F096FD85
-:1063B000002808D003F09CFD002801D1032000E054
-:1063C0000420C0B21BE0FFF742FB002801D00520EB
-:1063D00015E0EDB2002D06D1F6B2002E03D103F088
-:1063E00087FD002801D0042009E0E4B2002C03D18D
-:1063F00002F0A2FB002801D0022000E0012076BDBF
-:10640000F8B584B0FFF79BFA69464871FFF7C2FA06
-:106410000400FFF7ECFA69460871FFF718FB6946BC
-:10642000C87002A802F095FBC0B2002805D002A8EF
-:106430004078032801D1012000E000202100C9B2EA
-:1064400000290AD1C0B2002807D103F051FD00286D
-:1064500003D102F0ADFF002801D0012500E00025A6
-:10646000934806780F273E40FFF78DFF0001304329
-:10647000694688708F480078694648708E48007871
-:106480006946087003F02AFD002801D0102600E0BC
-:10649000002602F051FB002801D0202000E000205F
-:1064A0006946C978002901D0402100E000216A46F0
-:1064B00052793A40164330430143E80108433C40D7
-:1064C000694609790A012243BB4909780F40D02364
-:1064D0003B43694689786C46647824020C43B7498B
-:1064E0000988090421436C462478C0B20002204385
-:1064F000D2B214040443DBB21A062243B04803F0BC
-:106500009DFA05B0F0BDF1B594B0AE4814A9097874
-:106510000C2251434018019006A914A80078FFF7F7
-:106520001BF8002801D10020C0E006A8FFF7DEFE1E
-:10653000040006A8FFF7FEFE070006A8C07869461B
-:10654000087006A83221405C002803D006A830213C
-:10655000455C00E00025079869464880994814A9E1
-:1065600009780C2251434018807A002817D00198EE
-:1065700000780A2803D0019800780B2801D1042460
-:1065800000E001240127019880786946087001988D
-:106590008088694648800198FFF70DF8050006AE2F
-:1065A0003220305C002808D1864814A909780C22D2
-:1065B00051434018807A002802D00420059001E061
-:1065C000002005903420305C002802D00820049080
-:1065D00001E0002004903420305C002805D00998A8
-:1065E000002802D11020039001E000200390342005
-:1065F000305C002809D00A98002806D009980A992A
-:10660000884202D32020029001E00020029070789E
-:10661000042802D14020019001E000200190707810
-:10662000072803D0FBF70CFF002801D0802000E0F2
-:106630000020694609788907890F059A0A43049959
-:106640001143039A0A4302991143019A0A431043E2
-:106650003421715C002907D00D998C4A914201D3F5
-:106660008B4A02E00D9A00E08A4A14A90978E4B244
-:1066700023071B0FFFB23C01F02626401E433302C6
-:106680000B43C0B200041843694649880906014318
-:106690006846408880B2000A80B292B21302034377
-:1066A000EDB22A061A437C4803F0C8F915B0F0BDD4
-:1066B000C11C0028C21C0028C31C0028F1B590B0E2
-:1066C00001A910A80078FEF747FF002801D100209B
-:1066D00070E0802040020499814203D36D496A46EC
-:1066E000518002E004996A4651800599814203D3A2
-:1066F00068486946088002E005986946088007985E
-:1067000019303221FDF7F2FC0400FF2C00D9FF24E0
-:1067100001A84078042801D1012700E0002701A842
-:106720004078072803D0FBF78BFE002801D0022514
-:1067300000E0002501A84078082801D1042600E0E7
-:10674000002601A84078092803D002F031FE002875
-:1067500001D0082100E000213D432E4331430F20AA
-:1067600001AA93780340090119433123D25C1040F8
-:106770004A4A10AB1B78D25C1201024310A8007881
-:10678000C9B20B02034368464088010419436846B6
-:106790000088E4B223040343D2B212061A434048ED
-:1067A00003F04CF9002801D1002003E010A8007884
-:1067B00000F00AF811B0F0BDD01C00289E1C002883
-:1067C00001030000AC1A002878B585B00400200051
-:1067D000C0B2042809D22000C0B2FEF7A4FE694668
-:1067E000C0B2FCF75DFA002801D0002031E0684615
-:1067F0004178002901D0012100E000218278002A9F
-:1068000001D0022200E00022C378002B01D0042333
-:1068100000E000230579002D01D0082600E00026C5
-:106820004579002D01D0102500E000250A431343CF
-:106830001E433543E4B2EDB22A022243C188090463
-:1068400011430389808902041A43C120800003F0A8
-:10685000F5F806B070BDE0B5684602F07AF9002898
-:1068600001D1002011E068460178427812020A4303
-:1068700081780B041343C178090619438388C088C3
-:1068800002041A43844803F0D9F80EBD1127000012
-:1068900010270000FFFF000002030000681C002812
-:1068A00003030000F8B5FCF7E5F904007B4D296807
-:1068B0002000FEF703FE002805D00120784908706B
-:1068C000200064302860774D29682000FEF7F6FD2F
-:1068D000002805D001207449087020006430286029
-:1068E00072480078002814D1714801682000FEF732
-:1068F000E5FD00280DD06F4A6F4800781070012028
-:106900006E490B781278050095401D430D7067495C
-:1069100008706B480078002814D16A48016820008C
-:10692000FEF7CCFD00280DD0674A6848007810704B
-:10693000674901200B781278050095401D430D70C2
-:106940005F490870564D287800281ED0FFF758FD83
-:10695000002815D0002028705E490A78521C1207C2
-:10696000120F0A705C490A78002A04D05B4A107042
-:106970005B4A107008705B480168491C016003E0C5
-:1069800059480168491C016085E0474D2878002876
-:106990000FD0FFF760FF002806D000202870514874
-:1069A0000168491C016003E04F480168491C01600F
-:1069B00071E0002500E06D1C2800C0B204282CD234
-:1069C0000127AF403D4E30783842F4D02800C0B2A5
-:1069D000FFF799FD00281BD03078B843307033485A
-:1069E000017800290FD033490978EDB28D420AD1E0
-:1069F00031490A78521C9207920F0A7000210170E7
-:106A000019342B48046037480168491C016003E0D1
-:106A100035480168491C01603DE0002500E06D1C1F
-:106A20002800C0B2042836D20127AF40284E307863
-:106A30003842F4D02800C0B2FFF740FE002825D02D
-:106A40003078B843307029482900C9B2415C491CEC
-:106A50000907090F2A00D2B2815419480178002988
-:106A60000FD019490978EDB28D420AD117490A7839
-:106A7000521C9207920F0A700021017019341148BC
-:106A8000046018480168491C016003E01648016869
-:106A9000491C0160FFE7F1BD06030000701C0028DF
-:106AA000031300287C1C002806130028CE1C002895
-:106AB000741C0028CC1C0028CA1C002804130028C1
-:106AC000CF1C0028781C0028CD1C0028CB1C0028D7
-:106AD00005130028D01C0028C71C0028C11C002852
-:106AE000C21C0028581C00285C1C0028681C0028B8
-:106AF00070470000704700001206130A1A43130C77
-:106B00001A4300BF094205D0830707D00270401C1A
-:106B1000491EF9D1704700000022FFE71300103929
-:106B200006D330B41400150010393CC0FCD230BC80
-:106B3000490700D30CC000D504C0890002D30280ED
-:106B4000801C002900D5027070470000F8B50200D3
-:106B500000231800A94C2468002959D000920A7813
-:106B60001207120F009D10352E680F27BE433243C7
-:106B70002A604A78FF25AC43D2B222438C78002C9D
-:106B800001D0012400E01C009D4D1540240280220C
-:106B9000520014402C430122CE781640994D2540D6
-:106BA00074028026B60034402C430D79002D01D0AC
-:106BB000160000E01E00944D2540B4028026F60029
-:106BC00034402C434D79002D01D0160000E01E000A
-:106BD0008E4D254074078026B60534402C438D79B0
-:106BE000002D01D0160000E01E00A14D2540B40785
-:106BF0008026F60534402C43C979002901D01300C2
-:106C0000FFE762005208D9071143009A116000E0C3
-:106C10009848F2BD0021016001617047F0B585B070
-:106C20000C000025019594490E6894490968049167
-:106C300093490968039193490F6893490968029140
-:106C4000002C00D1D4E00090009800F0E7F8029901
-:106C50008020C0000843802189000143802040003B
-:106C600008430222024301210A4304201043009AF0
-:106C7000106120784007400F072296433043627826
-:106C80005207520F70239843120170261640064394
-:106C90000322A07810407D4B33400602C0208000C4
-:106CA00030401843E378002B01D00B0000E02B00AC
-:106CB000774E0640D80280231B01184030432379C9
-:106CC000002B01D00B0000E02B0046007608D8070F
-:106CD0003043009B186060798006800E049B3F263D
-:106CE000B3431843A3791340C026B0439B01C02689
-:106CF0001E400643E07943075B0F664830401E02A2
-:106D0000E023DB0033400343207A002801D00D004C
-:106D1000FFE75F4E1E40E80280231B01184030430E
-:106D2000657A1540874B03402D03C0208001284021
-:106D30001843A57A1540844B0340AD03C0200002E0
-:106D400028401843A3891D052D0D804B03402D04B9
-:106D50007F4828401843A37B0B4045006D08D807A7
-:106D60002843009B5860E07B4007400F039B0725AA
-:106D7000AB431843237C0B404025A8439B0140258F
-:106D80002B400343607C014080208343C801802165
-:106D900008401843A17C6F4B03400902FF2000020A
-:106DA00008401843E17CC906C90E6B4B0340090437
-:106DB000F820400308401843217D0A4067490140FC
-:106DC0009205C02000041040084300998860E08AC2
-:106DD000390C090480B20843218B82B208041043A5
-:106DE0000099C86021001A31009800F055F801E0C0
-:106DF00020480190019805B0F0BD0000C0E80010E7
-:106E0000FFFEFFFFFFFDFFFFFFFBFFFFFFFFFFDFB9
-:106E10003830016801220A43026070473830016847
-:106E200001229143016070473C30016801220A430E
-:106E30000260704710B503000020002916D0002A18
-:106E400014D05B6A1C000C80190F0C00E407E40FDF
-:106E50001470990F0C00E407E40F9470590F0C00A4
-:106E6000E407E40F5470D90FD17000E0014810BD61
-:106E7000FFFFFFBF0100DA00C4E80010C8E80010FF
-:106E8000CCE80010D0E80010D4E80010FFFCFFFFB1
-:106E9000FFF7FFFFFFF8FFFFF0B50A00002319001E
-:106EA0006F4C2468002A49D05579002D01D0012665
-:106EB00000E01E006B4D2540B4028026F6003440F1
-:106EC0002C431579002D01D0012600E01E00664DEF
-:106ED000254074028026B60034402C43D578002D1E
-:106EE00001D0012600E01E00604D254034028026BE
-:106EF000760034402C435578002D01D0012500E068
-:106F00001D000226B4436D00022635402543147847
-:106F1000002C01D0012400E01C0001260127BD4304
-:106F200034402C439278002A00D11E00042294435E
-:106F3000B20004231A402243826100E0474908005E
-:106F4000F0BD0000FFCFFFFFFF3FFFFFFFFF00F09E
-:106F50000000FF0FFF00FFFFFFFFE0FFFFFF3FFF0D
-:106F6000F0B50A0000231900414C2468002A49D0DA
-:106F70005579002D01D0012600E01E00394D254035
-:106F8000B4028026F60034402C431579002D01D040
-:106F9000012600E01E00344D254074028026B60014
-:106FA00034402C43D578002D01D0012600E01E008E
-:106FB0002E4D254034028026760034402C435578EF
-:106FC000002D01D0012500E01D000226B4436D0014
-:106FD0000226354025431478002C01D0012400E01E
-:106FE0001C0001260127BD4334402C439278002A1F
-:106FF00000D11E0004229443B20004231A4022430D
-:10700000026100E015490800F0BD000010B5020063
-:10701000002000291FD01269930A1C00E407E40F26
-:107020004C71530A1C00E407E40F0C71130A1C0096
-:10703000E407E40FCC7053081C00E407E40F4C7025
-:1070400013001C00E407E40F0C7092081300DB0728
-:10705000DB0F8B7000E0014810BD00000100DA007A
-:10706000D8E80010FFFBFFFFFFFDFFFFFFFEFFFF63
-:10707000DCE8001000B5012027490A6852080240E8
-:10708000002A01D0022001E00968084000BD27481D
-:1070900001680800C007C00F704700B5C21E022A71
-:1070A00001D3012002E0C01E0860002000BD1CB515
-:1070B000FF246946FFF7F1FFC0B2002802D020008C
-:1070C000C0B207E03C480099890041580800C00759
-:1070D000C00FC0B216BD00B5002801D0032801D3EF
-:1070E000012002E0401E0860002000BD1CB5FF2406
-:1070F0006946FFF7F0FFC0B2002802D02000C0B2FE
-:1071000008E03448009909014018C1680800C00728
-:10711000C00FC0B216BD0000241526402E480068DE
-:1071200081080800C007C00F7047000040152640C6
-:1071300038B504002000C0B208280DD3274D18220E
-:107140002749280000F0D0FB0020E8752548264993
-:107150000860002000F028FC24482100C9B2890002
-:1071600041580A00D205D20F002A05D0E4B2A1008E
-:1071700040580007000F00E0FF2032BD38B5050081
-:107180002800C0B208280ED3144C1822144920003D
-:1071900000F0AAFB0020E075892000011249086078
-:1071A000002000F001FC1148EDB2A9004058000990
-:1071B0008007800F32BD0000401626400F4800684F
-:1071C000000AC0B270470E480068000AC0B270479B
-:1071D000000000000019264010002740181B00285E
-:1071E0004CE200105B080000E81B0028401226401B
-:1071F00004480068000AC0B2704700001010204028
-:107200000C1020400810204038B50400072C0ED385
-:10721000124D18221249280000F066FB0020E87584
-:10722000CE2040000F490860002000F0BDFB0A4856
-:10723000A10040584007400F010009B2042907D1BE
-:107240000448A1004058C106C90E802040000843F0
-:1072500000B232BD0001264000122640181B002853
-:10726000A8E20010E81B00281E4909688A03920B57
-:107270000260090E0A00D207D20FC27117490968CD
-:107280000A00D204D20C82800A00120CD2B202810F
-:10729000090CC9B24181264909680F220B0013402D
-:1072A00003730B091A4042730A0AD204D20CC2813A
-:1072B000090F8907890F0174094909680A0A5207E9
-:1072C000520F82710A00120CD205D20D4282890F30
-:1072D0000A00D207D20F027570470000341526400D
-:1072E0003C152640301526401CB50C006946FFF7BA
-:1072F000D4FE0100C9B2002901D0C0B217E00D4888
-:107300000099890040584106490E21601F21020A58
-:107310000A406260020C1140A160010F8907890FC9
-:107320006173C00E0100C907C90F2173002016BD8B
-:1073300038152640001626401CB50C006946FFF79C
-:10734000CAFE0100C9B2002901D0C0B233E01A4818
-:10735000009909014158CAB222601F220B0A13404A
-:1073600063600B0C1A40A260090F8907890F217313
-:107370000099090141184A68D10F61730721130F61
-:107380000B40002B01D0012300E00023A373120265
-:10739000120A2261009A120180188068C20F2275B9
-:1073A000020E1300DB07DB0F63750200A275000CF1
-:1073B0000140E175002016BD0019264080B501008E
-:1073C00086481822FDF790FC0120854908700020AE
-:1073D00002BD000000B583490968C90F002907D024
-:1073E0007F490978002907D100210160032000BDF1
-:1073F000002101600320FAE7784909680160002054
-:10740000F5E7000010B50400FFF734FE002803D1B3
-:107410000020206003200BE071480078002804D091
-:107420006E4880682060002002E000202060032079
-:1074300010BD00B56A490978002904D06749496838
-:107440000160002002E000210160032000BD000077
-:1074500000B565490968C90F002907D06049097856
-:10746000002907D100210160032000BD0021016037
-:107470000320FAE75949C96801600020F5E70000D8
-:1074800000B55A490968C90F002907D0544909783D
-:10749000002907D100210160032000BD0021016007
-:1074A0000320FAE74D49096901600020F5E7000073
-:1074B00010B50400FFF732FE002803D10020206041
-:1074C00003200BE046480078002804D04348406978
-:1074D0002060002002E000202060032010BD00009A
-:1074E00010B50C00C0B2FFF78FFE00280CD0401E74
-:1074F0000ED0401E10D087214900401A10D0401EE7
-:1075000012D0C01E14D017E02000FFF763FF16E072
-:107510002000FFF78EFF12E02000FFF773FF0EE060
-:107520002000FFF795FF0AE02000FFF7C1FF06E00B
-:107530002000FFF7A5FF02E000202060032010BD1F
-:1075400080B501000020FFF7CBFF02BD80B503220C
-:10755000D2B2824203D200200860012003E0401C26
-:10756000C0B2FFF7BDFF02BD30B587B0040068466A
-:10757000FFF7E6FF0100C9B2002903D00021216016
-:10758000C0B228E001A8FFF76FFE01AD287C0228F9
-:1075900003D10098206000201DE07B480068C00FE8
-:1075A000002808D0FFF773FDC0B2002807D10020E3
-:1075B000206003200FE00098206000200BE000987E
-:1075C00001994843A988FCF791FDE979491CFCF72A
-:1075D0008DFD2060002007B030BD0000001B00289A
-:1075E000A91C002818152640081526400C15264011
-:1075F000F0B58BB004000D0069462000C0B2FFF763
-:10760000A5FF0100C9B2002903D000212960C0B242
-:10761000B7E02000C0B2022848D307A92000C0B2BA
-:10762000401CFFF761FEC0B200280DD0824E182228
-:107630008249300000F058F90020F07580488149F7
-:107640000860002000F0B0F97F482100C9B289002D
-:10765000401808380068C00F002807D007A8407BF2
-:10766000022807D10098286000208AE0009828604E
-:10767000002086E0E4B2641C2000FFF718FD010042
-:10768000C9B2002902D0C0B2FF2803D1002028606F
-:10769000032076E00098079948430899FCF726FDF7
-:1076A0000999FCF723FD286000206AE001A9200069
-:1076B000C0B2401CFFF740FEC0B200280DD05E4EA5
-:1076C00018225E49300000F00FF90020F0755F4885
-:1076D0005C490860002000F067F95D482100C9B2EC
-:1076E00009014058C00F002807D001AE307B0228A6
-:1076F00007D100982860002043E00098286000200F
-:107700003FE0E4B2641C2000FFF7F0FC0100C9B2C6
-:10771000002902D0C0B2FF2803D100202860032036
-:107720002FE0707B012821D100980021019E0027C5
-:107730003F06320A17433606059A002392197B4109
-:10774000FCF7C2FE06000F0002980021039A0023F6
-:10775000FCF7BAFE02000B0030003900FCF7C1FB59
-:10776000000E0A021043090E286009E000980199F2
-:1077700048430299FCF7BAFC0399FCF7B7FC286070
-:1077800000200BB0F0BD00003015264010B50323DB
-:10779000421E0400E4B2002C03D10800FFF7E4FE0F
-:1077A0000CE01400DBB2E4B2A34204D31000C0B278
-:1077B000FFF71EFF02E0C0B2FFF792FE10BD38B522
-:1077C00004000D002000C0B2FFF7B2FC0100C9B2F6
-:1077D000FF2904D12800FFF7FDFDC0B21BE0694678
-:1077E000C0B2FFF7D3FF0100C9B2002903D00021C6
-:1077F0002960C0B20FE02000C0B2FFF7BFFCC0B2EA
-:10780000002805D002280BD006D303280CD00FE0A7
-:1078100000982860002032BD009840082860F9E7F1
-:10782000009880082860F5E70098C0082860F1E714
-:10783000002028600320EEE7181B0028A8E20010B3
-:1078400063090000E81B0028001626407F0900009D
-:10785000001926401CB5040069460020FFF7AFFF61
-:107860000100C9B2002903D000212160C0B209E0A3
-:10787000FFF7A9FC01000098C9B2491CFCF736FCCF
-:107880002060002016BD1CB5040069460020FFF7EB
-:1078900096FF0100C9B2002903D000212160C0B2C7
-:1078A00008E0FFF78BFC01000098491CFCF71EFC68
-:1078B0002060002016BD1CB504006846FFF7E3FFFA
-:1078C0000100C9B2002901D0C0B208E0FFF790FC66
-:1078D00001000098491CFCF709FC2060002016BD3F
-:1078E00080B5FFF7E8FF02BD71B58B0709D0521EC6
-:1078F00028D30B780370401C1B421FD0491C8B07F8
-:10790000F5D1121F3ED3274CE50140C9331BB343C9
-:107910002B4209D1830716D140C0121F32D340C970
-:10792000331BB3432B42F7D0121DFF231E4205D059
-:107930000670401C360A521E1E42F9D11100002268
-:10794000FFF7E0F871BDDB4216D0401E4670360AE4
-:107950004680360C0671001D121F06D340C9331B2A
-:10796000B3432B42F2D0401CDEE7401C0AE040C982
-:10797000331BB3432B42D7D10680360C4680001D03
-:10798000121FF4D2121D0BD00B780370521E07D0B9
-:10799000401C491C1B42F7D10370401C521EFBD1F6
-:1079A00071BD00000101010100B501BEFEE780B517
-:1079B0000C4A0D490B68934210D00A6002684A6075
-:1079C00042688A608268CA60C2680A6102694A6164
-:1079D00042698A618269CA61C069086202F030FE48
-:1079E00001BD0000F3F2F1F0DC1A00287047704787
-:1079F00000B5C0B2042801D2012000E00020C0B2CE
-:107A000000BD00B50100C9B2002901D1904813E0C2
-:107A10000100C9B2012902D1AF2040010CE00100F0
-:107A2000C9B2022901D18B4806E0C0B2032802D1B5
-:107A3000E120400100E0002000BD00B50100C9B216
-:107A4000002901D15A2011E00100C9B2012901D158
-:107A50005A200BE00100C9B2022901D15A2005E0E9
-:107A6000C0B2032801D15A2000E0002000BD00B5BB
-:107A7000401A002801D4012000E00020C0B200BD5F
-:107A800000B5884201D3401A00E0081A00BD00B5D5
-:107A90000200D2B2002A08D1C9B2022902D1E120E3
-:107AA000800001E0FA20800018E00200D2B2012A32
-:107AB00008D1C9B2022902D19620C00001E0AF204E
-:107AC00080000BE0C0B2032807D1C9B2022901D15E
-:107AD000614801E0C820C00000E0002000BD10B5F2
-:107AE00000280FD00C00002C0CD06178002909D0A0
-:107AF0002169002906D0A168002903D02169826884
-:107B0000914201D2002019E080680021A268002380
-:107B1000FCF7DAFC02000B00206940080021801805
-:107B2000594122690023FCF7DCF96168FFF7A8FFDF
-:107B3000032801D2012000E00020C0B210BD00B532
-:107B4000C0B232382E2801D2012000E00020C0B29D
-:107B500000BD00B50178022905D00178012904D1C2
-:107B60004078022801D1012000E00020C0B200BD11
-:107B700000B50178032905D00178012904D14078A6
-:107B8000032801D1012000E00020C0B200BD38B5BB
-:107B90000C00BE490200D2B23C235A438D18C0B239
-:107BA000FAF78BFD0A202870AC7000203821685449
-:107BB00031BDB649C0B23C225043081809210170BA
-:107BC000022181700021382281547047AF49C0B230
-:107BD0003C22504308180021017003228270382291
-:107BE0008154704770B505000C002800C0B2FFF743
-:107BF000FFFE002807D0FAF723FC002803D18020DD
-:107C00004002844201D3002020E02800C0B2FAF7ED
-:107C100054FD002807D1210089B22800C0B2FAF72C
-:107C200012FC002801D0002010E09848EDB23C2161
-:107C30004D4345193C2100222E003000FEF75CFF29
-:107C40006C600120A87038216854012070BD0000CC
-:107C5000FC530000901A00006C070000F2B59EB0C3
-:107C6000070016001C00002001903800C0B2FFF78A
-:107C7000BFFE002819D029A80078022803D029A81F
-:107C80000078032811D13800C0B2FFF7BAFE1E9960
-:107C900088420AD305A93800C0B2FBF787F800284C
-:107CA00003D105A84078002801D10020E4E0774DF9
-:107CB0003800C0B23C21484328180490049836216B
-:107CC000405C694648706846067027A8007800281E
-:107CD00007D168460078FFF732FF002801D1002065
-:107CE000CAE008991E98FFF7CBFE02900394269EE7
-:107CF000289C27A8007800281CD00398002802D0D0
-:107D00000298002816D10298002811D1E4B2002C64
-:107D100008D131003800C0B2FFF764FF002801D15C
-:107D20000020A9E03800C0B2FFF743FF0120A3E024
-:107D30000020A1E00FA804993C22FCF7D5FF200009
-:107D4000C0B2002808D131003800C0B2FFF74AFFA6
-:107D5000002801D100208FE03800C0B23C21484308
-:107D60002D18E4B2002C0CD028000FA93C22FCF7FF
-:107D7000BBFF01200100A97001003822A954694607
-:107D80004870249C27A8007800282FD02598002828
-:107D900001D0019018E0002C01D0019414E0029869
-:107DA0000021FA2292000023FCF78EFB02000B0058
-:107DB00003980021801859410022401E9141039AE6
-:107DC0000023FCF78EF801900198002807D0029A52
-:107DD00001993800C0B2FBF78FF8002815D00821B0
-:107DE0003800C0B2FFF7D3FE002045E068460178B6
-:107DF0003800C0B2FAF748FD002806D00821380044
-:107E0000C0B2FFF7C4FE002036E029A800786870F1
-:107E1000002C01D0012001E029A8007828701E98CC
-:107E2000A860EC60019828610020A861039828628E
-:107E3000684600783521685427A8007837216854AF
-:107E400068464078362168541E980899884201D3C4
-:107E5000012000E00220342168541E993800C0B28D
-:107E6000FBF74CF9002806D008213800C0B2FFF714
-:107E70008EFE002000E001201FB0F0BD10B5F02103
-:107E800000227B4C2000FEF737FE10BD281800288A
-:107E9000F8B505000C002800C0B2FFF7A9FD0028C6
-:107EA00013D02800C0B2FAF708FC7148EDB23C21AB
-:107EB0004D4345193C21002632002F003800FEF7C3
-:107EC0001BFE6C602E700320A870F1BD38B5040055
-:107ED000002505E021002800C0B2FFF7D9FF6D1C86
-:107EE000042DF7D331BD00B5002000E0401C04286C
-:107EF00009D25F493C22424389183822895C002913
-:107F0000F4D0012000E0002000BD78B585B0040069
-:107F100057482300DBB23C256B43C5182878082856
-:107F200035D1696889B22000C0B2FAF7EBFA0028AF
-:107F300004D12000C0B2FFF749FE96E02000C0B295
-:107F4000FAF747FD002800D08FE0286B002806D004
-:107F5000296B2000C0B2FAF732FE002812D06968FF
-:107F600089B22000C0B2FAF7CDFA002804D120006F
-:107F7000C0B2FFF72BFE04E009212000C0B2FFF7DA
-:107F800006FE72E02000C0B2FFF713FE6DE0C87875
-:107F900004280BD0C878022808D0C878032805D058
-:107FA000C878052802D0C878012805D10921200009
-:107FB000C0B2FFF7ECFD58E02878012855D0160034
-:107FC000287806281BD1E86AFA21490041183000B8
-:107FD000FFF74DFD002811D069462000C0B2FAF726
-:107FE000BBFD002805D009212000C0B2FFF7CFFD5E
-:107FF0003BE00398A862EE620720287035E0E86A4B
-:10800000FA21890041183000FFF731FD00282CD0FB
-:1080100069462000C0B2FAF79FFD002805D009216B
-:108020002000C0B2FFF7B3FD1FE0E86A361A0398DC
-:10803000A96A401A00210F4A0023FCF745FA3200D2
-:108040000023FBF74EFF0600002E05D02000C0B233
-:10805000FAF733FB002805D009212000C0B2FFF752
-:1080600096FD02E02E630820287006B070BD000067
-:1080700028180028A0860100F8B592B0FAF77CF91C
-:10808000FAF7F8FD0690002007900CE00621280082
-:10809000C0B2FFF77CFD03E02800C0B2FFF789FD06
-:1080A0000798401C07900798042800D348E1079DD3
-:1080B000A44807993C22514344183820205C0028EA
-:1080C00006D008A92800C0B2FAF770FE002800D038
-:1080D000E6E7FAF7B5F9002803D108AEF0780728EB
-:1080E00005D107212800C0B2FFF751FDD8E761682C
-:1080F00089B22800C0B2FAF705FA002804D1280096
-:10810000C0B2FFF763FDCBE7F078062807D12078EF
-:10811000082804D02800C0B2FFF758FDC0E7207837
-:10812000012816D1B078002813D06078207020780C
-:10813000062802D10698E0620BE0E068002806D02D
-:108140000698E168401861694018A06101E00020CC
-:10815000A061207806280BD02078072808D0207846
-:10816000082805D02078012809D16078062806D192
-:10817000069A08A92800C0B2FFF7C7FE90E720784A
-:1081800004282FD1E1690698FFF771FC002828D058
-:1081900060780590012004903720205C039060688F
-:1081A000029020690190E0680090236A3520225CEB
-:1081B000A1682800C0B2FFF751FD002811D1616805
-:1081C00089B22800C0B2FAF79DF9002804D128002E
-:1081D000C0B2FFF7FBFC04E004212800C0B2FFF7A7
-:1081E000D6FC5DE7F078022802D0F078032801D1B0
-:1081F000012700E00027F078042803D03800C0B23F
-:10820000002852D02000FFF7A4FC00280AD008A9BB
-:108210002000FFF764FC002804D02800C0B2FFF75C
-:10822000C8FC3DE72000FFF794FC002823D036204F
-:10823000205C00281FD12800C0B2FAF73EFA0028BF
-:108240000CD0FAF7FDF8002801D0072100E0082142
-:10825000C9B22800C0B2FFF79AFC21E704202070C1
-:108260000020A0610698FA21C9004018E0610120B1
-:108270003621605418E03800C0B2002809D0200030
-:10828000FFF776FC002804D02800C0B2FFF791FC6D
-:108290000AE0FFB2002F01D0052100E00421C9B29D
-:1082A0002800C0B2FFF773FCFAE6F078012804D189
-:1082B0002800C0B2FFF77DFCF2E6F078052805D172
-:1082C00006212800C0B2FFF762FCE9E6A069002899
-:1082D00000D1E5E6A1690698FFF7C9FB002800D1A7
-:1082E000DEE62800C0B2FAF7E8F900280CD0FAF769
-:1082F000A7F8002801D0072100E00821C9B2280012
-:10830000C0B2FFF744FCCBE62078032800D0BDE6DE
-:1083100069462800C0B2FAF71FFC002805D00821E2
-:108320002800C0B2FFF733FCBAE60398616A8842BE
-:1083300000D0B1E604212800C0B2FFF728FCAFE668
-:1083400013B0F0BD2818002810B586B0022405949B
-:108350000024049400240394029300230193002337
-:1083600000930023D2B2C0B2FFF778FC06B010BD74
-:10837000F8B590B00C001D0062498C4211D2160075
-:10838000002E0ED0070006A93800C0B2FAF70EFD85
-:10839000002806D106A84078002802D00A980028B4
-:1083A00001D1002022E0200000210A9A0023FCF7DE
-:1083B0008BF802000B005448002180185941534AA1
-:1083C0000023FBF78EFD022105910021049100217D
-:1083D00003911699029100210191009600232A0031
-:1083E000D2B201003800C0B2FFF738FC11B0F0BDC6
-:1083F000F0B58BB007000E0014001D0001A9380075
-:10840000C0B2FAF7D3FC002803D101A840780028B5
-:1084100001D1002012E00A988119002901D500211C
-:1084200003E03848814200DB38492B0022001098D5
-:108430000090DBB23800C0B2FFF79AFF0BB0F0BD7E
-:10844000F6B585B004000E000698002815D01F0070
-:108450003800C0B2FFF773FB00280ED03000C0B266
-:10846000012803D03000C0B2022806D10C992000A8
-:10847000C0B2FFF7B7FB002801D1002040E039006F
-:10848000C9B22000C0B2FAF7FFF9002806D00821CF
-:108490002000C0B2FFF77BFB002031E053482100F1
-:1084A000C9B23C225143451869462000C0B2FAF7D0
-:1084B00053FB002806D008212000C0B2FFF767FB5D
-:1084C00000201DE0039868623100C9B22000C0B2EC
-:1084D000FAF76EFA002806D008212000C0B2FFF794
-:1084E00056FB00200CE00120287003206870342027
-:1084F0002E540698E8600020A86135202F540120F2
-:1085000007B0F0BD112700008813000010270000FD
-:10851000F6B591B00C001E00129900290BD007008F
-:1085200007A93800C0B2FAF741FC002803D107A818
-:108530004078002801D1002055E006940A99069859
-:10854000FFF79EFA0400002C07D1189B32220699EF
-:108550003800C0B2FFF7F8FE45E006980A99884255
-:1085600001D3012100E002211298FF22F63290424D
-:1085700003D31298A04A851800E0129DC9B23800B2
-:10858000C0B2FFF784FA0021C943491B814201D2DE
-:10859000002028E02D1820000021FA22920000235C
-:1085A000FBF792FF2A000023FBF79BFC02210591B9
-:1085B00000210491012103911899029101951299CA
-:1085C00000910300002206993800C0B2FFF746FB75
-:1085D0000100C9B2002905D00449FFB23C2257432B
-:1085E000C9194E61C0B213B0F0BD000028180028B0
-:1085F000F8B58AB007000E0014001D006946380067
-:10860000C0B2FAF7D3FB00280AD1684640780028A8
-:1086100006D00298002803D030000299814201D28E
-:10862000002017E00021049A0023FBF74DFF020011
-:108630000B0002984008002180185941029A00233B
-:10864000FBF74FFC2B002200D2B201003800C0B271
-:10865000FFF77AFE0BB0F0BDF0B58BB007000E004F
-:1086600014001D0001A93800C0B2FAF79FFB0028D2
-:108670000AD101A84078002806D00398002803D02A
-:1086800030000399814201D2002018E00021059AB0
-:108690000023FBF719FF02000B000398400800219C
-:1086A00080185941039A0023FBF71BFC1099009195
-:1086B0002B00220001003800C0B2FFF729FF0BB0E9
-:1086C000F0BDFEB504000D0016002000C0B2FFF79B
-:1086D0008FF9002802D02F00002F01D100203DE0AB
-:1086E0002000C0B2FFF7A9F9050031002000C0B298
-:1086F000FFF778FA002807D02900C9B22000C0B2DD
-:10870000FAF7C2F8002806D009212000C0B2FFF70E
-:108710003EFA002022E005204D492200D2B23C233F
-:108720005A4388546B463A0002212000C0B2FBF73E
-:10873000DDF8002806D168460178002902D040788B
-:10874000002806D109212000C0B2FFF720FA00203E
-:1087500004E02000C0B2FFF72CFA0120FEBDFEB5F8
-:1087600004000D0016002000C0B2FFF741F90028F8
-:1087700002D02F00002F01D100203AE02000C0B22B
-:10878000FFF75BF9050031002000C0B2FFF72AFABD
-:10879000002807D02900C9B22000C0B2FAF774F847
-:1087A000002806D009212000C0B2FFF7F0F9002010
-:1087B0001FE0052026492200D2B23C235A438854A8
-:1087C0006B463A0000212000C0B2FBF78FF800286A
-:1087D00003D168460078002806D109212000C0B2E4
-:1087E000FFF7D5F9002004E02000C0B2FFF7E1F95F
-:1087F0000120FEBD000000000CFEFFFF70B504006C
-:108800002000C0B2FFF7F4F8002809D02000C0B261
-:10881000FAF7DFF8002803D1F9F712FE002801D09B
-:10882000002013E00A48E4B23C214C4304193820EC
-:10883000205C002801D0002008E065683C2100226F
-:1088400026003000FEF758F96560012070BD000079
-:108850002818002838B596B005000C00002C1AD056
-:108860002800C0B2FFF7C4F8002814D069462800D9
-:10887000C0B2FAF79BFA00280DD10FA92800C0B2A8
-:10888000FAF7E6FB002806D10AA92800C0B2FAF7D9
-:1088900063F9002801D000203CE01F48EDB23C21E4
-:1088A0004D43401901782170817861706946CA781A
-:1088B000A2708A78E27042686260039AA260019AAC
-:1088C000E260029A22610C9A6261149AA261099A8A
-:1088D000E261059A2262069A6262079AA262089A87
-:1088E000E2620FAA527E3023E2543622825C3123A8
-:1088F000E2543822825C3223E2543622805C002823
-:1089000001D0012000E000203322A0544878342117
-:108910006054012017B030BD2818002870B53421EC
-:1089200000242200B24D2E003000FEF7E5F86C70F6
-:1089300070BDF0B58FB007000E003800C0B200F077
-:108940003EF900900098002807D000F0F5F80028C4
-:1089500003D1FFF7C8FA002801D000203BE0002433
-:10896000250000E06D1C2800C0B2042818D201A91F
-:10897000B0482A00D2B2805CFFF76CFF00280DD00F
-:1089800001A83421405C002808D005980099496866
-:108990002A00D2B25200895A8842E3D200201AE05B
-:1089A00034212200924C25002800FEF7A5F82770FC
-:1089B000012001006170A0702681FAF75BF9E06088
-:1089C000E168009800F0D4F9002803D100F00AFB18
-:1089D000002000E001200FB0F0BDFEB50020694688
-:1089E000087000F0A9F8002800D18AE0804C2078B7
-:1089F00000F0E5F80700002F02D100F0F3FA80E064
-:108A0000FAF738F90600E0688B494118300000F0A9
-:108A1000CBF8002805D02089401C80B200F072F805
-:108A20006FE0684600F022F90500684600780028EB
-:108A300002D000F0D7FA64E06078012817D1EDB2D7
-:108A4000002D09D032000021380000F0C5F90028BF
-:108A500001D100F0C7FA54E02069AD494118300057
-:108A600000F0A2F8002801D000F0BCFA49E0B86894
-:108A7000E17818225143401802902169300000F03B
-:108A80009CF801900298007D02281AD1EDB2002DC9
-:108A90000FD0207E002807D1380000F06AFA0028A5
-:108AA00006D100F09FFA03E03100380000F0AFFA81
-:108AB00027E0029880680199884201D200F092FA7A
-:108AC0001FE00198616988421BD3EDB2002D04D0EC
-:108AD0003100380000F09BFA13E000F01BF9002889
-:108AE00007D02089FFF7F2F93100380000F08FFA43
-:108AF00007E06069864940180199884201D200F078
-:108B000071FAF7BD70B5040000F016F8002809D01E
-:108B1000200080B2F9F77EFDF9F72EFCA4B2200008
-:108B2000FFF7D4F9342100242200314D2E0030000B
-:108B3000FDF7E2FF6C7070BD00B52D48417801294A
-:108B400002D04078022801D1012000E00020C0B20C
-:108B500000BD70B50400002C01D1002023E0FFF718
-:108B6000EBFF002807D0FAF785F82149096900F0E2
-:108B700024F8050000E000251D4E30782070707844
-:108B80006070B078A07000F035F8317909010143C8
-:108B9000E170F088A08080204002854201D38B4D97
-:108BA000FFE7E580012070BD00B5401A002801D420
-:108BB000012000E00020C0B200BD401A704710B58F
-:108BC000002100E0491C0A00D2B2022A0EDA804AD3
-:108BD0000B00DBB218246343D35C0400E4B2A3426D
-:108BE000F0D1C9B218204143501800E0002010BD58
-:108BF000781A002838B58EB000252C0012E069469E
-:108C00000C482A00D2B2805CFFF724FE002808D06E
-:108C100068463221405C002803D020000124AC408B
-:108C200004436D1C2800C0B20428E8D32000C0B261
-:108C30000FB030BD9CE90010C027090000B50178D5
-:108C40000A290ED0417804290BD04178062908D092
-:108C50004178072905D04178082902D040780928B1
-:108C600001D1012000E00020C0B200BDF1B590B0FC
-:108C700001242000694608701098002801D10020C6
-:108C800043E0002010990870002617E00498381A75
-:108C900009E001A8FFF7D2FF00282BD10498B842C1
-:108CA000F4D30498C01B01A93222895C002901D1A8
-:108CB000042802D3002069460870761C3000C0B238
-:108CC000042820D2434D3000C0B240002818478B02
-:108CD00001A9C3483200D2B2805CFFF7BBFD002877
-:108CE000D7D128792100B14001432971109804702F
-:108CF00000200AE028792100B14001432971109831
-:108D00000470002001E06846007811B0F0BD00005A
-:108D10003075000038B58EB0002400E0641C2000DF
-:108D2000C0B2042821D22B482100C9B24900401802
-:108D3000458B6946AA482200D2B2805CFFF78AFDC3
-:108D400000280AD06846FFF779FF002805D103986C
-:108D5000A84204D30398401B03E0002006E00398D8
-:108D6000281A0428DAD3002000E001200FB030BD1B
-:108D7000F8B50600174D2889401C28812961AF48A5
-:108D80006861002400E0641C2000C0B204281AD2EC
-:108D900070682100C9B24900405A2100C9B2490097
-:108DA000691848832B895A2270682100C9B249008A
-:108DB000415A8B482700FFB2C05DFFF719FC00281D
-:108DC000E1D1002000E00120F2BD0000FFFF000023
-:108DD00014E60010781A0028F8B590B00700002FAC
-:108DE00004D008003B7BC0B2984201D30020BEE013
-:108DF000B8680B00DBB218246343C0180190904E92
-:108E000002207070F17001980078B07032610198A2
-:108E100040687061002030763089401C308100202D
-:108E200016E001990200D2B2520089188989020025
-:108E3000D2B25200B218518301990200D2B252004C
-:108E4000891889890200D2B25200B2185185401C9B
-:108E50000100C9B20429E4D30198007D012801D1A1
-:108E6000012084E00198007D022863D100241EE0E7
-:108E70002000C0B24000301845840DE0290089B2BE
-:108E8000BA8A891880B28142F2DAB88A2818210099
-:108E9000C9B24900711848842000C0B2400030189F
-:108EA000408C2100C9B2490071184883641C20001D
-:108EB000C0B2042821D201982100C9B2490040184B
-:108EC000858902A946482200D2B2805CFFF7C2FC25
-:108ED000002810D00598010089B2BA8A89182A00A2
-:108EE00092B29142CADAB88A281A2100C9B249005E
-:108EF00071184884D0E7002039E0002400E0641CA9
-:108F00002000C0B2042813D2338938692100C9B2C5
-:108F1000425C2000C0B240003018418B3048250030
-:108F2000EDB2405DFFF764FB0028E8D100201EE0B1
-:108F300001201CE0002400E0641C2000C0B20428D2
-:108F400014D2308900903D4B01984268019821006D
-:108F5000C9B249004018818921482500EDB2405D21
-:108F6000FFF77AFB0028E7D1002000E0012011B0D4
-:108F7000F0BDF8B50600002E01D100202FE0304DE5
-:108F80002889401C288102202876002420000AE03D
-:108F90000100C9B249006918498D0200D2B25200DD
-:108FA000AA185183401C0100C9B20429F0D300E083
-:108FB000641C2000C0B2042810D22B89B27D20008E
-:108FC000C0B240002818418D1E482700FFB2C05D86
-:108FD000FFF70EFB0028EBD1002000E00120F2BDDE
-:108FE0009CE9001038B5164D2C89641C200080B215
-:108FF000F9F710FBF9F7C0F9200080B2FEF766FF21
-:109000002C8103206870F9F735FE286131BD38B531
-:109010000A000B4BD978491C0C00057BE4B2AC422A
-:1090200003D30021DC88641CDC80C9B2FFF7D4FEC6
-:10903000002801D1FFF7D6FF31BD000030750000D8
-:10904000781A00289CE90010F8B5C0B0002001F0A3
-:1090500072FB20A9002000F016FA070069460120E3
-:1090600000F011FA04003800C0B2022801D1012535
-:1090700000E000252000C0B2022801D1012600E056
-:109080000026300028438749087086480078002869
-:1090900013D1FFB2002F04D120A800F04CFA002811
-:1090A00007D0E4B2002C08D1684600F044FA00284A
-:1090B00003D101207C49087002E000207A49087041
-:1090C0007848007800280FD100200100BA4A1170BA
-:1090D0007649086005E00021C943754A8300D150F4
-:1090E000401C2028F7D331E0F6B2002E16D0EDB2A6
-:1090F000002D05D02299029800F014FA00280DD016
-:1091000001206A4908600020202814D269468200A4
-:109110008958674A8300D150401CF5E70020634915
-:10912000086006E020A982008958614A8300D15076
-:10913000401C2028F6D35E48C068012803D10120D6
-:109140009D49087002E000209B49087041B0F0BDC5
-:10915000F0B595B053480078002803D096480078C1
-:10916000002801D1002065E0002400E0641C042CEC
-:109170004ED2062767433F1D4D4DB800285801A920
-:1091800014226243885001AEB800281840681421A8
-:10919000614371184860B800281880681421614341
-:1091A00071188860B8002818C068142161437118CC
-:1091B000C860B800281800690090B80028184069F5
-:1091C000012801D1012000E0002014216143711821
-:1091D0000874142060433018426801A814216143C8
-:1091E00041582000C0B200F02DF9B9006918496952
-:1091F00002290BD20099814208D114206043311812
-:109200002000C0B2F9F716FC0028AFD0002011E012
-:10921000002400E0641C042C0BD201A8142161433B
-:1092200041182000C0B2F9F72FFC0028F2D000202E
-:1092300000E0012015B0F0BD00205F49087001205A
-:1092400019490870704710B5A0B01648007800287A
-:1092500003D059480078002804D1002056490870EE
-:1092600001201CE00020010006E0114A8B00D258CA
-:109270006B468C001A51491C2029F6D30C49896889
-:10928000491C029103901C21684600F097F81C903D
-:10929000A048006801214140684600F075F920B0FF
-:1092A00010BD0000D11C0028D31C0028801C002801
-:1092B000F8190028F8B5B0B0974F3878002805D0D5
-:1092C0009448006801214140009101E00020009095
-:1092D0000026300005E00021C94310AA8300D150C8
-:1092E000401C2028F7D38D48109008201190387822
-:1092F000002803D08A488068401C00E001201290BA
-:109300000120139034001FE0310019E0019810A9EA
-:10931000AA00885010A80299AA00821851600399E7
-:10932000AA00821891600499AA008218D160099954
-:10933000AA008218116101A9097C0029E4D0012149
-:10934000AA0080184161641C042C12D206256543D2
-:109350002D1D01A92000C0B2F9F7FEFB002806D19F
-:1093600006A92000C0B2F9F721FD0028CED00020C8
-:1093700016E01C2110A800F021F82C903878002865
-:109380000AD022480078002806D010A800F0E7F89C
-:10939000002801D0012003E0009910A800F0F4F8A3
-:1093A00031B0F0BDA04800787047A0480078704701
-:1093B0009F48007870470000D21C0028F2B50026B4
-:1093C000F64300210A0000E0521C009B9A421AD288
-:1093D0009300C4580B0000E05B1C042BF4D2350052
-:1093E000E6B26E40240A0D0001E00F0004E0082DF3
-:1093F000F2D2F707F9D5904F7608B4463E0067469B
-:109400007E406D1CF3E7F043F2BD0000D21C002843
-:10941000C0018A494018704700B5C0B2002805D085
-:10942000022808D004D3032807D009E0844808E0C4
-:10943000AF20400105E0834803E0E120400100E067
-:10944000002000BD38B50D001400C0B2FFF7E4FFE6
-:1094500002002800002A01D0002C02D10020C043C5
-:1094600010E0844200D2200000210023FBF72CF8FA
-:1094700002000B00600800218018594122000023DF
-:10948000FAF72FFD32BD10B50C00FFF7C1FF002C1D
-:1094900001D100203CE0002104E08A0082588B00CA
-:1094A000E250491C2029F8D3E068022801D30020AB
-:1094B0002EE02068194988420BD16068082808D13D
-:1094C0001C212000FFF77AFF216F814201D1022089
-:1094D0001EE020685C49884202D1606805280DD0F2
-:1094E00020685A49884202D16068062806D0206860
-:1094F000574988420BD16068072808D11C212000F9
-:10950000FFF75CFF216F814201D1012000E00020C4
-:1095100010BD0000801C0028D11C002838564D5377
-:10952000F819002800B5401A012801DB012000E0ED
-:109530000020C0B200BD00B5002801D100200DE020
-:10954000002100E0491C202907D28A00825800230C
-:10955000DB439A42F6D0002000E0012000BD10B5A8
-:10956000002801D100200EE0042100E0491C1C2944
-:1095700008D28A0082582F4B8C001B599A42F5D092
-:10958000002000E0012010BDFEB50500002D03D035
-:1095900000910098022801D3002043E00098FFF7D3
-:1095A00037FF070001970121380001F0E2F801219F
-:1095B000380001F01CF9002801D1002032E000261B
-:1095C000340007E00122A0002918A000381801F09B
-:1095D00057F9641C202CF5D3300005E08100695850
-:1095E000144A8300D150401C202808D201998200DF
-:1095F00089588200AA589142F0D0002012E00098C9
-:109600001449086001200100074A1170E968012926
-:1096100002D10649087002E030000449087004488D
-:1096200006700120FEBD0000D11C0028D21C0028BD
-:10963000D31C0028F81900282083B8ED000003147B
-:10964000FC530000901A000035564D5336564D53CA
-:1096500037564D53801C002800B5010009B200297F
-:1096600005D40121C006C00E8140AE48016000BD96
-:1096700000B5010009B2002905D40121C006C00EC1
-:109680008140CC48016000BDF0B5020012B2002A52
-:1096900018D41822A44B040024B2A408A4001C5916
-:1096A000FF250600F6001640B540AC438901C9B25B
-:1096B0000500ED002A409140214300B2800880005F
-:1096C00019501CE00F22BC4C182503001BB213409C
-:1096D000083B9B089B00060036B23240083A9208CD
-:1096E0009200A258FF260700FF002F40BE40B24361
-:1096F0008901C9B2C0000540A9401143E150F0BD45
-:1097000000B5002A03D101228A40426002E0012212
-:109710008A40826000BD0268CA401000C007C00FC6
-:10972000704700B5022801D301200FE00B00DBB227
-:10973000042B01DB012009E0BC4B80001818C9B2E2
-:10974000405C824201D3012000E0002000BDF8B55A
-:1097500004001F00022C01D3012023E015000E009D
-:109760002A003100C9B22000FFF7DBFF012801D138
-:10977000012017E03000C0B2002816D1FF2F12D808
-:10978000AB4861034018A9004018802149014018E6
-:109790000168A84A0A403902FF231B020B40134309
-:1097A00003600020F2BD0120FCE7F6B2012E16D1C5
-:1097B00080204002874210D29D4861034018A900D2
-:1097C0004018A0214901401801689B4A0A4039020B
-:1097D000C44B0B4013430360E3E70120E2E70120A1
-:1097E000E0E700B20012C0B27047F8B505000F0004
-:1097F0001600280000B2FFF7F4FF04002000C0B2FA
-:10980000022801D301202CE032003900C9B2200027
-:10981000C0B2FFF786FF012801D1012021E0844872
-:109820002100C9B2490341182A00D2B29200891816
-:10983000C02212018A58AC491140FFB23B02C0223B
-:1098400092001A400A43FF218A43F1B21143E4B265
-:1098500062038018EDB2AA008018C0221201815064
-:109860000020F2BD70B50400022C01D3012028E0D5
-:1098700015000E002A003100C9B22000FFF751FF89
-:10988000012801D101201CE0694861034158802270
-:1098900012060A43C02189041143FF2212040A431D
-:1098A000914B1340F6B23202C02189001140194396
-:1098B000FF229143EAB20A436103425061034058D8
-:1098C000002070BD70B50400022C01D3012028E0F7
-:1098D00015000E002A003100C9B22000FFF721FF59
-:1098E000012801D101201CE0514861034158802228
-:1098F000D2050A43C02189041143FF2212040A43FE
-:10990000794B1340F6B23202C0218900114019434D
-:10991000FF229143EAB20A43610342506103405877
-:10992000002070BD00E100E000E400E038B5002058
-:109930000100974A11700100964A1170964908601B
-:1099400000F0D4F8002803D000F02CF9002804D14E
-:109950009248B849086000202BE0914C2000FBF7AA
-:1099600091F9002804D08D48B2490860002020E019
-:10997000B1490020205EFBF7A4F900210220205EFF
-:10998000FFF782FE0220205EFFF772FEAB4D28003B
-:1099900001F05AFEAA49280001F0CCFAA549086056
-:1099A000002801D0002004E00220205EFFF754FED2
-:1099B000012032BD80E200E01CED00E038B504007B
-:1099C000002C01D100202FE0FBF722F871490A7822
-:1099D00013006F4D2D78DBB2AB4203D1FBF71CF8BF
-:1099E000002021E0C44B1500EDB22D015D5925602A
-:1099F0001500EDB22D015D196D6865601500EDB2C1
-:109A00002D015D19AD68A5601500EDB22D015B1942
-:109A10001B7B2373521C1300DBB2102B00D30022DC
-:109A20000A70FAF7F9FF012032BD000098E8001033
-:109A300000000440FF00FFFFFF0000FFF1B594B0FD
-:109A40000D0016005021002422006F463800FDF75B
-:109A500053F8149880210901884203D24E480068C7
-:109A6000002804D04D48A9490860002038E0684625
-:109A700021000170210001721499019108214C22EA
-:109A800081540395049600E0641C2000C0B20828AD
-:109A900021D26A4D2100C9B2280001F02DFF01003A
-:109AA000C9B20129F0D0C0B20328EDD0149898496A
-:109AB00008606A462100C9B2280001F049FE9349B6
-:109AC0000860002805D193480168491C0160012005
-:109AD00006E0002004E090480168491C0160002075
-:109AE00015B0F0BD00FFFF00FFFCFFFFF8B500253B
-:109AF00000956846FDF7AEFE002801D0002046E044
-:109B0000864C0098A04205D300982100FAF7EEFA9F
-:109B1000002901D000203AE000982100FAF7E6FA87
-:109B20000400002C03D0FF20801C844201D30020BD
-:109B30002DE0FF2608363000FFF753FE0700002215
-:109B400000213800FFF7BEFE002801D000201EE0F3
-:109B5000002200213000FFF748FE002801D000203D
-:109B600015E023005B1E002200213800FFF7EFFD07
-:109B7000002801D000200AE0002200213800FFF771
-:109B800071FE002801D1012000E02800C0B2F2BD22
-:109B9000A51C0028A61C0028DC1B00280100620070
-:109BA0000008002818B5A7B01AA85D493422FBF7B1
-:109BB0009BF80DA85B493422FBF796F868465A4992
-:109BC0003422FBF791F8594C1AAA07212000FAF722
-:109BD0004EFA002801D0002024E00DAA0621200022
-:109BE000FAF745FA002801D000201BE06A4601215F
-:109BF0002000FAF73CFA002801D0002012E00122F0
-:109C000001212000FFF77CFDFA208000FBF756FAC7
-:109C100001212000FFF77FFD012801D1012000E094
-:109C20000020C0B228B010BD80B5044801F042F851
-:109C300001BD0000BC1B0028299C001000045440FA
-:109C40000808002870B51400002C05D0207A0028E0
-:109C500002D12078002800D04DE035480168491C29
-:109C600001606068334908606068C02189008842EB
-:109C700014D14C20205C082810D1E068C0B209281B
-:109C80000CD1E068000AC0B2102807D12069002872
-:109C900004D1E068000C80B2F8F7BCFC26480178DB
-:109CA0000A00521C1300DBB2102B00D30022130059
-:109CB000224D2D78DBB2AB4204D121480168491C0A
-:109CC000016018E00C4B65680E00F6B236019D513C
-:109CD0004C25655D0E00F6B236019E193573E568B8
-:109CE0000E00F6B236019E1975602469C9B20901E9
-:109CF00059188C60027070BD2817002800B5C0B2DA
-:109D0000002802D101200F49086000BDD81B00289F
-:109D1000D41B0028C81B0028CC1B0028005A620254
-:109D2000E4E4001018E500104CE50010800131401B
-:109D3000C01B0028D01B0028A51C0028A61C00283A
-:109D4000C41B0028DC1B00286B490A6808607047A8
-:109D50006A490A6810239A43C0B2000110231840D0
-:109D600010430860704765490A68654B1340C0B2EC
-:109D700000028022520010401843086070475F497B
-:109D80000A6852005208C0B2C0071043086070470A
-:109D9000002070475B480068704710B504005948C0
-:109DA0000460BFF34F8FFFF7F5FFA04201D1012000
-:109DB00000E00020C0B210BDF8B50400FF20E23082
-:109DC0000090FFF7E5FF0700FFF7E4FF01252E00F5
-:109DD00000210A004C4B1A700A004C4B1A70009A72
-:109DE0002240002A02D04A490D7001E0484A117011
-:109DF000610005D50020FFF7D0FF0600FFF7CAFF7E
-:109E0000F6B2002E09D04349884206D04249884222
-:109E100007D13800C0B2002803D105203A490870A4
-:109E200012E03B480078002803D00420364908702F
-:109E30000AE0FFB2002F07D00800FFF7AEFF0028AE
-:109E400002D1052030490870FBF7A6F9FBF7CEF9DF
-:109E5000C8200001FFF778FF0120FFF779FF0020FD
-:109E6000FFF781FF0120FFF78AFFFBF7B4F9FBF74B
-:109E7000D0F92648057000F001F8F1BD80B52348FF
-:109E80000078002801D0FBF7EBF901BD80B5010097
-:109E9000C9B200290CD01C490A78002A08D10870E0
-:109EA0000020F8F7EFFBF8F7FDFB0020FEF70EF8B7
-:109EB00001BD80B5FFF76CFFFFF76CFF15498842C5
-:109EC00002D10520FFF7E2FFF8F7BAFA002802D026
-:109ED0000120FFF7DBFFFFF7D1FF01BD00B50A4806
-:109EE0000078002801D0012000E00020C0B200BDB1
-:109EF000054800787047000008C0264010C0264082
-:109F0000FFFEFFFF0C102740B61C0028B81C0028DD
-:109F1000B71C002845564F4D41564F4D1CB501F01A
-:109F200019FD002803D100F0B9F800202BE001F062
-:109F3000F3FF002803D100F0B1F8002023E0FAF786
-:109F4000DEFB002805D069460520FAF767FC0028EB
-:109F500003D100F0A3F8002015E068460088974977
-:109F6000088001249648047000209649086001206A
-:109F700000F084FA012000F09DFA64209249086004
-:109F800092480470012016BD80B5002804D1904885
-:109F90000168491C016020E08E490A68521C0A6071
-:109FA00001688D4A891A08D00C3909D092225200D2
-:109FB000891A08D05C3909D00BE000F085F80CE074
-:109FC00000F00EF909E000F06DF906E000F0A0F9EC
-:109FD00003E07F480168491C016001BD80B501F0C4
-:109FE000E7FC00F03CF87D480178E02905D00178D5
-:109FF000052902D00078002806D10020A649087063
-:10A000000120724908700EE0A4480178002906D1A9
-:10A01000A1480178002906D00121017003E00078F1
-:10A02000401C9D4908709E480078002814D0B44810
-:10A030000168002910D00168491E016000680028ED
-:10A040000AD1B048007801F0D9FF002804D10120DE
-:10A05000AD49086000F056FA00F05BFA01BD1CB58E
-:10A0600058480168491C016001680A2915D3002479
-:10A07000046069460520FAF7D1FB002807D068463E
-:10A0800000884E49088001204D49087005E09F482E
-:10A090000168491C01604A48047013BD80B501F095
-:10A0A000FEFC02F083FA01F0C0FF002001007C4AB0
-:10A0B0001170934908600100B64A11707649087022
-:10A0C00001204249087001BD70B5017B08290AD002
-:10A0D0003F480168491C0160002000F0CFF90020D2
-:10A0E00000F0E8F968E00324416822000A40416872
-:10A0F000890823000B404168090925000D400F26FF
-:10A100004168090C31404068000D06401000C0B2A3
-:10A11000022803D1012000F0B1F924E0D2B2012AD3
-:10A120001AD11800C0B2012802D0DBB2022B13D121
-:10A130000800C0B200280FD00800C0B206280BD219
-:10A140000800C0B200F028F900280CD102206E49A6
-:10A15000086000F0D7F906E01D480168491C01605D
-:10A16000002000F08BF92800C0B2022803D10120A2
-:10A1700000F0A0F920E0EDB2012D16D13000C0B200
-:10A18000002812D03000C0B206280ED2BA4800789B
-:10A1900000280AD03000C0B200F03FF900280BD1EF
-:10A1A0005948046000F0AEF906E009480168491C0E
-:10A1B0000160002000F07EF970BD00009C1C0028AA
-:10A1C000C01C0028441C0028401C0028FE12002847
-:10A1D000281C0028241C00289E020000BB1C00280C
-:10A1E00080B5017B082904D0B0480168491C016092
-:10A1F00051E0436807214268120C0A404068C00CD5
-:10A200000140DBB2012B07D11000C0B2052803D2F8
-:10A210000800C0B2052804D3A4480168491C0160A5
-:10A2200039E01000C0B2012801D1012005E0D2B20E
-:10A23000022A01D1022000E003209D4A107008008C
-:10A24000C0B2012801D1012005E0C9B2022901D123
-:10A25000022000E00320A14908701148007800287E
-:10A260000AD09F48007800F097F8002804D1042015
-:10A270002549086000F046F90848007800280AD00F
-:10A280009848007800F0C9F8002804D105201E493C
-:10A29000086000F037F901BDFD120028BA1C002843
-:10A2A000BD1C002880B5017B08290AD00020724916
-:10A2B00008707E480168491C0160002000F0FAF82F
-:10A2C0001CE0406800098007800F0100C9B2012925
-:10A2D00002D0C0B2022803D101206749087002E011
-:10A2E00000206549087064480078002806D16F484E
-:10A2F0000168491C0160002000F0DCF801BD00008D
-:10A300003C1C0028BF1C0028341C0028381C0028D6
-:10A3100010B5017B08290AD064480168491C016016
-:10A32000002000F0ABF8002000F0C4F831E0032476
-:10A33000416821404068800804400800C0B20128FC
-:10A340000BD16748007800F027F800280BD10620D1
-:10A35000A849086000F0D6F805E0C9B2022902D188
-:10A36000012000F08BF82000C0B201280BD15D481D
-:10A37000007800F052F800280BD107209D490860B2
-:10A3800000F0C0F805E0E4B2022C02D1012000F098
-:10A3900091F810BDFC12002870B50100C9B2032964
-:10A3A00001D3032500E005000100C9B2002903D054
-:10A3B0000100C9B2062901D3002025E03C490A78F2
-:10A3C0002B00DBB29A4200D20D78454908708A4CC6
-:10A3D0002800C0B200F088F820706D1C8748057016
-:10A3E000012587480570874E307800280DD16420FC
-:10A3F00001F0B8FD002801D1002005E03570FA20F9
-:10A40000C00081490860012070BD7F4800680028B5
-:10A41000F9D1207801F0F2FDF6E710B50100C9B2DC
-:10A42000032901D3032400E004000100C9B200297C
-:10A4300007D00100C9B2062903D20F4909780029C3
-:10A4400001D1002017E025490A782300DBB29A42A7
-:10A4500000D20C78234908702000C0B201F00AFB3A
-:10A46000002801D1002006E0641C68480470012027
-:10A4700063490870012010BDBE1C002810B50400FF
-:10A4800001F0D3FD002001005E4A11705E490860B2
-:10A490000100594A11702100C9B2052900D30400F6
-:10A4A0005648047001205649087010BD281C002829
-:10A4B0000013002810B50400002001F0DBFA00288A
-:10A4C00001D102F073F82000C0B2052800D30024A7
-:10A4D0004E48047001204A49087010BD021300283C
-:10A4E000FF1200280113002800B50100C9B201299C
-:10A4F00001D1322005E0C0B2022801D1462000E09F
-:10A50000642000BD80B5FFF7C9FD0120FFF7BEFC48
-:10A5100001BDF8B53E4C2068401C2060384D2878BD
-:10A52000002802D12068642862D334480078C0B281
-:10A530004007400F35490978C90038220A400243D4
-:10A54000009234480078002801D0012100E0002169
-:10A5500031480078E02801D0022000E000200843C4
-:10A5600028490978002901D0012100E000212B4A67
-:10A570001278530006221A400A4380235B002849C0
-:10A580000E689E4201D3FF2100E00968254E37681E
-:10A590009F4201D3FF2300E03368C0B2D2B212025F
-:10A5A0000243214800880704174320480088C9B2A5
-:10A5B00009040143DBB21E060E43002200991C4829
-:10A5C000FFF73CFA00280FD0320039001948FFF796
-:10A5D00035FA002808D018480168491C016000209D
-:10A5E00001002970206003E014480168491C0160E3
-:10A5F000F1BD0000341C0028BF1C0028FC120028FC
-:10A60000FE120028BD1C00283C1C0028FD1200285A
-:10A61000401C0028C01C0028BB1C0028BA1C0028B5
-:10A62000381C0028101C00289C1C00289A1C00289C
-:10A63000FA040000050300002C1C0028301C002830
-:10A6400000B5FEE700B5010009B2002905D40121DB
-:10A65000C006C00E8140B748016000BDF0B50200E1
-:10A6600012B2002A18D41822844B040024B2A40881
-:10A67000A4001C59FF250600F6001640B540AC4367
-:10A680008901C9B20500ED002A409140214300B282
-:10A690008008800019501CE00F22A74C18250300E9
-:10A6A0001BB21340083B9B089B00060036B23240A9
-:10A6B000083A92089200A258FF260700FF002F4098
-:10A6C000BE40B2438901C9B2C0000540A940114350
-:10A6D000E150F0BD00B59D48012102680A430260C7
-:10A6E00002680A40002AFBD100BD99480168012296
-:10A6F0000A43026070479748016801220A430260DA
-:10A7000070471FB5684602F049F900280DD08B4C00
-:10A7100018228B492000FDF7E7F80020E07549205A
-:10A72000884908600020FDF73FF901208A49087038
-:10A73000FFF7D0FF1FBD80B5C0B201280ED10321A5
-:10A74000814802F05BF903210320FFF787FF032014
-:10A75000FFF778FF01208149087002E000207F495F
-:10A760000870FFF7C2FFFFF7C6FF01207A490870A3
-:10A7700001BD7CB505000E00794803C86A4603C2D6
-:10A78000083A3000C0B2002814D17448007801287B
-:10A790000DD06A4C18226A492000FDF7A5F8002068
-:10A7A000E0759420674908600020FDF7FDF800205F
-:10A7B0006949087068460121017100242100417136
-:10A7C00000953200D2B26946002002F027FB002833
-:10A7D0000CD05A4D18225A492800FDF785F8EC751F
-:10A7E0009E20584908600020FDF7DEF873BD7CB557
-:10A7F00006000D00300002F013FA00280DD04F4C77
-:10A8000018224F492000FDF76FF80020E075B520B1
-:10A810004C4908600020FDF7C7F82800C0B20028A6
-:10A8200014D14E48007801280DD0444C18224449D8
-:10A830002000FDF759F80020E075B9204149086073
-:10A840000020FDF7B1F80020434908700096300061
-:10A8500002F024FA002801D0202001E080208000AE
-:10A8600001902A00D2B26946002002F03FFB002886
-:10A8700001D1012000E0002076BD000000E400E0EE
-:10A88000F8B584B007000E001500380002F0C8F9D2
-:10A8900000280DD0294C182229492000FDF724F862
-:10A8A0000020E075DF20274908600020FDF77CF8D4
-:10A8B00068461021FCF730F92800C0B2002814D1F6
-:10A8C0002648007801280DD01C4C18221C49200075
-:10A8D000FDF70AF80020E075E6201A49086000201C
-:10A8E000FDF762F800201C490870012168460A0043
-:10A8F00002720A00427202228272C1720024210096
-:10A900000173009701962A00D2B26946002002F036
-:10A9100027F900280CD0094D182209492800FCF716
-:10A92000E3FFEC75F520074908600020FDF73CF8CF
-:10A9300005B0F0BD00E100E01CED00E0181B0028B0
-:10A9400060E30010E81B002803A700100800244063
-:10A9500000F4244000F52440A71C0028A81C00286F
-:10A9600088E8001000B5002801D0002901D1A048D6
-:10A9700008E0A04A904206D1002008808020800193
-:10A980004860002000BD9C4A904205D18020800193
-:10A9900002000A804860F4E7BA4A904206D180205B
-:10A9A000C0010880802080014860EAE7B64A9042F2
-:10A9B00006D1C020C0010880802080014860E0E707
-:10A9C000B24A904206D18020000208808020800197
-:10A9D0004860D6E7AE4A904205D10020088080202A
-:10A9E00080014860CDE7AB4A904205D180208001CC
-:10A9F00002000A804860C4E7A74A904206D180203E
-:10AA0000C0010880802080014860BAE7A34A9042D4
-:10AA100006D1C020C0010880802080014860B0E7D6
-:10AA20009F4A904206D18020000208808020800149
-:10AA30004860A6E76E48A5E700B5002100E0491C84
-:10AA40000A290AD2974A18234B43D3589842F6D181
-:10AA5000182041435018001D00E0002000BD10B533
-:10AA60000A00D2B2402A01DB002017E0020C1204D7
-:10AA700080235B02D218AC23C3589B089B049B0C19
-:10AA80009B00D218C9B2884BBC240059000A400769
-:10AA9000400F185C801C41438800101810BD10B591
-:10AAA0000A00D2B2202A01DB002016E0020C1204B8
-:10AAB00080235B02D218C023C3589B089B049B0CC5
-:10AAC0009B00D218C9B2784BC82400594007400FE8
-:10AAD000185C801C41438800101810BD10B50B0095
-:10AAE000DBB2022B01DB002028E0030C1B048024D6
-:10AAF00064021B190C00E4B2002C05D1A0240459F7
-:10AB0000A408A404A40C04E0B0240459A408A404D8
-:10AB1000A40CA4001B19C9B2002904D1BC214058BF
-:10AB20004007400F04E0BC21405800094007400F97
-:10AB30005D49085C801C42439000181810BD00B5A8
-:10AB40005A49884201D3052100E00021400A40060D
-:10AB5000400E0818C0B200BD38B504000020002C1B
-:10AB600044D02000FFF7EBFF0121226D520F0A4075
-:10AB7000002A05D00A004E4B0500EDB26D005A5375
-:10AB8000226D120F0A40002A05D00222484B050010
-:10AB9000EDB26D005A53226DD20E0A40002A05D044
-:10ABA0000322434B0500EDB26D005A53226D920E05
-:10ABB0000A40002A05D004223D4B0500EDB26D008D
-:10ABC0005A53226D520E0A40002A05D00522384BF6
-:10ABD0000500EDB26D005A53226D520D114000294F
-:10ABE00004D00621324AC0B24000115231BD0000EB
-:10ABF00001006200000052400002524070B5002285
-:10AC00001300130000283CD003689B0F1C00E407CE
-:10AC1000E40F0C720B7A002B05D10368DB00DB0814
-:10AC20009B144B6003E00368DB00DB084B60436868
-:10AC30005B0D1C00E407E40F0C7043681B0C1B0742
-:10AC40001B0F4C240B554C23CB5C082B01DA130053
-:10AC500002E04C23CB5C083B0AE01400A4B2A40041
-:10AC60000419A4681500ADB2AD004D19EC60521C7A
-:10AC700014000D4D1E00B6B2AD5DA4B2ADB2AC4233
-:10AC8000EBD370BD00045240000652400008524011
-:10AC90000000544000025440000454400006544058
-:10ACA000000854405808002880E80010010852406D
-:10ACB000301B0028F1B5A8B0002000900020289893
-:10ACC000FFF7BAFE0700002F29D0289E306D974964
-:10ACD0000140002902D02898FFF73EFF0125306D82
-:10ACE000C00C284000281CD1306D2840002868D1B5
-:10ACF000306D00092840002800D0BAE0306D400ACD
-:10AD00000540002D0BD030005030016880229200A9
-:10AD10000A4302603868002801D03868804729B0AB
-:10AD2000F0BD300050300168802212030A430260F7
-:10AD300098203058002816D0002400E0641C200021
-:10AD4000C0B220282CDA98203058E0402840002853
-:10AD5000F4D02100C9B22898FFF781FE0090A540E9
-:10AD6000982035501CE09C203058002818D0002432
-:10AD700000E0641C2000C0B2202811DA9C2030586A
-:10AD8000E04028400028F4D020342100C9B228989F
-:10AD9000FFF765FE00902000E03085409C20355094
-:10ADA00000980028BBD013A90098FFF727FF786808
-:10ADB0000028B4D013AA2100C9B200207B689847AC
-:10ADC000ADE73000503001682943016017E0289A50
-:10ADD000D4235B00D45801AA0300DBB29B00D450FB
-:10ADE000401C02000B00D2B2DBB29A42EFD3B8682B
-:10ADF000002804D001AAC9B20020BB689847A4204B
-:10AE000030584006400E012889DB2898C0214900AF
-:10AE100040582840002822D1A420305800903F24D8
-:10AE20000098020A224000212898FFF757FE0028C8
-:10AE3000E5D013A9FFF7E2FE3000A83001683F22F9
-:10AE40009143009A120A14400C4304607868002869
-:10AE5000D5D013AA002101207B689847CFE734485A
-:10AE60002899BC2289584907490F415C891C002058
-:10AE7000B7E730005030016810220A43026017E043
-:10AE8000289ADC235B00D45801AA0300DBB29B00A4
-:10AE9000D450401C02000B00D2B2DBB29A42EFD376
-:10AEA000B868002804D001AAC9B20120BB6898473D
-:10AEB000B42030584006400E012800DA2FE72898C9
-:10AEC000C0214900405840082840002822D1B42021
-:10AED000305800903F240098020A2240012128980F
-:10AEE000FFF7FCFD0028E3D013A9FFF787FE300031
-:10AEF000B83001683F229143009A120A14400C4373
-:10AF0000046078680028D3D013AA012101207B684F
-:10AF10009847CDE706482899BC228958090949076E
-:10AF2000490F415C891C0020B4E70000EEE0F73FC8
-:10AF300080E80010F1B594B0D34800681290D3486F
-:10AF400000681190D2480768D2480668D248006865
-:10AF50001090D24800680F90D14800680490D14802
-:10AF600000680E90D04800680190D04800680D90AD
-:10AF7000CF4800680C90CF4800680B90CE4800681E
-:10AF80000A90CE4800680990CD4800680890CD48E6
-:10AF900000680390CC4800680290DC480068079085
-:10AFA000DB48006800901498002810D00C00002C9A
-:10AFB0000DD02820205C002802D0E06A002806D0AE
-:10AFC0003020205C002804D0606B002801D1D148DB
-:10AFD00024E31498FFF730FD002801D1CD481DE38C
-:10AFE0002168016061684160A1688160E168C160B9
-:10AFF00021690161149D0120A861A869C007FCD5E1
-:10B000000320A86105A91498FFF7ACFC002801D023
-:10B01000C04803E32820215C129ABF4810400A046C
-:10B02000FF21090411400143BC4808406946898A50
-:10B0300089B2890889B289000143842029503020CF
-:10B04000205C4006400EFE21C903119BE44A1A40D1
-:10B050000004084010438422AA5892082823E35C85
-:10B06000D2189204920CAD4B03409200DD48104080
-:10B0700018438822A850A06BC000C0087A0F52075E
-:10B0800010439022A85007224020205C1040099FC6
-:10B09000D54B3B400702E020C00038401843412315
-:10B0A000E35C13407027B8431F0170233B40034308
-:10B0B0004220205C10400727BB431843BC23E850C4
-:10B0C0004420235C1800C007C00F73005B08C6074C
-:10B0D0001E434520205C4006400EC44B1E40070620
-:10B0E000FE20C005384030434626A65D7606760E23
-:10B0F000BB4F07403004084038438826AE59B60895
-:10B100003027E75D7F00F619B604B60C834F074081
-:10B11000B600B44830403843A026A8514820265CE9
-:10B120003000C007C00F109E76007608C00730437D
-:10B130004926A65D7606760E03403606FE20C0053B
-:10B14000304018434A23E35C5B065B0EA44E064086
-:10B15000180401403143A64FA020285880084623F8
-:10B16000E35C4226A65DBE5DB61C7343C018830433
-:10B170009B0C6A4808409B009A4919400143B02043
-:10B1800029504720205C002801D1002100E0012146
-:10B19000009B012083430800C007C00F18434B21C8
-:10B1A000615C002901D1002100E0012102239843C4
-:10B1B00049000223194001431498C0235B00C15089
-:10B1C000B020285880084A21615C4123E35CFB5C85
-:10B1D0009B1C5943401883049B0C82484F490F9E87
-:10B1E0000E409B0003403343AC26AB514323E35C4A
-:10B1F0001A40089B0726B3431A43C823EA507D4AE6
-:10B20000049E16407C4B1E400496AC26AE59B608F0
-:10B2100000964C26A65DB4464026A65DBE5DB61CD3
-:10B2200067467743009EF619B604B60C049F0F409C
-:10B23000B60006403E43F027EE510E9F6F4E3E4053
-:10B2400032404D26A65DB606B60E13403604FC22EB
-:10B25000920332401A43F023EB589B0814339B04AB
-:10B260009B0C11409A0010400843C0216850802276
-:10B2700052021498000C00046946898A401880180C
-:10B2800006998B08002125E0E0E80010E4E80010B2
-:10B29000E8E80010ECE80010F0E80010F4E8001016
-:10B2A000F8E80010FCE8001000E9001004E90010C4
-:10B2B00008E900100CE9001010E9001014E9001072
-:10B2C00018E900101CE9001020E9001000260660B3
-:10B2D000001D491C9942F9D301990120084302211C
-:10B2E0000143CF480840217D012901D1012100E01F
-:10B2F0000021CC4B034048028021890008401843BC
-:10B30000217D01290CD101210BE000BF24E90010AF
-:10B3100028E9001001006200FFFF00FF0300FFFFAB
-:10B320000021C14B03400802802149000840184316
-:10B33000802188434021884320218843102188436D
-:10B340000421884301900198A861E08AC005C00DDE
-:10B350000D99B64B0B400104B54808401843217EB7
-:10B36000B44B03400902FF200002084018437F232A
-:10B37000617E19407F26B0430143A07E1840C90179
-:10B38000C90940060843E861207D012853D11F20E8
-:10B39000A18B01400C9FA84E3E400F04F8214903A9
-:10B3A00039403143A67F3040A44E0E400102F820C0
-:10B3B0004001084030430F21E67F0E40F027B8439C
-:10B3C0003701F0263E4006432020205C01400F203C
-:10B3D000864331432220205C012811D1012610E050
-:10B3E000FFFF80FFFCFF0000FFF8FFFFFFFFFF8073
-:10B3F00080E80010FFFFFFC0FFFFC0FFFFFFFFBF9F
-:10B4000000268F480840F10580263604314001436C
-:10B41000E9602320215C19400B9E8A4830400E02CF
-:10B42000FE21C901314001432420205C03407F20DC
-:10B4300081430B43AB6403203C21635C03400A99C6
-:10B440003026B1431E01302333400B433D21615C64
-:10B4500008400C218B4381000C20084018433E21FA
-:10B46000615C012901D1012100E000210223984300
-:10B4700049000223194001433F20205C012801D1EB
-:10B48000012000E0002001260123994330400843B9
-:10B49000802168501498000C0004842169588908A0
-:10B4A0008904890C890040188018002105E0E36AAE
-:10B4B0008F00DB598F00C351491C2823E35C99425C
-:10B4C000F5D31498000C0004882169588908890470
-:10B4D000890C890040188218002308E0606BD900AD
-:10B4E000401803C8DF00D71903C7083F5B1C302092
-:10B4F000205C8342F2D3844803990140834A0A4086
-:10B5000083491140834A0A4083491140834A0A40D3
-:10B510004B491140824A0A4082491140824A0A40FE
-:10B52000802109031143814A0A4081491140814A1F
-:10B530000A40814911403A4A0A4080491140804AF4
-:10B540000A4080491140804A0A4036491140364B32
-:10B550000B4080218B434021C9430B402022D24322
-:10B56000134010271F4308239F430423DB431F403E
-:10B570000224E443274037430397039F6F65029FEC
-:10B58000384002900298614F074061483840614F4F
-:10B59000074061483840614F074029483840604FB4
-:10B5A000074060483840604F0740684838405F4F68
-:10B5B00007405F4838405F4F07405F483840184FAA
-:10B5C00007405E4838405E4F07405E4838405E4F57
-:10B5D000074014483840144F0740802087433940C3
-:10B5E0000A40102082430820824313402340012058
-:10B5F0008343AB65079830430440EC651498FFF72C
-:10B600009EFA4000B04900220A5201980121884365
-:10B61000A861A86930400028FBD1002015B0F0BD1A
-:10B62000FFBFFFFFFFFDFFFFFFFEFFFFFFFF00FE6D
-:10B630000000FF01FF00FFFFFFFFE0FFFFE0FFFF53
-:10B64000FFFF7FFFFF80FFFFFEB50700002F01D146
-:10B650009E4857E03800FFF7EFF9002801D19B48DA
-:10B6600050E0002404604460C46004613D00012097
-:10B67000A861A96901400029FBD00326AE61694693
-:10B680003800FFF76FF9002801D090483AE0842095
-:10B690002C5088202C508E4890216850BC202C5073
-:10B6A000A0202C50B0202C50C02040003C50AC209A
-:10B6B0002C50C8202C50F0202C50C0202C50380C7E
-:10B6C0000004694609884018802149024018019900
-:10B6D0008A08210002E00460001D491C9142FAD34F
-:10B6E000AE617C48E8617C48E860AC6480202C5006
-:10B6F0006C65AC65EC653800FFF721FA40007249D3
-:10B700000C520020FEBD0000FFFFFFDFFFFFFFEF38
-:10B71000FFFFFFF7FFFFFFFBFFFFFFFDFFFFFFFE48
-:10B72000FFFFBFFFFFFFDFFFFFFFEFFFFFFFFBFF9D
-:10B73000FFFFFDFFFFFFFEFFFF7FFFFFFFDFFFFFBC
-:10B74000FFEFFFFFFFF7FFFFFFFBFFFFFFFFF7FF2D
-:10B75000F8B50600002E02D01400002C01D15B4881
-:10B76000B0E06846017068460078202801DB574841
-:10B77000A8E03000FFF760F9002801D15348A1E0AC
-:10B7800037000125B8692840002808D1CC20395855
-:10B7900068460078C1400800C007C00F00E02800DC
-:10B7A000C0B2002801D049488CE0684601783000DA
-:10B7B000FFF775F9002801D1444883E001000A68C9
-:10B7C000464B13400B60217A012901D12B0000E088
-:10B7D000002302001668424931409B078026F60587
-:10B7E00033400B4313600168890F2940002902D1BF
-:10B7F00061688A0400E0626801000B685B0F5B0708
-:10B80000D200D2081A430A60011D0A68354B134062
-:10B810000B60011D0A681202120A0A604C21615C69
-:10B820000B071B0F011D0E682F4A32401B04F02628
-:10B8300036031E4016430E602178012901D12B00EA
-:10B8400000E00023021D1668284931405B05802670
-:10B85000B60333400B4313602178012901D12B003B
-:10B8600000E00023021D1668214931401B05802697
-:10B87000760333400B4313604C21615C082901DAE5
-:10B88000002102E04C21615C08391A4A89B2515CFE
-:10B8900000220AE013009BB29B00E318DB6816004D
-:10B8A000B6B2B6008619B360521C13000E00F6B291
-:10B8B0009BB2B6B2B342EDD3684600788540D02043
-:10B8C0003D500020F2BD0000301B00280100620046
-:10B8D000FFFFFF1F030A0006330A0000FFFFFFDF20
-:10B8E000FFFFFFBFFFFF7FFFFFFFF0FFFFFFDFFF57
-:10B8F000FFFFEFFF80E8001010B50200002A03D020
-:10B900000800C0B2202801DB002021E00020012334
-:10B91000CC241459CC401C40002C09D0D420105801
-:10B92000C8401840002801D1180010E003200EE0A4
-:10B93000D8241459CC401C40002C01D0022006E031
-:10B94000DC241259CA401340002B00D00420C0B29E
-:10B9500010BD000080B500F029FE00F097FD002822
-:10B9600004D1E02000F01EF9002020E001F024FBCB
-:10B97000002804D1E02000F015F9002017E0002095
-:10B9800001006F4A11706F4908606F4908606F4984
-:10B99000086001006E4A117001006E4A11700121A9
-:10B9A0006D4A11706D49086086490860012002BD2A
-:10B9B00038B585480168491C0160654C2078042829
-:10B9C00003D3E02000F0EEF853E05D480078002853
-:10B9D00002D000F0EBFD4CE020785E4D2978C0B23B
-:10B9E000884208D0207800F062F8002803D1E020D7
-:10B9F00000F0D8F83DE02878002814D0F7F73AF99D
-:10BA00007049504A1268801A086008686F49884275
-:10BA100009D36F480168491C01600020207005208F
-:10BA200000F0C0F825E048480168491C0160016841
-:10BA30000A291ED30024046001F0CBFA00280AD0A2
-:10BA40004248046001F0D8FA6249088001F0D7FA50
-:10BA5000614908600DE061480168491C01603B488C
-:10BA60000168491C01600068032802D3E02000F04F
-:10BA700099F831BD00B50100C9B2042901D30020F5
-:10BA80000CE02F490978002905D00100C9B200292E
-:10BA900001D0002002E02E490870012000BD80B5D1
-:10BAA00000202B490870E02000F07CF801BD70B543
-:10BAB00004002000C0B200280FD100F077FD254817
-:10BAC00004700120244908700020454908603D4960
-:10BAD00008601C49086001202FE02000C0B200F07F
-:10BAE0003FF80500002D01D1002026E000F068FDA0
-:10BAF000002806D0280000F03BFD002808D10020D7
-:10BB00001BE0280000F0E8FC002801D1002014E030
-:10BB1000104E3078002806D1F7F7ACF809490860D4
-:10BB200000202849086034702000C0B200F029F8D5
-:10BB3000094908702A480560012070BD0000000016
-:10BB4000BC1C0028181C00281C1C0028201C0028D5
-:10BB5000B91C0028BA1C0028BB1C0028001C0028A7
-:10BB600000B5C0B2012804D009D3032805D002D300
-:10BB700005E01E2004E03C2002E05A2000E0002006
-:10BB800000BD00B5C0B2012804D009D3032805D0F8
-:10BB900002D305E0022004E0032002E0042000E0DC
-:10BBA000012000BD10B5040000F000FD01200D498A
-:10BBB0000870002001000C4A1170094908600B4808
-:10BBC000047010BD041C0028081C0028C0270900B0
-:10BBD0000C1C00289A1C0028141C0028101C00288B
-:10BBE000001C0028BC1C0028BA1C0028BB1C002814
-:10BBF00070B5B14BC018C0090001C64BC318042969
-:10BC00000CD21F251C68CE002800B0408443D2B25D
-:10BC10001540C800854025431D600CE0FC311F2500
-:10BC20005C68CE002800B0408443D2B21540C80002
-:10BC3000854025435D6070BD00B59F4A8018C009EE
-:10BC40000001B44A8018042905D20068C900C84020
-:10BC5000C006C00E05E0FC314068C900C840C006FF
-:10BC6000C00EC0B200BD00B5002A03D101228A4037
-:10BC7000426002E001228A40826000BD30B40300CD
-:10BC80008C000F25596C2800A04081431540A54029
-:10BC90000D435D6430BC704730B403004C00103479
-:10BCA0000325D96C2800A04081431540A5400D43D1
-:10BCB000DD6430BC704700B5022801D301200FE0DD
-:10BCC0000B00DBB2042B01DB012009E0A44B800058
-:10BCD0001818C9B2405C824201D3012000E0002064
-:10BCE00000BDF8B504001F00022C01D3012023E0A1
-:10BCF00015000E002A003100C9B22000FFF7DBFF5B
-:10BD0000012801D1012017E03000C0B2002816D16F
-:10BD1000FF2F12D8B74861034018A90040188021AE
-:10BD2000490140180168B44A0A403902FF231B0246
-:10BD30000B40134303600020F2BD0120FCE7F6B284
-:10BD4000012E16D180204002874210D2A9486103FB
-:10BD50004018A9004018A021490140180168BB4AB9
-:10BD60000A403902BA4B0B4013430360E3E701205A
-:10BD7000E2E70120E0E700B20012C0B27047F8B578
-:10BD800005000F001600280000B2FFF7F4FF0400C2
-:10BD90002000C0B2022801D301202CE0320039007B
-:10BDA000C9B22000C0B2FFF786FF012801D10120EF
-:10BDB00021E090482100C9B2490341182A00D2B2BB
-:10BDC00092008918C02212018A58A2491140FFB27C
-:10BDD0003B02C02292001A400A43FF218A43F1B27B
-:10BDE0001143E4B262038018EDB2AA008018C022A9
-:10BDF000120181500020F2BD70B50400022C01D365
-:10BE0000012028E015000E002A003100C9B22000F0
-:10BE1000FFF751FF012801D101201CE075486103A3
-:10BE20004158802212060A43C02189041143FF228F
-:10BE300012040A43874B1340F6B23202C021890034
-:10BE400011401943FF229143EAB20A436103425071
-:10BE500061034058002070BD70B50400022C01D36E
-:10BE6000012028E015000E002A003100C9B2200090
-:10BE7000FFF721FF012801D101201CE05D4861038B
-:10BE800041588022D2050A43C02189041143FF2270
-:10BE900012040A436F4B1340F6B23202C0218900EC
-:10BEA00011401943FF229143EAB20A436103425011
-:10BEB00061034058002070BD0000CFBFF0B58DB0C9
-:10BEC000684665493422F8F70FFF644F6A4601213E
-:10BED0003800F8F7CCF80600002420006946087204
-:10BEE0006A4602213800F8F7C2F805000022012155
-:10BEF0003800FFF7B8FE002202213800FFF7B3FE3A
-:10BF00003543002D01D1012000E02000C0B20DB06A
-:10BF1000F0BD00000000304010B500F0ABF8002884
-:10BF200001D100201BE04E4C2000F8F7BDFA4D492E
-:10BF30002000F8F733F9002801D000200FE020009E
-:10BF4000F8F7BFFA4849884207D12000F8F7B5FA58
-:10BF50004649884201D1012000E00020C0B210BD56
-:10BF600098E8001070B5424C0021216000F046F8BE
-:10BF7000002803D10120206000203AE0374E002243
-:10BF800001213000FFF76FFE354D37492800F8F7E3
-:10BF900096FA2800F8F782FA2800F8F740FD022008
-:10BFA000F9F78CF82800F8F784FA000405D4022089
-:10BFB000206000F03AF800201BE000220121300050
-:10BFC000FFF76AFE062201213000FFF757FE082224
-:10BFD00001213000FFF70CFE01213000FFF72CFE9D
-:10BFE000082805D00320206000F01FF8002000E0A2
-:10BFF000012070BD00000440FF00FFFF38B5652838
-:10C0000001D3002010E000F087F80400144D210057
-:10C010002800F8F750FA2800F8F74FFAA04201D1AB
-:10C02000012000E00020C0B232BD10B50C48F8F786
-:10C030003BFA0A4C00220121200000F07BF800228C
-:10C040000221200000F076F810BD0000FF0000FF84
-:10C0500000FFFF00FFFCFFFFB0E40010800531404F
-:10C06000001E584090E000101F4E0000204E0000BF
-:10C07000B81B0028F8B5002500956846FBF7EAFBD9
-:10C08000002801D0002045E0274C0098A04205D3AD
-:10C0900000982100F8F72AF8002901D0002039E0A3
-:10C0A00000982100F8F722F80400002C02D01F4865
-:10C0B000844201D300202DE0FF266A363000FFF7CE
-:10C0C0005AFE0700002201213800FFF7C5FE0028B4
-:10C0D00001D000201EE0002201213000FFF74FFEBA
-:10C0E000002801D0002015E023005B1E0022012162
-:10C0F0003800FFF7F6FD002801D000200AE00022FA
-:10C1000001213800FFF778FE002801D1012000E06E
-:10C110002800C0B2F2BD000000B5054948436421C3
-:10C12000F7F7E4FF00BD000080841E00010001005D
-:10C13000204E000070B505000C0016000022210002
-:10C140002800FFF790FD3200D2B221002800FFF74F
-:10C150004FFD002221002800FFF79EFD062221004E
-:10C160002800FFF78BFD002221002800FFF77BFD50
-:10C1700070BD000070B5B14BC018C0090001C24BC2
-:10C18000C31804290CD21F251C68CE002800B0401B
-:10C190008443D2B21540C800854025431D600CE0A1
-:10C1A000FC311F255C68CE002800B0408443D2B229
-:10C1B0001540C800854025435D6070BD00B59F4AAD
-:10C1C0008018C0090001B04A8018042905D200680F
-:10C1D000C900C840C006C00E05E0FC314068C90077
-:10C1E000C840C006C00EC0B200BD00B5002A03D1D1
-:10C1F00001228A40426002E001228A40826000BD42
-:10C2000030B403008C000F25596C2800A0408143F6
-:10C210001540A5400D435D6430BC704730B4030049
-:10C220004C0010340325D96C2800A04081431540F0
-:10C23000A5400D43DD6430BC704700B5022801D332
-:10C2400001200FE00B00DBB2042B01DB012009E031
-:10C25000A04B80001818C9B2405C824201D3012073
-:10C2600000E0002000BDF8B504001F00022C01D33F
-:10C27000012023E015000E002A003100C9B2200081
-:10C28000FFF7DBFF012801D1012017E03000C0B229
-:10C29000002816D1FF2F12D8B34861034018A90017
-:10C2A00040188021490140180168B04A0A4039020B
-:10C2B000FF231B020B40134303600020F2BD01204B
-:10C2C000FCE7F6B2012E16D180204002874210D240
-:10C2D000A54861034018A9004018A0214901401851
-:10C2E0000168B14A0A403902BA4B0B40134303605C
-:10C2F000E3E70120E2E70120E0E700B20012C0B26C
-:10C300007047F8B505000F001600280000B2FFF7CF
-:10C31000F4FF04002000C0B2022801D301202CE069
-:10C3200032003900C9B22000C0B2FFF786FF0128F1
-:10C3300001D1012021E08C482100C9B249034118F4
-:10C340002A00D2B292008918C02212018A58A2494A
-:10C350001140FFB23B02C02292001A400A43FF2163
-:10C360008A43F1B21143E4B262038018EDB2AA002D
-:10C370008018C022120181500020F2BD70B5040067
-:10C38000022C01D3012028E015000E002A00310004
-:10C39000C9B22000FFF751FF012801D101201CE0A4
-:10C3A000714861034158802212060A43C021890462
-:10C3B0001143FF2212040A43874B1340F6B23202A4
-:10C3C000C021890011401943FF229143EAB20A4378
-:10C3D0006103425061034058002070BD70B50400F5
-:10C3E000022C01D3012028E015000E002A003100A4
-:10C3F000C9B22000FFF721FF012801D101201CE074
-:10C400005948610341588022D2050A43C02189045A
-:10C410001143FF2212040A436F4B1340F6B232025B
-:10C42000C021890011401943FF229143EAB20A4317
-:10C430006103425061034058002070BD0000CFBF2F
-:10C4400078B58DB0684665493422F8F74DFC644EE6
-:10C450006A4607213000F7F70AFE04000022072190
-:10C460003000FFF7C2FE00255E480560002C07D1B2
-:10C4700007213000FFF7A2FE002801D1012000E0D3
-:10C480002800C0B20EB070BD0000304010B500F002
-:10C49000B3F8002801D100201AE0534C2000F8F72F
-:10C4A00003F852492000F7F779FE002801D0002058
-:10C4B0000EE02000F8F705F84D49884206D120002B
-:10C4C000F7F7FBFF002801D1012000E00020C0B2F7
-:10C4D00010BD000098E8001070B5464C00212160A6
-:10C4E00000F046F8002803D10120206000203AE047
-:10C4F0003B4E002207213000FFF777FE3A4D3C49C2
-:10C500002800F7F7DCFF2800F7F7C8FF2800F8F746
-:10C5100086FA0220F8F7D2FD2800F7F7CAFF0004D8
-:10C5200005D40220206000F041F800201BE000222A
-:10C5300007213000FFF772FE062207213000FFF7C7
-:10C540005FFE082207213000FFF714FE07213000AC
-:10C55000FFF734FE082805D00320206000F026F8FD
-:10C56000002000E0012070BD00000440FF00FFFF3C
-:10C5700070B50400002C01D0652C01D3002012E01E
-:10C58000200000F08BF80600174D31002800F7F767
-:10C5900092FF2800F7F791FFB04201D0002002E09F
-:10C5A00010480460012070BDFF0000FF80B50E48F8
-:10C5B000F7F77AFF00F07AF800200A49086001BD19
-:10C5C00080B50948F7F775FFC10B0800C007C00F19
-:10C5D00002BD000000FFFF00FFFCFFFF7CE4001035
-:10C5E00000083140B01B0028802058401CE000109B
-:10C5F0001F4E0000B41B0028F8B5002500956846C2
-:10C60000FBF728F9002801D0002045E0354C0098C0
-:10C61000A04205D300982100F7F768FD002901D05A
-:10C62000002039E000982100F7F760FD0400002C9D
-:10C6300002D02D48844201D300202DE0B726760099
-:10C640003000FFF75AFE0700032201213800FFF7F0
-:10C65000C5FE002801D000201EE003220121300089
-:10C66000FFF74FFE002801D0002015E023005B1EDD
-:10C67000032201213800FFF7F6FD002801D0002039
-:10C680000AE0032201213800FFF778FE002801D1DB
-:10C69000012000E02800C0B2F2BD000000B513493F
-:10C6A00048436421F7F722FD00BD000010B5104C8F
-:10C6B000002207212000FFF798FD0022072120001B
-:10C6C000FFF758FD002207212000FFF7A7FD0622F3
-:10C6D00007212000FFF794FD002207212000FFF72B
-:10C6E00084FD10BD80841E0001000100204E00006A
-:10C6F0000008314038B50500082D0DD3914C1822A3
-:10C7000091492000FBF7F0F80020E075E8208F4900
-:10C7100008600020FBF748F98D486901401832BDD8
-:10C72000994B1B689BB212041A43120C120489B273
-:10C73000114381607047C0687047944B1B689BB27F
-:10C7400012041A43120C120489B2114301600068EA
-:10C750007047C069C00FC0B27047F8B502000E0044
-:10C76000002A01D105204EE00F2089490B681B0AE1
-:10C770000340002B01D1002007E00968090A0840A6
-:10C780000E2801D1012000E00220824940010F184B
-:10C79000814C984D280011001022F8F7BFFA286844
-:10C7A00001218843286010212800FBF720F9924BD3
-:10C7B0002A000121380000F04CFC002804D00120A0
-:10C7C00021E0641E002C15D03800FFF7C2FF0028BE
-:10C7D000F7D1002E08D010212800FBF707F9300010
-:10C7E00029001022F8F79AFA00F0B4F8012803D1D2
-:10C7F000032008E0022006E000F0ACF8002801D198
-:10C80000002000E00420F2BD38B50100002901D16C
-:10C8100005202BE00F205E4A13681B0A0340002B03
-:10C8200001D1002007E01268120A10400E2801D141
-:10C83000012000E00220574A400115186D4C2000ED
-:10C840001022F8F76BFA206801218843206010213C
-:10C850002000FBF7CCF8684B22000121280000F0F3
-:10C86000F8FB002801D0012000E0002032BDFEB519
-:10C8700003001600002B03D001910198002801D17C
-:10C8800005205DE00F2042490A68120A0240002A92
-:10C8900001D1002007E00968090A08400E2801D1EB
-:10C8A000012000E002203B49400108180090804C24
-:10C8B000504D280019001022F8F730FA7D4F38004B
-:10C8C00001991022F8F72AFA286801218843286084
-:10C8D000386801218843386010212800FBF787F869
-:10C8E00010213800FBF783F83B002A000121009853
-:10C8F00000F0AFFB002804D0012021E0641E002CD2
-:10C9000015D00098FFF725FF0028F7D1002E08D09A
-:10C9100010212800FBF76AF8300029001022F8F7F0
-:10C92000FDF900F017F8012803D1032008E00220E8
-:10C9300006E000F00FF8002801D1002000E00420FC
-:10C94000FEBD0000181B00289CDE0010E81B00281C
-:10C950000010224010B5274C10212000FBF746F8AC
-:10C960002068000F0007A0210906884201D100209D
-:10C9700009E02068000F0007F0210906884201D174
-:10C98000012000E0022010BD60E9001064E9001001
-:10C990000000204000002240FFFFFF0F38B50400D8
-:10C9A000FFF7D8FF05002800C0B2022801D1424895
-:10C9B0000DE0002C04D0200027491022F8F7AEF932
-:10C9C000EDB2002D01D1002001E02348006832BD06
-:10C9D00000B5010F0907A0221206914201D10020E3
-:10C9E00006E0010F0907F0221206914200D03248FA
-:10C9F00000BD0000601B0028E41B00281CB50200DD
-:10CA00000B002E4803C86C4603C4083C6C46638088
-:10CA10002B4802606846F8F735F92A490020205E65
-:10CA2000F8F74FF90220FFF765FE0F21264A136839
-:10CA30001B0A0B40002B01D1002307E01268120AE9
-:10CA400011400E2901D1012300E00223002201211F
-:10CA50009940FFF765FE13BD601B002870B50026E6
-:10CA600030000220FFF746FE04002000FFF763FEBF
-:10CA700005000F2014490A68120A0240002A07D054
-:10CA80000968090A08400E2801D1012600E00226A3
-:10CA90002800F040C00705D509480168002901D0E9
-:10CAA000006880472A0CA9B22000FFF746FE70BD3F
-:10CAB000FFFFFF00801B0028FFFFFF0F90E8001022
-:10CAC000E01B00285DCA00100000204050480068AC
-:10CAD000410B0800C007C00F70474D480068010BAC
-:10CAE0000800C007C00F704700B54A48012102681E
-:10CAF0000A43026002680A40002AFBD100BD1FB54C
-:10CB00000400C9B2012921D168461021FAF704F8BE
-:10CB100069462000FFF721FE0100C9B2012901D1B9
-:10CB20005B481BE00100C9B2022901D13A4815E077
-:10CB3000C0B2042801D1394810E0009800F01CF977
-:10CB400000280BD1FFF7D0FF002007E02000FFF7FF
-:10CB50005BFE002801D04E4800E0002004B010BD6C
-:10CB60007FB50C001500002C01D14A484DE020682B
-:10CB700000F0F0F8012802D06068002801D1454893
-:10CB800043E068461021F9F7C7FF00980002000A49
-:10CB9000C021C90401430091227AFF2000023E49CE
-:10CBA000009B0B40120202401A430092637A009EDF
-:10CBB000494A32401B04FF2636041E4016430096A5
-:10CBC000E27A019B19401202104008430190A07ABA
-:10CBD0000199FF229143C0B208430190207B019943
-:10CBE0000902090A00060843019020680290606863
-:10CBF00003903A48A17A4900415A6068FAF7F7FE73
-:10CC00002900C9B26846FFF77AFF04B070BD000082
-:10CC1000000024400800244010005200FF00520091
-:10CC200010B50400FFF752FF002810D1EC200006D9
-:10CC30002018C0218902884201D2002026E0444801
-:10CC400020188021490288421FD200201EE0C02007
-:10CC50004002EC2109066118814201D2002015E052
-:10CC6000802109026B4AA2188A4201D200200DE0FD
-:10CC7000EB221206A218824201D2002006E066488A
-:10CC80002018884201D2002000E0012010BD0000E1
-:10CC9000040052000F005200FF00FFFF10B5040017
-:10CCA000FFF714FF002807D12948201880214902E6
-:10CCB00088420FD201200EE0802000025549611801
-:10CCC000814201D2012006E053496118814201D21C
-:10CCD000012000E0002010BDFFFF00FFF0E7001082
-:10CCE00010B50400FFF7F9FE002810D1F02000066F
-:10CCF0002018FE21C903884201D2002026E06548A1
-:10CD000020188021C90288421FD200201EE0FE2088
-:10CD10008003F02109066118814201D2002015E04C
-:10CD2000802189025C4AA2188A4201D200200DE0CB
-:10CD3000EE221206A218824201D2002006E05748D5
-:10CD40002018884201D2002000E0012010BD000020
-:10CD50000000FDEB10B504002000FFF761FF002884
-:10CD600001D1002007E02000FFF7BAFF002801D121
-:10CD7000002000E0012010BD80B5FFF729FE00284B
-:10CD800001D1002044E04649884201D145483FE0B6
-:10CD90004549401A1CD0801E1DD0401E1DD0401E8B
-:10CDA0001DD0401E1DD0001F1DD087381DD0401E35
-:10CDB0001DD012381DD0401E1DD0401E1DD0801E1B
-:10CDC0001DD0801E1DD008381DD009381DD01EE092
-:10CDD000A420C0031CE035481AE0354818E0354867
-:10CDE00016E0354814E0354812E0354810E0354883
-:10CDF0000EE035480CE035480AE0354808E0354893
-:10CE000006E0354804E0354802E0354800E02548B2
-:10CE100002BD00000080FEEB0080FEEA38B584B061
-:10CE20000C001500002C01D12E4831E02068FFF7DE
-:10CE300091FF012801D12B482AE02078800701D0FA
-:10CE4000284825E068461021F9F766FE00980002A0
-:10CE5000000AA02149050143009120790099224A46
-:10CE60000A400002FF21090201401143009160794C
-:10CE700000994C4A0A400004FF2109040140114373
-:10CE80000091206801902900C9B26846FFF737FE7B
-:10CE900005B030BD000081EF0080C0EF0080C0ED24
-:10CEA000FFFFFF0FFF005200010000F001005200E1
-:10CEB000020052000300520004005200050052001C
-:10CEC00006005200070052000800520009005200FC
-:10CED0000A0052000B0052000C0052000D005200DC
-:10CEE0000E0052000F005200FF00FFFF38B588B05F
-:10CEF0000C001500002C01D12E4851E0606800287C
-:10CF000001D12C484CE02068FFF78AFE012808D0A8
-:10CF10002068616889004018401EFFF781FE0128E3
-:10CF200001D124483CE068461021F9F7F5FD00984E
-:10CF30000002000AA82189050143009120680190A0
-:10CF40006068401E80B20299090C090408430290EF
-:10CF5000EDB2012D1CD104A81021F9F7DDFD04A9C3
-:10CF60006846FFF7FAFB0100C9B2012901D1104858
-:10CF700016E00100C9B2022901D10B4810E0C0B28D
-:10CF8000042801D109480BE00498FFF7F5FE07E0FB
-:10CF90006846FFF739FC002801D0054800E0002072
-:10CFA00009B030BDFFFF00FF10005200FF0052002B
-:10CFB000040052000F00520080B5F7F7A0FB0028D4
-:10CFC00001D1002004E001201349087000F001F8AD
-:10CFD00002BD80B510480078002805D069460420BD
-:10CFE000F7F71CFC002801D1002004E06846008807
-:10CFF0000A490880012002BD08480088704780B5B2
-:10D00000064800880021064A0023F7F75DFA054A22
-:10D010000023F6F766FF02BDA21C0028981C00281A
-:10D0200040787D0150FB4A00174A1268120C120426
-:10D0300089B2114381607047C160704701617047D8
-:10D0400000B50068C00F002801D1104800E00020A2
-:10D0500000BDF8B507000C0015001E003800FFF7F2
-:10D06000EFFF00280DD129003800FFF7E5FF310060
-:10D070003800FFF7E3FF21003800FFF7D5FF00205D
-:10D0800000E00248F2BD00004CE9001001008A00F7
-:10D09000F8B584B0F8F7C9F8BA490127086803223F
-:10D0A000904338430860B8480A6802400A60B749AC
-:10D0B0000A6803239A433A430A600A6802400A60F6
-:10D0C000B3490A6803239A433A430A600A68024054
-:10D0D0000A60B0490A6803239A433A430A600A681F
-:10D0E00010400860AC4801680F2291433943016049
-:10D0F000AA480168072291430160A94801680722F4
-:10D10000914304220A4302600168F0229143C02245
-:10D110000A4302600168C02292000A43026001686B
-:10D12000C02212010A43026001689E4A0A4080211F
-:10D13000490111430160E1480168802212060A4357
-:10D140000260DF48016839400029FAD001684908C7
-:10D1500039400029FAD0DB480168DB4A0A40026006
-:10D16000DA480168D84A0A40802149001143016029
-:10D17000D7480168D44A0A40802149001143016020
-:10D18000D4480168D04A0A400260D34801680722A7
-:10D19000914302220A430260D048016849004908CD
-:10D1A0000160CF480168890A890229220A43026086
-:10D1B0000168CC4A0A4002600168802252040A4396
-:10D1C00002600168C84A0A400260016880221206B3
-:10D1D0000A430260C5480168C54A0A408021C90067
-:10D1E000114301600168FF229143AF220A430260AC
-:10D1F000802189020268BF4B13400B4303608022E9
-:10D2000092040368BC4C1C4014430460BB4B04688C
-:10D210001C400460046880252D0625430560B8483D
-:10D2200004680725AC43022525430560B54804681A
-:10D23000240E2406B44D254305600468B34D2540F3
-:10D24000802464052C430460046880252D06254352
-:10D250000560AF480468640064080460AD4C802534
-:10D26000AD002668A2483040284320602068FF2691
-:10D27000B04362260643266026689E4830408026DA
-:10D28000F6020643266026689B483040024322602F
-:10D290002068184020602068802212060243226025
-:10D2A0009D4802680724A2430224144304609B485B
-:10D2B00002687F24A24328241443046002688C4C33
-:10D2C00014402C43046002688A4C144021430160DE
-:10D2D0000168894A0A400260914902680A40026076
-:10D2E00002681A4002600268802424061443046025
-:10D2F0008C4802680724A243022414430460B04807
-:10D3000002687F24A2431E24144304600268784C00
-:10D310001440254305600268764C1440C0229202F6
-:10D32000224302600268744C144004600268114099
-:10D33000016001680B4003600168802212060A4305
-:10D340000260A048006838400028FAD09E48006873
-:10D3500038400028FAD09D48006838400028FAD0AC
-:10D360009B48006838400028FAD09A480168072294
-:10D3700091430160684698491022F7F7B5FC0026F2
-:10D3800035E000BFC4132040FFFCFFFF0013204026
-:10D3900080132040A01320400000244000152640A8
-:10D3A00044152640FF8FFFFF32200021F7F746FE8D
-:10D3B000300040B2800028180168302291432200DA
-:10D3C00052B21201302313400B430360641E20004D
-:10D3D00040B26946320052B25200895C00B209B2D2
-:10D3E0008842E1DA32200021F7F728FE761C30006F
-:10D3F00040B208283FD2300040B204280DD1EFF3EC
-:10D400001084002080F31088FA239B000022012161
-:10D41000102000F00BFA84F31088704D300040B2F9
-:10D420008000281801680F2291436A4633005BB2DE
-:10D430005B00D21852781207120F0A4302603000C4
-:10D4400040B280002818016830220A430260300090
-:10D4500040B2800028180168802252000A4302600E
-:10D46000300040B2800028180168802212060A436A
-:10D4700002600224ABE75A48134A01681140016078
-:10D48000F821C94303680B400360564803681A40FB
-:10D490000260026811400160F7F7A8FE5248016877
-:10D4A000802212060A43026001680F430760F7F703
-:10D4B00092FE00F039F805B0F0BD00BF1C15264003
-:10D4C0002415264010102040FF00FFFF08102040C8
-:10D4D0000C1020402003204004122640041926404E
-:10D4E00008192640FFFFF8FFFFFFFFEF0019264055
-:10D4F000FFE0FFFFFFFFE0FFFFFFFFF9FFFFFFCFB0
-:10D500000812264014192640F1D24D00FFFFFF8F6C
-:10D5100018192640101926400C12264000162640E5
-:10D52000FFFFFFF71012264038B586B068462F4936
-:10D530001822F7F7D9FB6846F9F740FFC0B2002878
-:10D540000ED02B4C18222B492000FAF7CDF90020E1
-:10D55000E075FF20A830284908600020FAF724FA77
-:10D56000264D2800FAF7BCF9C0B200280ED0204C96
-:10D57000182220492000FAF7B7F90020E075FF20B3
-:10D58000AA301D4908600020FAF70EFA1C4C2868E2
-:10D59000206020681B4940181B49F6F7A7FD1B496E
-:10D5A00008601B4D20681B494018FA218900F6F7D6
-:10D5B0009DFD28602868C0031749086007B030BD8A
-:10D5C000041626400C1926401C19264040162640F9
-:10D5D000441626401412264054E8001040122640FB
-:10D5E000080020400804204008152640C4E7001029
-:10D5F000181B0028E4E10010E81B0028841C002808
-:10D60000881C00283F420F0040420F00901C002859
-:10D610008C1C0028E7030000941C0028F3B595B08B
-:10D62000170000210D000800684601801C00A4B20C
-:10D63000A408200080B280218900884203D30125FC
-:10D64000684604807E4C1C9E00F011F9002800D032
-:10D6500099E06846877016A8077801A81021F9F7A5
-:10D660005BFA0198022188433100C9B249000222C5
-:10D67000114001430191019804218843FFB2B90090
-:10D680000422114001430191019808218843694611
-:10D690008978C900082211400143019101981021A5
-:10D6A00088430190019820218843019001984021EE
-:10D6B000884301900198802101430191614F0198B5
-:10D6C000384015A909780902F82252010A4002439C
-:10D6D000019201985C490140019101980002000A01
-:10D6E000A82149050143019111A81021F9F714FA65
-:10D6F0001198800A8002A4B2A105890D01431191FD
-:10D7000052480068002806D101980740D020400107
-:10D710003843019007E0002805D001980740802099
-:10D72000400138430190002211A901A8FFF79FF89A
-:10D73000EDB2002D03D06846008800F08DF809A8EE
-:10D740001021F9F7E9F9099802218843F6B271002E
-:10D75000022211400143099109983D490140099174
-:10D7600009983C49014080204002084309900998EB
-:10D770000002000A8821490501430991002109A8F6
-:10D78000FEF7EBFF50E000F07DF80128FBD000F041
-:10D7900073F80128F7D10DA81021F9F7BDF90DA8EC
-:10D7A0000078FD2101400DA801700DA800780C2122
-:10D7B00001430DA801700D980002000AB02149052F
-:10D7C00001430D9100210DA8FEF7C7FF00F054F8AA
-:10D7D000002829D1EDB2002D03D06846008800F062
-:10D7E0003BF805A81021F9F797F90598022188431D
-:10D7F000F6B27100022211400143059105981449C7
-:10D8000001400591059813490140802040020843DA
-:10D81000059005980002000A8821490501430591F9
-:10D82000002105A8FEF799FF17B0F0BD1CB5012433
-:10D8300000949BB2D2B2C9B2C0B2FFF7EFFE13BDE3
-:10D84000FF010000FFE0FFFFFF1FFFFF3007001791
-:10D85000FF00FFFFFFFF00FF0D490A680D4B13405B
-:10D8600080B200050C4A02401A430A60704708481B
-:10D870000068C00FC0B27047084801680800C007C0
-:10D88000C00F704705480068C00FC0B27047000065
-:10D8900028102640FFFF0FC00000F03F2C1026404C
-:10D8A00000B5010009B2002905D40121C006C00E4F
-:10D8B00081408F48016000BDF0B5020012B2002A1D
-:10D8C00018D418228B4B040024B2A408A4001C59BD
-:10D8D000FF250600F6001640B540AC438901C9B2E9
-:10D8E0000500ED002A409140214300B280088000ED
-:10D8F00019501CE00F22804C182503001BB2134066
-:10D90000083B9B089B00060036B23240083A92085A
-:10D910009200A258FF260700FF002F40BE40B243EE
-:10D920008901C9B2C0000540A9401143E150F0BDD2
-:10D9300080B500F012F87148714902680A4002602F
-:10D94000704802680A4002606F4802681140016036
-:10D9500000F092F800F0A9F801BDFEB568466B49E9
-:10D960000CC90CC008390838002630000AE06A46A5
-:10D970000300DBB2DB00D2185268521C11400029B0
-:10D980000ED1401C0100C9B200290AD107216A4604
-:10D990000300DBB2DB00D2580A40002AE7D0FEE7E2
-:10D9A000FEE75B4C072021680140002900D0FEE71C
-:10D9B000584F3968491C0840002800D0FEE7350060
-:10D9C00024E068462900C9B2C90040184168684689
-:10D9D0002A00D2B2D200805800F044F815E030009E
-:10D9E0000028EED02168491E68462A00D2B2D20033
-:10D9F000805800F037F868462900C9B2C9004018BD
-:10DA000041683868401C00F02DF86D1C2800C0B239
-:10DA1000002826D168462900C9B2C900405800280C
-:10DA200014D0206869462A00D2B2D20089588842B0
-:10DA30000AD368462900C9B2C90040184068216865
-:10DA4000884201D30120CBE73000C9E768462900AE
-:10DA5000C9B2C9004018406821688842BFD301207C
-:10DA6000BEE7F7BD80B50022002302E00CC00838F5
-:10DA700008308842FAD301BD30B5274880082749CD
-:10DA8000274A002308E01C00E4B2A40014591D003A
-:10DA9000EDB2AD004C515B1C1C000500E4B2EDB2D0
-:10DAA000AC42F0D31F48016030BD10B510231121E6
-:10DAB0001A4800221C00E4B2A4001459DBB29B00F7
-:10DAC000C4500B00DBB29B00D258C9B2890042504F
-:10DAD00001210020FFF7F0FE00210120FFF7ECFEFE
-:10DAE0000020FFF7DDFE0120FFF7DAFE10BD000089
-:10DAF00000E100E000E400E01CED00E00013204045
-:10DB0000FFFFF7FF80132040A0132040B8E800106B
-:10DB1000DCE10010E0E1001080000000001D0028A2
-:10DB20000000001008ED00E000B5010009B2002976
-:10DB300005D40121C006C00E81404A48016000BDE5
-:10DB400000B5FEE780B54848006848480068C10F46
-:10DB5000002905D046498005800D8000085880477F
-:10DB60000020FFF7E1FF01BD80B542480068424850
-:10DB70000068C10F002905D03D498005800D800057
-:10DB8000085880470120FFF7CFFF01BD80B53B4813
-:10DB900000683B480068C10F002905D03449800562
-:10DBA000800D8000085880470220FFF7BDFF01BDAF
-:10DBB00080B53448006834480068C10F002905D09A
-:10DBC0002B498005800D8000085880470320FFF70F
-:10DBD000ABFF01BD80B52D4800682D480068C10F1E
-:10DBE000002905D022498005800D80000858804713
-:10DBF0000420FFF799FF01BD80B52648006826483C
-:10DC00000068C10F002905D019498005800D8000EA
-:10DC1000085880470520FFF787FF01BD80B51F48E2
-:10DC200000681F480068C10F002905D01049800511
-:10DC3000800D8000085880470620FFF775FF01BD62
-:10DC400080B51848006818480068C10F002905D041
-:10DC500007498005800D8000085880470720FFF79E
-:10DC600063FF01BD80E200E02CE9001000112040BC
-:10DC70004809002830E900100411204034E9001060
-:10DC80000811204038E900100C1120403CE9001038
-:10DC90001011204040E900101411204044E9001008
-:10DCA0001811204048E900101C112040ACE600107B
-:10DCB00004E8001080023140040000000800000069
-:10DCC000800658403A01000000093140020000007F
-:10DCD0000A0F0D07E0010000FC530000982100002E
-:10DCE000F4010000E8030000F401000038E7001030
-:10DCF00014E8001080023140050000000800000018
-:10DD0000000758403B0100000005314001000000C1
-:10DD10000AF0D07076010000E0150000D417000072
-:10DD20005E010000E8030000F401000054E7001069
-:10DD300024E800100004314000000000080000004A
-:10DD400080095840400100000007314000000000F9
-:10DD5000090F0D0795030000901A0000282300000A
-:10DD6000F4010000E8030000F401000070E7001077
-:10DD700034E800108000314000000000080000007E
-:10DD8000000658403901000000063140050000003F
-:10DD900009F0D07087020000201C000098210000CC
-:10DDA000F4010000D0070000F401000080B5F3F793
-:10DDB0007FFAFCF773F9FCF761F8FA208000F7F7B7
-:10DDC0007DF9F4E710B5FEF73BFBFEF777F8FFF7B8
-:10DDD0005FF9F3F76DFAFEF733FB002803D0FEF787
-:10DDE0006DF8002801D1FFF7E1FF204C00F042F868
-:10DDF000206000F042F82068FBF7DEFFFCF76EF8C9
-:10DE0000002801D0FFF7D2FF62B6194CF5F7D4FF16
-:10DE100020602068002804D00120FCF737F8FFF7C5
-:10DE2000C5FF0120F4F7BDFFFCF778F8002804D106
-:10DE30000120FCF72BF8FFF7B9FFF7F719FA0028D4
-:10DE400001D1FFF7B3FFF7F76FFAFCF7C7F8FCF75C
-:10DE500045F8002803D0F3F72BFAFCF71FF9FCF77D
-:10DE60000DF8FA208000F7F729F9ECE7EC1B002801
-:10DE7000281200280648006870470020C043044963
-:10DE800008600449086000200349086070470000EA
-:10DE9000001826400418264008102640443A5C68C2
-:10DEA00075616E672E7875657765695C4769745C26
-:10DEB000436F676E69746976655F4167656E745C10
-:10DEC0002E636F6465785F746D705C736561742D2B
-:10DED0006669726D776172652D6275696C642D6219
-:10DEE00061643338633535313366393461393362CF
-:10DEF0003532633831626334303338363763335CFC
-:10DF0000636F6D6D6F6E5C7372635C64726976656E
-:10DF100072735C6970635C63795F6970635F64727C
-:10DF2000762E6800F1B401684118436858080A1851
-:10DF300000988068DB0701D54B46C01891422DD070
-:10DF40000D78491C032403262E4002D10E78F61CBE
-:10DF5000491C2B090F2B07D10B780F33491C03E009
-:10DF60000F78491C0770401C761EF9D1002BE5D0B4
-:10DF70000E78491CAD082C40032C01D10C78491CAB
-:10DF800024023419654244190025AE1E9E42D5D0A4
-:10DF90002678641C0670401C6D1CF6E700980C3057
-:10DFA000F2BC704700053140060000000000000090
-:10DFB000801890400200000000063140010000007F
-:10DFC00000000000401990400500000000053140AD
-:10DFD0000700000000000000C0189040030000008F
-:10DFE000000531400500000000000000401890408E
-:10DFF00001000000000631400200000000000000A7
-:10E000008019904006000000000631400600000024
-:10E0100000000000801A90400A0000000400000088
-:10E0200000000000000000000000000001000303E9
-:10E030001F4E000000000000000000000000000073
-:10E0400000000000000000000000000000000000D0
-:10E0500000000000000000000000000002030000BB
-:10E0600000000000030000000000000003000000AA
-:10E07000000000000300000000000000030000009A
-:10E080000000000003000000010000000102000089
-:10E09000040000000000000000000000000000007C
-:10E0A000010003031F4E00000000000000000000FC
-:10E0B000204E0000000000000000000000000000F2
-:10E0C0000000000000000000000000000000000050
-:10E0D0000203000000000000030000000000000038
-:10E0E000030000000000000003000000000000002A
-:10E0F0000300000000000000030000000100000019
-:10E100000102000004000000000000000000000008
-:10E110000000000001000303630000000000000095
-:10E1200000000000320000000000000000000000BD
-:10E1300000000000000000000000000000000000DF
-:10E1400000000000020300000000000003000000C7
-:10E1500000000000030000000000000003000000B9
-:10E1600000000000030000000000000003000000A9
-:10E17000010000000102000072B61048104908605A
-:10E18000BFF34F8F0120C0040E490A6802430A60A2
-:10E190000D490A6802430A600C490A6802430A6092
-:10E1A000002000210D4A03C26A45FCD1084FB84740
-:10E1B000084FB847084FB847FEE7000000000010BE
-:10E1C00008ED00E00013204080132040A013204001
-:10E1D00031D9001045E60010A9E7001000FF012822
-:10E1E000FFFF0128443A5C6875616E672E7875659B
-:10E1F0007765695C4769745C436F676E69746976BB
-:10E20000655F4167656E745C6669726D77617265A2
-:10E210005C7432675C747669696268386D5C7372CD
-:10E22000635C73797374656D5C7265765F645C734F
-:10E23000797374656D5F747669696268386D5F6360
-:10E240006D30706C75732E6300000000443A5C689A
-:10E2500075616E672E7875657765695C4769745C72
-:10E26000436F676E69746976655F4167656E745C5C
-:10E270006669726D776172655C7432675C74766929
-:10E28000696268386D5C7372635C6472697665722A
-:10E29000735C737973636C6B5C63795F73797363BD
-:10E2A0006C6B2E6800000000443A5C6875616E6714
-:10E2B0002E7875657765695C4769745C436F676E36
-:10E2C00069746976655F4167656E745C6669726DD5
-:10E2D000776172655C7432675C747669696268380C
-:10E2E0006D5C7372635C647269766572735C73797A
-:10E2F00073636C6B5C63795F737973636C6B2E63B0
-:10E3000000000000443A5C6875616E672E787565A0
-:10E310007765695C4769745C436F676E6974697699
-:10E32000655F4167656E745C6669726D7761726581
-:10E330005C7432675C636F6D6D6F6E5C7372635C8F
-:10E34000647269766572735C7379737469636B5C0C
-:10E3500063795F7379737469636B2E6300000000E7
-:10E36000443A5C6875616E672E7875657765695C9F
-:10E370004769745C436F676E69746976655F41676E
-:10E38000656E745C6669726D776172655C74326724
-:10E390005C636F6D6D6F6E5C7372635C6D775C66F2
-:10E3A0006C6173685C63795F6D775F666C617368DD
-:10E3B0002E6300009F0F000000000000000000001E
-:10E3C000000000000000000000000300000000004A
-:10E3D000000000000000000000030000000000003A
-:10E3E0000300000000000000030000000000000027
-:10E3F0000300000000000000030000000100000016
-:10E40000000000000100000000000000000000000B
-:10E4100010000000100000001000000001000001CA
-:10E4200000000000000000000000000000000000EC
-:10E4300000000000000000000000000000000000DC
-:10E4400070B40123002413E00168001D194202D0BA
-:10E450004D466918491E0C60091D121F042AFAD284
-:10E460000D00960701D50C80AD1C1A4000D02C7011
-:10E470000268001D002AE7D170BC70470000000050
-:10E480000600000000000000000000000000000086
-:10E49000000000000000000000000000000000007C
-:10E4A000000000000000000000000000000000006C
-:10E4B0000000000006000000000000000000000056
-:10E4C000000000000000000000000000000000004C
-:10E4D000000000000000000000000000000000003C
-:10E4E000000000000000000008000000150000000F
-:10E4F000000000000000000000000000000000001C
-:10E50000000000000000000000000000000000000B
-:10E510000000000000000000010000000E000000EC
-:10E5200015000000000000000000000000000000D6
-:10E5300000000000000000000000000000000000DB
-:10E5400000000000000000000000000001000000CA
-:10E5500006000000000000000000000000000000B5
-:10E5600000000000000000000000000000000000AB
-:10E57000000000000000000000000000000000009B
-:10E580000000000006000000000000000000000085
-:10E59000000000000000000000000000000000007B
-:10E5A000000000000000000000000000000000006B
-:10E5B000000000000200000000000000983A000087
-:10E5C0000E01FA00CC0190010200000003000000DF
-:10E5D00000000000983A0000720182001C02CC0189
-:10E5E000020000000500000000000000307500007F
-:10E5F000F6001901BD02EE01020000000600000055
-:10E60000000000003075000087018C009501940126
-:10E610000200000001000000A8E80010B4E50010AE
-:10E6200002000000A4E9001008003200020000000F
-:10E63000B0E80010E4E5001002000000A0E90010BE
-:10E640000C00320010B5074979441831064C7C445F
-:10E65000163404E0081D0A68891888470100A142A1
-:10E66000F8D110BD0800000024000000D5FDFFFF18
-:10E67000CC0900000813002800000000A9F8FFFFE3
-:10E680005A030000380100000008002800000301C0
-:10E690000000000001000000000000000000000079
-:10E6A00001000000FF0F0100000000004D4F544F1B
-:10E6B000525F494E325F4842375F4842385F484FA9
-:10E6C00052495A4F4E54414C0000000004207146FC
-:10E6D000084202D0EFF3098001E0EFF3088000B5B3
-:10E6E0000149884700BD0000AF79001000F00EF826
-:10E6F000002801D0FFF7A6FF00BF00BF002000BF29
-:10E7000000BFFFF75FFB00F003F800000020704738
-:10E7100080B500F001F801BD0746384600F002F868
-:10E72000FBE7000080B500BF00BF024A11001820BF
-:10E73000ABBEFBE7260002004D4F544F525F494EDF
-:10E74000335F4842355F4842365F534541545F501E
-:10E75000414E00004D4F544F525F494E345F484286
-:10E76000335F4842345F4241434B524553540000AB
-:10E770004D4F544F525F494E315F4842315F4842DE
-:10E78000325F4C4547524553540000000420714607
-:10E79000084201D0EFF30980EFF3088000B501498A
-:10E7A000884700BD65E800100548014603B4684687
-:10E7B00080F3098800BF00BF00BF00BFFFF796FFCE
-:10E7C000A5EDF5FE00127A00000000000024F40020
-:10E7D0000080000000800000008000009E029E0A71
-:10E7E000AA02AA0ACE03CE0B2A042A0C0003000BAD
-:10E7F000010002000400080010002000400080001A
-:10E8000000010002484F52495A4F4E54414C5F4854
-:10E81000414C4C00534541545F50414E5F48414C80
-:10E820004C0000004241434B524553545F48414C19
-:10E830004C0000004C4547524553545F48414C4CF6
-:10E8400000000000E02E0000401F0000E02E00004D
-:10E85000102700000003000100040103020200026F
-:10E86000000300058169891E0978C9B201607047FB
-:10E870000000000000010101010101000001000091
-:10E880000203040506080C10000000000000000050
-:10E890000200000001000000040300011314001531
-:10E8A000C7010300010000004001BE00F401AE01F9
-:10E8B00087018C009501940100080028FFFF0128C2
-:10E8C0000000000000000000000000000000000048
-:10E8D0000000000000000000000000000000000038
-:10E8E0000000000000000000000000000000000028
-:10E8F0000000000000000000000000000000000018
-:10E900000000000000000000000000000000000007
-:10E9100000000000000000000000000000000000F7
-:10E9200000000000000000000000000000000000E7
-:10E9300000000000000000000000000000000000D7
-:10E9400000000000000000000000000000000000C7
-:10E9500000000000000000000000000000000000B7
-:10E9600000000000000000000000000000000000A7
-:10E970000000000000000000000000000000000097
-:10E980000000000000000000000000000000000087
-:10E990000000000000000000000000000001020371
-:10E9A00032325A325A5A5A32000102035A5A5A5AC9
-:10E9B000FEE70000FEE70000FEE70000FEE70000C3
-:10E9C000FEE70000FEE70000FEE70000FEE70000B3
-:10E9D000FEE70000FEE70000FEE7400455000200ED
-:10E9E0000100015003459C0010000132FD0CA00401
-:10E9F0000900040101000112050E83DCE728600410
-:10EA0000FFFFFF1F020225920807F001035240009A
-:10EA100001F2060218F2060418F2060618F20608B9
-:10EA200018F306005478F10618F2060418F20606E8
-:10EA300018F2050818F002FF41DB001004F1FF0492
-:10EA4000F1FF04F1FF04F1FF04F1FF04F1FF04F111
-:10EA5000FF04F147046C0248090028060AF3210666
-:10EA60000001F12334F25208680009010101020398
-:10EA70000203010F0F010000000000000000000071
-:10EA80000000000000000000000000000000000086
-:10EA90000000000000000000000000000000000076
-:10EAA0000000000000000000000000000000000066
-:10EAB0000000000000000000000000000000000056
-:10EAC0000000000000000000000000000000000046
+:1032C0000220802160549620205C00287DD1574840
+:1032D000006860619620255430008621605474E0B7
+:1032E00068460078002839D068460078012802D165
+:1032F000A068B84206D368460078022804D1A068C6
+:10330000874201D2280000E030009621615C00294C
+:1033100007D14649096861619621655431008622CA
+:10332000A154C0B2002850D13F48019989014018EA
+:10333000406901F01AFC30007E2160543000802189
+:1033400060543A480068E06194202554684601784A
+:103350002000FEF72DFB6846857036E09520205C46
+:1033600000281DD0A068874201D1300005E0A06888
+:10337000B84201D2280000E0022080216054206A77
+:10338000E061942025549620205C00281DD1274818
+:10339000006860619620255430008621605414E056
+:1033A000A068874206D13000862160542000FEF7D5
+:1033B0004FFB0AE0A068B84202D26846057402E0FA
+:1033C00002206946087468464570029801F0C4FB03
+:1033D00068468078002809D00198FEF77BFA00281B
+:1033E00001D0300000E02800C0B215E06846407807
+:1033F000002810D0002003900020029000200190AF
+:10340000002000903B0001226846017C6846007E57
+:10341000FEF738FC00E0002007B0F0BD08130028DC
+:10342000BD1C0028BF1C0028DCE60010F81B00288B
+:10343000FEB5C0B20400FDF76DFE019010E0FFB2D2
+:10344000002F46D0FDF766FE0199401A9849884240
+:1034500041D234480078002801D001F0A1FF30BFEC
+:10346000FEF78AFF02F067F801F072FB00908425F6
+:103470006D002B4E2000684330189521475C8D4825
+:10348000007800281AD1200068433018FDF749F869
+:10349000002813D02000684330187E21405C0028AB
+:1034A0000CD12000684330189421405C002805D1DD
+:1034B000654370198221405C002801D0012500E09D
+:1034C0000025009801F048FBEDB2002DB7D0002098
+:1034D00002E0012000E00020FEBD0000FBB5170067
+:1034E000089C0299002901D1002C18D0060001F097
+:1034F0002FFB84225200704B310051435D585643DC
+:1035000099194E6801F028FB0298002803D0019811
+:10351000281A02990860002C01D0F01B2060F7BD2A
+:1035200008130028C41C0028F1B586B00E00150051
+:103530006846047E6846007E032802D1022005907A
+:1035400001E00420059004930498002802D0002094
+:10355000049908606846007EFFF76AFF002801D1E1
+:103560000120A3E02F0001F0F3FA0500380000214C
+:10357000FA229200002301F047F802000B00B34842
+:10358000002180185941FA22D200002300F049FDA1
+:10359000494984225200624389188861280001F059
+:1035A000DBFA00200390002002900120019001200E
+:1035B0000090002300223100C9B26846007EFEF769
+:1035C00061FB002801D0012070E001F0C1FA3A4906
+:1035D0008422520062438918C96A019101F0BCFA41
+:1035E0000FE0FFB2002F50D1EDB2002D02D1F6B2A4
+:1035F000002E4AD0D0480078002801D001F0D0FE3B
+:1036000030BFFEF7B9FE01F096FF01F0A1FA842267
+:103610005200294B2100514359184968009121005B
+:103620005143591883254F5D2100514359187E2578
+:103630004D5D6243991894228E5C01F08DFA0098DA
+:103640000199401A05998842CBD36846007EFFF75E
+:1036500034F8002805D16846007EFFF7E9FE00280F
+:1036600009D1049800900023019A00212000FFF75F
+:1036700035FF01201AE0049800900023019A0021F0
+:103680002000FFF72BFF002010E06846007EFFF7C8
+:1036900014F86846007EFFF7CBFE049800900023E4
+:1036A000019A00212000FFF719FF012007B0F0BDAB
+:1036B000C4090000BF1C002808130028F1B586B01B
+:1036C0000E0015006846047E3000C0B2022803D107
+:1036D00002206946087402E00320694608740593D5
+:1036E0000598002802D00020059908600C98002851
+:1036F00002D000200C9908606846007EFFF798FE13
+:10370000002801D1012014E12F0001F021FA050069
+:1037100038000021FA229200002300F075FF020019
+:103720000B004A48002180185941FA22D200002398
+:1037300000F077FC9D498422520062438918886119
+:10374000280001F009FA00200390002002900120D7
+:10375000019001200090002300223100C9B2684688
+:10376000007EFEF78FFA002801D00120E1E001F091
+:10377000EFF984256D008D4E210069437118896A27
+:103780000291210069437118C96A019101F0E4F9BD
+:1037900013E068464078002800D0B9E06846007819
+:1037A000002803D1FFB2002F00D1B1E062480078B9
+:1037B000002801D001F0F4FD30BFFEF7DDFD01F07F
+:1037C000BAFE01F0C5F92100694371188322895CB2
+:1037D0006A4651702100694371187E22895C6A46ED
+:1037E000117021006943711894228F5C2100694394
+:1037F00071189522895C6A46917001F0ADF96846AE
+:1038000040786946097C8842C3D168460078002820
+:10381000BFD13800C0B20028BBD1684680780028EC
+:1038200016D06846007EFFF703FE002810D16846D8
+:10383000007EFEF742FF0C980090059B019A0299CA
+:103840002000FFF74BFE012073E000BFCF07000010
+:1038500001F07EF907002000684330188321405CA6
+:103860006946097C88421FD12000684330187E21B8
+:10387000405C002818D12000684330189421405C37
+:10388000002811D12000684330189521405C0028A1
+:103890000AD1200068433018FCF743FE002803D00B
+:1038A00043480078002810D0380001F055F96846E8
+:1038B000007EFEF702FF0C980090059B019A02998A
+:1038C0002000FFF70BFE012033E020006843305852
+:1038D00003902000684330184068009000206C433B
+:1038E00031198B228854380001F036F905980028E8
+:1038F00004D003980299401A059908600C98002892
+:1039000004D000980199401A0C990860002010E03A
+:103910006846007EFEF7D1FE6846007EFFF788FD10
+:103920000C980090059B019A02992000FFF7D6FDA4
+:10393000012007B0F0BD0000C41C0028F2B582B021
+:103940001C4980010818806A00216A4603C2083AAF
+:1039500064240025684603C84622002300F054FE74
+:1039600022002B0000F05DFB06000F00684603C834
+:103970008222002300F048FE22002B0000F051FBC1
+:10398000029A082A0FD3029A0023BB420BD301D814
+:10399000B24208D3029A0023994204D301D890423C
+:1039A00001D3012000E00020C0B2FEBD08130028B2
+:1039B000BF1C0028DCE60010F1B590B00F00160027
+:1039C00010A80478002004900020089000200C909B
+:1039D00000200B9010A80078032802D102200E903E
+:1039E00001E004200E900020002000200020002094
+:1039F0000A90002009903220694648730125002072
+:103A0000002069460871002069460875002005A954
+:103A100048700020069007932348007800281FD0A4
+:103A200010A80078FCF76AFD002819D01F4800781C
+:103A3000002815D11E480078002811D1029602985E
+:103A400000280DD0684607736846007B002811D017
+:103A50006846007B01280DD06846007B022809D00B
+:103A60000798002804D005A803C8079A03C2083A9B
+:103A700001203EE201F06CF8009084277F000D4E9B
+:103A8000200078433018FCF74CFD002814D1009832
+:103A900001F062F80798002804D005A803C8079A27
+:103AA00003C2083A012024E2BD1C0028C01C0028E3
+:103AB000BF1C002808130028200078433018C06875
+:103AC0000D90009801F048F810A80078FEF7F5FD79
+:103AD000002800D0C2E16846007B002800D08CE0BE
+:103AE00008A8009004AB029A022110A80078FFF702
+:103AF000E5FD05002800C0B2002857D108980E99AE
+:103B0000884253D20020694608701CE010A8007853
+:103B1000032806D13C2110A80078FEF7B5FE002846
+:103B200022D168460078022808D200200B900BAB07
+:103B3000029A022110A80078FFF7F6FC6846007888
+:103B4000401C694608706846007803280DD20CAB0B
+:103B5000029A012110A80078FFF7E6FC0500280072
+:103B6000C0B20028D2D100E001252800C0B2002850
+:103B70001CD108A8009004AB029A022110A800787A
+:103B8000FFF79CFD05002800C0B200280ED1089860
+:103B900000210022401C514102000B000C98002122
+:103BA0008B4203D801D3824200D201252800C0B243
+:103BB000002820D100F0CCFF00902000784330187E
+:103BC000FCF7AFFC002804D1009800F0C5FF0125E8
+:103BD00044E1002120007843301881600121200059
+:103BE0007843301889228154009800F0B5FF0120F5
+:103BF0006946087521E101251FE16846007B01281F
+:103C000030D10020009004AB029A012110A8007866
+:103C1000FFF754FD05002800C0B2002820D100F0B5
+:103C200097FF0090200078433018FCF77AFC0028BA
+:103C300004D1009800F090FF01250FE10D992000BC
+:103C400078433018816001212000784330188922A0
+:103C50008154009800F080FF012005A94870ECE035
+:103C60000125EAE0002000900023029A022110A81A
+:103C70000078FFF723FD05002800C0B2002828D1F6
+:103C800000F066FF0500200078433018FCF749FC7F
+:103C9000002804D1280000F05FFF0125DEE00021AC
+:103CA0002000784330188160200078433018892242
+:103CB0008154280000F050FF01206946087500205B
+:103CC000009004AB029A012110A80078FFF7F6FCDF
+:103CD00005002800C0B2002800D0ADE00499200003
+:103CE000FFF72CFE002800D1A6E000F031FF2100F4
+:103CF0007943711883225200895C6A4691732100CE
+:103D000079437118A42289580F91210079437118C1
+:103D1000A82289580E9100F01FFF6846807B00287A
+:103D20000ED003A8401C029009A801900AA8009098
+:103D30000E9B0F9A04992000FCF750FC694608710D
+:103D400000F006FF0090200078433018FCF7E9FBF4
+:103D5000002804D1009800F0FFFE01257EE00499C0
+:103D6000200078433018C16004992000784330184F
+:103D700081600121200078433018892281546846EF
+:103D8000807B00284FD06846007900281FD00A9910
+:103D9000200078433018AC228150099920007843E4
+:103DA0003018B02281506846417B2000784330189B
+:103DB000F22281546846417B200078433018F32278
+:103DC0008154200078433018FCF7EEFB2BE00021F3
+:103DD0000A0020007843301883235B00C25420007F
+:103DE00078433018A4228150200078433018A8224C
+:103DF0008150200078433018AC2281502000784355
+:103E00003018B0228150200078433018B4228150FD
+:103E10003221200078433018F22281542000784368
+:103E20003018F3228154009800F096FE012005A975
+:103E300048700498069000E001252800C0B20028D0
+:103E40000CD16846007B022808D000F081FE2100DA
+:103E500079437118C968069100F07EFE2800C0B24F
+:103E600000283CD034480078002803D110A80078FE
+:103E7000FEF723FC00F06CFE00906846007B0228F1
+:103E800008D16846007D002804D0049920007843BA
+:103E9000301881600D99200078433018C1600021EE
+:103EA0000A002000784330188923C2540A002000F9
+:103EB000784330188B23C254200078433018962260
+:103EC00081541D480078002801D0072000E0082018
+:103ED0007C43311983228854009800F03DFE0798F6
+:103EE000002804D005A803C8079A03C2083A28008E
+:103EF000C0B211B0F0BD38B5002010490870FDF710
+:103F000087F9FDF725FAFDF751FB050000F097FC56
+:103F10000400FDF707F9EDB2002D06D0E4B2002C45
+:103F200003D0FCF733FC002803D1FDF7F5FB01209B
+:103F300000E0002032BD0000BF1C0028C01C00288B
+:103F4000D021890040587047C22189004058C005DF
+:103F5000C00D7047902292008150704782218900E5
+:103F60004058C005C00D704700B50068800B800741
+:103F7000800F002801D1802000E0402000BD00B566
+:103F8000C02189004058C006C00E082801D2012077
+:103F900000E00020C0B200BDF8B504000D0016001E
+:103FA0002000FFF7ECFF002809D02F000025B542C4
+:103FB00010D22000FFF7C4FF78556D1CF7E72F00E3
+:103FC000002505E02000FFF7BBFF690078526D1C5B
+:103FD000B542F7D3F1BDF8B507000D001600380063
+:103FE000FFF7B2FF0400A64200D2340029002200ED
+:103FF0003800FFF7D1FF2000F2BDF8B505000C0036
+:1040000000262800FFF7B0FF07002800FFF7A6FFF3
+:10401000874204D021002800FFF79CFF01263000D2
+:10402000F2BD12422DD0994231D970B500251B4204
+:1040300009D00C00002112E0110000F0F7F80A008E
+:104040000021002370BD0942F6D000240126491842
+:104050006441944200D3A41A7641F8D3310001267A
+:1040600001E0764109D2001864416D41A41A9D41D6
+:10407000F7D2A4185D41B619F5D3300022002B0009
+:1040800070BD1B42CFD108B503F066F808BD01D161
+:104090009042CAD202000B000021002070470000AD
+:1040A00070B55F4BC018C00900015E4BC3180429EE
+:1040B0000CD21F251C68CE002800B0408443D2B229
+:1040C0001540C800854025431D600CE0FC311F25CC
+:1040D0005C68CE002800B0408443D2B21540C800CE
+:1040E000854025435D6070BD00B5002A03D10122E3
+:1040F0008A40426002E001228A40826000BD30B402
+:1041000003008C000F25596C2800A0408143154006
+:10411000A5400D435D6430BC704730B403000125F9
+:104120009C6C28008840844315408D4025439D6445
+:1041300030BC704730B403000125DC6C2800884097
+:10414000844315408D402543DD6430BC704730B456
+:1041500003004C0010340325D96C2800A040814393
+:104160001540A5400D43DD6430BC70474269012213
+:104170008A4042614069704730B4030001259C6960
+:1041800028008840844315408D4025439D6130BC04
+:10419000704730B403004C000325196C2800A04080
+:1041A00081431540A5400D431D6430BC7047F8B5F0
+:1041B00004000025002C30D01600002E2DD00F005A
+:1041C000326839002000FFF78FFF327A3900200073
+:1041D000FFF766FF726939002000FFF79EFFB269A2
+:1041E00039002000FFF7A6FFF26939002000FFF731
+:1041F000AEFF726839002000FFF781FFF2683900D6
+:104200002000FFF7C6FF39002000FFF7AFFF32693B
+:1042100039002000FFF7B0FF00E0034D2800F2BD99
+:104220000000CFBF0000304001005A000022030A06
+:104230008B420BD203098B4219D243088B422ED2F8
+:10424000411A00D20146524110467047FF2209022E
+:104250003FD012068B4205D3121209028B4201D3C2
+:104260001212090203098B4219D300E0090AC3099B
+:104270008B4201D3CB01C01A524183098B4201D337
+:104280008B01C01A524143098B4201D34B01C01A22
+:10429000524103098B4201D30B01C01A5241C3089A
+:1042A0008B4201D3CB00C01A524183088B4201D309
+:1042B0008B00C01A524143088B4201D34B00C01AF5
+:1042C0005241884200D3401A5241CFD20146104693
+:1042D000704708B502F042FF08BD0000F8B50123A1
+:1042E0001A00002800D151E1002900D14EE1A84A6E
+:1042F00012680C7AA74D1540A4048022D202144003
+:104300002C430322CE681640A34D25403604C0241A
+:10431000A40234402C430D786E07760F9F4D254044
+:104320003606E024E40434402C438E789C4D25402E
+:10433000B4078026F60534402C4328254D5D012620
+:10434000B4431D40254334240C5D0226B54364006C
+:10435000022634402C430D7F0426B443AD000426CE
+:10436000354025434C7F0826B543E40008263440F9
+:104370002C4340254E5D1E408A4D2540B4028026C8
+:10438000F60034402C4340254D5DEDB26D081E0013
+:104390002E40F6B2844D254074028026B60034408B
+:1043A0002C4370254E5D814D2540340280267600D9
+:1043B00034402C4371254E5D16407D4D254036031B
+:1043C000C024A40134402C4304600C7A002C02D198
+:1043D0000023836006E00C7A012C02D14B698360D4
+:1043E00000E083600B6A03614B6A4361CB6A8361BF
+:1043F0000B6BC3614B6903628B6943626D4B1C6835
+:104400004423CB5CDBB2FF25AC4323434C240C5D3F
+:10441000E4B2694D1D402404FF231B0423402B43B9
+:104420005C240C5DE4B21D022D0A23062B436C2490
+:104430000C5DE4B2614D1D402402FF231B022340AA
+:104440002B4343645E4B1B6864240C5DE4B25B4DFC
+:104450001D402402FF231B0223402B4354240C5DE8
+:10446000E4B2FF25AB431C438464564B1C684123D4
+:10447000CB5C13400325AC43234360240C5D144004
+:10448000514E1E40A302C0252D011D403543482337
+:10449000CE5C16403023DB4330241D4037012740DB
+:1044A0002F4350254D5D1540484E3E402F02C025FC
+:1044B000AD003D40354358268E5D1640C027BD43B4
+:1044C000B701C0263E402E4368254D5D15400C27A0
+:1044D000BE43AF000C253D403543C5643C4D2D68BF
+:1044E00007267227CF5D374000970727BD432F006F
+:1044F000009D3D437327CF5D3E407027BD4337018C
+:1045000070263E402E43466535254D5D8567314D0D
+:104510002D680E7C16400327BD432E43CD7C1540ED
+:10452000C027BE43AF01C0253D4035434E7C1640F9
+:104530000C27BD43B7000C263E402E438D7C2A40FD
+:104540003340120114401C430465234A1268CB888F
+:1045500094B21A0422438B889BB21B0A9BB2174C5D
+:1045600014401B02FF2212021A4022430B78052B33
+:1045700005D10979C9B2FF239A43114304E0497870
+:10458000FF239A43C9B21143016300221000F2BD18
+:1045900084F30010FFFFFBFFFFFFFCFFFFFFFFF8AE
+:1045A000FFFFFFBFFFFBFFFFFFFDFFFFFFFEFFFF62
+:1045B000FFCFFFFF88F30010FFFF00FFFF00FFFFAA
+:1045C0008CF3001090F30010FFF3FFFFFFFCFFFFE0
+:1045D00094F3001098F300109CF3001001688022FF
+:1045E00012060A43026070470168490049080160E9
+:1045F000704740687047016170470069704781608B
+:104600007047006A7047000030B4434351435D185F
+:10461000010C0C00130C5C432D1980B2434392B281
+:1046200051430024C918644124040B04090C0919DE
+:104630005043C018694130BC7047000000B50228E3
+:1046400001D301200FE00B00DBB2042B01DB0120C2
+:1046500009E0BE4B80001818C9B2405C824201D309
+:10466000012000E0002000BDF8B504001F00022C6E
+:1046700001D3012023E015000E002A003100C9B249
+:104680002000FFF7DBFF012801D1012017E03000F7
+:10469000C0B2002816D1FF2F12D8AD4861034018D0
+:1046A000A90040188021490140180168A94A0A4020
+:1046B0003902FF231B020B40134303600020F2BDAD
+:1046C0000120FCE7F6B2012E16D18020400287427D
+:1046D00010D29F4861034018A9004018A021490149
+:1046E000401801689C4A0A403902C94B0B401343E9
+:1046F0000360E3E70120E2E70120E0E700B20012F7
+:10470000C0B27047F8B505000F001600280000B2CF
+:10471000FFF7F4FF04002000C0B2022801D30120FB
+:104720002CE032003900C9B22000C0B2FFF786FF8A
+:10473000012801D1012021E085482100C9B24903A7
+:1047400041182A00D2B292008918C02212018A5858
+:10475000B0491140FFB23B02C02292001A400A4306
+:10476000FF218A43F1B21143E4B262038018EDB233
+:10477000AA008018C022120181500020F2BD70B53D
+:104780000400022C01D3012028E015000E002A00AD
+:104790003100C9B22000FFF751FF012801D10120EB
+:1047A0001CE06B4861034158802212060A43C02175
+:1047B00089041143FF2212040A43964B1340F6B2B8
+:1047C0003202C021890011401943FF229143EAB20D
+:1047D0000A436103425061034058002070BD70B528
+:1047E0000400022C01D3012028E015000E002A004D
+:1047F0003100C9B22000FFF721FF012801D10120BB
+:104800001CE05348610341588022D2050A43C0216D
+:1048100089041143FF2212040A437E4B1340F6B26F
+:104820003202C021890011401943FF229143EAB2AC
+:104830000A436103425061034058002070BDF8B53F
+:1048400098B00BA8342102F09BFC9A4803C801AA37
+:1048500003C2083A03A8A549202200F0E5FAAA48B5
+:104860000078002801D001206DE000252C0007E031
+:104870002800A649620088522800A5490855641CF2
+:10488000062C14D2A348142161434118097A0BAABB
+:1048900011720BAA14216143411849681423634320
+:1048A000C058FFF784FC0028E2D000204BE06846A7
+:1048B00000F0B2F8002801D1002044E00098002167
+:1048C000962292000023FFF79FFE934A00231218BE
+:1048D0004B4110001900914A0023FFF7A2FB00286A
+:1048E00000D1012003AFB8818D4E300002F0C6FC2C
+:1048F00001A9300002F05EFC002801D0002022E077
+:104900002C0006E0142060432818C06802F0B4FDB3
+:10491000641C062C13D27F4D142060432818007CA1
+:10492000787103A9142060432818C06802F0AAFC1B
+:104930000028E7D0300002F0A1FC002003E00120B5
+:1049400071490870012019B0F0BD00009CF2001000
+:1049500000000440FF00FFFFFF0000FFF8B584B037
+:104960000E00C0B20290002528006946088004218C
+:104970002A0003AC200002F0F3FB2C006248007810
+:10498000002806D0674F3878002802D10298062800
+:1049900001D3002039E0012038705E4802991422CA
+:1049A00051434018C0680190019800F0A1F80198A7
+:1049B00002F06EFD019800F07FF800281FD003AAD6
+:1049C0006946019802F06AFD002818D103A8C07852
+:1049D000002814D0684600880005000D694608804C
+:1049E000684600884949029A520088520124484882
+:1049F00002994454002E02D0684600883080019805
+:104A000000F076F83D702000C0B205B0F0BD0000A7
+:104A100000FFFF00FFFCFFFFF8B50700002000903B
+:104A2000FF262C363000FFF769FE0500002F04D06A
+:104A3000684603F043FA002801D0002038E00098CF
+:104A4000394940183949FFF7F1FB0400002C02D026
+:104A50003748844201D300202AE0042201212800A3
+:104A6000FFF7BDFE002801D0002021E00422012133
+:104A70003000FFF747FE002801D0002018E0631E39
+:104A8000042201212800FFF7EFFD002801D00020BB
+:104A90000EE0042201212800FFF771FE002801D05A
+:104AA000002005E000982100FFF7C0FB38600120DE
+:104AB000F2BD000074F200107CB505001D4C06210B
+:104AC00000226E46300002F04BFB6946280002F0DF
+:104AD000D1FD68460078002803D1641E002CF4D173
+:104AE00001E0012000E0002076BD00008CF0001005
+:104AF000E0B511490CC9083969460CC10839694645
+:104B000002F062FD07BD0000B31C0028901B0028C6
+:104B1000A81B00284CE90010FFC99A3B00CA9A3B29
+:104B200000109040B41C00285F8DCB00608DCB003E
+:104B300001000100A08601007CF2001000000000CE
+:104B4000801C800803D0401C801EFCD100BF704731
+:104B5000EFF3108072B6704780F3108870474030D2
+:104B6000016810220A430260704740300168082241
+:104B70000A43026070470000F8B5012422004C236C
+:104B8000CB5C052B03D24D23CB5C052B01D310004E
+:104B9000E2E0002800D1DEE0002900D1DBE06F4A2E
+:104BA00012684B7923406E4D15409B048022D2023F
+:104BB00013402B4303228D7915406A4E1E402B046F
+:104BC000C025AD021D40354307230E7A1E40664FB7
+:104BD0002F403606E025ED0435403D43CE79634F46
+:104BE0002F40B5078026F60535403D430E7D012751
+:104BF000BD4326402E4324254D5D0227BE436D0054
+:104C000002273D40354305600D7906003036009699
+:104C1000009E3668FF27BE43EDB23543009E3560E7
+:104C20004D79012D0BD18C79002C02D100248460A8
+:104C300006E08C79012C03D10C68846000E084606C
+:104C4000CC6804610C694461CC6984610C6AC461FC
+:104C50000C680462464C25680C7EE4B2FF26B5431E
+:104C60002C4330254D5DEEB2424D25403604FF24E5
+:104C7000240434402C4340254D5DEDB22402240A27
+:104C80002E06264348240C5DE7B2FF2424023A4D49
+:104C90002E403F02274037434764384E3668382756
+:104CA000CF5DFFB20097FF27BE43009F3743282602
+:104CB0008E5DF6B23D40360234402C438464304C65
+:104CC00025688C7D14400326B5432C4325254E5D75
+:104CD00016402C4D2540B602C024240134402C43FC
+:104CE0002C254D5D15403026B4432E01302535402E
+:104CF000254334240C5D1440234E2E402502C0244D
+:104D0000A4002C4034433C254D5D1540C026B443DF
+:104D1000AE01C0253540254344240C5D22400C24BF
+:104D2000A54394000C2222402A43C264174A146807
+:104D30004C228A5C1A400725AC4322434D240C5D6B
+:104D400023407024A2431C01702323401343436576
+:104D5000497D816700221000F2BD000070F3001051
+:104D6000FFFFFBFFFFFFFCFFFFFFFFF8FFFFFFBFA1
+:104D700074F30010FFFF00FFFF00FFFF78F3001047
+:104D80007CF30010FFF3FFFFFFFCFFFF80F3001038
+:104D90000168802212060A43026070477830016879
+:104DA00001220A4302607047C16F0800C007C00FAC
+:104DB0007047010070310A68012313430B60006FD4
+:104DC0007047000030B5010000221000134B1B6833
+:104DD000002914D08C786407640F0725AB431C436B
+:104DE0000B79002B01D00122FFE763005B08D2079B
+:104DF0001A430B4B0024095F89005A5000E0064813
+:104E000030BD00B5074A1368002B03D0126800B20A
+:104E10008000115000BD0000010056006CF300102E
+:104E2000008020402412002870B4103A03D378C9BF
+:104E3000103A78C0FBD2530701D318C918C001D566
+:104E400008C908C0D20704D30B880380891C801CC2
+:104E5000002A01D50B78037070BC70478B0701D115
+:104E60008307E1D0124205D00B78491C0370401C27
+:104E7000521EF9D170470000F7B5AD4BAD4A156829
+:104E8000AD4A1668AD4A12680192AD4A12680092A6
+:104E9000002422002200002800D11EE10A00002A7E
+:104EA00000D11AE15168002901D1936805E05168E9
+:104EB000022901D1230000E0022311695769B94298
+:104EC00001D3116900E05169092909D29D4929409E
+:104ED0002125555D002D15D080256D000D4313E073
+:104EE000112905D2974F2F408021C9013943EFE79F
+:104EF000212905D2934F2F40802109023943E7E74A
+:104F00008B48EBE0904D0D40D168491E0907090F11
+:104F10000F27BD4329438D4D0D408021490429436E
+:104F20000160117F002901D0210000E0012101254D
+:104F30000127BE43294031430E0051680909294029
+:104F40000227BE434900022739403143D67E10274D
+:104F5000B943360110273E400E43517E2027BE4301
+:104F600049012027394031431668012E00D0250021
+:104F70004E007608E90731430425A9435D00042665
+:104F800035400D4308218D43D9000823194029439A
+:104F9000537F6D4D0D40190280235B00194029435A
+:104FA000957F80239B006A4E0E4069021940314371
+:104FB000D67F684D0D40B1028026F600314029436E
+:104FC0002025565D644D2940F60280273F013E4072
+:104FD0000E4311798F07BF0F5C4931403F06C02651
+:104FE000B6043E400E430662167E009F5649394085
+:104FF000360280277F003E400E43977E5449314061
+:105000007E021E400E431169491EC906C90E1F27A4
+:10501000BE433143C026B60081512421515CC9B240
+:105020000091C121890041180E68FF27BE43009FEF
+:1050300037430F60167E019F43493940360280276F
+:105040007F003E400E435169491EC906C90E1F2705
+:10505000BE4331438026B60081512C21515CC9B238
+:1050600000918121890041180E68FF27BE43009FEF
+:1050700037430F60116B1B4E8151916A184E81515D
+:105080003821515CF026360186190096009E37685B
+:105090002F4E3E4049020B40334300990B603921AB
+:1050A000515CF4221201821813681D40C90280234A
+:1050B0001B011940294311600B49445002980028F4
+:1050C0000AD002980460029884610298C460029831
+:1050D000C46126480299086223001800FEBD000042
+:1050E000C80F0000880F0000C80E00001B490160B7
+:1050F000C02189040162FF220832C0218900425088
+:105100000021C1239B00C15080239B00C2508122FB
+:1051100092008150124A8150154A8150114A8150A3
+:10512000114A8150134A8150134A81507047000040
+:105130000140AA0054F3001058F300105CF3001073
+:1051400060F30010FF3FFFFFFFFEFFFFFFFFFFFCCC
+:10515000FFFDFFFFFFFBFFFFFFF7FFFF0F00000357
+:10516000C80E0000C80F0000880F0000EFCDAB0094
+:10517000880E0000080F0000480F0000F8B504007A
+:105180000D00334F387800280ED02D4E18222D49AF
+:10519000300002F0DDFE0020F075CF2040002A49EB
+:1051A0000860002002F034FF2000290001223A703C
+:1051B00080225204002399420AD301D8904207D397
+:1051C000244A04000D0024A003C80019694102E02C
+:1051D0000200002000211D4B00241C60204D2A608D
+:1051E000214A146005221A601A68D203FCD51C609B
+:1051F0000029DDD10028DBD13C70F1BD70B5050080
+:10520000184E306800280ED10D4C18220D49200090
+:1052100002F09EFE0020E075E52040000A4908608B
+:10522000002002F0F5FE2C0030681049FEF7FEFF6A
+:10523000002122000023FFF7E7F9FFF79FFF70BD71
+:10524000181B0028ACEC0010F01B002810E000E058
+:10525000BA1C0028FFFFFF00010000FFFFFFFFFF57
+:1052600014E000E0901C002818E000E040420F002D
+:1052700043490A680860704742490A6808607047F5
+:1052800041490A680860704740490A6801239A4307
+:10529000C0B20300DB07DB0F13430B6070473B49D1
+:1052A0000A6810239A43C0B200011023184010432B
+:1052B0000860704735490A68354B1340C0B2000298
+:1052C000802252001040184308607047314801683E
+:1052D00001220A430260704710B5FFF739FC040051
+:1052E00000F024F80020FFF7C3FFFA20C001FFF709
+:1052F000C3FF0020FFF7C4FF0020FFF7C5FF012018
+:10530000FFF7CDFF0020FFF7D5FF00F004F82000E5
+:10531000FFF722FC10BD80B5FFF71AFC1E490A6892
+:10532000032313430B60FFF717FC01BD80B5FFF7A4
+:105330000FFC19490A6803239A43012313430B60A6
+:105340000A6803239A43022313430B60FFF704FC0C
+:1053500001BD80B5FFF7EAFF104801688022120600
+:105360000A430260FFF7D7FF01BD80B5FFF7DEFFFC
+:105370000A480168490049080160FFF7CCFF01BDF8
+:1053800004C0264008C026400CC0264010C026405D
+:10539000FFFEFFFF44C0264040C0264000C026401C
+:1053A00080B5FFF7C3FFFFF791FFFFF7B4FF01BD23
+:1053B00070B5302100242200744D280001F0D0FE89
+:1053C000E0212200954D280001F0CAFE042631009C
+:1053D0002200934D280001F0C3FE2200914D3100C0
+:1053E000280001F0BDFE072122008F4D280001F0AA
+:1053F000B7FE20008D49087020008D4908808D4837
+:10540000046020008C4908708C48046003F06AF83E
+:1054100003F0C8FD04F05CF904F008FB002809D093
+:1054200004F007FB002805D004F0D6F9002801D1CC
+:1054300004F046FA04F03EFE002804D1062005F0F0
+:10544000ADF9002016E0FDF774FC9E4908609E4906
+:1054500008609E4908609E4908609E4908600120D6
+:105460009D4908700F219D4A11709D4A1170B649DF
+:105470000870012070BD38B584B09A4800680028D3
+:1054800002D0022005F08AF905F0A0F905F0B6F97E
+:1054900000282BD003F094FE00280ED0AB480088E3
+:1054A00003F074FE012464480470FDF742FCB64921
+:1054B000401862490860A44804700020010008E018
+:1054C0000200324B0C00E4B20C256C431B199A729B
+:1054D000491C0A00D2B2042AF2D3AC490870012058
+:1054E0007D49087002E0684600F0D4FB684604F08D
+:1054F00029FE002811D00098C02189008842F2D0EE
+:105500000098BC218900884203D1684600F0F8FD6C
+:10551000ECE7684605F020FAE8E701F0F6F803F05A
+:10552000DFF803F09EFD01F04FF901F095F901F06D
+:10553000EDFC05B030BDF8B502E0684600F0AAFB0E
+:10554000684604F0FFFD002811D00098C0218900B2
+:105550008842F2D00098BC218900884203D1684675
+:1055600000F0CEFDECE7684605F0F6F9E8E75D48A7
+:105570000068002802D0022005F010F905F026F995
+:1055800001F022F901F0C2FC05B000BDAC1A002800
+:10559000F1B503F015FE07006846008803F0F6FD3C
+:1055A00068460088FDF736F8FCF7E6FE0026340072
+:1055B00018E02000C0B200F078F8050068460188C5
+:1055C0002800C0B2FCF73FFF684601882800C0B23F
+:1055D00002F092FF7C482100C9B20C2251434018CE
+:1055E0008672641C2000C0B20428E2D367480670AB
+:1055F0000F203A4908703A4908700120364908706E
+:1056000051490870FFB2002F07D00B490870FDF711
+:1056100090FB5D49401809490860F1BD1819002840
+:10562000681C0028701C0028B01B0028E31C002800
+:10563000B01C0028881C0028DA1C00286C1C0028DC
+:1056400000B5401A002801D4012000E00020C0B2BB
+:1056500000BD00B5401A00B2012801DB012000E0C6
+:105660000020C0B200BD00B500281BD0002919D011
+:1056700002780B789A4215D142784B789A4211D130
+:1056800082788B789A420DD182888B889A4209D190
+:10569000C288CB889A4205D100890989884201D104
+:1056A000012000E00020C0B200BD00B50100C9B279
+:1056B000042903D24549C0B2085C00E00420C0B20E
+:1056C00000BD0000741C0028781C00287C1C0028E9
+:1056D000801C0028841C00280313002804130028C1
+:1056E00005130028E41B002810B50C000100C9B206
+:1056F000042901D2002C01D1002006E0C0B2FFF73E
+:10570000D4FF2100C0B203F0E9FB10BD00B50028B2
+:1057100002D04178042901D3002013E001780A293E
+:1057200002D001780B2904D10189FA208000484376
+:1057300008E00189002901D0008903E0244940786C
+:105740008000085800BD000006130028AC1C00288B
+:1057500000B5002802D04178042901D3002012E0CE
+:105760000178032903D01B494078085C0BE00089CD
+:10577000401D0A21FEF75AFD322800D2322060284F
+:1057800000D35F20C0B200BDB80B0000D61C0028BB
+:1057900000B5114B1870114B1970002A05D0117803
+:1057A0000F4B197091880F4A1180C0B2002803D0A6
+:1057B00001209949087002E00020974908700120F3
+:1057C0009649087000BD0000AC1A0028ACF3001028
+:1057D00048F20010B0F30010D31C0028D41C00289D
+:1057E000D51C0028AC1C0028F8B50500002D05D0FC
+:1057F0000C00002C02D01600002E01D1002039E050
+:105800000A2100222700380001F0AAFC68682070F5
+:105810006868000A03210A00024062700200D2B2E6
+:1058200092080A40A2706A68120CA280AA68E280FC
+:10583000AA68120C22812A68C0239B009A4202D1D6
+:105840002A7B082A03D001203070002012E0F022C9
+:105850000240102A03D00220307000200AE0207895
+:10586000401E022802D9C01F072801D8012001E0EC
+:1058700031700020F2BD00B5002801D0002901D10F
+:10588000002054E04278042A03D30420087000204A
+:105890004DE00278092A05D002780E2A02D002785B
+:1058A0000F2A06D14278002A03D004200870002075
+:1058B0003DE00278032A09D18278012A0DD082784E
+:1058C000022A0AD005200870002030E08278002AE1
+:1058D00003D005200870002029E00278521E13D062
+:1058E000521E25D0521E37D0521F012A44D9921E73
+:1058F0004DD0521E59D0521E3ED0521E63D0521E61
+:105900006DD0521E79D083E0C2887D4B9A4207D277
+:105910000289002A08D0008964387A4A904203D369
+:1059200006200870002002E000200870012000BD61
+:10593000C28812B2744BD218744B9A4207D20289B1
+:10594000002A08D0008964386E4A904203D30620AA
+:1059500008700020EBE7E7E7C288643A694B9A4297
+:1059600005D200896A4A80186A4A904203D3062009
+:1059700008700020DBE7D7E7C288002A02D100893F
+:10598000002803D0062008700020D0E7CCE7C288AA
+:10599000AF4B9A4204D100890A38AE4A904203D3F1
+:1059A000062008700020C2E7BEE7C288AA4B9A42D0
+:1059B00004D100890A38A74A904203D30620087010
+:1059C0000020B4E7B0E7C288A44B9A4202D1008914
+:1059D000002803D0062008700020A8E7A4E7C288AA
+:1059E000012A02D0C288022A02D10089002803D0ED
+:1059F0000620087000209AE796E7C288002A02D1A4
+:105A00000089002803D00620087000208FE78BE76C
+:105A10000320087000208AE7D91C002803130028FF
+:105A200000B50100C9B2012902D0C0B2022801D1DB
+:105A3000012000E00020C0B200BD10B5040020002D
+:105A4000C0B2FFF7EDFF00280AD12000C0B2032842
+:105A500006D02000C0B20A2802D0E4B20B2C01D13B
+:105A6000012000E00020C0B210BD80B58EB0010062
+:105A7000C9B2042908D27A490200D2B20C235A438F
+:105A80008918897A002901D001200EE06946C0B248
+:105A9000FFF72AFE002806D068463221405C002825
+:105AA00001D0012000E00020C0B20FB000BD00B561
+:105AB0006C480078002801D0012000E00020C0B22E
+:105AC00000BD38B58EB067480478002510E06946FF
+:105AD0002800C0B2FFF708FE002808D0684632212F
+:105AE000405C002803D020000124AC4004436D1C1E
+:105AF0002800C0B20428EAD32000C0B20FB030BDE5
+:105B000011270000FDE9000010270000214E0000D1
+:105B1000D4FEFFFFBD02000038B58EB000252C007A
+:105B200018E069462800C0B2FFF7DEFD002810D05B
+:105B300068464178042908D04178072905D0417882
+:105B4000082902D04078092803D120000124AC4064
+:105B500004436D1C2800C0B20428E2D3FCF770FC9B
+:105B6000002802D020000F2404432000C0B20FB050
+:105B700030BD38B58EB000252C0010E069462800F5
+:105B8000C0B2FFF7B1FD002808D068463421405C60
+:105B9000002803D020000124AC4004436D1C2800E1
+:105BA000C0B20428EAD32000C0B20FB030BD80B527
+:105BB000FFF787FF0100002005E00A00D207D20F9F
+:105BC0008018C9B249080A00D2B2002AF5D1C0B281
+:105BD00002BD10B58EB0002418E069462000C0B2A6
+:105BE000FFF782FD002810D068463221415C002971
+:105BF0000BD00178052926D00178062923D0017819
+:105C0000072920D0007808281DD0641C2000C0B2CD
+:105C100004281AD212482100C9B20C22514341185B
+:105C2000897A0029D9D02100C9B20C225143415CA4
+:105C30000A2906D02100C9B20C225143405C0B282E
+:105C4000CBD1012002E0012000E000200EB010BD09
+:105C50005AA500004F020000524B00003CC3000058
+:105C6000AC1A0028D61C002810B5002400E0641CE3
+:105C70002000C0B204280AD22000C0B2FFF715FDF0
+:105C8000C0B2FCF7A6FE0028F1D0012000E0002001
+:105C900010BD000070B592B0012421006A46117059
+:105CA000AF490A68521C0A606A4601A9FFF79CFDC9
+:105CB000002805D0694601A8FFF7DDFD00280AD1BC
+:105CC000A8480168491C016001AA684601780220C1
+:105CD000FFF75EFDBCE101AD2878092836D0A24867
+:105CE000017800291ED0A988A04A1288914219D1B2
+:105CF0009F48007800280BD09E4901A8FFF7B3FC0D
+:105D0000002805D001AA00210320FFF741FD08E08B
+:105D100094480168491C016001AA08210220FFF78C
+:105D200037FD95E10078002810D090480188A888B8
+:105D3000FFF78FFC002809D18A480168491C0160DF
+:105D400001AA08210220FFF723FD81E120008649F6
+:105D50000870200086490870A88884490880854812
+:105D600001A94CC94CC00C390C38287809280CD131
+:105D7000A888FFF70DFC01AA00210420FFF708FD09
+:105D8000BB480168491C016062E128780F280CD1EA
+:105D9000A888FFF7FDFB01AA00210120FFF7F8FC0E
+:105DA000B3480168491C016052E12878082815D1E0
+:105DB00003F006FA002803D0A888FFF7E9FB03E008
+:105DC000A988687800F0D6FB01AA00210120FFF71E
+:105DD000DFFCA7480168491C016039E128780C28DC
+:105DE00013D168788440BE48017821430170BD48D2
+:105DF00001780C43047001AA00210120FFF7C8FCC0
+:105E00009B480168491C016022E128780D283BD19C
+:105E10006878FFF72AFE002809D0B3480168491CBA
+:105E2000016001AA09210220FFF7B2FC10E104F091
+:105E3000E5FC00280BD1FCF703FB002807D16878AC
+:105E4000FFF733FCC0B203F01DF8002805D101AA0A
+:105E50000B210220FFF79CFCFAE0A14801786A7848
+:105E6000230093400B4303709E4801786A78944066
+:105E70000C43047001AA00210120FFF789FC7C4833
+:105E80000168491C0160E3E004F0B8FC002805D07B
+:105E900001AA0B210220FFF77BFCD9E028780E280D
+:105EA0006AD103F08DF9002807D102F050FB0028D9
+:105EB00003D1FFF7FCFD002809D08B480168491C7D
+:105EC000016001AA09210220FFF762FCC0E0FFF790
+:105ED00050FE0F280CD003F0AFFD002801D00D219B
+:105EE00000E0072101AAC9B20220FFF751FCAFE090
+:105EF00004F044FC03F0EBFC002808D1032004F07C
+:105F00004DFC01AA0E210220FFF742FCA0E0200078
+:105F100076490870FCF70DFF75494018754908600F
+:105F2000A988E888C0B203F048F8002807D101AA80
+:105F30000E210220FFF72CFC6F48047088E00F2030
+:105F400067490870674908706B48047001AA00210E
+:105F50000120FFF71DFC46480168491C016077E0FD
+:105F6000501C0028541C0028D71C0028AE1C0028F8
+:105F7000D81C00289C1B002803F022F9002809D017
+:105F800059480168491C016001AA09210220FFF754
+:105F9000FFFB5DE02878FFF743FD00281DD004A932
+:105FA0006878FFF7A1FB002805D101AA0E21022085
+:105FB000FFF7EEFB4CE004A83421405C00280CD134
+:105FC00003F03AFD002801D00D2100E0072101AACD
+:105FD000C9B20220FFF7DCFB3AE0FFF7FAFD002828
+:105FE00009D041480168491C016001AA0921022029
+:105FF000FFF7CEFB2CE028780A2802D028780B285F
+:1060000011D102F0A4FA002803D1FFF750FD0028B7
+:1060100012D035480168491C016001AA09210220FB
+:10602000FFF7B6FB14E06878FFF71FFD002811D0DA
+:10603000A988687800F09EFA01A800F0DAFA01AAAF
+:1060400000210120FFF7A4FB09480168491C0160F9
+:1060500012B070BDFFF7ABFD0428EDD322480168F4
+:10606000491C016001AA0A210220FFF791FBEFE71A
+:106070005C1C00287CB5069D6C465A262670607014
+:10608000A1701000E070100080B2000A20716371EE
+:10609000A5710020E07106E0E1790200D2B2A25CB5
+:1060A0008918E171401C0100C9B20729F4D3207896
+:1060B000617809020143A07800040843E1780906E9
+:1060C00001432079627912020243A079000410434F
+:1060D000E27912060243094804F074F876BD000024
+:1060E0000413002805130028581C0028DA1C002877
+:1060F000B80B00006C1C002806130028F1020000F9
+:10610000F8B592B000252A002E0029006B4659717F
+:106110002C00002802D0017B082900D019E202A936
+:1061200043680B7043681B0A4B7043681B0C8B70F1
+:1061300043681B0ECB7083680B7183681B0A4B711D
+:1061400083681B0C8B718068000EC871280004E006
+:106150000300DBB2CB5CD218401C0300DBB2072B80
+:10616000F6D30878A52803D1C879D2B2824200D0EC
+:10617000EFE14F7888786A461071C8780A79120280
+:1061800002436846C2804A798879000210433A0087
+:10619000D2B2012A1BD03A00D2B2022A17D03A005A
+:1061A000D2B2032A13D03A00D2B2052A0FD03A0055
+:1061B000D2B2062A0BD00020009005236846C28880
+:1061C000684601793800C0B2FFF754FFC1E16A4662
+:1061D0001279002A21D14879532802D1887946289A
+:1061E00001D004260BE0884807706846C0888749BC
+:1061F0000880FCF79EFD864940188649086068467D
+:10620000407900903300DBB26846C2886846017965
+:106210003800C0B2FFF72EFF9BE17B4909783A00B6
+:10622000D2B291420CD17949098880B2814207D11A
+:10623000FCF77FFD77490968FFF702FA00280BD0C9
+:106240000020009004236846C2886846017938001F
+:10625000C0B2FFF70FFF7CE128006B4908702800EF
+:106260006A4908806B48056068460079012800D0BB
+:106270009FE03800C0B2012808D002283BD0032894
+:1062800048D0052868D006286ED091E06846C088BE
+:10629000FFF77EF90220FFF708FAC0B2FCF7BCFC5A
+:1062A000002801D1012400E02C002000C0B2002809
+:1062B0001DD003F005FB01252800A7493A00D2B202
+:1062C00088542800A5490870FCF733FDA4494018FC
+:1062D000A4490860A44904200A78030013430B7002
+:1062E000A2490A7810430870A148057002E0E22034
+:1062F0006946487112E16846C088FFF749F903F022
+:10630000A1FB040094483900C9B2445401209849C3
+:10631000087003E16846C088FFF73AF90020FFF7EC
+:10632000C4F9C0B2FCF786FB002805D0FFF79CFC3F
+:10633000002801D1012400E02C0087483900C9B2AF
+:1063400044542000C0B2002802D06846457102E0E3
+:10635000E32069464871E1E004F0A6FB04007E48B2
+:106360003900C9B24454D9E06846C088FFF710F933
+:1063700004F084FB6846C08804F05AFA04007648AA
+:106380003900C9B244542000C0B200280FD0002008
+:10639000009000236846C288684601793800C0B280
+:1063A000FFF768FEA448FEF729FF04F06FFAB5E096
+:1063B000B4E068460079022853D13800C0B2012801
+:1063C00008D0022828D003282AD0052830D0062853
+:1063D00032D03DE004A90220FFF786F900280AD058
+:1063E00004A83421405C002805D003F0A7FA002857
+:1063F00001D0012400E02C002000C0B2002802D00F
+:1064000028005649087023E0E31C0028B01C00282F
+:1064100030750000881C002803F06AFB040017E0B8
+:10642000FFF722FC002801D1012400E02C000FE03E
+:1064300004F03FFB04000BE004F03BFA002805D019
+:1064400004F0DCF9002801D1012400E02C00FFE772
+:106450002000C0B2002861D03F483900C9B245547D
+:106460005CE068460079032857D13800C0B20128A3
+:1064700008D002281DD003282BD005283CD00628A0
+:106480003ED049E004A90220FFF72EF900280ED0E3
+:1064900004A83421405C002809D003F0C7FA002882
+:1064A00005D003F0C6FA002801D0012400E02C003A
+:1064B00034E003F0BBFA002809D003F0BAFA002850
+:1064C00005D003F0B9FA002801D1012400E02C0026
+:1064D00024E004A90020FFF707F900280AD004A847
+:1064E0003421405C002805D0FFF7BEFB002801D115
+:1064F000012400E02C0011E004F0E8FA04000DE0B3
+:1065000004F0D7F9002805D004F078F9002801D16B
+:10651000012400E02C0001E000E005263000C0B2BC
+:10652000002809D1E4B2002C06D16846007903287E
+:1065300001D1012600E00226684640790090330030
+:10654000DBB26846C288684601793800C0B2FFF7FE
+:1065500091FD13B0F0BD0000B01B0028DA1C00282C
+:10656000B80B00006C1C0028041300280513002839
+:1065700003130028F8B504002000C0B2042837D265
+:106580000F002000C0B2FFF790F806000125390087
+:1065900089B22800B040C0B2FBF7E9FFFBF7ECFE80
+:1065A000390089B23000C0B2FBF74DFFBFB23900ED
+:1065B0003000C0B201F0A0FF0020A3492200D2B2F7
+:1065C0000C235A4389188872A0490A782800A040F1
+:1065D00082430A709E4801782A00A2400A43027052
+:1065E0009C4801782A00A2400A430270B74805700F
+:1065F000F1BD38B501004C78934D2000C0B20C229B
+:10660000504328180A22FEF729FC0120010022002D
+:10661000D2B20C235A43AA1891728C490A7803000B
+:10662000A34013430B708A490A780300A340134325
+:106630000B70A649087031BD88130000F8B504003E
+:106640006078FFF732F805002000FFF75FF80700D9
+:106650002000FFF77DF806002078FFF7EEF900280C
+:1066600015D004F08BF803F032F9002804D1032090
+:1066700004F094F8002047E004F080F801209449E9
+:106680000870FCF756FB934940189349086020783E
+:10669000012808D0022811D003281BD00A2824D0B2
+:1066A0000B2829D02FE0A08800903300DBB23A00FD
+:1066B000E1882800C0B202F09FF925E0A088009090
+:1066C0003300DBB23A00E18809B22800C0B202F020
+:1066D000D3F919E0A08800903300DBB2E288A178FA
+:1066E0002800C0B202F0F0F90EE0A28839002800BC
+:1066F000C0B202F02AFB07E0A28839002800C0B22D
+:1067000002F071FB00E00020F2BDF8B584B0FCF7A8
+:1067100010FB009004F072F8002806D16F48016861
+:106720000098FEF78DFF002800D14BE0002000E02C
+:10673000401C0100C9B2042944D20326684F3978AD
+:106740000D183540404C2900C9B20C225143611844
+:10675000897A0029ECD001A82900C9B20C22514342
+:1067600061180A22FEF77AFB00202900C9B20C2228
+:10677000514361188872012434490A782000A840E6
+:1067800082430A702800401C06403E700098643026
+:106790005249086001A8FFF751FF002804D101AA5F
+:1067A0000E210220FEF7F4FF294801782200AA40BA
+:1067B0000A430270274801782200AA400A43027067
+:1067C0004248047005B0F0BD38B58EB0002435E005
+:1067D00069462000C0B2FEF787FF00282DD0414D4A
+:1067E0002000C0B2285C00280AD03F482100C9B26E
+:1067F000382251434118684600F078F800281CD030
+:1068000039482100C9B2382251434018694638221C
+:10681000FEF70AFB012001002200D2B2A9540C4964
+:106820000A780300A34013430B700A490A78030057
+:10683000A34013430B7025490870641C2000C0B2AC
+:106840000428C5D30FB030BDAC1A0028D61C0028D0
+:10685000041300280513002838B51D4C20780028A3
+:1068600032D002F0ADFC00282ED1FCF762FA050010
+:10687000FFF71DF9002807D101F069FE002803D1B8
+:10688000FFF7F2F9002804D01248281812490860CE
+:106890001AE0114801682800FEF7D2FE002813D044
+:1068A00003F06CFF03F04AF8002803D1032003F043
+:1068B00075FF09E003F062FF00202070012003490A
+:1068C00008700F20A849087031BD0000031300288C
+:1068D000DA1C0028B80B00006C1C0028741C00286F
+:1068E000DB1C0028681C00281819002800B5027855
+:1068F0000B789A4227D142784B789A4223D18278FA
+:106900008B789A421FD1C278CB789A421BD14268C9
+:106910004B689A4217D13022825C3023CB5C9A427A
+:1069200011D13222825C3223CB5C9A420BD13122CC
+:10693000825C3123CB5C9A4205D13422805C3422C4
+:10694000895C884201D0012000E00020C0B200BD77
+:1069500000B5007800280FD0022811D00ED30428EB
+:106960000CD00FD306280FD00ED308280CD00BD391
+:106970000A280DD00AD30DE000200CE001200AE027
+:10698000022008E0032006E0042004E0062002E0E4
+:10699000072000E0072000BD00B5407800280ED099
+:1069A000022810D00DD3042811D00ED3062812D0FF
+:1069B0000FD3082813D010D3092812D013E00020D9
+:1069C00012E0012010E002200EE003200CE0052080
+:1069D0000AE0042008E0062006E0072004E0092081
+:1069E00002E00B2000E0092000BD7CB5FFF769F84C
+:1069F0000400FFF791F80500684602F0EEFB00285E
+:106A000005D068464078032801D1012600E0002621
+:106A100003F0F4FE002808D003F0FAFE002801D1AC
+:106A2000032000E00420C0B21BE0FFF7D2F80028EA
+:106A300001D0052015E0EDB2002D06D1F6B2002EF2
+:106A400003D103F0E5FE002801D0042009E0E4B200
+:106A5000002C03D102F0B4FB002801D0022000E09A
+:106A6000012076BDF8B584B0FFF72BF86946487170
+:106A7000FFF752F80700FFF77CF869460871FFF747
+:106A8000A8F86946C87002A802F0A7FBC0B20028A7
+:106A900005D002A84078032801D1012000E00020A1
+:106AA0003900C9B200290AD1C0B2002807D103F0C9
+:106AB000AFFE002803D102F0BFFF002801D001245F
+:106AC00000E00024944806780F252E40FFF78DFF44
+:106AD00000013043694688709048007869464870E4
+:106AE0008F4800786946087003F088FE002801D0BE
+:106AF000102600E0002602F063FB002801D02020D1
+:106B000000E000206946C978002901D0402100E05A
+:106B100000216A4652792A40164330430143E0017E
+:106B200008433D40694609790A012A43BC4909786E
+:106B3000F0230B43694689786C46647824020C4341
+:106B4000B8490988090421436C462478C0B2000280
+:106B50002043D2B214040443DBB21A062243B248E3
+:106B600003F030FB05B0F0BD05130028F1B594B07B
+:106B7000AE4814A909780C2251434018019006A987
+:106B800014A80078FEF7B0FD002801D10020C0E075
+:106B900006A8FFF7DDFE040006A8FFF7FDFE0700CC
+:106BA00006A8C0786946087006A83221405C002813
+:106BB00003D006A83021455C00E00025079869460F
+:106BC00048809A4814A909780C2251434018807AC9
+:106BD000002817D0019800780A2803D0019800787F
+:106BE0000B2801D1042400E00124012701988078BA
+:106BF0006946087001988088694648800198FEF7C8
+:106C0000A7FD050006AE3220305C002808D1874879
+:106C100014A909780C2251434018807A002802D028
+:106C20000420059001E0002005903420305C00280D
+:106C300002D00820049001E0002004903420305C51
+:106C4000002805D00998002802D11020039001E007
+:106C5000002003903420305C002809D00A980028D6
+:106C600006D009980A99884202D32020029001E0B8
+:106C7000002002907078042802D14020019001E0A9
+:106C8000002001907078072803D0FBF7D9FB00287B
+:106C900001D0802000E00020694609788907890F2B
+:106CA000059A0A4304991143039A0A43029911432E
+:106CB000019A0A4310433421715C002907D00D99D1
+:106CC0008C4A914201D38C4A02E00D9A00E08B4A33
+:106CD00014A90978E4B223071B0FFFB23C01F02688
+:106CE00026401E4333020B43C0B2000418436946DA
+:106CF0004988090601436846408880B2000A80B28C
+:106D000092B213020343EDB22A061A437C4803F001
+:106D100059FA15B0F0BD0000D31C0028D41C00287F
+:106D2000D51C0028F1B590B001A910A80078FEF795
+:106D3000DBFC002801D1002070E080204002049993
+:106D4000814203D36D496A46518002E004996A4644
+:106D500051800599814203D368486946088002E062
+:106D6000059869460880079819303221FDF75EFAC8
+:106D70000400FF2C00D9FF2401A84078042801D189
+:106D8000012700E0002701A84078072803D0FBF77F
+:106D900057FB002801D0022500E0002501A840781B
+:106DA000082801D1042600E0002601A8407809281F
+:106DB00003D002F041FE002801D0082100E00021AC
+:106DC0003D432E4331430F2001AA9378034009012C
+:106DD00019433123D25C10404A4A10AB1B78D25C75
+:106DE0001201024310A80078C9B20B02034368469F
+:106DF00040880104194368460088E4B22304034331
+:106E0000D2B212061A43404803F0DCF9002801D13F
+:106E1000002003E010A8007800F00AF811B0F0BDDF
+:106E2000E21C0028AC1C002801030000AC1A00285A
+:106E300078B585B004002000C0B2042809D2200033
+:106E4000C0B2FEF732FC6946C0B2FBF783FF0028F0
+:106E500001D0002031E068464178002901D00121AD
+:106E600000E000218278002A01D0022200E0002206
+:106E7000C378002B01D0042300E000230579002D06
+:106E800001D0082600E000264579002D01D010250C
+:106E900000E000250A4313431E433543E4B2EDB23C
+:106EA0002A022243C188090411430389808902040C
+:106EB0001A43C120800003F085F906B070BDE0B52B
+:106EC000684602F08AF9002801D1002011E06846E6
+:106ED0000178427812020A4381780B041343C17887
+:106EE000090619438388C08802041A43844803F0C2
+:106EF00069F90EBD1127000010270000FFFF0000F8
+:106F000002030000701C002803030000F8B5FBF723
+:106F100010FF04007B4D29682000FEF791FB00283C
+:106F200005D0012078490870200064302860774D32
+:106F300029682000FEF784FB002805D00120744951
+:106F4000087020006430286072480078002814D14E
+:106F5000714801682000FEF773FB00280DD06F4ACE
+:106F60006F480078107001206E490B781278050088
+:106F700095401D430D70674908706B4800780028E4
+:106F800014D16A4801682000FEF75AFB00280DD092
+:106F9000674A684800781070674901200B781278BA
+:106FA000050095401D430D705F490870564D2878C7
+:106FB00000281ED0FFF756FD002815D000202870AD
+:106FC0005E490A78521C1207120F0A705C490A784F
+:106FD000002A04D05B4A10705B4A107008705B484E
+:106FE0000168491C016003E059480168491C0160BF
+:106FF00085E0474D287800280FD0FFF760FF002874
+:1070000006D00020287051480168491C016003E047
+:107010004F480168491C016071E0002500E06D1CCB
+:107020002800C0B204282CD20127AF403D4E307852
+:107030003842F4D02800C0B2FFF798FD00281BD0DA
+:107040003078B84330703348017800290FD0334985
+:107050000978EDB28D420AD131490A78521C920763
+:10706000920F0A700021017019342B4804603748D0
+:107070000168491C016003E035480168491C016052
+:107080003DE0002500E06D1C2800C0B2042836D287
+:107090000127AF40284E30783842F4D02800C0B2E3
+:1070A000FFF740FE002825D03078B84330702948DB
+:1070B0002900C9B2415C491C0907090F2A00D2B254
+:1070C00081541948017800290FD019490978EDB287
+:1070D0008D420AD117490A78521C9207920F0A7002
+:1070E0000021017019341148046018480168491CD6
+:1070F000016003E016480168491C0160FFE7F1BD2B
+:1071000006030000781C002803130028841C0028B4
+:1071100006130028E01C00287C1C0028DE1C002828
+:10712000DC1C002804130028E11C0028801C002817
+:10713000DF1C0028DD1C002805130028E21C0028A5
+:10714000D91C0028D31C0028D41C0028601C00284F
+:10715000641C0028701C0028704700007047000065
+:107160001206130A1A43130C1A4300BF094205D032
+:10717000830707D00270401C491EF9D170470000F8
+:107180000022FFE71300103906D330B414001500B5
+:1071900010393CC0FCD230BC490700D30CC000D52C
+:1071A00004C0890002D30280801C002900D502702F
+:1071B00070470000F8B5020000231800A94C2468AD
+:1071C000002959D000920A781207120F009D10353D
+:1071D0002E680F27BE4332432A604A78FF25AC430E
+:1071E000D2B222438C78002C01D0012400E01C0094
+:1071F0009D4D154024028022520014402C43012250
+:10720000CE781640994D254074028026B600344051
+:107210002C430D79002D01D0160000E01E00944D86
+:107220002540B4028026F60034402C434D79002DD1
+:1072300001D0160000E01E008E4D25407407802608
+:10724000B60534402C438D79002D01D0160000E0A6
+:107250001E00A14D2540B4078026F60534402C437E
+:10726000C979002901D01300FFE762005208D9074D
+:107270001143009A116000E09848F2BD00210160BE
+:1072800001617047F0B585B00C0000250195944967
+:107290000E689449096804919349096803919349D8
+:1072A0000F68934909680291002C00D1D4E0009046
+:1072B000009800F0E7F802998020C0000843802180
+:1072C000890001438020400008430222024301213B
+:1072D0000A4304201043009A106120784007400FB1
+:1072E00007229643304362785207520F7023984327
+:1072F00012017026164006430322A07810407D4BF1
+:1073000033400602C020800030401843E378002B51
+:1073100001D00B0000E02B00774E0640D8028023FE
+:107320001B01184030432379002B01D00B0000E0F3
+:107330002B0046007608D8073043009B1860607920
+:107340008006800E049B3F26B3431843A379134065
+:10735000C026B0439B01C0261E400643E079430788
+:107360005B0F664830401E02E023DB0033400343DE
+:10737000207A002801D00D00FFE75F4E1E40E80292
+:1073800080231B0118403043657A1540874B03402A
+:107390002D03C020800128401843A57A1540844B56
+:1073A0000340AD03C020000228401843A3891D05F7
+:1073B0002D0D804B03402D047F4828401843A37BAC
+:1073C0000B4045006D08D8072843009B5860E07BC0
+:1073D0004007400F039B0725AB431843237C0B401A
+:1073E0004025A8439B0140252B400343607C01407E
+:1073F00080208343C801802108401843A17C6F4B43
+:1074000003400902FF20000208401843E17CC9063E
+:10741000C90E6B4B03400904F82040030840184391
+:10742000217D0A40674901409205C02000041040B8
+:10743000084300998860E08A390C090480B2084347
+:10744000218B82B2080410430099C86021001A31D0
+:10745000009800F055F801E020480190019805B02F
+:10746000F0BD0000C4F20010FFFEFFFFFFFDFFFFB4
+:10747000FFFBFFFFFFFFFFDF3830016801220A43F7
+:107480000260704738300168012291430160704703
+:107490003C30016801220A430260704710B50300C6
+:1074A0000020002916D0002A14D05B6A1C000C8032
+:1074B000190F0C00E407E40F1470990F0C00E40797
+:1074C000E40F9470590F0C00E407E40F5470D90FC7
+:1074D000D17000E0014810BDFFFFFFBF0100DA00DE
+:1074E000C8F20010CCF20010D0F20010D4F200105C
+:1074F000D8F20010FFFCFFFFFFF7FFFFFFF8FFFFD0
+:10750000F0B50A00002319006F4C2468002A49D006
+:107510005579002D01D0012600E01E006B4D25405D
+:10752000B4028026F60034402C431579002D01D09A
+:10753000012600E01E00664D254074028026B6003C
+:1075400034402C43D578002D01D0012600E01E00E8
+:10755000604D254034028026760034402C43557817
+:10756000002D01D0012500E01D000226B4436D006E
+:107570000226354025431478002C01D0012400E078
+:107580001C0001260127BD4334402C439278002A79
+:1075900000D11E0004229443B20004231A40224367
+:1075A000826100E047490800F0BD0000FFCFFFFF07
+:1075B000FF3FFFFFFFFF00F00000FF0FFF00FFFF96
+:1075C000FFFFE0FFFFFF3FFFF0B50A0000231900B7
+:1075D000414C2468002A49D05579002D01D001265C
+:1075E00000E01E00394D2540B4028026F6003440EC
+:1075F0002C431579002D01D0012600E01E00344DEA
+:10760000254074028026B60034402C43D578002DE6
+:1076100001D0012600E01E002E4D254034028026B8
+:10762000760034402C435578002D01D0012500E030
+:107630001D000226B4436D00022635402543147810
+:10764000002C01D0012400E01C0001260127BD43CD
+:1076500034402C439278002A00D11E000422944327
+:10766000B20004231A402243026100E015490800D9
+:10767000F0BD000010B50200002000291FD01269E3
+:10768000930A1C00E407E40F4C71530A1C00E40742
+:10769000E40F0C71130A1C00E407E40FCC705308CC
+:1076A0001C00E407E40F4C7013001C00E407E40F17
+:1076B0000C7092081300DB07DB0F8B7000E00148B1
+:1076C00010BD00000100DA00DCF20010FFFBFFFF3C
+:1076D000FFFDFFFFFFFEFFFFE0F2001000B50120FD
+:1076E00027490A6852080240002A01D0022001E01E
+:1076F0000968084000BD274801680800C007C00F9E
+:10770000704700B5C21E022A01D3012002E0C01E4C
+:107710000860002000BD1CB5FF246946FFF7F1FF9B
+:10772000C0B2002802D02000C0B207E03C48009957
+:10773000890041580800C007C00FC0B216BD00B58F
+:10774000002801D0032801D3012002E0401E086078
+:10775000002000BD1CB5FF246946FFF7F0FFC0B252
+:10776000002802D02000C0B208E034480099090186
+:107770004018C1680800C007C00FC0B216BD0000A5
+:10778000241526402E48006881080800C007C00F55
+:10779000704700004015264038B504002000C0B2F4
+:1077A00008280DD3274D18222749280000F0D0FBC8
+:1077B0000020E875254826490860002000F028FCD4
+:1077C00024482100C9B2890041580A00D205D20FCD
+:1077D000002A05D0E4B2A10040580007000F00E0E5
+:1077E000FF2032BD38B505002800C0B208280ED3EE
+:1077F000144C18221449200000F0AAFB0020E07568
+:107800008920000112490860002000F001FC1148A5
+:10781000EDB2A900405800098007800F32BD00007A
+:10782000401626400F480068000AC0B270470E4854
+:107830000068000AC0B2704700000000001926402E
+:1078400010002740181B0028F4EB00105B08000014
+:10785000F01B00284012264004480068000AC0B20D
+:1078600070470000101020400C10204008102040ED
+:1078700038B50400072C0ED3124D182212492800E7
+:1078800000F066FB0020E875CE2040000F4908603C
+:10789000002000F0BDFB0A48A10040584007400FFF
+:1078A000010009B2042907D10448A1004058C106CB
+:1078B000C90E80204000084300B232BD00012640BE
+:1078C00000122640181B002850EC0010F01B002866
+:1078D0001E4909688A03920B0260090E0A00D2074A
+:1078E000D20FC271174909680A00D204D20C8280F3
+:1078F0000A00120CD2B20281090CC9B24181264998
+:1079000009680F220B00134003730B091A404273DE
+:107910000A0AD204D20CC281090F8907890F0174A7
+:10792000094909680A0A5207520F82710A00120CAB
+:10793000D205D20D4282890F0A00D207D20F0275FA
+:1079400070470000341526403C152640301526406F
+:107950001CB50C006946FFF7D4FE0100C9B200292E
+:1079600001D0C0B217E00D48009989004058410687
+:10797000490E21601F21020A0A406260020C114078
+:10798000A160010F8907890F6173C00E0100C9074B
+:10799000C90F2173002016BD381526400016264059
+:1079A0001CB50C006946FFF7CAFE0100C9B20029E8
+:1079B00001D0C0B233E01A48009909014158CAB257
+:1079C00022601F220B0A134063600B0C1A40A26056
+:1079D000090F8907890F21730099090141184A6825
+:1079E000D10F61730721130F0B40002B01D001232E
+:1079F00000E00023A3731202120A2261009A12010E
+:107A000080188068C20F2275020E1300DB07DB0F9F
+:107A100063750200A275000C0140E175002016BDDF
+:107A20000019264080B5010086481822FDF7FCF9B0
+:107A3000012085490870002002BD000000B583497F
+:107A40000968C90F002907D07F490978002907D1A3
+:107A500000210160032000BD002101600320FAE73E
+:107A60007849096801600020F5E7000010B50400BE
+:107A7000FFF734FE002803D10020206003200BE034
+:107A800071480078002804D06E488068206000208B
+:107A900002E000202060032010BD00B56A4909788B
+:107AA000002904D0674949680160002002E00021F4
+:107AB0000160032000BD000000B565490968C90FD9
+:107AC000002907D060490978002907D10021016009
+:107AD000032000BD002101600320FAE75949C9686D
+:107AE00001600020F5E7000000B55A490968C90F98
+:107AF000002907D054490978002907D100210160E5
+:107B0000032000BD002101600320FAE74D49096907
+:107B100001600020F5E7000010B50400FFF732FE19
+:107B2000002803D10020206003200BE046480078A5
+:107B3000002804D0434840692060002002E0002073
+:107B40002060032010BD000010B50C00C0B2FFF78C
+:107B50008FFE00280CD0401E0ED0401E10D0872172
+:107B60004900401A10D0401E12D0C01E14D017E099
+:107B70002000FFF763FF16E02000FFF78EFF12E002
+:107B80002000FFF773FF0EE02000FFF795FF0AE0EB
+:107B90002000FFF7C1FF06E02000FFF7A5FF02E08D
+:107BA00000202060032010BD80B501000020FFF7F9
+:107BB000CBFF02BD80B50322D2B2824203D20020A5
+:107BC0000860012003E0401CC0B2FFF7BDFF02BD0A
+:107BD00030B587B004006846FFF7E6FF0100C9B280
+:107BE000002903D000212160C0B228E001A8FFF7DE
+:107BF0006FFE01AD287C022803D100982060002090
+:107C00001DE07B480068C00F002808D0FFF773FD17
+:107C1000C0B2002807D10020206003200FE00098A8
+:107C2000206000200BE0009801994843A988FCF7E8
+:107C3000FDFAE979491CFCF7F9FA2060002007B049
+:107C400030BD0000001B0028B91C00281815264074
+:107C5000081526400C152640F0B58BB004000D0029
+:107C600069462000C0B2FFF7A5FF0100C9B2002994
+:107C700003D000212960C0B2B7E02000C0B20228C2
+:107C800048D307A92000C0B2401CFFF761FEC0B274
+:107C900000280DD0824E18228249300000F058F999
+:107CA0000020F075804881490860002000F0B0F99C
+:107CB0007F482100C9B28900401808380068C00F09
+:107CC000002807D007A8407B022807D10098286029
+:107CD00000208AE000982860002086E0E4B2641C5E
+:107CE0002000FFF718FD0100C9B2002902D0C0B280
+:107CF000FF2803D100202860032076E00098079930
+:107D000048430899FCF792FA0999FCF78FFA286022
+:107D100000206AE001A92000C0B2401CFFF740FE2D
+:107D2000C0B200280DD05E4E18225E49300000F02F
+:107D30000FF90020F0755F485C490860002000F0F2
+:107D400067F95D482100C9B209014058C00F0028F9
+:107D500007D001AE307B022807D1009828600020B0
+:107D600043E00098286000203FE0E4B2641C20005B
+:107D7000FFF7F0FC0100C9B2002902D0C0B2FF2811
+:107D800003D10020286003202FE0707B012821D13F
+:107D900000980021019E00273F06320A174336064D
+:107DA000059A002392197B41FCF72EFC06000F0078
+:107DB00002980021039A0023FCF726FC02000B0026
+:107DC00030003900FCF72DF9000E0A021043090EAD
+:107DD000286009E00098019948430299FCF726FAC7
+:107DE0000399FCF723FA286000200BB0F0BD0000D7
+:107DF0003015264010B50323421E0400E4B2002CC7
+:107E000003D10800FFF7E4FE0CE01400DBB2E4B29B
+:107E1000A34204D31000C0B2FFF71EFF02E0C0B2BD
+:107E2000FFF792FE10BD38B504000D002000C0B26F
+:107E3000FFF7B2FC0100C9B2FF2904D12800FFF707
+:107E4000FDFDC0B21BE06946C0B2FFF7D3FF0100E1
+:107E5000C9B2002903D000212960C0B20FE0200080
+:107E6000C0B2FFF7BFFCC0B2002805D002280BD07B
+:107E700006D303280CD00FE000982860002032BD04
+:107E8000009840082860F9E7009880082860F5E726
+:107E90000098C0082860F1E7002028600320EEE782
+:107EA000181B002850EC001063090000F01B00288C
+:107EB000001626407F090000001926401CB504006A
+:107EC00069460020FFF7AFFF0100C9B2002903D0C7
+:107ED00000212160C0B209E0FFF7A9FC0100009871
+:107EE000C9B2491CFCF7A2F92060002016BD1CB5E0
+:107EF000040069460020FFF796FF0100C9B200297F
+:107F000003D000212160C0B208E0FFF78BFC010024
+:107F10000098491CFCF78AF92060002016BD1CB5AA
+:107F200004006846FFF7E3FF0100C9B2002901D051
+:107F3000C0B208E0FFF790FC01000098491CFCF774
+:107F400075F92060002016BD80B5FFF7E8FF02BD7F
+:107F500071B58B0709D0521E28D30B780370401CD3
+:107F60001B421FD0491C8B07F5D1121F3ED3274C53
+:107F7000E50140C9331BB3432B4209D1830716D116
+:107F800040C0121F32D340C9331BB3432B42F7D03A
+:107F9000121DFF231E4205D00670401C360A521ED9
+:107FA0001E42F9D111000022FFF7E0F871BDDB425B
+:107FB00016D0401E4670360A4680360C0671001DEB
+:107FC000121F06D340C9331BB3432B42F2D0401CCF
+:107FD000DEE7401C0AE040C9331BB3432B42D7D134
+:107FE0000680360C4680001D121FF4D2121D0BD0E5
+:107FF0000B780370521E07D0401C491C1B42F7D15E
+:108000000370401C521EFBD171BD00000101010133
+:1080100000B501BEFEE780B50C4A0D490B689342DE
+:1080200010D00A6002684A6042688A608268CA604A
+:10803000C2680A6102694A6142698A618269CA61E9
+:10804000C069086203F014F801BD0000F3F2F1F01A
+:10805000DC1A00287047704700B5C0B2042801D26E
+:10806000012000E00020C0B200BD00B50100C9B28F
+:10807000002901D1904813E00100C9B2012902D1C1
+:10808000AF2040010CE00100C9B2022901D18B48A8
+:1080900006E0C0B2032802D1E120400100E0002048
+:1080A00000BD00B50100C9B2002901D15A2011E07C
+:1080B0000100C9B2012901D15A200BE00100C9B267
+:1080C000022901D15A2005E0C0B2032801D15A206B
+:1080D00000E0002000BD00B5401A002801D40120B6
+:1080E00000E00020C0B200BD00B5884201D3401AB4
+:1080F00000E0081A00BD00B50200D2B2002A08D183
+:10810000C9B2022902D1E120800001E0FA208000FA
+:1081100018E00200D2B2012A08D1C9B2022902D164
+:108120009620C00001E0AF2080000BE0C0B2032821
+:1081300007D1C9B2022901D1614801E0C820C000BD
+:1081400000E0002000BD10B500280FD00C00002C6E
+:108150000CD06178002909D02169002906D0A168D6
+:10816000002903D021698268914201D2002019E0E0
+:1081700080680021A2680023FCF746FA02000B0089
+:108180002069400800218018594122690023FBF72B
+:1081900048FF6168FFF7A8FF052801D2012000E031
+:1081A0000020C0B210BD00B5C0B232382E2801D2B6
+:1081B000012000E00020C0B200BD00B50178022916
+:1081C00005D00178012904D14078022801D101208D
+:1081D00000E00020C0B200BD00B50178032905D041
+:1081E0000178012904D14078032801D1012000E061
+:1081F0000020C0B200BD38B50C00BE490200D2B2AA
+:108200003C235A438D18C0B2FAF757FA0A20287057
+:10821000AC7000203821685431BDB649C0B23C2250
+:108220005043081809210170022181700021382271
+:1082300081547047AF49C0B23C2250430818002116
+:1082400001700322827038228154704770B5050096
+:108250000C002800C0B2FFF7FFFE002807D0FAF795
+:10826000EFF8002803D180204002844201D300208F
+:1082700020E02800C0B2FAF720FA002807D1210038
+:1082800089B22800C0B2FAF7DEF8002801D0002039
+:1082900010E09848EDB23C214D4345193C210022A5
+:1082A0002E003000FEF75CFF6C600120A8703821C2
+:1082B0006854012070BD0000FC530000901A0000BB
+:1082C0006C070000F2B59EB0070016001C000020ED
+:1082D00001903800C0B2FFF7BFFE002819D029A8CE
+:1082E0000078022803D029A80078032811D138008B
+:1082F000C0B2FFF7BAFE1E9988420AD305A938001A
+:10830000C0B2FAF7AFFD002803D105A840780028D5
+:1083100001D10020E4E0774D3800C0B23C21484351
+:108320002818049004983621405C694648706846D5
+:10833000067027A80078002807D168460078FFF764
+:1083400032FF002801D10020CAE008991E98FFF7EB
+:10835000CBFE02900394269E289C27A80078002834
+:108360001CD00398002802D00298002816D1029849
+:10837000002811D1E4B2002C08D131003800C0B27D
+:10838000FFF764FF002801D10020A9E03800C0B247
+:10839000FFF743FF0120A3E00020A1E00FA804990C
+:1083A0003C22FCF741FD2000C0B2002808D131007A
+:1083B0003800C0B2FFF74AFF002801D100208FE04B
+:1083C0003800C0B23C2148432D18E4B2002C0CD038
+:1083D00028000FA93C22FCF727FD01200100A9700D
+:1083E00001003822A95469464870249C27A80078C7
+:1083F00000282FD02598002801D0019018E0002CEB
+:1084000001D0019414E002980021FA229200002386
+:10841000FCF7FAF802000B0003980021801859417C
+:108420000022401E9141039A0023FBF7FAFD0190C0
+:108430000198002807D0029A01993800C0B2FAF7D3
+:10844000B5FD002815D008213800C0B2FFF7D3FED3
+:10845000002045E0684601783800C0B2FAF714FA07
+:10846000002806D008213800C0B2FFF7C4FE002063
+:1084700036E029A800786870002C01D0012001E0C6
+:1084800029A8007828701E98A860EC6001982861DF
+:108490000020A86103982862684600783521685456
+:1084A00027A80078372168546846407836216854F8
+:1084B0001E980899884201D3012000E0022034214F
+:1084C00068541E993800C0B2FAF774FE002806D02E
+:1084D00008213800C0B2FFF78EFE002000E0012026
+:1084E0001FB0F0BD10B5F02100227B4C2000FEF73C
+:1084F00037FE10BD28180028F8B505000C0028002C
+:10850000C0B2FFF7A9FD002813D02800C0B2FAF7C7
+:10851000D4F87148EDB23C214D4345193C21002669
+:1085200032002F003800FEF71BFE6C602E70032017
+:10853000A870F1BD38B50400002505E02100280031
+:10854000C0B2FFF7D9FF6D1C042DF7D331BD00B5C4
+:10855000002000E0401C042809D25F493C2242432D
+:1085600089183822895C0029F4D0012000E000201D
+:1085700000BD78B585B0040057482300DBB23C2528
+:108580006B43C5182878082835D1696889B220005E
+:10859000C0B2F9F7B7FF002804D12000C0B2FFF73E
+:1085A00049FE96E02000C0B2FAF713FA002800D086
+:1085B0008FE0286B002806D0296B2000C0B2FAF7A4
+:1085C0005DFB002812D0696889B22000C0B2F9F7BB
+:1085D00099FF002804D12000C0B2FFF72BFE04E071
+:1085E00009212000C0B2FFF706FE72E02000C0B2F1
+:1085F000FFF713FE6DE0C87804280BD0C878022876
+:1086000008D0C878032805D0C878052802D0C878D3
+:10861000012805D109212000C0B2FFF7ECFD58E088
+:108620002878012855D01600287806281BD1E86A3A
+:10863000FA21490041183000FFF74DFD002811D004
+:1086400069462000C0B2FAF7AFFA002805D0092128
+:108650002000C0B2FFF7CFFD3BE00398A862EE62B6
+:108660000720287035E0E86AFA21890041183000B7
+:10867000FFF731FD00282CD069462000C0B2FAF780
+:1086800093FA002805D009212000C0B2FFF7B3FDFE
+:108690001FE0E86A361A0398A96A401A00210F4AB7
+:1086A0000023FBF7B1FF32000023FBF7BAFC060002
+:1086B000002E05D02000C0B2F9F7FFFF002805D03A
+:1086C00009212000C0B2FFF796FD02E02E630820CA
+:1086D000287006B070BD000028180028A086010090
+:1086E000F8B592B0F9F748FEFAF723FB06900020A0
+:1086F00007900CE006212800C0B2FFF77CFD03E0E4
+:108700002800C0B2FFF789FD0798401C0790079822
+:10871000042800D358E1079DAC4807993C225143F7
+:1087200044183820205C002806D008A92800C0B2D0
+:10873000FAF798FB002800D0E6E7F9F781FE002859
+:1087400003D108AEF078072805D107212800C0B270
+:10875000FFF751FDD8E7616889B22800C0B2F9F788
+:10876000D1FE002804D12800C0B2FFF763FDCBE79B
+:10877000F078062807D12078082804D02800C0B255
+:10878000FFF758FDC0E72078012816D1B0780028FF
+:1087900013D0607820702078062802D10698E06215
+:1087A0000BE0E068002806D00698E168401861698F
+:1087B0004018A06101E00020A061207806280BD0BD
+:1087C0002078072808D02078082805D020780128AC
+:1087D00009D16078062806D1069A08A92800C0B2F7
+:1087E000FFF7C7FE90E7207804282FD1E1690698AB
+:1087F000FFF771FC002828D06078059001200490D4
+:108800003720205C03906068029020690190E06846
+:108810000090236A3520225CA1682800C0B2FFF7CF
+:1088200051FD002811D1616889B22800C0B2F9F762
+:1088300069FE002804D12800C0B2FFF7FBFC04E069
+:1088400004212800C0B2FFF7D6FC5DE7F0780228CB
+:1088500002D0F078032801D1012700E00027F0784A
+:10886000042803D03800C0B2002852D02000FFF7FF
+:10887000A4FC00280AD008A92000FFF764FC002807
+:1088800004D02800C0B2FFF7C8FC3DE72000FFF786
+:1088900094FC002823D03620205C00281FD128001B
+:1088A000C0B2F9F70AFF00280CD0F9F7C9FD00287B
+:1088B00001D0072100E00821C9B22800C0B2FFF7AB
+:1088C0009AFC21E7042020700020A0610698FA217C
+:1088D000C9004018E06101203621605418E03800DA
+:1088E000C0B2002809D02000FFF776FC002804D091
+:1088F0002800C0B2FFF791FC0AE0FFB2002F01D0C0
+:10890000052100E00421C9B22800C0B2FFF773FCC2
+:10891000FAE6F078012804D12800C0B2FFF77DFC08
+:10892000F2E6F078052815D12000FFF746FC002874
+:108930000AD008A92000FFF706FC002804D0280070
+:10894000C0B2FFF76AFCDFE606212800C0B2FFF7DD
+:1089500052FCD9E6A069002800D1D5E6A1690698A5
+:10896000FFF7B9FB002800D1CEE62800C0B2F9F726
+:10897000A4FE00280CD0F9F763FD002801D00721E0
+:1089800000E00821C9B22800C0B2FFF734FCBBE602
+:108990002078032800D0ADE669462800C0B2FAF777
+:1089A00003F9002805D008212800C0B2FFF723FCF6
+:1089B000AAE60398616A884200D0A1E60421280053
+:1089C000C0B2FFF718FC9FE613B0F0BD28180028CE
+:1089D00010B586B002240594002404940024039466
+:1089E000029300230193002300930023D2B2C0B26C
+:1089F000FFF768FC06B010BDF8B590B00C001D0084
+:108A000062498C4211D21600002E0ED0070006A932
+:108A10003800C0B2FAF726FA002806D106A8407836
+:108A2000002802D00A98002801D1002022E020006E
+:108A300000210A9A0023FBF7E7FD02000B005448CF
+:108A4000002180185941534A0023FBF7EAFA02211A
+:108A500005910021049100210391169902910021B2
+:108A60000191009600232A00D2B201003800C0B262
+:108A7000FFF728FC11B0F0BDF0B58BB007000E0079
+:108A800014001D0001A93800C0B2FAF7EBF9002864
+:108A900003D101A84078002801D1002012E00A98F3
+:108AA0008119002901D5002103E03848814200DB0B
+:108AB00038492B00220010980090DBB23800C0B279
+:108AC000FFF79AFF0BB0F0BDF6B585B004000E00BD
+:108AD0000698002815D01F003800C0B2FFF763FBCE
+:108AE00000280ED03000C0B2012803D03000C0B240
+:108AF000022806D10C992000C0B2FFF7A7FB00287E
+:108B000001D1002040E03900C9B22000C0B2F9F71D
+:108B1000BBFE002806D008212000C0B2FFF76BFB87
+:108B2000002031E053482100C9B23C22514345188E
+:108B300069462000C0B2FAF737F8002806D00821AD
+:108B40002000C0B2FFF757FB00201DE003986862C9
+:108B50003100C9B22000C0B2F9F72AFF002806D0C0
+:108B600008212000C0B2FFF746FB00200CE00120E6
+:108B700028700320687034202E540698E860002086
+:108B8000A86135202F54012007B0F0BD1127000047
+:108B90008813000010270000F6B591B00C001E00ED
+:108BA000129900290BD0070007A93800C0B2FAF7C4
+:108BB00059F9002803D107A84078002801D10020E6
+:108BC00055E006940A990698FFF78EFA0400002CE7
+:108BD00007D1189B322206993800C0B2FFF7F8FE81
+:108BE00045E006980A99884201D3012100E002215C
+:108BF0001298FF22F632904203D31298A04A8518A9
+:108C000000E0129DC9B23800C0B2FFF774FA00212B
+:108C1000C943491B814201D2002028E02D182000C1
+:108C20000021FA2292000023FBF7EEFC2A00002329
+:108C3000FBF7F7F90221059100210491012103912D
+:108C4000189902910195129900910300002206994A
+:108C50003800C0B2FFF736FB0100C9B2002905D0C9
+:108C60000449FFB23C225743C9194E61C0B213B048
+:108C7000F0BD000028180028F8B58AB007000E00E3
+:108C800014001D0069463800C0B2FAF7EBF800285E
+:108C90000AD168464078002806D00298002803D000
+:108CA00030000299814201D2002017E00021049A8D
+:108CB0000023FBF7A9FC02000B00029840080021EA
+:108CC00080185941029A0023FBF7ABF92B002200D0
+:108CD000D2B201003800C0B2FFF77AFE0BB0F0BD8F
+:108CE000F0B58BB007000E0014001D0001A938007C
+:108CF000C0B2FAF7B7F800280AD101A840780028D6
+:108D000006D00398002803D030000399814201D295
+:108D1000002018E00021059A0023FBF775FC0200F3
+:108D20000B0003984008002180185941039A002342
+:108D3000FBF777F9109900912B0022000100380011
+:108D4000C0B2FFF729FF0BB0F0BDFEB504000D0067
+:108D500016002000C0B2FFF77FF9002802D02F00D4
+:108D6000002F01D100203DE02000C0B2FFF799F9AB
+:108D7000050031002000C0B2FFF768FA002807D0D4
+:108D80002900C9B22000C0B2F9F77EFD002806D044
+:108D900009212000C0B2FFF72EFA002022E00520B2
+:108DA0004D492200D2B23C235A4388546B463A00C4
+:108DB00002212000C0B2FAF7FFFD002806D1684664
+:108DC0000178002902D04078002806D1092120002E
+:108DD000C0B2FFF710FA002004E02000C0B2FFF795
+:108DE0001CFA0120FEBDFEB504000D001600200097
+:108DF000C0B2FFF731F9002802D02F00002F01D1B7
+:108E000000203AE02000C0B2FFF74BF90500310026
+:108E10002000C0B2FFF71AFA002807D02900C9B213
+:108E20002000C0B2F9F730FD002806D0092120004B
+:108E3000C0B2FFF7E0F900201FE00520264922001C
+:108E4000D2B23C235A4388546B463A00002120009A
+:108E5000C0B2FAF7B1FD002803D1684600780028B7
+:108E600006D109212000C0B2FFF7C5F9002004E0B7
+:108E70002000C0B2FFF7D1F90120FEBD00000000C4
+:108E80000CFEFFFF70B504002000C0B2FFF7E4F84D
+:108E9000002809D02000C0B2F9F79BFD002803D1BB
+:108EA000F9F7CEFA002801D0002013E00A48E4B216
+:108EB0003C214C4304193820205C002801D00020BC
+:108EC00008E065683C21002226003000FEF748F9E2
+:108ED0006560012070BD00002818002838B596B0E4
+:108EE00005000C00002C1AD02800C0B2FFF7B4F81F
+:108EF000002814D069462800C0B2F9F7B3FF002853
+:108F00000DD10FA92800C0B2FAF7FEF8002806D14B
+:108F10000AA92800C0B2F9F747FE002801D00020B6
+:108F20003CE01F48EDB23C214D43401901782170CF
+:108F3000817861706946CA78A2708A78E270426866
+:108F40006260039AA260019AE260029A22610C9A1E
+:108F50006261149AA261099AE261059A2262069AF4
+:108F60006262079AA262089AE2620FAA527E3023D6
+:108F7000E2543622825C3123E2543822825C32236E
+:108F8000E2543622805C002801D0012000E000205D
+:108F90003322A054487834216054012017B030BDEA
+:108FA0002818002870B5342100242200B24D2E006C
+:108FB0003000FEF7D5F86C7070BDF0B58FB00700CB
+:108FC0000E003800C0B200F03EF900900098002872
+:108FD00007D000F0F5F8002803D1FFF7B8FA002811
+:108FE00001D000203BE00024250000E06D1C28009B
+:108FF000C0B2042818D201A9B0482A00D2B2805CBD
+:10900000FFF76CFF00280DD001A83421405C002838
+:1090100008D00598009949682A00D2B25200895AAE
+:109020008842E3D200201AE034212200924C25002D
+:109030002800FEF795F82770012001006170A070EC
+:109040002681F9F776FEE060E168009800F0D4F937
+:10905000002803D100F00AFB002000E001200FB03F
+:10906000F0BDFEB500206946087000F0A9F80028A0
+:1090700000D18AE0804C207800F0E5F80700002F4E
+:1090800002D100F0F3FA80E0F9F753FE0600E06841
+:109090008B494118300000F0CBF8002805D020891A
+:1090A000401C80B200F072F86FE0684600F022F9D0
+:1090B000050068460078002802D000F0D7FA64E086
+:1090C0006078012817D1EDB2002D09D032000021BF
+:1090D000380000F0C5F9002801D100F0C7FA54E0CB
+:1090E0002069AD494118300000F0A2F8002801D0F5
+:1090F00000F0BCFA49E0B868E17818225143401802
+:1091000002902169300000F09CF801900298007DE7
+:1091100002281AD1EDB2002D0FD0207E002807D1F1
+:10912000380000F06AFA002806D100F09FFA03E048
+:109130003100380000F0AFFA27E00298806801990A
+:10914000884201D200F092FA1FE0019861698842DA
+:109150001BD3EDB2002D04D03100380000F09BFA93
+:1091600013E000F01BF9002807D02089FFF7E2F98F
+:109170003100380000F08FFA07E060698649401836
+:109180000199884201D200F071FAF7BD70B5040070
+:1091900000F016F8002809D0200080B2F9F73AFA5A
+:1091A000F9F7EAF8A4B22000FFF7C4F9342100244B
+:1091B0002200314D2E003000FDF7D2FF6C7070BDE3
+:1091C00000B52D484178012902D04078022801D10C
+:1091D000012000E00020C0B200BD70B50400002CEA
+:1091E00001D1002023E0FFF7EBFF002807D0F9F7BB
+:1091F000A0FD2149096900F024F8050000E00025E0
+:109200001D4E3078207070786070B078A07000F0DB
+:1092100035F8317909010143E170F088A0808020A0
+:109220004002854201D38B4DFFE7E580012070BDF0
+:1092300000B5401A002801D4012000E00020C0B28F
+:1092400000BD401A704710B5002100E0491C0A001B
+:10925000D2B2022A0EDA804A0B00DBB21824634332
+:10926000D35C0400E4B2A342F0D1C9B21820414358
+:10927000501800E0002010BD781A002838B58EB0D4
+:1092800000252C0012E069460C482A00D2B2805C0E
+:10929000FFF724FE002808D068463221405C0028F1
+:1092A00003D020000124AC4004436D1C2800C0B250
+:1092B0000428E8D32000C0B20FB030BDA0F30010E6
+:1092C000C027090000B501780A290ED04178042989
+:1092D0000BD04178062908D04178072905D041787C
+:1092E000082902D04078092801D1012000E000209F
+:1092F000C0B200BDF1B590B00124200069460870ED
+:109300001098002801D1002043E000201099087037
+:10931000002617E00498381A09E001A8FFF7D2FFE9
+:1093200000282BD10498B842F4D30498C01B01A99B
+:109330003222895C002901D1042802D30020694629
+:109340000870761C3000C0B2042820D2434D300093
+:10935000C0B240002818478B01A9C3483200D2B2DE
+:10936000805CFFF7BBFD0028D7D128792100B140F0
+:10937000014329711098047000200AE02879210027
+:10938000B1400143297110980470002001E0684643
+:10939000007811B0F0BD00003075000038B58EB017
+:1093A000002400E0641C2000C0B2042821D22B4815
+:1093B0002100C9B249004018458B6946AA482200DD
+:1093C000D2B2805CFFF78AFD00280AD06846FFF71A
+:1093D00079FF002805D10398A84204D30398401BC5
+:1093E00003E0002006E00398281A0428DAD30020BE
+:1093F00000E001200FB030BDF8B50600174D2889F8
+:10940000401C28812961AF486861002400E0641C89
+:109410002000C0B204281AD270682100C9B24900E5
+:10942000405A2100C9B24900691848832B895A2241
+:1094300070682100C9B24900415A8B482700FFB229
+:10944000C05DFFF719FC0028E1D1002000E00120F9
+:10945000F2BD0000FFFF000014F00010781A002891
+:10946000F8B590B00700002F04D008003B7BC0B2D5
+:10947000984201D30020BEE0B8680B00DBB218248C
+:109480006343C0180190904E02207070F1700198F3
+:109490000078B070326101984068706100203076C9
+:1094A0003089401C3081002016E001990200D2B2C0
+:1094B0005200891889890200D2B25200B218518331
+:1094C00001990200D2B25200891889890200D2B2F1
+:1094D0005200B2185185401C0100C9B20429E4D3DE
+:1094E0000198007D012801D1012084E00198007DD0
+:1094F000022863D100241EE02000C0B240003018D2
+:1095000045840DE0290089B2BA8A891880B2814267
+:10951000F2DAB88A28182100C9B2490071184884C3
+:109520002000C0B240003018408C2100C9B2490070
+:1095300071184883641C2000C0B2042821D201980D
+:109540002100C9B249004018858902A94648220075
+:10955000D2B2805CFFF7C2FC002810D00598010051
+:1095600089B2BA8A89182A0092B29142CADAB88AB4
+:10957000281A2100C9B2490071184884D0E7002098
+:1095800039E0002400E0641C2000C0B2042813D29B
+:10959000338938692100C9B2425C2000C0B2400062
+:1095A0003018418B30482500EDB2405DFFF764FB79
+:1095B0000028E8D100201EE001201CE0002400E08B
+:1095C000641C2000C0B2042814D2308900903D4BA6
+:1095D0000198426801982100C9B249004018818968
+:1095E00021482500EDB2405DFFF77AFB0028E7D166
+:1095F000002000E0012011B0F0BDF8B50600002EFB
+:1096000001D100202FE0304D2889401C2881022004
+:109610002876002420000AE00100C9B24900691838
+:10962000498D0200D2B25200AA185183401C010099
+:10963000C9B20429F0D300E0641C2000C0B20428A1
+:1096400010D22B89B27D2000C0B240002818418D75
+:109650001E482700FFB2C05DFFF70EFB0028EBD1CC
+:10966000002000E00120F2BDA0F3001038B5164D37
+:109670002C89641C200080B2F8F7CCFFF8F77CFE40
+:10968000200080B2FEF756FF2C8103206870F9F7A6
+:1096900050FB286131BD38B50A000B4BD978491C05
+:1096A0000C00057BE4B2AC4203D30021DC88641CCF
+:1096B000DC80C9B2FFF7D4FE002801D1FFF7D6FF46
+:1096C00031BD000030750000781A0028A0F30010AA
+:1096D000F8B5C0B0002001F046FD20A9002000F040
+:1096E00098FA07006946012000F093FA0400380058
+:1096F000C0B2022801D1012500E000252000C0B23F
+:10970000022801D1012600E00026300028438749C5
+:10971000087086480078002813D1FFB2002F04D1CA
+:1097200020A800F0CAFA002807D0E4B2002C08D123
+:10973000684600F0C2FA002803D101207C49087075
+:1097400002E000207A4908707848007800280FD19C
+:1097500000200100BA4A11707649086005E0002136
+:10976000C943754A8300D150401C2028F7D331E00B
+:10977000F6B2002E16D0EDB2002D05D02299029837
+:1097800000F092FA00280DD001206A4908600020FC
+:10979000202814D2694682008958674A8300D15034
+:1097A000401CF5E700206349086006E020A982001C
+:1097B0008958614A8300D150401C2028F6D35E4866
+:1097C000C068012803D101209D49087002E00020F3
+:1097D0009B49087041B0F0BDF0B595B05348007892
+:1097E000002803D096480078002801D1002065E0C9
+:1097F000002400E0641C042C4ED2062767433F1D62
+:109800004D4DB800285801A914226243885001AE7A
+:10981000B800281840681421614371184860B800E6
+:10982000281880681421614371188860B8002818CE
+:10983000C068142161437118C860B8002818006915
+:109840000090B80028184069012801D1012000E0EB
+:1098500000201421614371180874142060433018EB
+:10986000426801A81421614341582000C0B200F0B1
+:10987000AFF9B9006918496902290BD200998142F0
+:1098800008D11420604331182000C0B2F9F7FBF86A
+:109890000028AFD0002011E0002400E0641C042C5C
+:1098A0000BD201A81421614341182000C0B2F9F77E
+:1098B00014F90028F2D0002000E0012015B0F0BD1E
+:1098C00000205F490870012019490870704710B5E1
+:1098D000A0B016480078002803D059480078002826
+:1098E00004D100205649087001201CE0002001002E
+:1098F00006E0114A8B00D2586B468C001A51491C65
+:109900002029F6D30C498968491C029103901C2137
+:10991000684600F014F91C90A948006801214140F4
+:10992000684600F0F3F920B010BD0000E41C0028E8
+:10993000E61C00288C1C0028F8190028F8B5B0B0E7
+:10994000A04F3878002805D09D480068012141408B
+:10995000009101E0002000900026300005E0002189
+:10996000C94310AA8300D150401C2028F7D3964841
+:109970001090082011903878002803D09348806810
+:10998000401C00E0012012900120139034001FE0E1
+:10999000310019E0019810A9AA00885010A8029976
+:1099A000AA00821851600399AA0082189160049954
+:1099B000AA008218D1600999AA008218116101A930
+:1099C000097C0029E4D00121AA0080184161641CAF
+:1099D000042C12D2062565432D1D01A92000C0B21A
+:1099E000F9F7E2F8002806D106A92000C0B2F9F77D
+:1099F00039FA0028CED0002016E01C2110A800F073
+:109A00009EF82C90387800280AD0A54800780028C5
+:109A100006D010A800F065F9002801D0012003E06D
+:109A2000009910A800F072F931B0F0BD65480078D7
+:109A300070479B48007870479A480078704700004C
+:109A4000E51C0028F0B5A1B05E480078002803D0DE
+:109A500093480078002801D1002047E00027380013
+:109A600006E05A498200895801AA8300D150401C5F
+:109A70002028F6D355488068401C039001251C21FE
+:109A800001A800F05CF868401D904D4800686840EF
+:109A900000F07CF8060000960121300001F081FB07
+:109AA0000121300001F0BBFB002801D100201DE0A6
+:109AB0003C0008E0012201A8A1004118A0003018D4
+:109AC00001F0F6FB641C202CF4D300E07F1C202F57
+:109AD00009D20098B900405801A9BA0089588842B3
+:109AE000F4D0002002E06F480570012021B0F0BDE5
+:109AF00010B5A0B033480078002801D100201CE048
+:109B0000002006E03149820089586A468300D1501E
+:109B1000401C2028F6D32D488068801C0290012428
+:109B200003941C21684600F00AF81C909F480068C6
+:109B300044402100684600F0E9F820B010BDF2B5BD
+:109B40000026F64300210A0000E0521C009B9A42C6
+:109B50001AD29300C4580B0000E05B1C042BF4D213
+:109B60003500E6B26E40240A0D0001E00F0004E06B
+:109B7000082DF2D2F707F9D58D4F7608B4463E008E
+:109B800067467E406D1CF3E7F043F2BDC001894992
+:109B90004018704700B5C0B2002805D0022808D090
+:109BA00004D3032807D009E0834808E0AF20400130
+:109BB00005E0824803E0E120400100E0002000BD14
+:109BC0008C1C0028E41C002838564D53F819002836
+:109BD00038B50D001400C0B2FFF7DCFF020028000A
+:109BE000002A01D0002C02D10020C04310E08442A2
+:109BF00000D2200000210023FAF706FD02000B002E
+:109C0000600800218018594122000023FAF709FA60
+:109C100032BD10B50C00FFF7B9FF002C01D10020B8
+:109C20003CE0002104E08A0082588B00E250491C8D
+:109C30002029F8D3E068022801D300202EE0206814
+:109C40005F4988420BD16068082808D11C21200098
+:109C5000FFF775FF216F814201D102201EE02068CD
+:109C60005849884202D1606805280DD020685649BD
+:109C7000884202D16068062806D02068534988428D
+:109C80000BD16068072808D11C212000FFF757FF7F
+:109C9000216F814201D1012000E0002010BD0000B1
+:109CA000E51C0028E61C002800B5401A012801DB4D
+:109CB000012000E00020C0B200BD00B5002801D1A5
+:109CC00000200DE0002100E0491C202907D28A0075
+:109CD00082580023DB439A42F6D0002000E00120A6
+:109CE00000BD10B5002801D100200EE0042100E0E5
+:109CF000491C1C2908D28A008258354B8C001B59FC
+:109D00009A42F5D0002000E0012010BDFEB505000C
+:109D1000002D03D000910098022801D3002043E0D9
+:109D20000098FFF733FF070001970121380001F089
+:109D300038FA0121380001F072FA002801D1002020
+:109D400032E00026340007E00122A0002918A0001C
+:109D5000381801F0ADFA641C202CF5D3300005E072
+:109D6000810069581A4A8300D150401C202808D22B
+:109D70000199820089588200AA589142F0D00020AF
+:109D800012E000980949086001200100114A117091
+:109D9000E968012902D11049087002E030000E493B
+:109DA00008700E4806700120FEBD00008C1C0028C3
+:109DB0002083B8ED00000314FC530000901A00004B
+:109DC00038564D5335564D5336564D5337564D53E1
+:109DD000F8190028E41C0028E51C0028E61C0028CF
+:109DE00000B5010009B2002905D40121C006C00E4A
+:109DF0008140AE48016000BD00B5010009B20029F4
+:109E000005D40121C006C00E8140CC48016000BDD0
+:109E1000F0B5020012B2002A18D41822A44B040094
+:109E200024B2A408A4001C59FF250600F600164021
+:109E3000B540AC438901C9B20500ED002A4091400C
+:109E4000214300B28008800019501CE00F22BC4C56
+:109E5000182503001BB21340083B9B089B0006001B
+:109E600036B23240083A92089200A258FF26070004
+:109E7000FF002F40BE40B2438901C9B2C000054077
+:109E8000A9401143E150F0BD00B5002A03D10122E1
+:109E90008A40426002E001228A40826000BD02687E
+:109EA000CA401000C007C00F704700B5022801D398
+:109EB00001200FE00B00DBB2042B01DB012009E0E5
+:109EC000BC4B80001818C9B2405C824201D301200B
+:109ED00000E0002000BDF8B504001F00022C01D3F3
+:109EE000012023E015000E002A003100C9B2200035
+:109EF000FFF7DBFF012801D1012017E03000C0B2DD
+:109F0000002816D1FF2F12D8AB4861034018A900D2
+:109F100040188021490140180168A84A0A403902C6
+:109F2000FF231B020B40134303600020F2BD0120FE
+:109F3000FCE7F6B2012E16D180204002874210D2F3
+:109F40009D4861034018A9004018A021490140180C
+:109F500001689B4A0A403902C44B0B40134303601B
+:109F6000E3E70120E2E70120E0E700B20012C0B21F
+:109F70007047F8B505000F001600280000B2FFF783
+:109F8000F4FF04002000C0B2022801D301202CE01D
+:109F900032003900C9B22000C0B2FFF786FF0128A5
+:109FA00001D1012021E084482100C9B249034118B0
+:109FB0002A00D2B292008918C02212018A58AC49F4
+:109FC0001140FFB23B02C02292001A400A43FF2117
+:109FD0008A43F1B21143E4B262038018EDB2AA00E1
+:109FE0008018C022120181500020F2BD70B504001B
+:109FF000022C01D3012028E015000E002A003100B8
+:10A00000C9B22000FFF751FF012801D101201CE057
+:10A01000694861034158802212060A43C02189041D
+:10A020001143FF2212040A43914B1340F6B232024D
+:10A03000C021890011401943FF229143EAB20A432B
+:10A040006103425061034058002070BD70B50400A8
+:10A05000022C01D3012028E015000E002A00310057
+:10A06000C9B22000FFF721FF012801D101201CE027
+:10A070005148610341588022D2050A43C021890416
+:10A080001143FF2212040A43794B1340F6B2320205
+:10A09000C021890011401943FF229143EAB20A43CB
+:10A0A0006103425061034058002070BD00E100E0B0
+:10A0B00000E400E038B500200100974A117001006B
+:10A0C000964A11709649086000F0D4F8002803D031
+:10A0D00000F02CF9002804D19248B849086000200B
+:10A0E0002BE0914C2000FAF76DFE002804D08D483B
+:10A0F000B2490860002020E0B1490020205EFAF754
+:10A1000080FE00210220205EFFF782FE0220205EFA
+:10A11000FFF772FEAB4D280001F0AEFFAA49280000
+:10A1200001F020FCA5490860002801D0002004E0CF
+:10A130000220205EFFF754FE012032BD80E200E0E5
+:10A140001CED00E038B50400002C01D100202FE008
+:10A15000FAF7FEFC71490A7813006F4D2D78DBB2D7
+:10A16000AB4203D1FAF7F8FC002021E0C44B150004
+:10A17000EDB22D015D5925601500EDB22D015D197F
+:10A180006D6865601500EDB22D015D19AD68A560C3
+:10A190001500EDB22D015B191B7B2373521C1300BC
+:10A1A000DBB2102B00D300220A70FAF7D5FC012095
+:10A1B00032BD00009CF2001000000440FF00FFFFD1
+:10A1C000FF0000FFF1B594B00D00160050210024EF
+:10A1D00022006F463800FCF7C3FF14988021090164
+:10A1E000884203D24E480068002804D04D48A9494F
+:10A1F0000860002038E068462100017021000172EB
+:10A200001499019108214C2281540395049600E091
+:10A21000641C2000C0B2082821D26A4D2100C9B2B6
+:10A22000280002F081F80100C9B20129F0D0C0B2C3
+:10A230000328EDD01498984908606A462100C9B2F5
+:10A24000280001F09DFF93490860002805D193483C
+:10A250000168491C0160012006E0002004E09048EC
+:10A260000168491C0160002015B0F0BD00FFFF002F
+:10A27000FFFCFFFFF8B5002500956846FDF71EFEC0
+:10A28000002801D0002046E0864C0098A04205D36B
+:10A2900000982100F9F7CAFF002901D000203AE018
+:10A2A00000982100F9F7C2FF0400002C03D0FF2022
+:10A2B000801C844201D300202DE0FF2608363000A8
+:10A2C000FFF753FE0700002200213800FFF7BEFE13
+:10A2D000002801D000201EE0002200213000FFF7FE
+:10A2E00048FE002801D0002015E023005B1E00225C
+:10A2F00000213800FFF7EFFD002801D000200AE020
+:10A30000002200213800FFF771FE002801D1012052
+:10A3100000E02800C0B2F2BDB51C0028B61C002821
+:10A32000E41B0028010062000008002818B5A7B04F
+:10A330001AA85D493422FAF777FD0DA85B4934224B
+:10A34000FAF772FD68465A493422FAF76DFD594C06
+:10A350001AAA07212000F9F72AFF002801D00020BF
+:10A3600024E00DAA06212000F9F721FF002801D0E2
+:10A3700000201BE06A4601212000F9F718FF0028A1
+:10A3800001D0002012E0012201212000FFF77CFD16
+:10A39000FA208000FAF732FF01212000FFF77FFD4D
+:10A3A000012801D1012000E00020C0B228B010BD7A
+:10A3B00080B5044801F096F901BD0000C41B0028D7
+:10A3C000B1A30010000454400808002870B5140020
+:10A3D000002C05D0207A002802D12078002800D057
+:10A3E0004DE035480168491C0160606833490860E8
+:10A3F0006068C0218900884214D14C20205C082864
+:10A4000010D1E068C0B209280CD1E068000AC0B2DF
+:10A41000102807D12069002804D1E068000C80B220
+:10A42000F8F7F8F8264801780A00521C1300DBB24E
+:10A43000102B00D300221300224D2D78DBB2AB424B
+:10A4400004D121480168491C016018E00C4B656883
+:10A450000E00F6B236019D514C25655D0E00F6B238
+:10A4600036019E193573E5680E00F6B236019E1965
+:10A4700075602469C9B2090159188C60027070BDF9
+:10A480002817002800B5C0B2002802D101200F49CA
+:10A49000086000BDE01B0028DC1B0028D01B002842
+:10A4A000D41B0028005A6202E4EE001018EF0010DE
+:10A4B0004CEF001080013140C81B0028D81B002839
+:10A4C000B51C0028B61C0028CC1B0028E41B002863
+:10A4D00000B5BFF34F8F3D48AE490860BFF34F8FC3
+:10A4E00000BFFDE7AC490A6808607047B5490A68D3
+:10A4F00010239A43C0B20001102318401043086093
+:10A500007047B0490A68B04B1340C0B200028022C5
+:10A5100052001040184308607047AA490A68B64BB9
+:10A520001340C0B20003802252011040184308605B
+:10A530007047A4490A6852005208C0B2C0071043CD
+:10A5400008607047B4480068704700207047B348FF
+:10A550000068704710B50400B0480460BFF34F8F27
+:10A56000FFF7F5FFA04201D1012000E00020C0B2BA
+:10A5700010BD38B5C824C0B2002801D0012505E0BF
+:10A58000002503E00120FAF739FE641EA4490120EA
+:10A590000A680240AA4203D0002C01D0020000E069
+:10A5A0000022D2B2002AEDD109680140A94200D0B0
+:10A5B0000020C0B232BD00209A4908609A49086064
+:10A5C0009A490860BFF34F8F704700000400FA05F6
+:10A5D000FEB50400FF20E230019001252F00FAF7BC
+:10A5E000C4FE0020FFF7C5FF69464870FFF7ADFFC6
+:10A5F00069460870FFF7ABFF06008A4800688A4981
+:10A6000009688A4A1268A04B98420DD14140002344
+:10A61000DB434B409A4207D101992140002901D1E7
+:10A62000E10601D5290000E000210022A24B1A70AA
+:10A630000022A24B1A700022A14B1A70019A2240EC
+:10A64000002A02D19F4A117002E02A009D4B1A7025
+:10A650009D4A117061000CD50020FFF77BFF0700B9
+:10A66000FFF775FF0600FFF7A6FF00209649087068
+:10A670000BE095490978002902D0FFF79CFF04E020
+:10A680008149884201D1FFF796FFFFB2002F09D020
+:10A690008E48864206D08E48864207D169460978A0
+:10A6A000002903D105208449087016E085490978FE
+:10A6B000002907D084490978002903D104207E4964
+:10A6C00008700AE069460978002906D0FFF742FFC2
+:10A6D000002802D105207849087068464078002893
+:10A6E00002D17548057048E0FAF7F6FDFAF71EFE4C
+:10A6F000C82424012000FFF7F5FE0120FFF7F6FE35
+:10A700000020FFF7FEFE0020FFF707FF0120FFF704
+:10A7100010FFFAF700FE20480068A0420BD129483C
+:10A72000016809092940002905D00068010B0800CB
+:10A73000C007C00F00E02800C0B2002802D05E4869
+:10A7400005701AE0FAF705FE0120FFF712FF002856
+:10A7500002D15948057010E0FAF722FEFA20800075
+:10A76000FAF74CFDFFF7EEFE002802D152480570C3
+:10A7700003E05248057000F001F8F7BD80B54F487E
+:10A780000078002805D04E480078002801D1FAF75B
+:10A7900007FE01BD0CED00E008C0264080B50100B9
+:10A7A000C9B200290CD044490A78002A08D108709F
+:10A7B0000020F7F767FFF7F775FF0020FDF7BAFEF7
+:10A7C00001BD000010C02640FFFEFFFF80B5FFF76F
+:10A7D000BCFEFFF7BCFE3D49884202D10520FFF7D1
+:10A7E000DDFFF7F72DFE002802D00120FFF7D6FF8E
+:10A7F000FFF7C4FF01BD0000FFEFFFFF00B52E48CB
+:10A800000078002801D0012000E00020C0B200BD87
+:10A81000294800787047000014C026400C102740DB
+:10A8200000C0264000102740041027400810274091
+:10A8300038B522490978002903D0214C2178002914
+:10A8400001D000201FE0234B0F491960020092B293
+:10A85000214D2A6080B2214A424021480260BFF364
+:10A860004F8F1B688B4202D10068904203D0FFF7E4
+:10A87000A2FE002007E00020F8F7EDFAFAF790FDBD
+:10A8800001202070012032BD364C494880B50C486B
+:10A890000078002801D101BD00BFFFF753FEC82199
+:10A8A00009018842F8D3BFF34F8FFFF711FE00BFB5
+:10A8B000FDE7054800787047C61C0028C81C002822
+:10A8C000C91C0028C71C0028CA1C002845564F4D2B
+:10A8D00041564F4D0010274004102740C9B3B6B76A
+:10A8E000081027401CB501F04DFD002803D100F0F1
+:10A8F000C5F800202FE002F027F8002803D100F06F
+:10A90000BDF8002027E0F9F79AFF002805D0694636
+:10A910000520FAF723F8002803D100F0AFF8002053
+:10A9200019E0684600886E49088001246D4804706B
+:10A9300000206D4908606D4800886D49088001203D
+:10A9400000F0ACFA012000F0C5FA64206949086003
+:10A95000A6480470012016BD80B5002804D1A44883
+:10A960000168491C016020E0A2490A68521C0A6083
+:10A970000168A14A891A08D00C3909D092225200E4
+:10A98000891A08D05C3909D00BE000F0B5F80CE06A
+:10A9900000F03AF909E000F099F906E000F0CAF990
+:10A9A00003E093480168491C016001BD80B501F0D6
+:10A9B00017FD4E484E490A8803889A4201D2008802
+:10A9C000088000F03CF88D480178E02905D0017836
+:10A9D000052902D00078002806D100208849087097
+:10A9E0000120824908700EE086480178002906D1CE
+:10A9F00083480178002906D00121017003E0007826
+:10AA0000401C7F490870AE480078002814D0AD483B
+:10AA10000168002910D00168491E01600068002803
+:10AA20000AD1A948007802F001F8002804D10120D9
+:10AA3000BD49086000F078FA00F07DFA01BD1CB550
+:10AA400029480168491C016001680A2915D30024BE
+:10AA5000046069460520F9F781FF002807D06846A1
+:10AA600000881F49088001201E49087005E0AF4892
+:10AA70000168491C01601B48047013BD80B501F0DA
+:10AA800026FD02F0ABFA01F0E8FF002001008C4A3D
+:10AA900011708C4908600100A54A1170584908706E
+:10AAA00001205249087001BD80B5022000F084F9F0
+:10AAB00002BD80B5012000F0F1F98148007800283E
+:10AAC00001D1012000E00020C0B202BD00B57C48E9
+:10AAD0000078002801D1012000E00020C0B200BDB4
+:10AAE000A81C0028D21C00284C1C0028A61C0028EA
+:10AAF000AA1C0028481C002870B5017B08290AD030
+:10AB00003B480168491C0160002000F0C7F90020A3
+:10AB100000F0E0F968E00324416822000A4041683F
+:10AB2000890823000B404168090925000D400F26C4
+:10AB30004168090C31404068000D06401000C0B269
+:10AB4000022803D1012000F0A9F924E0D2B2012AA1
+:10AB50001AD11800C0B2012802D0DBB2022B13D1E7
+:10AB60000800C0B200280FD00800C0B206280BD2DF
+:10AB70000800C0B200F020F900280CD102206A4978
+:10AB8000086000F0D1F906E019480168491C01602D
+:10AB9000002000F083F92800C0B2022803D1012070
+:10ABA00000F098F920E0EDB2012D16D13000C0B2CE
+:10ABB000002812D03000C0B206280ED2B648007865
+:10ABC00000280AD03000C0B200F037F900280BD1BD
+:10ABD0005548046000F0A8F906E005480168491CE2
+:10ABE0000160002000F076F970BD0000FE12002820
+:10ABF000301C00282C1C00289E020000CD1C0028C0
+:10AC0000FD120028CC1C002880B5017B082904D047
+:10AC1000AE480168491C016051E043680721426861
+:10AC2000120C0A404068C00C0140DBB2012B07D176
+:10AC30001000C0B2052803D20800C0B2052804D312
+:10AC4000A2480168491C016039E01000C0B2012827
+:10AC500001D1012005E0D2B2022A01D1022000E098
+:10AC600003209B4A10700800C0B2012801D10120C6
+:10AC700005E0C9B2022901D1022000E003209F496A
+:10AC800008700F48007800280AD09D48007800F02E
+:10AC900093F8002804D104202349086000F044F907
+:10ACA0009848007800280AD09748007800F0C5F846
+:10ACB000002804D105201C49086000F035F901BDC9
+:10ACC000CF1C0028441C0028D11C002880B5017B23
+:10ACD00008290AD00020704908707C480168491C86
+:10ACE0000160002000F0F6F81CE0406800098007D1
+:10ACF000800F0100C9B2012902D0C0B2022803D1DD
+:10AD000001206549087002E000206349087062482C
+:10AD10000078002806D16D480168491C01600020B8
+:10AD200000F0D8F801BD00003C1C0028401C0028A1
+:10AD3000FC12002810B5017B08290AD0634801687D
+:10AD4000491C0160002000F0A9F8002000F0C2F8C2
+:10AD500031E0032441682140406880080440080035
+:10AD6000C0B201280BD16648007800F025F8002811
+:10AD70000BD10620AA49086000F0D6F805E0C9B258
+:10AD8000022902D1012000F089F82000C0B2012878
+:10AD90000BD15D48007800F050F800280BD1072057
+:10ADA0009F49086000F0C0F805E0E4B2022C02D12F
+:10ADB000012000F08FF810BD70B50100C9B2032961
+:10ADC00001D3032500E005000100C9B2002903D02A
+:10ADD0000100C9B2062901D3002025E03C490A78C8
+:10ADE0002B00DBB29A4200D20D78454908708D4C99
+:10ADF0002800C0B200F08AF820706D1C8A480570E7
+:10AE000001258A4805708A4E307800280DD16420CB
+:10AE100001F0C0FD002801D1002005E03570FA20C6
+:10AE2000C00084490860012070BD82480068002885
+:10AE3000F9D1207801F0FAFDF6E710B50100C9B2AA
+:10AE4000032901D3032400E004000100C9B2002952
+:10AE500007D00100C9B2062903D20F490978002999
+:10AE600001D1002017E025490A782300DBB29A427D
+:10AE700000D20C78244908702000C0B201F012FB07
+:10AE8000002801D1002006E0641C6B4804700120FA
+:10AE900066490870012010BDD01C002810B50400C0
+:10AEA00001F0DBFD00200100614A1170614908607A
+:10AEB00001005C4A11702100C9B2052900D30400C9
+:10AEC0005948047001205949087010BD301C0028F1
+:10AED0000013002810B50400002001F0E3FA002858
+:10AEE00001D102F07BF82000C0B2052800D3002475
+:10AEF0005148047001204D49087010BD021300280C
+:10AF0000FF120028CC1C00280113002800B5010006
+:10AF1000C9B2012901D1322005E0C0B2022801D115
+:10AF2000462000E0642000BD80B5FFF7A7FD0120AA
+:10AF3000FFF734FC01BDFEB5404C2068401C20608A
+:10AF40003A4E3078002802D12068642866D336480B
+:10AF50000078C0B24007400F37490978C90038224D
+:10AF60000A400243019236480078002801D00121AE
+:10AF700000E0002133480078E02801D0022000E002
+:10AF8000002008432A490978002901D0012100E066
+:10AF900000212D4A1278530006221A400A438023CA
+:10AFA0005B002A490D689D4201D3FF2100E009683A
+:10AFB000274D2F689F4201D3FF2300E02B68C0B2CA
+:10AFC000D2B21202024323480088000410430090CA
+:10AFD000214D2888C9B209040143DBB21F060F4383
+:10AFE000002201991D48FFF7EDF8002812D03A0021
+:10AFF00000991B48FFF7E6F800280BD019480168B4
+:10B00000491C016018480088288000200100317028
+:10B01000206003E015480168491C0160F7BD00008D
+:10B020003C1C0028D11C0028FC120028FE1200281D
+:10B03000CF1C0028441C0028FD120028481C0028B2
+:10B04000D21C0028CD1C0028CC1C0028401C002845
+:10B05000181C0028A81C0028AA1C0028FA040000BC
+:10B0600005030000341C0028A61C0028381C0028FA
+:10B0700000B5FEE700B5010009B2002905D40121A1
+:10B08000C006C00E8140B748016000BDF0B50200A7
+:10B0900012B2002A18D41822844B040024B2A40847
+:10B0A000A4001C59FF250600F6001640B540AC432D
+:10B0B0008901C9B20500ED002A409140214300B248
+:10B0C0008008800019501CE00F22A74C18250300AF
+:10B0D0001BB21340083B9B089B00060036B232406F
+:10B0E000083A92089200A258FF260700FF002F405E
+:10B0F000BE40B2438901C9B2C0000540A940114316
+:10B10000E150F0BD00B59D48012102680A4302608C
+:10B1100002680A40002AFBD100BD9948016801225B
+:10B120000A43026070479748016801220A4302609F
+:10B1300070471FB5684602F049F900280DD08B4CC6
+:10B1400018228B492000FCF703FF0020E0754920FE
+:10B15000884908600020FCF75BFF01208A490870DD
+:10B16000FFF7D0FF1FBD80B5C0B201280ED103216B
+:10B17000814802F05BF903210320FFF787FF0320DA
+:10B18000FFF778FF01208149087002E000207F4925
+:10B190000870FFF7C2FFFFF7C6FF01207A49087069
+:10B1A00001BD7CB505000E00794803C86A4603C29C
+:10B1B000083A3000C0B2002814D174480078012841
+:10B1C0000DD06A4C18226A492000FCF7C1FE00200D
+:10B1D000E0759420674908600020FCF719FF002003
+:10B1E00069490870684601210171002421004171FC
+:10B1F00000953200D2B26946002002F027FB0028F9
+:10B200000CD05A4D18225A492800FCF7A1FEEC75C3
+:10B210009E20584908600020FCF7FAFE73BD7CB5FB
+:10B2200006000D00300002F013FA00280DD04F4C3C
+:10B2300018224F492000FCF78BFE0020E075B52056
+:10B240004C4908600020FCF7E3FE2800C0B200284B
+:10B2500014D14E48007801280DD0444C182244499E
+:10B260002000FCF775FE0020E075B9204149086018
+:10B270000020FCF7CDFE0020434908700096300006
+:10B2800002F024FA002801D0202001E08020800074
+:10B2900001902A00D2B26946002002F03FFB00284C
+:10B2A00001D1012000E0002076BD000000E400E0B4
+:10B2B000F8B584B007000E001500380002F0C8F998
+:10B2C00000280DD0294C182229492000FCF740FE07
+:10B2D0000020E075DF20274908600020FCF798FE79
+:10B2E00068461021FBF74CFF2800C0B2002814D19B
+:10B2F0002648007801280DD01C4C18221C4920003B
+:10B30000FCF726FE0020E075E6201A4908600020C0
+:10B31000FCF77EFE00201C490870012168460A00E7
+:10B3200002720A00427202228272C172002421005B
+:10B330000173009701962A00D2B26946002002F0FC
+:10B3400027F900280CD0094D182209492800FCF7DC
+:10B35000FFFDEC75F520074908600020FCF758FE5A
+:10B3600005B0F0BD00E100E01CED00E0181B002876
+:10B3700060ED0010F01B002833B1001008002440DD
+:10B3800000F4244000F52440B71C0028B81C002815
+:10B390008CF2001000B5002801D0002901D1A0488E
+:10B3A00008E0A04A904206D1002008808020800159
+:10B3B0004860002000BD9C4A904205D18020800159
+:10B3C00002000A804860F4E7BA4A904206D1802021
+:10B3D000C0010880802080014860EAE7B64A9042B8
+:10B3E00006D1C020C0010880802080014860E0E7CD
+:10B3F000B24A904206D1802000020880802080015D
+:10B400004860D6E7AE4A904205D1002008808020EF
+:10B4100080014860CDE7AB4A904205D18020800191
+:10B4200002000A804860C4E7A74A904206D1802003
+:10B43000C0010880802080014860BAE7A34A90429A
+:10B4400006D1C020C0010880802080014860B0E79C
+:10B450009F4A904206D1802000020880802080010F
+:10B460004860A6E76E48A5E700B5002100E0491C4A
+:10B470000A290AD2974A18234B43D3589842F6D147
+:10B48000182041435018001D00E0002000BD10B5F9
+:10B490000A00D2B2402A01DB002017E0020C12049D
+:10B4A00080235B02D218AC23C3589B089B049B0CDF
+:10B4B0009B00D218C9B2884BBC240059000A40072F
+:10B4C000400F185C801C41438800101810BD10B557
+:10B4D0000A00D2B2202A01DB002016E0020C12047E
+:10B4E00080235B02D218C023C3589B089B049B0C8B
+:10B4F0009B00D218C9B2784BC82400594007400FAE
+:10B50000185C801C41438800101810BD10B50B005A
+:10B51000DBB2022B01DB002028E0030C1B0480249B
+:10B5200064021B190C00E4B2002C05D1A0240459BC
+:10B53000A408A404A40C04E0B0240459A408A4049E
+:10B54000A40CA4001B19C9B2002904D1BC21405885
+:10B550004007400F04E0BC21405800094007400F5D
+:10B560005D49085C801C42439000181810BD00B56E
+:10B570005A49884201D3052100E00021400A4006D3
+:10B58000400E0818C0B200BD38B504000020002CE1
+:10B5900044D02000FFF7EBFF0121226D520F0A403B
+:10B5A000002A05D00A004E4B0500EDB26D005A533B
+:10B5B000226D120F0A40002A05D00222484B0500D6
+:10B5C000EDB26D005A53226DD20E0A40002A05D00A
+:10B5D0000322434B0500EDB26D005A53226D920ECB
+:10B5E0000A40002A05D004223D4B0500EDB26D0053
+:10B5F0005A53226D520E0A40002A05D00522384BBC
+:10B600000500EDB26D005A53226D520D1140002914
+:10B6100004D00621324AC0B24000115231BD0000B0
+:10B6200001006200000052400002524070B500224A
+:10B630001300130000283CD003689B0F1C00E40794
+:10B64000E40F0C720B7A002B05D10368DB00DB08DA
+:10B650009B144B6003E00368DB00DB084B6043682E
+:10B660005B0D1C00E407E40F0C7043681B0C1B0708
+:10B670001B0F4C240B554C23CB5C082B01DA130019
+:10B6800002E04C23CB5C083B0AE01400A4B2A40007
+:10B690000419A4681500ADB2AD004D19EC60521C40
+:10B6A00014000D4D1E00B6B2AD5DA4B2ADB2AC42F9
+:10B6B000EBD370BD000452400006524000085240D7
+:10B6C000000054400002544000045440000654401E
+:10B6D000000854405808002884F200100108524025
+:10B6E000301B0028F1B5A8B0002000900020289859
+:10B6F000FFF7BAFE0700002F29D0289E306D97492A
+:10B700000140002902D02898FFF73EFF0125306D47
+:10B71000C00C284000281CD1306D2840002868D17A
+:10B72000306D00092840002800D0BAE0306D400A92
+:10B730000540002D0BD0300050300168802292006F
+:10B740000A4302603868002801D03868804729B071
+:10B75000F0BD300050300168802212030A430260BD
+:10B7600098203058002816D0002400E0641C2000E7
+:10B77000C0B220282CDA98203058E0402840002819
+:10B78000F4D02100C9B22898FFF781FE0090A540AF
+:10B79000982035501CE09C203058002818D00024F8
+:10B7A00000E0641C2000C0B2202811DA9C20305830
+:10B7B000E04028400028F4D020342100C9B2289865
+:10B7C000FFF765FE00902000E03085409C2035505A
+:10B7D00000980028BBD013A90098FFF727FF7868CE
+:10B7E0000028B4D013AA2100C9B200207B68984772
+:10B7F000ADE73000503001682943016017E0289A16
+:10B80000D4235B00D45801AA0300DBB29B00D450C0
+:10B81000401C02000B00D2B2DBB29A42EFD3B868F0
+:10B82000002804D001AAC9B20020BB689847A42010
+:10B8300030584006400E012889DB2898C021490075
+:10B8400040582840002822D1A420305800903F249E
+:10B850000098020A224000212898FFF757FE00288E
+:10B86000E5D013A9FFF7E2FE3000A83001683F22BF
+:10B870009143009A120A14400C430460786800282F
+:10B88000D5D013AA002101207B689847CFE7344820
+:10B890002899BC2289584907490F415C891C00201E
+:10B8A000B7E730005030016810220A43026017E009
+:10B8B000289ADC235B00D45801AA0300DBB29B006A
+:10B8C000D450401C02000B00D2B2DBB29A42EFD33C
+:10B8D000B868002804D001AAC9B20120BB68984703
+:10B8E000B42030584006400E012800DA2FE728988F
+:10B8F000C0214900405840082840002822D1B420E7
+:10B90000305800903F240098020A224001212898D4
+:10B91000FFF7FCFD0028E3D013A9FFF787FE3000F6
+:10B92000B83001683F229143009A120A14400C4338
+:10B93000046078680028D3D013AA012101207B6815
+:10B940009847CDE706482899BC2289580909490734
+:10B95000490F415C891C0020B4E70000EEE0F73F8E
+:10B9600084F20010F1B594B0D34800681290D34827
+:10B9700000681190D2480768D2480668D24800682B
+:10B980001090D24800680F90D14800680490D148C8
+:10B9900000680E90D04800680190D04800680D9073
+:10B9A000CF4800680C90CF4800680B90CE480068E4
+:10B9B0000A90CE4800680990CD4800680890CD48AC
+:10B9C00000680390CC4800680290DC48006807904B
+:10B9D000DB48006800901498002810D00C00002C60
+:10B9E0000DD02820205C002802D0E06A002806D074
+:10B9F0003020205C002804D0606B002801D1D148A1
+:10BA000024E31498FFF730FD002801D1CD481DE351
+:10BA10002168016061684160A1688160E168C1607E
+:10BA200021690161149D0120A861A869C007FCD5A6
+:10BA30000320A86105A91498FFF7ACFC002801D0E9
+:10BA4000C04803E32820215C129ABF4810400A0432
+:10BA5000FF21090411400143BC4808406946898A16
+:10BA600089B2890889B28900014384202950302095
+:10BA7000205C4006400EFE21C903119BE44A1A4097
+:10BA80000004084010438422AA5892082823E35C4B
+:10BA9000D2189204920CAD4B03409200DD48104046
+:10BAA00018438822A850A06BC000C0087A0F520724
+:10BAB00010439022A85007224020205C1040099F8C
+:10BAC000D54B3B400702E020C000384018434123DB
+:10BAD000E35C13407027B8431F0170233B400343CE
+:10BAE0004220205C10400727BB431843BC23E8508A
+:10BAF0004420235C1800C007C00F73005B08C60712
+:10BB00001E434520205C4006400EC44B1E400706E5
+:10BB1000FE20C005384030434626A65D7606760EE8
+:10BB2000BB4F07403004084038438826AE59B6085A
+:10BB30003027E75D7F00F619B604B60C834F074047
+:10BB4000B600B44830403843A026A8514820265CAF
+:10BB50003000C007C00F109E76007608C007304343
+:10BB60004926A65D7606760E03403606FE20C00501
+:10BB7000304018434A23E35C5B065B0EA44E06404C
+:10BB8000180401403143A64FA020285880084623BE
+:10BB9000E35C4226A65DBE5DB61C7343C0188304F9
+:10BBA0009B0C6A4808409B009A4919400143B02009
+:10BBB00029504720205C002801D1002100E001210C
+:10BBC000009B012083430800C007C00F18434B218E
+:10BBD000615C002901D1002100E00121022398438A
+:10BBE00049000223194001431498C0235B00C1504F
+:10BBF000B020285880084A21615C4123E35CFB5C4B
+:10BC00009B1C5943401883049B0C82484F490F9E4C
+:10BC10000E409B0003403343AC26AB514323E35C0F
+:10BC20001A40089B0726B3431A43C823EA507D4AAB
+:10BC3000049E16407C4B1E400496AC26AE59B608B6
+:10BC400000964C26A65DB4464026A65DBE5DB61C99
+:10BC500067467743009EF619B604B60C049F0F4062
+:10BC6000B60006403E43F027EE510E9F6F4E3E4019
+:10BC700032404D26A65DB606B60E13403604FC22B1
+:10BC8000920332401A43F023EB589B0814339B0471
+:10BC90009B0C11409A0010400843C021685080223C
+:10BCA00052021498000C00046946898A40188018D2
+:10BCB00006998B08002125E0E4F20010E8F200105C
+:10BCC000ECF20010F0F20010F4F20010F8F20010A4
+:10BCD000FCF2001000F3001004F3001008F3001051
+:10BCE0000CF3001010F3001014F3001018F3001000
+:10BCF0001CF3001020F3001024F30010002606604F
+:10BD0000001D491C9942F9D30199012008430221E1
+:10BD10000143CF480840217D012901D1012100E0E4
+:10BD20000021CC4B03404802802189000840184381
+:10BD3000217D01290CD101210BE000BF28F3001067
+:10BD40002CF3001001006200FFFF00FF0300FFFF63
+:10BD50000021C14B034008028021490008401843DC
+:10BD60008021884340218843202188431021884333
+:10BD70000421884301900198A861E08AC005C00DA4
+:10BD80000D99B64B0B400104B54808401843217E7D
+:10BD9000B44B03400902FF200002084018437F23F0
+:10BDA000617E19407F26B0430143A07E1840C9013F
+:10BDB000C90940060843E861207D012853D11F20AE
+:10BDC000A18B01400C9FA84E3E400F04F82149036F
+:10BDD00039403143A67F3040A44E0E400102F82086
+:10BDE0004001084030430F21E67F0E40F027B84362
+:10BDF0003701F0263E4006432020205C01400F2002
+:10BE0000864331432220205C012811D1012610E015
+:10BE1000FFFF80FFFCFF0000FFF8FFFFFFFFFF8038
+:10BE200084F20010FFFFFFC0FFFFC0FFFFFFFFBF56
+:10BE300000268F480840F105802636043140014332
+:10BE4000E9602320215C19400B9E8A4830400E0295
+:10BE5000FE21C901314001432420205C03407F20A2
+:10BE600081430B43AB6403203C21635C03400A998C
+:10BE70003026B1431E01302333400B433D21615C2A
+:10BE800008400C218B4381000C20084018433E21C0
+:10BE9000615C012901D1012100E0002102239843C6
+:10BEA00049000223194001433F20205C012801D1B1
+:10BEB000012000E00020012601239943304008437F
+:10BEC000802168501498000C000484216958890866
+:10BED0008904890C890040188018002105E0E36A74
+:10BEE0008F00DB598F00C351491C2823E35C994222
+:10BEF000F5D31498000C0004882169588908890436
+:10BF0000890C890040188218002308E0606BD90072
+:10BF1000401803C8DF00D71903C7083F5B1C302057
+:10BF2000205C8342F2D3844803990140834A0A404B
+:10BF300083491140834A0A4083491140834A0A4099
+:10BF40004B491140824A0A4082491140824A0A40C4
+:10BF5000802109031143814A0A4081491140814AE5
+:10BF60000A40814911403A4A0A4080491140804ABA
+:10BF70000A4080491140804A0A4036491140364BF8
+:10BF80000B4080218B434021C9430B402022D243E8
+:10BF9000134010271F4308239F430423DB431F4004
+:10BFA0000224E443274037430397039F6F65029FB2
+:10BFB000384002900298614F074061483840614F15
+:10BFC000074061483840614F074029483840604F7A
+:10BFD000074060483840604F0740684838405F4F2E
+:10BFE00007405F4838405F4F07405F483840184F70
+:10BFF00007405E4838405E4F07405E4838405E4F1D
+:10C00000074014483840144F074080208743394088
+:10C010000A4010208243082082431340234001201D
+:10C020008343AB65079830430440EC651498FFF7F1
+:10C030009EFA4000B04900220A520198012188432B
+:10C04000A861A86930400028FBD1002015B0F0BDE0
+:10C05000FFBFFFFFFFFDFFFFFFFEFFFFFFFF00FE33
+:10C060000000FF01FF00FFFFFFFFE0FFFFE0FFFF19
+:10C07000FFFF7FFFFF80FFFFFEB50700002F01D10C
+:10C080009E4857E03800FFF7EFF9002801D19B48A0
+:10C0900050E0002404604460C46004613D0001205D
+:10C0A000A861A96901400029FBD00326AE61694659
+:10C0B0003800FFF76FF9002801D090483AE084205B
+:10C0C0002C5088202C508E4890216850BC202C5039
+:10C0D000A0202C50B0202C50C02040003C50AC2060
+:10C0E0002C50C8202C50F0202C50C0202C50380C44
+:10C0F00000046946098840188021490240180199C6
+:10C100008A08210002E00460001D491C9142FAD314
+:10C11000AE617C48E8617C48E860AC6480202C50CB
+:10C120006C65AC65EC653800FFF721FA4000724998
+:10C130000C520020FEBD0000FFFFFFDFFFFFFFEFFE
+:10C14000FFFFFFF7FFFFFFFBFFFFFFFDFFFFFFFE0E
+:10C15000FFFFBFFFFFFFDFFFFFFFEFFFFFFFFBFF63
+:10C16000FFFFFDFFFFFFFEFFFF7FFFFFFFDFFFFF82
+:10C17000FFEFFFFFFFF7FFFFFFFBFFFFFFFFF7FFF3
+:10C18000F8B50600002E02D01400002C01D15B4847
+:10C19000B0E06846017068460078202801DB574807
+:10C1A000A8E03000FFF760F9002801D15348A1E072
+:10C1B00037000125B8692840002808D1CC2039581B
+:10C1C00068460078C1400800C007C00F00E02800A2
+:10C1D000C0B2002801D049488CE0684601783000A0
+:10C1E000FFF775F9002801D1444883E001000A688F
+:10C1F000464B13400B60217A012901D12B0000E04E
+:10C20000002302001668424931409B078026F6054C
+:10C2100033400B4313600168890F2940002902D184
+:10C2200061688A0400E0626801000B685B0F5B07CD
+:10C23000D200D2081A430A60011D0A68354B134028
+:10C240000B60011D0A681202120A0A604C21615C2F
+:10C250000B071B0F011D0E682F4A32401B04F026EE
+:10C2600036031E4016430E602178012901D12B00B0
+:10C2700000E00023021D1668284931405B05802636
+:10C28000B60333400B4313602178012901D12B0001
+:10C2900000E00023021D1668214931401B0580265D
+:10C2A000760333400B4313604C21615C082901DAAB
+:10C2B000002102E04C21615C08391A4A89B2515CC4
+:10C2C00000220AE013009BB29B00E318DB68160013
+:10C2D000B6B2B6008619B360521C13000E00F6B257
+:10C2E0009BB2B6B2B342EDD3684600788540D02009
+:10C2F0003D500020F2BD0000301B0028010062000C
+:10C30000FFFFFF1F030A0006330A0000FFFFFFDFE5
+:10C31000FFFFFFBFFFFF7FFFFFFFF0FFFFFFDFFF1C
+:10C32000FFFFEFFF84F2001010B50200002A03D0D7
+:10C330000800C0B2202801DB002021E000200123FA
+:10C34000CC241459CC401C40002C09D0D4201058C7
+:10C35000C8401840002801D1180010E003200EE06A
+:10C36000D8241459CC401C40002C01D0022006E0F7
+:10C37000DC241259CA401340002B00D00420C0B264
+:10C3800010BD000080B500F029FE00F097FD0028E8
+:10C3900004D1E02000F01EF9002020E001F024FB91
+:10C3A000002804D1E02000F015F9002017E000205B
+:10C3B00001006F4A11706F4908606F4908606F494A
+:10C3C000086001006E4A117001006E4A117001216F
+:10C3D0006D4A11706D49086086490860012002BDF0
+:10C3E00038B585480168491C0160654C20780428EF
+:10C3F00003D3E02000F0EEF853E05D480078002819
+:10C4000002D000F0EBFD4CE020785E4D2978C0B200
+:10C41000884208D0207800F062F8002803D1E0209C
+:10C4200000F0D8F83DE02878002814D0F6F781FC19
+:10C430007049504A1268801A086008686F4988423B
+:10C4400009D36F480168491C016000202070052055
+:10C4500000F0C0F825E048480168491C0160016807
+:10C4600007291ED30024046001F0CBFA00280AD06B
+:10C470004248046001F0D8FA6249088001F0D7FA16
+:10C48000614908600DE061480168491C01603B4852
+:10C490000168491C01600068032802D3E02000F015
+:10C4A00099F831BD00B50100C9B2042901D30020BB
+:10C4B0000CE02F490978002905D00100C9B20029F4
+:10C4C00001D0002002E02E490870012000BD80B597
+:10C4D00000202B490870E02000F07CF801BD70B509
+:10C4E00004002000C0B200280FD100F077FD2548DD
+:10C4F00004700120244908700020454908603D4926
+:10C5000008601C49086001202FE02000C0B200F044
+:10C510003FF80500002D01D1002026E000F068FD65
+:10C52000002806D0280000F03BFD002808D100209C
+:10C530001BE0280000F0E8FC002801D1002014E0F6
+:10C54000104E3078002806D1F6F7F3FB0949086051
+:10C5500000202849086034702000C0B200F029F89B
+:10C56000094908702A480560012070BD00000000DC
+:10C57000CE1C0028201C0028241C0028281C002871
+:10C58000CB1C0028CC1C0028CD1C0028081C00282F
+:10C5900000B5C0B2012804D009D3032805D002D3C6
+:10C5A00005E01E2004E03C2002E05A2000E00020CC
+:10C5B00000BD00B5C0B2012804D009D3032805D0BE
+:10C5C00002D305E0022004E0032002E0042000E0A2
+:10C5D000012000BD10B5040000F000FD01200D4950
+:10C5E0000870002001000C4A1170094908600B48CE
+:10C5F000047010BD0C1C0028101C0028C027090066
+:10C60000141C0028A61C00281C1C0028181C00282C
+:10C61000081C0028CE1C0028CC1C0028CD1C00289B
+:10C6200070B5B14BC018C0090001C64BC31804292E
+:10C630000CD21F251C68CE002800B0408443D2B223
+:10C640001540C800854025431D600CE0FC311F25C6
+:10C650005C68CE002800B0408443D2B21540C800C8
+:10C66000854025435D6070BD00B59F4A8018C009B4
+:10C670000001B44A8018042905D20068C900C840E6
+:10C68000C006C00E05E0FC314068C900C840C006C5
+:10C69000C00EC0B200BD00B5002A03D101228A40FD
+:10C6A000426002E001228A40826000BD30B4030093
+:10C6B0008C000F25596C2800A04081431540A540EF
+:10C6C0000D435D6430BC704730B403004C0010343F
+:10C6D0000325D96C2800A04081431540A5400D4397
+:10C6E000DD6430BC704700B5022801D301200FE0A3
+:10C6F0000B00DBB2042B01DB012009E0A44B80001E
+:10C700001818C9B2405C824201D3012000E0002029
+:10C7100000BDF8B504001F00022C01D3012023E066
+:10C7200015000E002A003100C9B22000FFF7DBFF20
+:10C73000012801D1012017E03000C0B2002816D135
+:10C74000FF2F12D8B74861034018A9004018802174
+:10C75000490140180168B44A0A403902FF231B020C
+:10C760000B40134303600020F2BD0120FCE7F6B24A
+:10C77000012E16D180204002874210D2A9486103C1
+:10C780004018A9004018A021490140180168BB4A7F
+:10C790000A403902BA4B0B4013430360E3E7012020
+:10C7A000E2E70120E0E700B20012C0B27047F8B53E
+:10C7B00005000F001600280000B2FFF7F4FF040088
+:10C7C0002000C0B2022801D301202CE03200390041
+:10C7D000C9B22000C0B2FFF786FF012801D10120B5
+:10C7E00021E090482100C9B2490341182A00D2B281
+:10C7F00092008918C02212018A58A2491140FFB242
+:10C800003B02C02292001A400A43FF218A43F1B240
+:10C810001143E4B262038018EDB2AA008018C0226E
+:10C82000120181500020F2BD70B50400022C01D32A
+:10C83000012028E015000E002A003100C9B22000B6
+:10C84000FFF751FF012801D101201CE07548610369
+:10C850004158802212060A43C02189041143FF2255
+:10C8600012040A43874B1340F6B23202C0218900FA
+:10C8700011401943FF229143EAB20A436103425037
+:10C8800061034058002070BD70B50400022C01D334
+:10C89000012028E015000E002A003100C9B2200056
+:10C8A000FFF721FF012801D101201CE05D48610351
+:10C8B00041588022D2050A43C02189041143FF2236
+:10C8C00012040A436F4B1340F6B23202C0218900B2
+:10C8D00011401943FF229143EAB20A4361034250D7
+:10C8E00061034058002070BD0000CFBFF0B58DB08F
+:10C8F000684665493422F8F797FA644F6A46012181
+:10C900003800F7F754FC060000242000694608723E
+:10C910006A4602213800F7F74AFC0500002201218F
+:10C920003800FFF7B8FE002202213800FFF7B3FEFF
+:10C930003543002D01D1012000E02000C0B20DB030
+:10C94000F0BD00000000304010B500F0ABF800284A
+:10C9500001D100201BE04E4C2000F7F745FE4D4969
+:10C960002000F7F7BBFC002801D000200FE02000DA
+:10C97000F7F747FE4849884207D12000F7F73DFE08
+:10C980004649884201D1012000E00020C0B210BD1C
+:10C990009CF2001070B5424C0021216000F046F876
+:10C9A000002803D10120206000203AE0374E002209
+:10C9B00001213000FFF76FFE354D37492800F7F7AA
+:10C9C0001EFE2800F7F70AFE2800F8F7C8F8022034
+:10C9D000F8F714FC2800F7F70CFE000405D4022039
+:10C9E000206000F03AF800201BE000220121300016
+:10C9F000FFF76AFE062201213000FFF757FE0822EA
+:10CA000001213000FFF70CFE01213000FFF72CFE62
+:10CA1000082805D00320206000F01FF8002000E067
+:10CA2000012070BD00000440FF00FFFF38B56528FD
+:10CA300001D3002010E000F087F80400144D21001D
+:10CA40002800F7F7D8FD2800F7F7D7FDA04201D15D
+:10CA5000012000E00020C0B232BD10B50C48F7F74D
+:10CA6000C3FD0A4C00220121200000F07BF80022C7
+:10CA70000221200000F076F810BD0000FF0000FF4A
+:10CA800000FFFF00FFFCFFFFB0EE0010800531400B
+:10CA9000001E584038EA00101F4E0000204E0000D3
+:10CAA000C01B0028F8B5002500956846FBF706FA7C
+:10CAB000002801D0002045E0274C0098A04205D373
+:10CAC00000982100F7F7B2FB002901D0002039E0DF
+:10CAD00000982100F7F7AAFB0400002C02D01F48A1
+:10CAE000844201D300202DE0FF266A363000FFF794
+:10CAF0005AFE0700002201213800FFF7C5FE00287A
+:10CB000001D000201EE0002201213000FFF74FFE7F
+:10CB1000002801D0002015E023005B1E0022012127
+:10CB20003800FFF7F6FD002801D000200AE00022BF
+:10CB300001213800FFF778FE002801D1012000E034
+:10CB40002800C0B2F2BD000000B505494843642189
+:10CB5000F7F76CFB00BD000080841E00010001009F
+:10CB6000204E000070B505000C00160000222100C8
+:10CB70002800FFF790FD3200D2B221002800FFF715
+:10CB80004FFD002221002800FFF79EFD0622210014
+:10CB90002800FFF78BFD002221002800FFF77BFD16
+:10CBA00070BD000070B5B14BC018C0090001C24B88
+:10CBB000C31804290CD21F251C68CE002800B040E1
+:10CBC0008443D2B21540C800854025431D600CE067
+:10CBD000FC311F255C68CE002800B0408443D2B2EF
+:10CBE0001540C800854025435D6070BD00B59F4A73
+:10CBF0008018C0090001B04A8018042905D20068D5
+:10CC0000C900C840C006C00E05E0FC314068C9003C
+:10CC1000C840C006C00EC0B200BD00B5002A03D196
+:10CC200001228A40426002E001228A40826000BD07
+:10CC300030B403008C000F25596C2800A0408143BC
+:10CC40001540A5400D435D6430BC704730B403000F
+:10CC50004C0010340325D96C2800A04081431540B6
+:10CC6000A5400D43DD6430BC704700B5022801D3F8
+:10CC700001200FE00B00DBB2042B01DB012009E0F7
+:10CC8000A04B80001818C9B2405C824201D3012039
+:10CC900000E0002000BDF8B504001F00022C01D305
+:10CCA000012023E015000E002A003100C9B2200047
+:10CCB000FFF7DBFF012801D1012017E03000C0B2EF
+:10CCC000002816D1FF2F12D8B34861034018A900DD
+:10CCD00040188021490140180168B04A0A403902D1
+:10CCE000FF231B020B40134303600020F2BD012011
+:10CCF000FCE7F6B2012E16D180204002874210D206
+:10CD0000A54861034018A9004018A0214901401816
+:10CD10000168B14A0A403902BA4B0B401343036021
+:10CD2000E3E70120E2E70120E0E700B20012C0B231
+:10CD30007047F8B505000F001600280000B2FFF795
+:10CD4000F4FF04002000C0B2022801D301202CE02F
+:10CD500032003900C9B22000C0B2FFF786FF0128B7
+:10CD600001D1012021E08C482100C9B249034118BA
+:10CD70002A00D2B292008918C02212018A58A24910
+:10CD80001140FFB23B02C02292001A400A43FF2129
+:10CD90008A43F1B21143E4B262038018EDB2AA00F3
+:10CDA0008018C022120181500020F2BD70B504002D
+:10CDB000022C01D3012028E015000E002A003100CA
+:10CDC000C9B22000FFF751FF012801D101201CE06A
+:10CDD000714861034158802212060A43C021890428
+:10CDE0001143FF2212040A43874B1340F6B232026A
+:10CDF000C021890011401943FF229143EAB20A433E
+:10CE00006103425061034058002070BD70B50400BA
+:10CE1000022C01D3012028E015000E002A00310069
+:10CE2000C9B22000FFF721FF012801D101201CE039
+:10CE30005948610341588022D2050A43C021890420
+:10CE40001143FF2212040A436F4B1340F6B2320221
+:10CE5000C021890011401943FF229143EAB20A43DD
+:10CE60006103425061034058002070BD0000CFBFF5
+:10CE700078B58DB0684665493422F7F7D5FF644E22
+:10CE80006A4607213000F7F792F9040000220721D3
+:10CE90003000FFF7C2FE00255E480560002C07D178
+:10CEA00007213000FFF7A2FE002801D1012000E099
+:10CEB0002800C0B20EB070BD0000304010B500F0C8
+:10CEC000B3F8002801D100201AE0534C2000F7F7F6
+:10CED0008BFB52492000F7F701FA002801D000200F
+:10CEE0000EE02000F7F78DFB4D49884206D1200067
+:10CEF000F7F783FB002801D1012000E00020C0B239
+:10CF000010BD00009CF2001070B5464C002121605D
+:10CF100000F046F8002803D10120206000203AE00C
+:10CF20003B4E002207213000FFF777FE3A4D3C4987
+:10CF30002800F7F764FB2800F7F750FB2800F7F705
+:10CF40000EFE0220F8F75AF92800F7F752FB00040A
+:10CF500005D40220206000F041F800201BE00022F0
+:10CF600007213000FFF772FE062207213000FFF78D
+:10CF70005FFE082207213000FFF714FE0721300072
+:10CF8000FFF734FE082805D00320206000F026F8C3
+:10CF9000002000E0012070BD00000440FF00FFFF02
+:10CFA00070B50400002C01D0652C01D3002012E0E4
+:10CFB000200000F08BF80600174D31002800F7F72D
+:10CFC0001AFB2800F7F719FBB04201D0002002E05D
+:10CFD00010480460012070BDFF0000FF80B50E48BE
+:10CFE000F7F702FB00F07AF800200A49086001BD5B
+:10CFF00080B50948F7F7FDFAC10B0800C007C00F5C
+:10D0000002BD000000FFFF00FFFCFFFF7CEE0010F0
+:10D0100000083140B81B002880205840C4E90010A7
+:10D020001F4E0000BC1B0028F8B50025009568467F
+:10D03000FAF744FF002801D0002045E0354C009865
+:10D04000A04205D300982100F7F7F0F8002901D09D
+:10D05000002039E000982100F7F7E8F80400002CE0
+:10D0600002D02D48844201D300202DE0B72676005F
+:10D070003000FFF75AFE0700032201213800FFF7B6
+:10D08000C5FE002801D000201EE00322012130004F
+:10D09000FFF74FFE002801D0002015E023005B1EA3
+:10D0A000032201213800FFF7F6FD002801D00020FF
+:10D0B0000AE0032201213800FFF778FE002801D1A1
+:10D0C000012000E02800C0B2F2BD000000B5134905
+:10D0D00048436421F7F7AAF800BD000010B5104CD2
+:10D0E000002207212000FFF798FD002207212000E1
+:10D0F000FFF758FD002207212000FFF7A7FD0622B9
+:10D1000007212000FFF794FD002207212000FFF7F0
+:10D1100084FD10BD80841E0001000100204E00002F
+:10D120000008314038B50500082D0DD3914C182268
+:10D1300091492000FAF70CFF0020E075E8208F49A4
+:10D1400008600020FAF764FF8D486901401832BD7D
+:10D15000994B1B689BB212041A43120C120489B239
+:10D16000114381607047C0687047944B1B689BB245
+:10D1700012041A43120C120489B2114301600068B0
+:10D180007047C069C00FC0B27047F8B502000E000A
+:10D19000002A01D105204EE00F2089490B681B0AA7
+:10D1A0000340002B01D1002007E00968090A08406C
+:10D1B0000E2801D1012000E00220824940010F1811
+:10D1C000814C984D280011001022F7F747FE28687F
+:10D1D00001218843286010212800FAF73CFF924B78
+:10D1E0002A000121380000F04CFC002804D0012066
+:10D1F00021E0641E002C15D03800FFF7C2FF002884
+:10D20000F7D1002E08D010212800FAF723FF3000B4
+:10D2100029001022F7F722FE00F0B4F8012803D10C
+:10D22000032008E0022006E000F0ACF8002801D15D
+:10D23000002000E00420F2BD38B50100002901D132
+:10D2400005202BE00F205E4A13681B0A0340002BC9
+:10D2500001D1002007E01268120A10400E2801D107
+:10D26000012000E00220574A400115186D4C2000B3
+:10D270001022F7F7F3FD2068012188432060102178
+:10D280002000FAF7E8FE684B22000121280000F098
+:10D29000F8FB002801D0012000E0002032BDFEB5DF
+:10D2A00003001600002B03D001910198002801D142
+:10D2B00005205DE00F2042490A68120A0240002A58
+:10D2C00001D1002007E00968090A08400E2801D1B1
+:10D2D000012000E002203B49400108180090804CEA
+:10D2E000504D280019001022F7F7B8FD7D4F380087
+:10D2F00001991022F7F7B2FD2868012188432860C0
+:10D30000386801218843386010212800FAF7A3FE0D
+:10D3100010213800FAF79FFE3B002A0001210098F7
+:10D3200000F0AFFB002804D0012021E0641E002C97
+:10D3300015D00098FFF725FF0028F7D1002E08D060
+:10D3400010212800FAF786FE300029001022F7F796
+:10D3500085FD00F017F8012803D1032008E0022022
+:10D3600006E000F00FF8002801D1002000E00420C2
+:10D37000FEBD0000181B002808ED0010F01B00285F
+:10D380000010224010B5274C10212000FAF762FE51
+:10D390002068000F0007A0210906884201D1002063
+:10D3A00009E02068000F0007F0210906884201D13A
+:10D3B000012000E0022010BD64F3001068F30010AB
+:10D3C0000000204000002240FFFFFF0F38B504009E
+:10D3D000FFF7D8FF05002800C0B2022801D142485B
+:10D3E0000DE0002C04D0200027491022F7F736FD6D
+:10D3F000EDB2002D01D1002001E02348006832BDCC
+:10D4000000B5010F0907A0221206914201D10020A8
+:10D4100006E0010F0907F0221206914200D03248BF
+:10D4200000BD0000601B0028EC1B00281CB502009A
+:10D430000B002E4803C86C4603C4083C6C4663804E
+:10D440002B4802606846F7F7BDFC2A490020205EA1
+:10D45000F7F7D7FC0220FFF765FE0F21264A136875
+:10D460001B0A0B40002B01D1002307E01268120AAF
+:10D4700011400E2901D1012300E0022300220121E5
+:10D480009940FFF765FE13BD601B002870B50026AC
+:10D4900030000220FFF746FE04002000FFF763FE85
+:10D4A00005000F2014490A68120A0240002A07D01A
+:10D4B0000968090A08400E2801D1012600E0022669
+:10D4C0002800F040C00705D509480168002901D0AF
+:10D4D000006880472A0CA9B22000FFF746FE70BD05
+:10D4E000FFFFFF00801B0028FFFFFF0F94F20010DA
+:10D4F000E81B00288DD40010000020405048006830
+:10D50000410B0800C007C00F70474D480068010B71
+:10D510000800C007C00F704700B54A4801210268E3
+:10D520000A43026002680A40002AFBD100BD1FB511
+:10D530000400C9B2012921D168461021F9F720FE63
+:10D5400069462000FFF721FE0100C9B2012901D17F
+:10D550005B481BE00100C9B2022901D13A4815E03D
+:10D56000C0B2042801D1394810E0009800F01CF93D
+:10D5700000280BD1FFF7D0FF002007E02000FFF7C5
+:10D580005BFE002801D04E4800E0002004B010BD32
+:10D590007FB50C001500002C01D14A484DE02068F1
+:10D5A00000F0F0F8012802D06068002801D1454859
+:10D5B00043E068461021F9F7E3FD00980002000AF5
+:10D5C000C021C90401430091227AFF2000023E4994
+:10D5D000009B0B40120202401A430092637A009EA5
+:10D5E000494A32401B04FF2636041E40164300966B
+:10D5F000E27A019B19401202104008430190A07A80
+:10D600000199FF229143C0B208430190207B019908
+:10D610000902090A00060843019020680290606828
+:10D6200003903A48A17A4900415A6068FAF713FD1D
+:10D630002900C9B26846FFF77AFF04B070BD000048
+:10D64000000024400800244010005200FF00520057
+:10D6500010B50400FFF752FF002810D1EC2000069F
+:10D660002018C0218902884201D2002026E04448C7
+:10D6700020188021490288421FD200201EE0C020CD
+:10D680004002EC2109066118814201D2002015E018
+:10D69000802109026B4AA2188A4201D200200DE0C3
+:10D6A000EB221206A218824201D2002006E0664850
+:10D6B0002018884201D2002000E0012010BD0000A7
+:10D6C000040052000F005200FF00FFFF10B50400DD
+:10D6D000FFF714FF002807D12948201880214902AC
+:10D6E00088420FD201200EE08020000255496118C7
+:10D6F000814201D2012006E053496118814201D2E2
+:10D70000012000E0002010BDFFFF00FFF4F1001039
+:10D7100010B50400FFF7F9FE002810D1F020000634
+:10D720002018FE21C903884201D2002026E0654866
+:10D7300020188021C90288421FD200201EE0FE204E
+:10D740008003F02109066118814201D2002015E012
+:10D75000802189025C4AA2188A4201D200200DE091
+:10D76000EE221206A218824201D2002006E057489B
+:10D770002018884201D2002000E0012010BD0000E6
+:10D780000000FDEB10B504002000FFF761FF00284A
+:10D7900001D1002007E02000FFF7BAFF002801D1E7
+:10D7A000002000E0012010BD80B5FFF729FE002811
+:10D7B00001D1002044E04649884201D145483FE07C
+:10D7C0004549401A1CD0801E1DD0401E1DD0401E51
+:10D7D0001DD0401E1DD0001F1DD087381DD0401EFB
+:10D7E0001DD012381DD0401E1DD0401E1DD0801EE1
+:10D7F0001DD0801E1DD008381DD009381DD01EE058
+:10D80000A420C0031CE035481AE0354818E035482C
+:10D8100016E0354814E0354812E0354810E0354848
+:10D820000EE035480CE035480AE0354808E0354858
+:10D8300006E0354804E0354802E0354800E0254878
+:10D8400002BD00000080FEEB0080FEEA38B584B027
+:10D850000C001500002C01D12E4831E02068FFF7A4
+:10D8600091FF012801D12B482AE02078800701D0C0
+:10D87000284825E068461021F9F782FC009800024C
+:10D88000000AA02149050143009120790099224A0C
+:10D890000A400002FF210902014011430091607912
+:10D8A00000994C4A0A400004FF2109040140114339
+:10D8B0000091206801902900C9B26846FFF737FE41
+:10D8C00005B030BD000081EF0080C0EF0080C0EDEA
+:10D8D000FFFFFF0FFF005200010000F001005200A7
+:10D8E00002005200030052000400520005005200E2
+:10D8F00006005200070052000800520009005200C2
+:10D900000A0052000B0052000C0052000D005200A1
+:10D910000E0052000F005200FF00FFFF38B588B024
+:10D920000C001500002C01D12E4851E06068002841
+:10D9300001D12C484CE02068FFF78AFE012808D06E
+:10D940002068616889004018401EFFF781FE0128A9
+:10D9500001D124483CE068461021F9F711FC0098F9
+:10D960000002000AA8218905014300912068019066
+:10D970006068401E80B20299090C090408430290B5
+:10D98000EDB2012D1CD104A81021F9F7F9FB04A96F
+:10D990006846FFF7FAFB0100C9B2012901D110481E
+:10D9A00016E00100C9B2022901D10B4810E0C0B253
+:10D9B000042801D109480BE00498FFF7F5FE07E0C1
+:10D9C0006846FFF739FC002801D0054800E0002038
+:10D9D00009B030BDFFFF00FF10005200FF005200F1
+:10D9E000040052000F00520080B5F6F728FF00280F
+:10D9F00001D1002004E001201349087000F001F873
+:10DA000002BD80B510480078002805D06946042082
+:10DA1000F6F7A4FF002801D1002004E06846008842
+:10DA20000A490880012002BD08480088704780B577
+:10DA3000064800880021064A0023F6F7E5FD054A5E
+:10DA40000023F6F7EEFA02BDB21C0028A41C002841
+:10DA500040787D0150FB4A00174A1268120C1204EC
+:10DA600089B2114381607047C1607047016170479E
+:10DA700000B50068C00F002801D1104800E0002068
+:10DA800000BDF8B507000C0015001E003800FFF7B8
+:10DA9000EFFF00280DD129003800FFF7E5FF310026
+:10DAA0003800FFF7E3FF21003800FFF7D5FF002023
+:10DAB00000E00248F2BD000050F3001001008A00AF
+:10DAC000F8B584B0F7F751FCBA490127086803227A
+:10DAD000904338430860B8480A6802400A60B74972
+:10DAE0000A6803239A433A430A600A6802400A60BC
+:10DAF000B3490A6803239A433A430A600A6802401A
+:10DB00000A60B0490A6803239A433A430A600A68E4
+:10DB100010400860AC4801680F229143394301600E
+:10DB2000AA480168072291430160A94801680722B9
+:10DB3000914304220A4302600168F0229143C0220B
+:10DB40000A4302600168C02292000A430260016831
+:10DB5000C02212010A43026001689E4A0A408021E5
+:10DB6000490111430160E1480168802212060A431D
+:10DB70000260DF48016839400029FAD0016849088D
+:10DB800039400029FAD0DB480168DB4A0A400260CC
+:10DB9000DA480168D84A0A408021490011430160EF
+:10DBA000D7480168D44A0A408021490011430160E6
+:10DBB000D4480168D04A0A400260D348016807226D
+:10DBC000914302220A430260D04801684900490893
+:10DBD0000160CF480168890A890229220A4302604C
+:10DBE0000168CC4A0A4002600168802252040A435C
+:10DBF00002600168C84A0A40026001688022120679
+:10DC00000A430260C5480168C54A0A408021C9002C
+:10DC1000114301600168FF229143AF220A43026071
+:10DC2000802189020268BF4B13400B4303608022AE
+:10DC300092040368BC4C1C4014430460BB4B046852
+:10DC40001C400460046880252D0625430560B84803
+:10DC500004680725AC43022525430560B5480468E0
+:10DC6000240E2406B44D254305600468B34D2540B9
+:10DC7000802464052C430460046880252D06254318
+:10DC80000560AF480468640064080460AD4C8025FA
+:10DC9000AD002668A2483040284320602068FF2657
+:10DCA000B04362260643266026689E4830408026A0
+:10DCB000F6020643266026689B48304002432260F5
+:10DCC00020681840206020688022120602432260EB
+:10DCD0009D4802680724A2430224144304609B4821
+:10DCE00002687F24A24328241443046002688C4CF9
+:10DCF00014402C43046002688A4C144021430160A4
+:10DD00000168894A0A400260914902680A4002603B
+:10DD100002681A40026002688024240614430460EA
+:10DD20008C4802680724A243022414430460B048CC
+:10DD300002687F24A2431E24144304600268784CC6
+:10DD40001440254305600268764C1440C0229202BC
+:10DD5000224302600268744C14400460026811405F
+:10DD6000016001680B4003600168802212060A43CB
+:10DD70000260A048006838400028FAD09E48006839
+:10DD800038400028FAD09D48006838400028FAD072
+:10DD90009B48006838400028FAD09A48016807225A
+:10DDA00091430160684698491022F7F73DF8002634
+:10DDB00035E000BFC4132040FFFCFFFF00132040EC
+:10DDC00080132040A013204000002440001526406E
+:10DDD00044152640FF8FFFFF32200021F7F7CEF9D0
+:10DDE000300040B2800028180168302291432200A0
+:10DDF00052B21201302313400B430360641E200013
+:10DE000040B26946320052B25200895C00B209B297
+:10DE10008842E1DA32200021F7F7B0F9761C3000B1
+:10DE200040B208283FD2300040B204280DD1EFF3B1
+:10DE30001084002080F31088FA239B000022012127
+:10DE4000102000F00BFA84F31088704D300040B2BF
+:10DE50008000281801680F2291436A4633005BB2A4
+:10DE60005B00D21852781207120F0A43026030008A
+:10DE700040B280002818016830220A430260300056
+:10DE800040B2800028180168802252000A430260D4
+:10DE9000300040B2800028180168802212060A4330
+:10DEA00002600224ABE75A48134A0168114001603E
+:10DEB000F821C94303680B400360564803681A40C1
+:10DEC0000260026811400160F7F730FA52480168B9
+:10DED000802212060A43026001680F430760F7F7C9
+:10DEE0001AFA00F039F805B0F0BD00BF1C15264045
+:10DEF0002415264010102040FF00FFFF081020408E
+:10DF00000C10204020032040041226400419264013
+:10DF100008192640FFFFF8FFFFFFFFEF001926401A
+:10DF2000FFE0FFFFFFFFE0FFFFFFFFF9FFFFFFCF75
+:10DF30000812264014192640F1D24D00FFFFFF8F32
+:10DF400018192640101926400C12264000162640AB
+:10DF5000FFFFFFF71012264038B586B068462F49FC
+:10DF60001822F6F761FF6846F9F75CFDC0B2002899
+:10DF70000ED02B4C18222B492000F9F7E9FF002086
+:10DF8000E075FF20A830284908600020FAF740F823
+:10DF9000264D2800F9F7D8FFC0B200280ED0204C3B
+:10DFA000182220492000F9F7D3FF0020E075FF2058
+:10DFB000AA301D4908600020FAF72AF81C4C28688E
+:10DFC000206020681B4940181B49F6F72FF91B49B0
+:10DFD00008601B4D20681B494018FA218900F6F79C
+:10DFE00025F928602868C0031749086007B030BDCC
+:10DFF000041626400C1926401C19264040162640BF
+:10E00000441626401412264058F2001040122640B2
+:10E01000080020400804204008152640DCF10010CC
+:10E02000181B00288CEB0010F01B0028901C002807
+:10E03000941C00283F420F0040420F009C1C002807
+:10E04000981C0028E7030000A01C0028F3B595B039
+:10E05000170000210D000800684601801C00A4B2D2
+:10E06000A408200080B280218900884203D30125C2
+:10E07000684604807E4C1C9E00F011F9002800D0F8
+:10E0800099E06846877016A8077801A81021F9F76B
+:10E0900077F80198022188433100C9B24900022271
+:10E0A000114001430191019804218843FFB2B90056
+:10E0B00004221140014301910198082188436946D7
+:10E0C0008978C9000822114001430191019810216B
+:10E0D00088430190019820218843019001984021B4
+:10E0E000884301900198802101430191614F01987B
+:10E0F000384015A909780902F82252010A40024362
+:10E10000019201985C490140019101980002000AC6
+:10E11000A82149050143019111A81021F9F730F810
+:10E120001198800A8002A4B2A105890D01431191C2
+:10E1300052480068002806D101980740D0204001CD
+:10E140003843019007E0002805D00198074080205F
+:10E15000400138430190002211A901A8FFF79FF860
+:10E16000EDB2002D03D06846008800F08DF809A8B4
+:10E170001021F9F705F8099802218843F6B27100D9
+:10E18000022211400143099109983D49014009913A
+:10E1900009983C49014080204002084309900998B1
+:10E1A0000002000A8821490501430991002109A8BC
+:10E1B000FEF7EBFF50E000F07DF80128FBD000F007
+:10E1C00073F80128F7D10DA81021F8F7D9FF0DA891
+:10E1D0000078FD2101400DA801700DA800780C21E8
+:10E1E00001430DA801700D980002000AB0214905F5
+:10E1F00001430D9100210DA8FEF7C7FF00F054F870
+:10E20000002829D1EDB2002D03D06846008800F027
+:10E210003BF805A81021F8F7B3FF059802218843C1
+:10E22000F6B271000222114001430591059814498C
+:10E2300001400591059813490140802040020843A0
+:10E24000059005980002000A8821490501430591BF
+:10E25000002105A8FEF799FF17B0F0BD1CB50124F9
+:10E2600000949BB2D2B2C9B2C0B2FFF7EFFE13BDA9
+:10E27000FF010000FFE0FFFFFF1FFFFF3007001757
+:10E28000FF00FFFFFFFF00FF0D490A680D4B134021
+:10E2900080B200050C4A02401A430A6070470848E1
+:10E2A0000068C00FC0B27047084801680800C00786
+:10E2B000C00F704705480068C00FC0B2704700002B
+:10E2C00028102640FFFF0FC00000F03F2C10264012
+:10E2D00000B5010009B2002905D40121C006C00E15
+:10E2E00081408F48016000BDF0B5020012B2002AE3
+:10E2F00018D418228B4B040024B2A408A4001C5983
+:10E30000FF250600F6001640B540AC438901C9B2AE
+:10E310000500ED002A409140214300B280088000B2
+:10E3200019501CE00F22804C182503001BB213402B
+:10E33000083B9B089B00060036B23240083A920820
+:10E340009200A258FF260700FF002F40BE40B243B4
+:10E350008901C9B2C0000540A9401143E150F0BD98
+:10E3600080B500F012F87148714902680A400260F5
+:10E37000704802680A4002606F48026811400160FC
+:10E3800000F092F800F0A9F801BDFEB568466B49AF
+:10E390000CC90CC008390838002630000AE06A466B
+:10E3A0000300DBB2DB00D2185268521C1140002976
+:10E3B0000ED1401C0100C9B200290AD107216A46CA
+:10E3C0000300DBB2DB00D2580A40002AE7D0FEE7A8
+:10E3D000FEE75B4C072021680140002900D0FEE7E2
+:10E3E000584F3968491C0840002800D0FEE7350026
+:10E3F00024E068462900C9B2C9004018416868464F
+:10E400002A00D2B2D200805800F044F815E0300063
+:10E410000028EED02168491E68462A00D2B2D200F8
+:10E42000805800F037F868462900C9B2C900401882
+:10E4300041683868401C00F02DF86D1C2800C0B2FF
+:10E44000002826D168462900C9B2C90040580028D2
+:10E4500014D0206869462A00D2B2D2008958884276
+:10E460000AD368462900C9B2C9004018406821682B
+:10E47000884201D30120CBE73000C9E76846290074
+:10E48000C9B2C9004018406821688842BFD3012042
+:10E49000BEE7F7BD80B50022002302E00CC00838BB
+:10E4A00008308842FAD301BD30B527488008274993
+:10E4B000274A002308E01C00E4B2A40014591D0000
+:10E4C000EDB2AD004C515B1C1C000500E4B2EDB296
+:10E4D000AC42F0D31F48016030BD10B510231121AC
+:10E4E0001A4800221C00E4B2A4001459DBB29B00BD
+:10E4F000C4500B00DBB29B00D258C9B28900425015
+:10E5000001210020FFF7F0FE00210120FFF7ECFEC3
+:10E510000020FFF7DDFE0120FFF7DAFE10BD00004E
+:10E5200000E100E000E400E01CED00E0001320400A
+:10E53000FFFFF7FF80132040A0132040BCF2001023
+:10E5400084EB001088EB001080000000001D002804
+:10E550000000001008ED00E000B5010009B200293C
+:10E5600005D40121C006C00E81404A48016000BDAB
+:10E5700000B5FEE780B54848006848480068C10F0C
+:10E58000002905D046498005800D80000858804745
+:10E590000020FFF7E1FF01BD80B542480068424816
+:10E5A0000068C10F002905D03D498005800D80001D
+:10E5B000085880470120FFF7CFFF01BD80B53B48D9
+:10E5C00000683B480068C10F002905D03449800528
+:10E5D000800D8000085880470220FFF7BDFF01BD75
+:10E5E00080B53448006834480068C10F002905D060
+:10E5F0002B498005800D8000085880470320FFF7D5
+:10E60000ABFF01BD80B52D4800682D480068C10FE3
+:10E61000002905D022498005800D800008588047D8
+:10E620000420FFF799FF01BD80B526480068264801
+:10E630000068C10F002905D019498005800D8000B0
+:10E64000085880470520FFF787FF01BD80B51F48A8
+:10E6500000681F480068C10F002905D010498005D7
+:10E66000800D8000085880470620FFF775FF01BD28
+:10E6700080B51848006818480068C10F002905D007
+:10E6800007498005800D8000085880470720FFF764
+:10E6900063FF01BD80E200E030F300100011204074
+:10E6A0004809002834F300100411204038F300100A
+:10E6B000081120403CF300100C11204040F30010E2
+:10E6C0001011204044F300101411204048F30010B2
+:10E6D000181120404CF300101C112040ACF0001029
+:10E6E00008F2001080023140040000000800000021
+:10E6F000800658403A010000000931400200000045
+:10E700000A0F0D07E0010000FC53000098210000F3
+:10E71000F4010000E8030000F401000038F10010EB
+:10E7200018F20010800231400500000008000000CF
+:10E73000000758403B010000000531400100000087
+:10E740000AF0D07076010000E0150000D417000038
+:10E750005E010000E8030000F401000054F1001025
+:10E7600028F2001000043140000000000800000002
+:10E7700080095840400100000007314000000000BF
+:10E78000090F0D0795030000901A000028230000D0
+:10E79000F4010000E8030000F401000070F1001033
+:10E7A00038F2001080003140000000000800000036
+:10E7B0000006584039010000000631400500000005
+:10E7C00009F0D07087020000201C00009821000092
+:10E7D000F4010000D0070000F401000080B5F2F75A
+:10E7E00067FDFCF74BF9FBF7C9FFFA208000F6F74D
+:10E7F00005FDF4E710B5FEF73BFBFEF777F8FFF7F2
+:10E800005FF9F2F755FDFEF733FB002803D0FEF762
+:10E810006DF8002801D1FFF7E1FF204C00F042F82D
+:10E82000206000F042F82068FBF7D2FEFBF7E6FF1D
+:10E83000002801D0FFF7D2FF62B6194CF5F75BFB59
+:10E8400020602068002804D00120FBF7A7FFFFF715
+:10E85000C5FF0120F4F7FFFAFCF744F8002804D1C3
+:10E860000120FBF79BFFFFF7B9FFF6F7A1FD00289A
+:10E8700001D1FFF7B3FFF6F7FEFDFCF797F8FBF7C2
+:10E88000BDFF002803D0F2F713FDFCF7F7F8FBF704
+:10E8900075FFFA208000F6F7B1FCECE7F41B0028C6
+:10E8A000281200280648006870470020C043044929
+:10E8B00008600449086000200349086070470000B0
+:10E8C000001826400418264008102640F1B40168BC
+:10E8D0004118436858080A1800988068DB0701D57A
+:10E8E0004B46C01891422DD00D78491C03240326B5
+:10E8F0002E4002D10E78F61C491C2B090F2B07D194
+:10E900000B780F33491C03E00F78491C0770401C3B
+:10E91000761EF9D1002BE5D00E78491CAD082C40AD
+:10E92000032C01D10C78491C240234196542441986
+:10E930000025AE1E9E42D5D02678641C0670401C71
+:10E940006D1CF6E700980C30F2BC704700053140B2
+:10E950000600000000000000801890400200000047
+:10E960000006314001000000000000004019904006
+:10E970000500000000053140070000000000000015
+:10E98000C018904003000000000531400500000061
+:10E9900000000000401890400100000000063140D7
+:10E9A00002000000000000008019904006000000F6
+:10E9B000000631400600000000000000801A904070
+:10E9C0000A00000004000000000000000000000039
+:10E9D00000000000010003031F4E000000000000C3
+:10E9E0000000000000000000000000000000000027
+:10E9F0000000000000000000000000000000000017
+:10EA000000000000020300000000000003000000FE
+:10EA100000000000030000000000000003000000F0
+:10EA200000000000030000000000000003000000E0
+:10EA300001000000010200000400000000000000CE
+:10EA40000000000000000000010003031F4E000052
+:10EA50000000000000000000204E00000000000048
+:10EA600000000000000000000000000000000000A6
+:10EA70000000000000000000020300000000000091
+:10EA80000300000000000000030000000000000080
+:10EA90000300000000000000030000000000000070
+:10EAA000030000000100000001020000040000005B
+:10EAB000000000000000000000000000010003034F
+:10EAC00063000000000000000000000032000000B1
:10EAD0000000000000000000000000000000000036
-:10EAE0000000000000000000000000000000000026
-:10EAF0000000000000000000000000000000000016
-:10EB00000000000000000000000000000000000005
-:10EB100000000000000000000000000000000000F5
-:10EB200000000000000000000000000000000000E5
-:10EB300000000000000000000000000000000000D5
-:10EB400000000000000000000000000000000000C5
-:10EB500000000000000000000000000000000000B5
-:10EB600000000000000000000000000000000000A5
-:10EB70000000000000000000000000000000000095
-:10EB80000000000000000000000000000000000085
-:10EB90000000000000000000000000000000000075
-:10EBA0000000000000000000000000000000000065
-:10EBB0000000000000000000000000000000000055
-:10EBC0000000000000000000000000000000000045
-:10EBD0000000000000000000000000000000000035
-:10EBE0000000000000000000000000000000000025
-:01EBF0000024
-:040000051000E7A957
+:10EAE0000000000000000000000000000203000021
+:10EAF0000000000003000000000000000300000010
+:10EB000000000000030000000000000003000000FF
+:10EB100000000000030000000100000001020000EE
+:10EB200072B6104810490860BFF34F8F0120C0042F
+:10EB30000E490A6802430A600D490A6802430A60E6
+:10EB40000C490A6802430A60002000210D4A03C2F2
+:10EB50006A45FCD1084FB847084FB847084FB84737
+:10EB6000FEE700000000001008ED00E00013204068
+:10EB700080132040A013204061E3001045F00010F6
+:10EB8000A9F1001000FF0128FFFF0128443A5C684A
+:10EB900075616E672E7875657765695C4769745C29
+:10EBA000436F676E69746976655F4167656E745C13
+:10EBB0006669726D776172655C7432675C747669E0
+:10EBC000696268386D5C7372635C73797374656DC8
+:10EBD0005C7265765F645C73797374656D5F74767F
+:10EBE00069696268386D5F636D30706C75732E6330
+:10EBF00000000000443A5C6875616E672E787565A8
+:10EC00007765695C4769745C436F676E69746976A0
+:10EC1000655F4167656E745C6669726D7761726588
+:10EC20005C7432675C747669696268386D5C7372B3
+:10EC3000635C647269766572735C737973636C6B21
+:10EC40005C63795F737973636C6B2E6800000000FE
+:10EC5000443A5C6875616E672E7875657765695CA6
+:10EC60004769745C436F676E69746976655F416775
+:10EC7000656E745C6669726D776172655C7432672B
+:10EC80005C747669696268386D5C7372635C647227
+:10EC900069766572735C737973636C6B5C63795FBF
+:10ECA000737973636C6B2E6300000000443A5C68F8
+:10ECB00075616E672E7875657765695C4769745C08
+:10ECC000436F676E69746976655F4167656E745CF2
+:10ECD0006669726D776172655C7432675C636F6DD3
+:10ECE0006D6F6E5C7372635C647269766572735C7F
+:10ECF0007379737469636B5C63795F737973746937
+:10ED0000636B2E6300000000443A5C6875616E67B7
+:10ED10002E7875657765695C4769745C436F676ECB
+:10ED200069746976655F4167656E745C6669726D6A
+:10ED3000776172655C7432675C636F6D6D6F6E5C7A
+:10ED40007372635C647269766572735C6970635C2C
+:10ED500063795F6970635F6472762E6800000000FB
+:10ED6000443A5C6875616E672E7875657765695C95
+:10ED70004769745C436F676E69746976655F416764
+:10ED8000656E745C6669726D776172655C7432671A
+:10ED90005C636F6D6D6F6E5C7372635C6D775C66E8
+:10EDA0006C6173685C63795F6D775F666C617368D3
+:10EDB0002E6300009F0F0000000000000000000014
+:10EDC0000000000000000000000003000000000040
+:10EDD0000000000000000000000300000000000030
+:10EDE000030000000000000003000000000000001D
+:10EDF000030000000000000003000000010000000C
+:10EE00000000000001000000000000000000000001
+:10EE100010000000100000001000000001000001C0
+:10EE200000000000000000000000000000000000E2
+:10EE300000000000000000000000000000000000D2
+:10EE400070B40123002413E00168001D194202D0B0
+:10EE50004D466918491E0C60091D121F042AFAD27A
+:10EE60000D00960701D50C80AD1C1A4000D02C7007
+:10EE70000268001D002AE7D170BC70470000000046
+:10EE8000060000000000000000000000000000007C
+:10EE90000000000000000000000000000000000072
+:10EEA0000000000000000000000000000000000062
+:10EEB000000000000600000000000000000000004C
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000032
+:10EEE0000000000000000000080000001500000005
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF10000000000000000000010000000E000000E2
+:10EF200015000000000000000000000000000000CC
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000000000000000000001000000C0
+:10EF500006000000000000000000000000000000AB
+:10EF600000000000000000000000000000000000A1
+:10EF70000000000000000000000000000000000091
+:10EF8000000000000600000000000000000000007B
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB000000000000200000000000000983A00007D
+:10EFC0000E01FA00CC0190010200000003000000D5
+:10EFD00000000000983A0000720182001C02CC017F
+:10EFE0000200000005000000000000003075000075
+:10EFF000F6001901BD02EE0102000000060000004B
+:10F00000000000003075000087018C00950194011C
+:10F010000200000001000000ACF20010B4EF00108C
+:10F0200002000000A8F300100800320002000000F7
+:10F03000B4F20010E4EF001002000000A4F300108E
+:10F040000C00320010B5074979441831064C7C4455
+:10F05000163404E0081D0A68891888470100A14297
+:10F06000F8D110BD0800000024000000D5FDFFFF0E
+:10F07000E0090000081300280000000051F8FFFF1D
+:10F080005E0300003A0100000008002800000301B0
+:10F09000000000000100000000000000000000006F
+:10F0A00001000000FF0F0100000000004D4F544F11
+:10F0B000525F494E325F4842375F4842385F484F9F
+:10F0C00052495A4F4E54414C0000000004207146F2
+:10F0D000084202D0EFF3098001E0EFF3088000B5A9
+:10F0E0000149884700BD00001780001000F00EF8AD
+:10F0F000002801D0FFF7A6FF00BF00BF002000BF1F
+:10F1000000BFFFF777FB00F003F800000020704716
+:10F1100080B500F001F801BD0746384600F002F85E
+:10F12000FBE7000080B500BF00BF024A11001820B5
+:10F13000ABBEFBE7260002004D4F544F525F494ED5
+:10F14000335F4842355F4842365F534541545F5014
+:10F15000414E00004D4F544F525F494E345F48427C
+:10F16000335F4842345F4241434B524553540000A1
+:10F170004D4F544F525F494E315F4842315F4842D4
+:10F18000325F4C45475245535400000004207146FD
+:10F19000084201D0EFF30980EFF3088000B5014980
+:10F1A000884700BD69F200100548014603B468466F
+:10F1B00080F3098800BF00BF00BF00BFFFF796FFC4
+:10F1C000A5EDF5FE9E029E0AAA02AA0ACE03CE0B68
+:10F1D0002A042A0C0003000BF002F00A00127A0045
+:10F1E000000000000024F400008000000080000007
+:10F1F0000080000001000200040008001000200050
+:10F200004000800000010002484F52495A4F4E54BE
+:10F21000414C5F48414C4C00534541545F50414E76
+:10F220005F48414C4C0000004241434B524553540F
+:10F230005F48414C4C0000004C4547524553545FD9
+:10F2400048414C4C00000000E02E0000401F000030
+:10F25000E02E0000307500000003000100040103EF
+:10F2600002020002000300058169891E0978C9B203
+:10F270000160704700000000000101010101010070
+:10F28000000100000203040506080C100000000045
+:10F290000000000002000000010000000403000163
+:10F2A00013140015C7010300010000004001BE0057
+:10F2B000F401AE0187018C0095019401000800283B
+:10F2C000FFFF012800000000000000000000000017
+:10F2D000000000000000000000000000000000002E
+:10F2E000000000000000000000000000000000001E
+:10F2F000000000000000000000000000000000000E
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000000DD
+:10F3300000000000000000000000000000000000CD
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000009D
+:10F37000000000000000000000000000000000008D
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A0000001020332325A325A5A5A320001020321
+:10F3B0005A5A5A5AFEE70000FEE70000FEE7000036
+:10F3C000FEE70000FEE70000FEE70000FEE70000A9
+:10F3D000FEE70000FEE70000FEE70000FEE7400455
+:10F3E000550002000100015003CDA30010000123CD
+:10F3F00085A40CA0040900040101000112060E837B
+:10F40000C4F1286004FFFFFF1F020225920807F0E5
+:10F41000010352400001F2060218F2060418F20637
+:10F420000618F2060818F306005478F10618F206DA
+:10F430000418F2060618F2050818F002FF71E5003C
+:10F440001004F1FF04F1FF04F1FF04F1FF04F1FFE8
+:10F4500004F1FF04F1FF04F147046C02480900289D
+:10F46000060AF321060001F12334F252086800096C
+:10F4700001010102030203010F0F0100000000005F
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000000000000000000001B
+:05F5F000000000000016
+:040000051000F1A94D
:00000001FF
diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out
index 87949f4..63442d1 100755
Binary files a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out and b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out differ
diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim
index 19e8ea5..917ce09 100755
Binary files a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim and b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim differ
diff --git a/src/cognitive_agent/application/seat_service.py b/src/cognitive_agent/application/seat_service.py
index fa31355..557482b 100755
--- a/src/cognitive_agent/application/seat_service.py
+++ b/src/cognitive_agent/application/seat_service.py
@@ -62,6 +62,9 @@ from cognitive_agent.application.vehicle_profile import ( # noqa: E402
VehicleProfile,
VehicleProfileRegistry,
)
+from cognitive_agent.application.zcan_seat_executor import ( # noqa: E402
+ ZcanBridgeSeatExecutor,
+)
from cognitive_agent.infrastructure.llm.openai_responses import ( # noqa: E402
OpenAIIntentError,
OpenAIIntentInterpreter,
@@ -217,7 +220,7 @@ class SeatDemoService:
"execution_modes": ["dry_run", "simulated_hardware", "hardware"],
"hardware_execution_allowed": (
self.hardware_settings.configured
- and self.vehicle_can_settings.configured
+ or self.vehicle_can_settings.configured
),
"hardware": hardware_info,
"vehicle_can": self.vehicle_can_settings.public_info(),
@@ -334,6 +337,29 @@ class SeatDemoService:
def _new_hardware_executor(
self, bus_factory: Any | None = None
) -> HardwareSeatExecutor:
+ shared_bridge_enabled = os.getenv(
+ "COGNITIVE_AGENT_SEAT_SHARED_ZCANPRO_BRIDGE_ENABLED", "true"
+ ).strip().lower() in {"1", "true", "yes", "on"}
+ if bus_factory is None and shared_bridge_enabled:
+ # Import lazily so the ordinary dry-run service does not initialize
+ # any self-repair runtime state. Both modules then share the one
+ # process that is allowed to own the Windows ZLG adapter.
+ from cognitive_agent.application.self_repair.service import (
+ BRIDGE_MANAGER,
+ PENDING_DIR,
+ REQUIRED_BRIDGE_VERSION,
+ STATUS_PATH,
+ ZCANPRO_EXE,
+ )
+ if ZCANPRO_EXE.is_file():
+ return ZcanBridgeSeatExecutor(
+ self.hardware_matrix,
+ BRIDGE_MANAGER,
+ STATUS_PATH,
+ PENDING_DIR,
+ required_version=REQUIRED_BRIDGE_VERSION,
+ auto_home=self.hardware_settings.auto_home_enabled,
+ )
resolved_bus_factory = bus_factory or self.hardware_settings.bus_factory()
return HardwareSeatExecutor(
self.hardware_matrix,
@@ -554,7 +580,8 @@ class SeatDemoService:
)
parsed = merge_native_can_intent(parsed, utterance)
parsed = self._partition_native_actions(
- parsed, promote_supported=hardware_request
+ parsed,
+ promote_supported=(hardware_request and self.vehicle_can_settings.enabled),
)
if hardware_request and not control_plane_request:
if parsed.get("actions"):
diff --git a/src/cognitive_agent/application/self_repair/service.py b/src/cognitive_agent/application/self_repair/service.py
index 2325fc9..abc2e24 100644
--- a/src/cognitive_agent/application/self_repair/service.py
+++ b/src/cognitive_agent/application/self_repair/service.py
@@ -4,7 +4,8 @@ The original HIL demo mixed HTTP hosting, business state, firmware tooling and
ZCANPRO process control in one script. This module keeps the proven state
machine and diagnostic rules while exposing them through the repository's
existing server. Every machine-specific path is supplied through environment
-configuration; importing the module never launches hardware tooling.
+configuration or discovered standard installations; importing the module never
+launches hardware tooling.
"""
from __future__ import unicode_literals
@@ -29,6 +30,9 @@ from .signal_diagnostic import (
from .zcan_bridge import (
ZcanBridgeManager, run_self_test as run_bridge_manager_self_test,
)
+from cognitive_agent.infrastructure.firmware.t2g_seat import (
+ EXPECTED_FIRMWARE_REVISION,
+)
REPOSITORY_ROOT = Path(__file__).resolve().parents[4]
@@ -39,6 +43,17 @@ def _env_path(name, default):
return Path(value).expanduser() if value else Path(default)
+def _env_or_installed_path(name, candidates, fallback):
+ value = os.getenv(name, "").strip()
+ if value:
+ return Path(value).expanduser()
+ for candidate in candidates:
+ path = Path(candidate)
+ if path.exists():
+ return path
+ return Path(fallback)
+
+
def _env_flag(name, default=False):
value = os.getenv(name)
if value is None:
@@ -71,16 +86,28 @@ HARDWARE_LOG_ROOT = _env_path(
REPOSITORY_ROOT / "artifacts" / "self-repair" / "hardware",
)
PROJECT_DIR = _env_path(
- "SELF_REPAIR_FIRMWARE_ROOT", REPOSITORY_ROOT / "__unconfigured_firmware__")
+ "SELF_REPAIR_FIRMWARE_ROOT",
+ REPOSITORY_ROOT / "firmware" / "t2g" / "Seat_Controller_demo")
IAR_PROJECT_PATH = PROJECT_DIR / "IAR" / "Seat_Controller_demo.ewp"
FIRMWARE_OUT_PATH = PROJECT_DIR / "IAR" / "rev_d" / "Exe" / \
"Seat_Controller_demo.out"
FIRMWARE_HEX_PATH = PROJECT_DIR / "IAR" / "rev_d" / "Exe" / \
"Seat_Controller_demo.hex"
-IAR_BUILD_PATH = _env_path(
- "SELF_REPAIR_IAR_BUILD_PATH", REPOSITORY_ROOT / "__unconfigured_iar_build__")
-CSPY_BAT_PATH = _env_path(
- "SELF_REPAIR_CSPY_BAT_PATH", REPOSITORY_ROOT / "__unconfigured_cspy__")
+IAR_INSTALL_ROOTS = (
+ Path(r"D:\Program Files\IAR Systems\Embedded Workbench 9.2"),
+ Path(r"C:\Program Files\IAR Systems\Embedded Workbench 9.2"),
+ Path(r"C:\Program Files\IAR Systems\Embedded Workbench 9.4"),
+)
+IAR_BUILD_PATH = _env_or_installed_path(
+ "SELF_REPAIR_IAR_BUILD_PATH",
+ tuple(root / "common" / "bin" / "iarbuild.exe"
+ for root in IAR_INSTALL_ROOTS),
+ REPOSITORY_ROOT / "__unconfigured_iar_build__")
+CSPY_BAT_PATH = _env_or_installed_path(
+ "SELF_REPAIR_CSPY_BAT_PATH",
+ tuple(root / "common" / "bin" / "CSpyBat.exe"
+ for root in IAR_INSTALL_ROOTS),
+ REPOSITORY_ROOT / "__unconfigured_cspy__")
CSPY_GENERAL_PATH = _env_path(
"SELF_REPAIR_CSPY_GENERAL_PATH",
PROJECT_DIR / "IAR" / "settings" / "Seat_Controller_demo.rev_d.general.xcl",
@@ -96,13 +123,19 @@ FIRMWARE_LOG_ROOT = _env_path(
FIRMWARE_SOURCE_ROOTS = tuple(
PROJECT_DIR / name for name in ("App", "Bsp", "Config", "Driver"))
FIRMWARE_SOURCE_SUFFIXES = frozenset((".c", ".h", ".s", ".asm"))
-REQUIRED_BRIDGE_VERSION = "2026-08-07-reset-home-far-target-v15"
-ZCANPRO_EXE = _env_path(
- "SELF_REPAIR_ZCANPRO_EXE", REPOSITORY_ROOT / "__unconfigured_zcanpro__")
-ZCANPRO_SCRIPT_CONFIG = _env_path(
- "SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG",
- REPOSITORY_ROOT / "__unconfigured_zcanpro_script_config__",
+REQUIRED_BRIDGE_VERSION = "2026-08-09-real-self-heal-v32"
+ZCANPRO_ROOTS = (
+ Path(r"C:\Program Files (x86)\ZCANPRO"),
+ Path(r"C:\Program Files\ZCANPRO"),
)
+ZCANPRO_EXE = _env_or_installed_path(
+ "SELF_REPAIR_ZCANPRO_EXE",
+ tuple(root / "ZCANPRO.exe" for root in ZCANPRO_ROOTS),
+ REPOSITORY_ROOT / "__unconfigured_zcanpro__")
+ZCANPRO_SCRIPT_CONFIG = _env_or_installed_path(
+ "SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG",
+ tuple(root / "config" / "extend_script.ini" for root in ZCANPRO_ROOTS),
+ REPOSITORY_ROOT / "__unconfigured_zcanpro_script_config__")
BRIDGE_MANAGER = ZcanBridgeManager(
STATUS_PATH, BRIDGE_SCRIPT_PATH,
required_version=REQUIRED_BRIDGE_VERSION,
@@ -268,6 +301,13 @@ class ConsoleState(object):
"CAN链路有流量但缺少0x301~0x305,判定为未烧录/固件不匹配类问题" if
bridge.get("bus_traffic") else
"桥接在线但座椅协议无报文,判定为未烧录/固件未运行类问题")
+ elif not bridge.get("firmware_revision_ok"):
+ reason = "FIRMWARE_REVISION_MISMATCH"
+ detail = (
+ "Seat_Controller_demo固件revision=%s,期望revision=%s,"
+ "需要自动重新构建并烧录" %
+ (bridge.get("firmware_revision", "未知"),
+ EXPECTED_FIRMWARE_REVISION))
else:
return {
"ready": True, "auto_flash": False,
@@ -334,7 +374,8 @@ class ConsoleState(object):
last_bridge = self._bridge_summary(last_status, time.time())
if (last_bridge.get("online") and
(not require_protocol or
- last_bridge.get("protocol_online"))):
+ (last_bridge.get("protocol_online") and
+ last_bridge.get("firmware_revision_ok")))):
return last_status, last_bridge
time.sleep(0.25)
return last_status, last_bridge or {}
@@ -385,7 +426,8 @@ class ConsoleState(object):
trigger_reason=qualification.get("reason_code"))
status, bridge = self._wait_bridge(require_protocol=True,
timeout_s=12.0)
- if not bridge.get("protocol_online"):
+ if (not bridge.get("protocol_online") or
+ not bridge.get("firmware_revision_ok")):
detail = ("自动烧录已执行,但仍未收到0x301~0x305;"
"硬件诊断未启动,请检查ECU供电或烧录日志")
with self.lock:
@@ -430,6 +472,7 @@ class ConsoleState(object):
online = age is not None and age < 3.0 and version_ok
system = {} if not isinstance(status, dict) else (
status.get("system") or {})
+ firmware_revision = system.get("firmware_revision")
frame_epochs = {} if not isinstance(status, dict) else (
status.get("frame_epochs") or {})
recent_frame_ids = []
@@ -460,6 +503,10 @@ class ConsoleState(object):
"current_request_id": None if not isinstance(status, dict) else status.get(
"current_request_id"),
"position_valid_mask": int(system.get("position_valid_mask", 0)),
+ "firmware_revision": firmware_revision,
+ "expected_firmware_revision": EXPECTED_FIRMWARE_REVISION,
+ "firmware_revision_ok":
+ firmware_revision == EXPECTED_FIRMWARE_REVISION,
"active_mask": int(system.get("active_mask", 0)),
"faulted_mask": int(system.get("faulted_mask", 0)),
"bus": {} if not isinstance(status, dict) else (
@@ -618,6 +665,16 @@ class ConsoleState(object):
self.hardware_active = False
if not self.hardware_run_id or self.hardware_report_path is not None:
return
+ active_test = (self.hardware_result or {}).get("active_test") or {}
+ test_phase = active_test.get("phase")
+ if test_phase in ("PASSED", "FAILED"):
+ self.hardware_prepare.update({
+ "state": "DIAGNOSTIC_%s" % test_phase,
+ "detail": active_test.get("detail") or
+ active_test.get("title") or
+ "21针主动检测已结束",
+ "finished_epoch": now,
+ })
report = {
"schema": "seat-hardware-diagnostic-report-v1",
"run_id": self.hardware_run_id,
@@ -625,8 +682,7 @@ class ConsoleState(object):
"events": list(self.hardware_events),
"diagnosis": self.hardware_result,
"startup_rule_check": self.hardware_self_test,
- "active_pin_test": (self.hardware_result or {}).get(
- "active_test"),
+ "active_pin_test": active_test,
"bridge": self._bridge_summary(status, now),
}
path = HARDWARE_LOG_ROOT / self.hardware_run_id / \
@@ -839,10 +895,11 @@ class ConsoleState(object):
"firmware": self._firmware_snapshot(),
}
- def start(self, case_id, execution_mode="shadow"):
+ def start(self, case_id, execution_mode="shadow", allow_batch=False):
with self.lock:
if execution_mode == "bench":
- if self.hardware_active or self.batch.get("active"):
+ if (self.hardware_active or
+ (self.batch.get("active") and not allow_batch)):
raise ValueError("硬件诊断或批量验证正在运行,不能启动实物故障用例")
scenario = SCENARIO_BY_ID.get(case_id) or {}
if not (scenario.get("bench") or {}).get("supported", False):
@@ -850,8 +907,9 @@ class ConsoleState(object):
"该用例没有安全的实物注入手段,请使用影子仿真")
self.bridge_manager.ensure_async()
now = time.time()
- status = _read_json(STATUS_PATH)
- bridge = self._bridge_summary(status, now)
+ status, bridge = self._wait_bridge(
+ require_protocol=True, timeout_s=12.0)
+ now = time.time()
if not bridge.get("online"):
raise ValueError("ZCANPRO桥接未在线,不能向实物ECU写入故障")
if not bridge.get("protocol_online"):
@@ -888,7 +946,8 @@ class ConsoleState(object):
self.bench_request_id = None
return self.engine.start(case_id, execution_mode="shadow")
- def reset(self, execution_mode="shadow"):
+ def reset(self, execution_mode="shadow", allow_batch=False,
+ force_all_axes=True, home_nonzero_axes=False):
with self.lock:
if (self.engine.execution_mode == "bench" and
self.engine.phase not in ("IDLE", PHASE_PASSED,
@@ -907,12 +966,14 @@ class ConsoleState(object):
})
return {"healing": self.engine.snapshot(),
"bench_reset": dict(self.bench_reset)}
- if self.hardware_active or self.batch.get("active"):
+ if (self.hardware_active or
+ (self.batch.get("active") and not allow_batch)):
raise ValueError("硬件诊断或批量验证正在运行,不能执行四轴归零")
self.bridge_manager.ensure_async()
now = time.time()
- status = _read_json(STATUS_PATH)
- bridge = self._bridge_summary(status, now)
+ status, bridge = self._wait_bridge(
+ require_protocol=True, timeout_s=12.0)
+ now = time.time()
if not bridge.get("online") or not bridge.get("protocol_online"):
raise ValueError("CAN桥接或座椅ECU协议未在线,不能执行四轴归零")
if (status or {}).get("current_request_id"):
@@ -925,7 +986,10 @@ class ConsoleState(object):
"armed_until_epoch": now + 600.0,
"source": "seat_self_healing_console",
"action": "initialize_known_ranges",
- "payload": {"force_all_axes": True},
+ "payload": {
+ "force_all_axes": bool(force_all_axes),
+ "home_nonzero_axes": bool(home_nonzero_axes),
+ },
}
zero = self._bench_zero_snapshot(status)
self.bench_reset = {
@@ -938,13 +1002,64 @@ class ConsoleState(object):
return {"healing": self.engine.snapshot(),
"bench_reset": dict(self.bench_reset)}
+ def _wait_bench_reset(self, timeout_s=620.0):
+ """Wait for the bridge-owned four-axis homing request to finish."""
+ deadline = time.time() + float(timeout_s)
+ last = None
+ while time.time() < deadline:
+ last = self.snapshot()
+ reset = last.get("bench_reset") or {}
+ if reset.get("phase") in ("PASSED", "FAILED"):
+ return reset
+ time.sleep(0.2)
+ with self.lock:
+ self.bench_reset.update({
+ "phase": "FAILED",
+ "finished_epoch": time.time(),
+ "summary": "四轴归零等待超时,批量验证已停止",
+ })
+ return dict(self.bench_reset)
+
+ @staticmethod
+ def _wait_bench_bridge_idle(timeout_s=8.0):
+ """Wait until the bridge clears its just-published request result."""
+ deadline = time.time() + float(timeout_s)
+ while time.time() < deadline:
+ status = _read_json(STATUS_PATH) or {}
+ if not status.get("current_request_id"):
+ return True
+ time.sleep(0.05)
+ return False
+
def _batch_worker(self, execution_mode):
try:
for scenario in public_scenarios():
with self.lock:
self.batch["current_case_id"] = scenario["id"]
self.latest_report_path = None
- self.start(scenario["id"], execution_mode)
+ if execution_mode == "bench":
+ if not self._wait_bench_bridge_idle():
+ raise ValueError(
+ "%s前台架桥接任务未在安全窗口内结束" % scenario["id"])
+ reset = {}
+ for reset_attempt in range(2):
+ self.reset(
+ "bench", allow_batch=True,
+ force_all_axes=False,
+ home_nonzero_axes=True)
+ reset = self._wait_bench_reset()
+ if (reset.get("phase") == "PASSED" and
+ reset.get("all_zero")):
+ break
+ if reset_attempt == 0:
+ time.sleep(1.0)
+ if (reset.get("phase") != "PASSED" or
+ not reset.get("all_zero")):
+ raise ValueError(
+ "%s前四轴自动归零失败:%s" %
+ (scenario["id"], reset.get("summary", "未知错误")))
+ self.start(
+ scenario["id"], execution_mode, allow_batch=True)
while True:
value = self.snapshot()
phase = value["healing"]["phase"]
@@ -961,9 +1076,12 @@ class ConsoleState(object):
"duration_s": value["healing"].get("elapsed_s"),
"diagnosed_code": value["healing"].get("diagnosed_code"),
"execution_mode": execution_mode,
- "snapshot_path": (None if self.latest_report_path is None else
- str(self.latest_report_path.parent /
- "diagnostic_snapshot_success.json")),
+ "report_path": (None if self.latest_report_path is None else
+ str(self.latest_report_path)),
+ "snapshot_path": (
+ None if self.latest_report_path is None or not passed else
+ str(self.latest_report_path.parent /
+ "diagnostic_snapshot_success.json")),
}
self.batch["results"].append(result)
self.batch["completed"] += 1
@@ -990,8 +1108,9 @@ class ConsoleState(object):
if execution_mode not in ("shadow", "bench"):
raise ValueError("未知批量验证方式")
if execution_mode == "bench":
- raise ValueError(
- "实物台架需逐项验证:每个用例前请人工点击重置并确认四轴归零")
+ if self.hardware_active:
+ raise ValueError("硬件诊断正在运行,不能启动实物批量验证")
+ self.bridge_manager.ensure_async()
self.batch = self._new_batch_state(execution_mode)
self.batch["active"] = True
self.batch["started_epoch"] = time.time()
@@ -1376,7 +1495,10 @@ class SelfRepairService(object):
return self.state.start_batch(payload.get("execution_mode", "shadow"))
def reset_healing(self, payload):
- return self.state.reset(payload.get("execution_mode", "shadow"))
+ return self.state.reset(
+ payload.get("execution_mode", "shadow"),
+ force_all_axes=bool(payload.get("force_all_axes", True)),
+ home_nonzero_axes=bool(payload.get("home_nonzero_axes", False)))
def start_hardware(self):
return self.state.start_hardware()
diff --git a/src/cognitive_agent/application/self_repair/zcan_bridge.py b/src/cognitive_agent/application/self_repair/zcan_bridge.py
index 819d6cb..156251a 100644
--- a/src/cognitive_agent/application/self_repair/zcan_bridge.py
+++ b/src/cognitive_agent/application/self_repair/zcan_bridge.py
@@ -24,6 +24,7 @@ class ZcanBridgeManager(object):
def __init__(self, status_path, script_path, heartbeat_stale_s=3.0,
poll_s=1.0, retry_cooldown_s=15.0,
+ busy_heartbeat_grace_s=45.0,
required_version=None, zcanpro_exe=None,
script_config_path=None, auto_start=False):
self.status_path = Path(status_path)
@@ -34,6 +35,7 @@ class ZcanBridgeManager(object):
self.heartbeat_stale_s = float(heartbeat_stale_s)
self.poll_s = float(poll_s)
self.retry_cooldown_s = float(retry_cooldown_s)
+ self.busy_heartbeat_grace_s = float(busy_heartbeat_grace_s)
self.required_version = required_version
self.lock = threading.RLock()
self.stop_event = threading.Event()
@@ -79,6 +81,7 @@ class ZcanBridgeManager(object):
"last_attempt_epoch": self.last_attempt_epoch,
"last_online_epoch": self.last_online_epoch,
"heartbeat_age_s": None if age is None else round(age, 2),
+ "busy_heartbeat_grace_s": self.busy_heartbeat_grace_s,
"zcan_window_found": self.zcan_window_found,
"retry_armed": self.retry_requested,
"zcan_exe": str(self.zcanpro_exe),
@@ -120,6 +123,20 @@ class ZcanBridgeManager(object):
return False
return True
+ def _bridge_busy_within_grace(self):
+ try:
+ import json
+ with self.status_path.open("r", encoding="utf-8") as stream:
+ status = json.load(stream)
+ heartbeat = float(status.get("heartbeat_epoch", 0) or 0)
+ age = max(0.0, time.time() - heartbeat)
+ return bool(
+ status.get("current_request_id") and
+ status.get("bridge_state") == "RUNNING" and
+ heartbeat > 0 and age <= self.busy_heartbeat_grace_s)
+ except (OSError, ValueError, TypeError):
+ return False
+
def _take_retry_request(self):
with self.lock:
if not self.retry_requested:
@@ -130,15 +147,22 @@ class ZcanBridgeManager(object):
def _monitor(self):
while not self.stop_event.is_set():
if self._heartbeat_online():
+ with self.lock:
+ # A defensive ensure request is already satisfied by a
+ # healthy bridge. Do not carry it into a later live task.
+ self.retry_requested = False
self._set_state(
"ONLINE", "CAN桥接在线,由ZCANPRO扩展脚本持续提供数据",
last_online_epoch=time.time())
+ elif self._bridge_busy_within_grace():
+ self._set_state(
+ "BUSY", "CAN bridge request is active; restart is deferred")
else:
with self.lock:
# A bridge that was genuinely online gets one automatic
# recovery attempt. A failed recovery is not repeated
# until an explicit Start action calls ``ensure_async``.
- if self.state == "ONLINE":
+ if self.state in ("ONLINE", "BUSY"):
self.retry_requested = True
if self._take_retry_request():
self._attempt_start()
diff --git a/src/cognitive_agent/application/zcan_seat_executor.py b/src/cognitive_agent/application/zcan_seat_executor.py
new file mode 100644
index 0000000..2f64e89
--- /dev/null
+++ b/src/cognitive_agent/application/zcan_seat_executor.py
@@ -0,0 +1,254 @@
+"""Execute normal seat command plans through the shared ZCANPRO bridge.
+
+ZLG's Windows driver gives one process exclusive ownership of a USBCAN device.
+Self-repair already keeps that ownership inside ZCANPRO, so opening the same
+adapter again from the web server makes both user and admin orchestration fail.
+This executor keeps one owner and exchanges bounded, armed JSON requests with
+the bridge instead.
+"""
+
+from __future__ import annotations
+
+from datetime import UTC, datetime
+import json
+import os
+from pathlib import Path
+import time
+from typing import Any
+import uuid
+
+
+def _now() -> str:
+ return datetime.now(UTC).isoformat().replace("+00:00", "Z")
+
+
+def _read_json(path: Path) -> dict[str, Any] | None:
+ try:
+ value = json.loads(path.read_text(encoding="utf-8"))
+ except (OSError, ValueError, TypeError):
+ return None
+ return value if isinstance(value, dict) else None
+
+
+def _atomic_json(path: Path, value: dict[str, Any]) -> None:
+ path.parent.mkdir(parents=True, exist_ok=True)
+ temporary = path.with_name(
+ f".{path.name}.{os.getpid()}.{time.time_ns()}.tmp"
+ )
+ temporary.write_text(
+ json.dumps(value, ensure_ascii=False, indent=2), encoding="utf-8"
+ )
+ os.replace(temporary, path)
+
+
+class ZcanBridgeSeatExecutor:
+ """Hardware-seat executor compatible with ``HardwareSeatExecutor``."""
+
+ def __init__(
+ self,
+ matrix: Any,
+ bridge_manager: Any,
+ status_path: Path,
+ pending_dir: Path,
+ *,
+ required_version: str,
+ auto_home: bool,
+ startup_timeout_s: float = 12.0,
+ request_timeout_s: float = 660.0,
+ ) -> None:
+ self.matrix = matrix
+ self.bridge_manager = bridge_manager
+ self.status_path = Path(status_path)
+ self.pending_dir = Path(pending_dir)
+ self.required_version = required_version
+ self.auto_home = bool(auto_home)
+ self.startup_timeout_s = float(startup_timeout_s)
+ self.request_timeout_s = float(request_timeout_s)
+
+ def _online_status(self, *, require_protocol: bool) -> dict[str, Any] | None:
+ value = _read_json(self.status_path)
+ if value is None or value.get("bridge_version") != self.required_version:
+ return None
+ try:
+ fresh = time.time() - float(value.get("heartbeat_epoch", 0)) < 3.0
+ except (TypeError, ValueError):
+ fresh = False
+ if not fresh:
+ return None
+ if require_protocol and not (value.get("system") and value.get("frame_epochs")):
+ return None
+ return value
+
+ def _wait_online(self, *, require_protocol: bool) -> dict[str, Any]:
+ self.bridge_manager.ensure_async()
+ deadline = time.time() + self.startup_timeout_s
+ while time.time() < deadline:
+ value = self._online_status(require_protocol=require_protocol)
+ if value is not None:
+ return value
+ time.sleep(0.1)
+ qualifier = "及座椅ECU协议" if require_protocol else ""
+ raise RuntimeError(f"ZCANPRO桥接{qualifier}未在线")
+
+ def _payload(
+ self,
+ command_plan: dict[str, Any],
+ function_config: dict[str, Any],
+ ) -> dict[str, Any]:
+ commands = []
+ for command in command_plan["spec"]["commands"]:
+ encoded = self.matrix.encode(command["message"], command["signals"])
+ item = dict(command)
+ item["frame_id"] = int(encoded["frame_id"], 16)
+ item["data"] = list(bytes.fromhex(encoded["data_hex"]))
+ commands.append(item)
+ return {
+ "name": command_plan.get("metadata", {}).get(
+ "name", "自然语言座椅控制"
+ ),
+ "commands": commands,
+ "operations": list(function_config["spec"]["operations"]),
+ "allow_auto_home": self.auto_home,
+ }
+
+ def _submit(self, payload: dict[str, Any]) -> dict[str, Any]:
+ status = self._wait_online(require_protocol=True)
+ idle_deadline = time.time() + self.startup_timeout_s
+ while status.get("current_request_id") and time.time() < idle_deadline:
+ time.sleep(0.1)
+ status = self._wait_online(require_protocol=True)
+ if status.get("current_request_id"):
+ raise RuntimeError(
+ "ZCANPRO桥接正在执行其他台架任务:%s" %
+ status.get("current_request_id")
+ )
+
+ request_id = "SEAT_ORCH_%d_%s" % (
+ int(time.time() * 1000), uuid.uuid4().hex[:6]
+ )
+ request = {
+ "schema": "seat-function-request-v1",
+ "request_id": request_id,
+ "created_epoch": time.time(),
+ "armed_until_epoch": time.time() + self.request_timeout_s + 30.0,
+ "source": "cabin_cognitive_orchestrator",
+ "action": "execute_command_plan",
+ "payload": payload,
+ }
+ _atomic_json(self.pending_dir / f"{request_id}.json", request)
+
+ deadline = time.time() + self.request_timeout_s
+ while time.time() < deadline:
+ status = self._online_status(require_protocol=False)
+ if status is None:
+ time.sleep(0.1)
+ continue
+ result = status.get("last_result") or {}
+ if result.get("request_id") == request_id:
+ return result
+ time.sleep(0.1)
+ raise RuntimeError("ZCANPRO桥接执行座椅请求超时,已停止等待")
+
+ @staticmethod
+ def _report(
+ function_config: dict[str, Any],
+ started_at: str,
+ bridge_result: dict[str, Any] | None,
+ error: Exception | None,
+ ) -> dict[str, Any]:
+ request_id = function_config["metadata"]["request_id"]
+ passed = error is None and (bridge_result or {}).get("result") == "PASS"
+ detail = (bridge_result or {}).get("details") or {}
+ message = (
+ detail.get("summary")
+ or (bridge_result or {}).get("summary")
+ or (str(error) if error is not None else "ZCANPRO桥接未返回通过结果")
+ )
+ results = [
+ {
+ "ref": operation["id"],
+ "domain": "seat",
+ "status": "succeeded" if passed else "failed",
+ "message": message,
+ "telemetry": {
+ "transport": "zcanpro_shared_bridge",
+ "hardware_feedback": passed,
+ "simulated": False,
+ "bridge_result": bridge_result,
+ "error_type": type(error).__name__ if error is not None else None,
+ "stop_all_attempted": bool(detail.get("stop_all_attempted")),
+ },
+ }
+ for operation in function_config["spec"]["operations"]
+ ]
+ return {
+ "apiVersion": "cognitive-agent/v1alpha1",
+ "kind": "ExecutionReport",
+ "metadata": {
+ "id": f"report-{request_id}",
+ "name": "T2G seat ZCANPRO bridge execution report",
+ "version": "1.0.0",
+ "request_id": request_id,
+ "labels": {"simulation": "false", "feedback": "physical_can"},
+ },
+ "spec": {
+ "mode": "hil",
+ "status": "succeeded" if passed else "failed",
+ "started_at": started_at,
+ "finished_at": _now(),
+ "results": results,
+ },
+ }
+
+ def execute(
+ self,
+ command_plan: dict[str, Any],
+ function_config: dict[str, Any],
+ actuator_state: dict[str, Any] | None = None,
+ ) -> dict[str, Any]:
+ del actuator_state
+ started_at = _now()
+ try:
+ result = self._submit(self._payload(command_plan, function_config))
+ except Exception as exc: # normalize bridge/startup failures for the API
+ return self._report(function_config, started_at, None, exc)
+ return self._report(function_config, started_at, result, None)
+
+ def read_physical_state(self) -> dict[str, Any]:
+ status = self._wait_online(require_protocol=True)
+ axes = ("longitudinal", "cushion_tilt", "backrest_recline", "legrest_height")
+ positions: dict[str, Any] = {}
+ missing = []
+ motors = status.get("motors") or []
+ for motor, axis in enumerate(axes):
+ item = motors[motor] if motor < len(motors) else None
+ if not isinstance(item, dict):
+ missing.append(axis)
+ continue
+ positions[axis] = {
+ "position_pct": round(int(item.get("position", 0)) / 100),
+ "position_valid": bool(item.get("position_valid")),
+ "motion_state": "moving" if item.get("active") else "stopped",
+ }
+ thermal = status.get("thermal") or []
+ thermal_byte = int(thermal[0]) if thermal else 0
+ ventilation_raw = thermal_byte & 0x07
+ heating_raw = (thermal_byte >> 3) & 0x07
+ return {
+ "position": positions,
+ "ventilation": {
+ "state": "off" if ventilation_raw <= 1 else "on",
+ "level": max(0, ventilation_raw - 1),
+ },
+ "heating": {
+ "state": "off" if heating_raw <= 1 else "on",
+ "level": max(0, heating_raw - 1),
+ },
+ "captured_at": _now(),
+ "source": "physical_can",
+ "target": {
+ "device": "seat", "zone": "front_right", "instance": "passenger"
+ },
+ "complete": not missing,
+ "missing": missing,
+ }
diff --git a/src/cognitive_agent/infrastructure/can/hardware.py b/src/cognitive_agent/infrastructure/can/hardware.py
index 0b76b37..82e2c5a 100755
--- a/src/cognitive_agent/infrastructure/can/hardware.py
+++ b/src/cognitive_agent/infrastructure/can/hardware.py
@@ -504,7 +504,11 @@ class VehicleCanSettings:
repository_root=repository_root,
enabled=_env_bool(
"COGNITIVE_AGENT_VEHICLE_CAN_ENABLED",
- default=_env_bool("COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED"),
+ # The seat bench and the vehicle CAN harness are independent
+ # pieces of hardware. Enabling physical seat execution must
+ # not silently open/transmit on the unconnected vehicle
+ # channel; dual-channel execution is an explicit opt-in.
+ default=False,
),
approval_required=_env_bool(
"COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN_REQUIRED", default=True
diff --git a/src/cognitive_agent/infrastructure/firmware/t2g_seat.py b/src/cognitive_agent/infrastructure/firmware/t2g_seat.py
index 4fccdb5..4384ab7 100755
--- a/src/cognitive_agent/infrastructure/firmware/t2g_seat.py
+++ b/src/cognitive_agent/infrastructure/firmware/t2g_seat.py
@@ -7,16 +7,17 @@ import subprocess
import time
from dataclasses import dataclass
from pathlib import Path
-from typing import Any, Callable
+from typing import TYPE_CHECKING, Any, Callable
-from cognitive_agent.infrastructure.can.gateway import CanBus
+if TYPE_CHECKING:
+ from cognitive_agent.infrastructure.can.gateway import CanBus
FIRMWARE_PROTOCOL_SIGNATURE = "seat-controller-smv8-dynamic-modes-v13"
FIRMWARE_PROTOCOL_FRAME_IDS = frozenset(
{0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x4FA}
)
-EXPECTED_FIRMWARE_REVISION = 13
+EXPECTED_FIRMWARE_REVISION = 15
EXPECTED_MOTOR_MAX_HALL = (480, 374, 917, 647)
diff --git a/tests/e2e/test_seat_web_api.py b/tests/e2e/test_seat_web_api.py
index e217eb9..70e4a0e 100755
--- a/tests/e2e/test_seat_web_api.py
+++ b/tests/e2e/test_seat_web_api.py
@@ -115,7 +115,7 @@ class SeatWebApiTests(unittest.TestCase):
def test_static_console_and_runtime_endpoint(self) -> None:
with self.opener.open(f"{self.base_url}/", timeout=3) as response:
html = response.read().decode("utf-8")
- with self.opener.open(f"{self.base_url}/app.js?v=seat-hil-43", timeout=3) as response:
+ with self.opener.open(f"{self.base_url}/app.js?v=seat-hil-44", timeout=3) as response:
app_script = response.read().decode("utf-8")
with self.opener.open(
f"{self.base_url}/gesture-control.js?v=android-pad-6", timeout=3
@@ -150,7 +150,7 @@ class SeatWebApiTests(unittest.TestCase):
self.assertIn("整车孪生界面", html)
self.assertIn("阅读灯", html)
self.assertNotIn("透明车体 · 实体设备", html)
- self.assertIn('src="/app.js?v=seat-hil-43"', html)
+ self.assertIn('src="/app.js?v=seat-hil-44"', html)
self.assertIn('src="/gesture-control.js?v=android-pad-6"', html)
self.assertNotIn('class="vehicle-system-hud"', html)
self.assertIn('src="/console-v2.js?v=desktop-refactor-28"', html)
@@ -229,6 +229,12 @@ class SeatWebApiTests(unittest.TestCase):
self.assertNotIn('id="releaseHardwareAccess"', html)
self.assertIn('const dynamicModeOrder = ["rocking_horse", "dynamic_cradle"]', app_script)
self.assertIn('divider.className = "mode-group-divider"', app_script)
+ self.assertIn(
+ 'mode === "hardware" && !state.runtime?.hardware_execution_allowed',
+ app_script,
+ )
+ self.assertIn("hardwareButton.disabled = !hardwareExecutionReady", app_script)
+ self.assertIn("车端 CAN 未启用,其他领域保持虚拟执行", app_script)
self.assertIn("function extractReferenceWindowPanes", app_script)
self.assertIn("function collectReferenceFrontLampMeshes", app_script)
self.assertIn("function emphasizeReferenceWindowPanes", app_script)
diff --git a/tests/e2e/test_self_repair_api.py b/tests/e2e/test_self_repair_api.py
index f9688ea..1108979 100644
--- a/tests/e2e/test_self_repair_api.py
+++ b/tests/e2e/test_self_repair_api.py
@@ -5,6 +5,7 @@ import threading
import urllib.error
import urllib.request
from http.server import ThreadingHTTPServer
+from pathlib import Path
import pytest
@@ -134,15 +135,15 @@ class TestSelfRepairApi:
with urllib.request.urlopen(f"{self.base_url}/", timeout=3) as response:
html = response.read().decode("utf-8")
with urllib.request.urlopen(
- f"{self.base_url}/self-repair.js?v=repair-15", timeout=3
+ f"{self.base_url}/self-repair.js?v=repair-17", timeout=3
) as response:
script = response.read().decode("utf-8")
with urllib.request.urlopen(
- f"{self.base_url}/self-repair.css?v=repair-15", timeout=3
+ f"{self.base_url}/self-repair.css?v=repair-17", timeout=3
) as response:
styles = response.read().decode("utf-8")
with urllib.request.urlopen(
- f"{self.base_url}/self-repair-seat3d.js?v=repair-15", timeout=3
+ f"{self.base_url}/self-repair-seat3d.js?v=repair-17", timeout=3
) as response:
seat3d = response.read().decode("utf-8")
with urllib.request.urlopen(
@@ -150,10 +151,15 @@ class TestSelfRepairApi:
) as response:
console_script = response.read().decode("utf-8")
- assert 'href="/self-repair.css?v=repair-15"' in html
- assert 'src="/self-repair.js?v=repair-15"' in html
- assert 'src="/self-repair-seat3d.js?v=repair-15"' in html
+ assert 'href="/self-repair.css?v=repair-17"' in html
+ assert 'src="/self-repair.js?v=repair-17"' in html
+ assert 'src="/self-repair-seat3d.js?v=repair-17"' in html
assert "量产故障用例" in script
+ assert 'id="repairConfirmDialog"' in script
+ assert "confirmAction(" in script
+ assert "window.confirm" not in script
+ assert 'hardware.link?.adapter === "OK"' in script
+ assert 'PASSED: ["21针通过", "online"]' in script
assert "connectorRows" in script
assert "Polling refreshes data only" in script
assert "renderRecords();\n showView(activeView);" not in script
@@ -172,3 +178,18 @@ class TestSelfRepairApi:
assert 'window.addEventListener("self-repair-seat-reset"' in seat3d
assert '["self-calibration", "self-repair"].includes(module)' in console_script
assert 'roleSelect.disabled = ui.activeModule === "self-repair"' in console_script
+
+
+def test_self_repair_bridge_uses_the_backend_runtime_directory() -> None:
+ source = (
+ Path(__file__).resolve().parents[2]
+ / "tools"
+ / "zcan"
+ / "seat_self_repair_bridge.py"
+ ).read_text(encoding="utf-8")
+
+ assert '"artifacts", "tmp", "self-repair", "runtime"' in source
+ assert 'os.path.join(BASE_DIR, "seat_function_runtime")' not in source
+ assert "A silent or disconnected CAN bus must not kill" in source
+ assert 'self.message("GUI STOP_ALL发送失败' in source
+ assert 'self.message("GUI thermal off发送失败' in source
diff --git a/tests/fixtures/seat_frontend_hil_suite.json b/tests/fixtures/seat_frontend_hil_suite.json
index 723ef25..646ca10 100644
--- a/tests/fixtures/seat_frontend_hil_suite.json
+++ b/tests/fixtures/seat_frontend_hil_suite.json
@@ -353,7 +353,11 @@
]},
{"mode_id": "zero_gravity", "expected": {"longitudinal": 100, "cushion_tilt": 100, "backrest_recline": 81, "legrest_height": 94}, "variants": [
{"id": "MODE-ZERO-GRAVITY-OPEN", "utterance": "打开零重力模式"}, {"id": "MODE-ZERO-GRAVITY-ENTER", "utterance": "副驾进入零重力"}, {"id": "MODE-ZERO-GRAVITY-ENGLISH", "utterance": "开启 zero-gravity 模式"}
- ]}
+ ]},
+ {"id": "MODE-ROCKING-HORSE-START", "mode_id": "rocking_horse", "utterance": "开启木马模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 1, "state": "running"}},
+ {"id": "MODE-ROCKING-HORSE-STOP", "utterance": "关闭木马模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 0, "state": "idle"}},
+ {"id": "MODE-DYNAMIC-CRADLE-START", "mode_id": "dynamic_cradle", "utterance": "开启动态摇篮模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 2, "state": "running"}},
+ {"id": "MODE-DYNAMIC-CRADLE-STOP", "utterance": "关闭动态摇篮模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 0, "state": "idle"}}
],
"model_cases": [
{
diff --git a/tests/integration/test_seat_frontend_input_coverage.py b/tests/integration/test_seat_frontend_input_coverage.py
index b12ed0d..ace1d4d 100644
--- a/tests/integration/test_seat_frontend_input_coverage.py
+++ b/tests/integration/test_seat_frontend_input_coverage.py
@@ -66,7 +66,11 @@ class SeatFrontendInputCoverageTests(unittest.TestCase):
{"thermal", "motion", "combined", "mode"},
)
self.assertEqual(
- {case["mode_id"] for case in self.positive_cases if case["group"] == "mode"},
+ {
+ case["mode_id"]
+ for case in self.positive_cases
+ if case["group"] == "mode" and case.get("mode_id")
+ },
{
"easy_entry_exit",
"office",
@@ -79,6 +83,8 @@ class SeatFrontendInputCoverageTests(unittest.TestCase):
"electric_beach_chair",
"nap",
"zero_gravity",
+ "rocking_horse",
+ "dynamic_cradle",
},
)
@@ -150,6 +156,19 @@ class SeatFrontendInputCoverageTests(unittest.TestCase):
for field, expected in expected_motion.items():
if field != "axis":
self.assertEqual(operation["motion"][field], expected)
+ expected_dynamic_mode = case.get("expected_dynamic_mode")
+ if expected_dynamic_mode:
+ capability = (
+ "seat.stop_dynamic_mode"
+ if expected_dynamic_mode["mode_id"] == 0
+ else "seat.start_dynamic_mode"
+ )
+ self.assertIn(capability, by_capability)
+ if expected_dynamic_mode["mode_id"]:
+ self.assertEqual(
+ by_capability[capability]["parameters"]["mode_id"],
+ expected_dynamic_mode["mode_id"],
+ )
def test_every_rejection_utterance_stops_before_execution(self) -> None:
for case in self.rejection_cases:
diff --git a/tests/unit/test_native_can_integration.py b/tests/unit/test_native_can_integration.py
index a8b515f..dc32ec6 100644
--- a/tests/unit/test_native_can_integration.py
+++ b/tests/unit/test_native_can_integration.py
@@ -1,5 +1,6 @@
from __future__ import annotations
+import os
import unittest
from pathlib import Path
from unittest.mock import patch
@@ -162,6 +163,17 @@ class NativeCanIntegrationTests(unittest.TestCase):
self.assertEqual(info["data"]["bitrate"], 2_000_000)
self.assertEqual(info["data"]["sample_point_percent"], 80)
+ def test_enabling_seat_hardware_does_not_implicitly_enable_vehicle_can(self) -> None:
+ with patch.dict(
+ os.environ,
+ {"COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED": "true"},
+ clear=False,
+ ):
+ os.environ.pop("COGNITIVE_AGENT_VEHICLE_CAN_ENABLED", None)
+ settings = VehicleCanSettings.from_env(Path(REPOSITORY_ROOT))
+
+ self.assertFalse(settings.enabled)
+
if __name__ == "__main__":
unittest.main()
diff --git a/tests/unit/test_self_repair.py b/tests/unit/test_self_repair.py
index 544ed0b..30ef5c7 100644
--- a/tests/unit/test_self_repair.py
+++ b/tests/unit/test_self_repair.py
@@ -1,5 +1,7 @@
from __future__ import annotations
+import json
+import time
from pathlib import Path
from cognitive_agent.application.self_repair.healing_model import (
@@ -81,3 +83,24 @@ def test_bridge_manager_does_not_arm_visible_tooling_by_default(tmp_path: Path)
assert snapshot["state"] == "IDLE"
assert snapshot["retry_armed"] is False
assert snapshot["attempts"] == 0
+
+
+def test_bridge_manager_does_not_restart_a_live_busy_request(tmp_path: Path) -> None:
+ status_path = tmp_path / "bridge.json"
+ status_path.write_text(
+ json.dumps({
+ "heartbeat_epoch": time.time() - 5.0,
+ "bridge_state": "RUNNING",
+ "current_request_id": "SELF_HEAL_BENCH_1",
+ }),
+ encoding="utf-8",
+ )
+ manager = ZcanBridgeManager(
+ status_path,
+ tmp_path / "bridge.py",
+ heartbeat_stale_s=3.0,
+ busy_heartbeat_grace_s=45.0,
+ )
+
+ assert manager._heartbeat_online() is False
+ assert manager._bridge_busy_within_grace() is True
diff --git a/tools/run_seat_frontend_hil_suite.py b/tools/run_seat_frontend_hil_suite.py
index 7379e8d..f3663e1 100644
--- a/tools/run_seat_frontend_hil_suite.py
+++ b/tools/run_seat_frontend_hil_suite.py
@@ -106,6 +106,7 @@ def expected_operation_errors(
result: dict[str, Any],
expected: dict[str, int],
expected_motion: dict[str, Any] | None = None,
+ expected_dynamic_mode: dict[str, Any] | None = None,
) -> list[str]:
errors: list[str] = []
seat_config = (result.get("function_configs") or {}).get("seat") or result.get(
@@ -151,6 +152,47 @@ def expected_operation_errors(
f"{capability} motion.{field}={actual_value}, "
f"expected={expected_value}"
)
+ if expected_dynamic_mode:
+ expected_mode_id = int(expected_dynamic_mode["mode_id"])
+ capability = (
+ "seat.stop_dynamic_mode"
+ if expected_mode_id == 0
+ else "seat.start_dynamic_mode"
+ )
+ operation = by_capability.get(capability)
+ if operation is None:
+ errors.append(f"expected capability was not generated: {capability}")
+ elif expected_mode_id and dig(operation, "parameters", "mode_id") != expected_mode_id:
+ errors.append(
+ f"{capability} mode_id={dig(operation, 'parameters', 'mode_id')}, "
+ f"expected={expected_mode_id}"
+ )
+
+ hardware_results = dig(result, "execution_report", "spec", "results") or []
+ telemetry = next(
+ (
+ item.get("telemetry", {})
+ for item in hardware_results
+ if item.get("domain") == "seat"
+ and item.get("telemetry", {}).get("dynamic_mode_id") is not None
+ ),
+ None,
+ )
+ if telemetry is None:
+ errors.append("dynamic-mode execution did not include physical 0x306 telemetry")
+ else:
+ if telemetry.get("dynamic_mode_id") != expected_mode_id:
+ errors.append(
+ f"dynamic telemetry mode_id={telemetry.get('dynamic_mode_id')}, "
+ f"expected={expected_mode_id}"
+ )
+ dynamic_state = telemetry.get("dynamic_state")
+ accepted_states = {0} if expected_mode_id == 0 else {1, 2}
+ if dynamic_state not in accepted_states:
+ errors.append(
+ f"dynamic telemetry state={dynamic_state}, "
+ f"expected one of {sorted(accepted_states)}"
+ )
return errors
@@ -306,6 +348,7 @@ def run_case(
result,
case.get("expected", {}),
case.get("expected_motion"),
+ case.get("expected_dynamic_mode"),
)
)
seat_config = (result.get("function_configs") or {}).get(
@@ -359,6 +402,18 @@ def run_case(
record["errors"].extend(
validate_physical_state(state, case.get("expected", {}), tolerance)
)
+ expected_dynamic_mode = case.get("expected_dynamic_mode")
+ if expected_dynamic_mode:
+ actual_dynamic_mode = dig(
+ state, "actuator_state", "passenger", "dynamic_mode"
+ ) or {}
+ for field in ("mode_id", "state"):
+ expected_value = expected_dynamic_mode[field]
+ if actual_dynamic_mode.get(field) != expected_value:
+ record["errors"].append(
+ f"dynamic_mode.{field}={actual_dynamic_mode.get(field)}, "
+ f"expected={expected_value}"
+ )
record["physical_state"] = state.get("physical_state")
record["status"] = "passed" if not record["errors"] else "failed"
except Exception as exc: # continue the suite after transport and parse errors
diff --git a/tools/zcan/seat_self_repair_bridge.py b/tools/zcan/seat_self_repair_bridge.py
index cd48966..970a05d 100644
--- a/tools/zcan/seat_self_repair_bridge.py
+++ b/tools/zcan/seat_self_repair_bridge.py
@@ -1,7 +1,7 @@
-"""ZCANPRO bridge for the standalone selectable seat-function GUI.
+"""ZCANPRO bridge for the web-console self-repair hardware workflow.
Run this file in ZCANPRO's extension-script window and leave it running. The
-normal Windows GUI writes armed JSON requests into ``seat_function_runtime``;
+web console writes armed JSON requests into the repository self-repair runtime;
this bridge is the only process that imports and calls ``zcanpro``.
"""
@@ -18,6 +18,19 @@ import time
import zcanpro
+# ZCANPRO executes extension scripts without adding the script directory or
+# the firmware HIL helpers to ``sys.path``. A fresh ZCANPRO process therefore
+# could only start this bridge when another script happened to have imported
+# ``hil_common`` first. Resolve the repository helper explicitly so bridge
+# startup is deterministic after a reboot.
+BASE_DIR = os.path.dirname(os.path.abspath(__file__))
+REPOSITORY_ROOT = os.path.dirname(os.path.dirname(BASE_DIR))
+HIL_COMMON_DIR = os.path.join(
+ REPOSITORY_ROOT, "firmware", "t2g", "Seat_Controller_demo",
+ "Tests", "manual_hil")
+if HIL_COMMON_DIR not in sys.path:
+ sys.path.insert(0, HIL_COMMON_DIR)
+
if "hil_common" in sys.modules:
_hil_common = importlib.reload(sys.modules["hil_common"])
else:
@@ -31,15 +44,15 @@ parse_303 = _hil_common.parse_303
parse_304 = _hil_common.parse_304
parse_305 = _hil_common.parse_305
-
-BASE_DIR = os.path.dirname(os.path.abspath(__file__))
-RUNTIME_DIR = os.path.join(BASE_DIR, "seat_function_runtime")
+RUNTIME_DIR = os.path.join(
+ REPOSITORY_ROOT, "artifacts", "tmp", "self-repair", "runtime")
PENDING_DIR = os.path.join(RUNTIME_DIR, "requests", "pending")
PROCESSING_DIR = os.path.join(RUNTIME_DIR, "requests", "processing")
COMPLETED_DIR = os.path.join(RUNTIME_DIR, "requests", "completed")
STATUS_PATH = os.path.join(RUNTIME_DIR, "bridge_status.json")
EMERGENCY_PATH = os.path.join(RUNTIME_DIR, "emergency_stop.json")
-LOG_ROOT = os.path.join(BASE_DIR, "logs", "05_seat_function_gui")
+LOG_ROOT = os.path.join(
+ REPOSITORY_ROOT, "artifacts", "self-repair", "hardware")
CONFIRMED_MAX_HALL = (480, 374, 917, 647)
POSITION_TIMEOUT_MS = 30000
NORMAL_TASK_MIN_OBSERVE_S = 5.0
@@ -81,7 +94,14 @@ SELF_HEAL_HOOK_CASES = {
"normal_task": "用户调整腿托后调用刚保存的舒适位置",
"fault_reaction": "CRC校验失败,腿托调用目标被挂起",
"resume_reaction": "重建双槽后继续执行原腿托舒适位置",
- "demo_motor": 3, "demo_delta": 2200, "prelude_delta": 2800,
+ # Keep both physical legs inside the connected seat's repeatedly
+ # observed M3 travel window. The CRC scenario needs a real saved move
+ # and a later restored move; it does not require a long-range pose.
+ # Save one reachable short-travel comfort pose, retreat from it, then
+ # use the saved pose itself as the post-repair recall target. This is
+ # both semantically accurate and independent of the connected seat's
+ # much shorter M3 internal-limit window.
+ "demo_motor": 3, "demo_delta": 200, "prelude_delta": 200,
"normal_observe_s": NORMAL_TASK_MIN_OBSERVE_S,
"inject": "向真实SMV8备用槽写入更新序号但CRC损坏的记录",
"repair": "保留旧有效槽并以更高序号重新原子提交SMV8冗余记录",
@@ -142,7 +162,7 @@ HOME_LEG_TIMEOUT_S = 120
SIGNAL_WINDOW_S = 2.5
HEATER_CURRENT_ACTIVE_DELTA_RAW = 500
FAN_CURRENT_ACTIVE_DELTA_RAW = 40
-BRIDGE_VERSION = "2026-08-07-reset-home-far-target-v15"
+BRIDGE_VERSION = "2026-08-09-real-self-heal-v32"
HARDWARE_MOTOR_PINS = {
0: ("JA1-4", "JA1-5", "JC1-9"),
1: ("JB1-6", "JB1-8", "JC1-15"),
@@ -177,9 +197,18 @@ def _atomic_json(path, value):
for attempt in range(8):
try:
os.replace(temporary, path)
- return
+ return True
except PermissionError:
if attempt >= 7:
+ # The status file is a best-effort telemetry snapshot.
+ # Windows readers may briefly deny FILE_SHARE_DELETE;
+ # dropping one snapshot is safe because the 10 ms bridge
+ # loop republishes the retained state (and last_result).
+ # Raising here would terminate the live ZCAN bridge and
+ # lose the in-flight request result.
+ if os.path.normcase(os.path.abspath(path)) == \
+ os.path.normcase(os.path.abspath(STATUS_PATH)):
+ return False
raise
# The web console polls this file frequently. Windows can
# briefly deny replacement while a reader is closing it.
@@ -189,6 +218,7 @@ def _atomic_json(path, value):
os.remove(temporary)
except OSError:
pass
+ return False
def _read_json(path):
@@ -287,6 +317,7 @@ class SeatFunctionBridge(object):
self.latest_currents = [None, None, None, None]
self.latest_thermal_current = None
self.latest_thermal = None
+ self.latest_dynamic = None
self.frame_epochs = {}
self.motor_current_history = [[], [], [], []]
self.motor_hall_history = [[], [], [], []]
@@ -390,6 +421,7 @@ class SeatFunctionBridge(object):
"currents": self.latest_currents,
"thermal_current": self.latest_thermal_current,
"thermal": self.latest_thermal,
+ "dynamic": self.latest_dynamic,
"frame_epochs": self.frame_epochs,
"signal_window": self.signal_window(),
"last_result": self.last_result,
@@ -459,6 +491,16 @@ class SeatFunctionBridge(object):
"raw": value["heater_raw"],
"valid": value["heater_sample_valid"],
}, received_epoch)
+ elif can_id == 0x306 and len(data) >= 8:
+ self.latest_dynamic = {
+ "mode_id": data[0],
+ "state": data[1],
+ "phase": data[2],
+ "active_mask": data[3] & 0x0F,
+ "fault_mask": (data[3] >> 4) & 0x0F,
+ "cycle_index": data[4] | (data[5] << 8),
+ "phase_elapsed_ms": data[6] | (data[7] << 8),
+ }
elif can_id == 0x4FA and len(data) >= 1:
self.latest_thermal = data
output.append((can_id, data))
@@ -484,11 +526,21 @@ class SeatFunctionBridge(object):
return False
self.message("执行GUI紧急STOP_ALL %s" % request_id)
sequence = self.next_sequence()
- self.transmit(0x300, command_payload(0x09, 0, 0, sequence),
- "GUI EMERGENCY STOP_ALL")
+ # A silent or disconnected CAN bus must not kill the long-running
+ # bridge. The request still interrupts any active workflow, while
+ # each shutdown frame is attempted independently so observation can
+ # resume after a firmware flash or a temporary bus interruption.
+ try:
+ self.transmit(0x300, command_payload(0x09, 0, 0, sequence),
+ "GUI EMERGENCY STOP_ALL")
+ except Exception as error:
+ self.message("GUI STOP_ALL发送失败:%r" % error)
if request.get("thermal_off", True):
- self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0],
- "GUI emergency thermal off")
+ try:
+ self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0],
+ "GUI emergency thermal off")
+ except Exception as error:
+ self.message("GUI thermal off发送失败:%r" % error)
return True
def wait(self, predicate, timeout_s, allow_emergency=True):
@@ -550,11 +602,12 @@ class SeatFunctionBridge(object):
current = int(status.get("position", 0))
if not status.get("position_valid"):
return None
- magnitude = max(600, min(2800, int(delta)))
+ magnitude = max(100, min(2800, int(delta)))
target = current + magnitude if current <= 5000 else current - magnitude
- target = max(800, min(9200, target))
- if abs(target - current) < 500:
- target = 8000 if current < 5000 else 2000
+ target = max(100, min(9200, target))
+ if abs(target - current) < 100:
+ target = min(9200, current + 100) if current < 5000 else \
+ max(100, current - 100)
return {"motor": int(motor), "start": current, "target": target,
"sequence": None, "ack": None}
@@ -789,6 +842,7 @@ class SeatFunctionBridge(object):
# signal only when each direction produces Hall movement at least once.
# This remains sensitive to a disconnected/intermittent pin, for which
# one direction (or both) never produces a valid edge in either cycle.
+
hall_direction_ok = {
direction: any(
item["direction"] == direction and
@@ -816,6 +870,75 @@ class SeatFunctionBridge(object):
"hall_ok": hall_ok,
"hall_direction_ok": hall_direction_ok, "runs": runs}
+ def _depart_legrest_endpoint_for_home(self):
+ """Move M3 off its hard stop with a bounded adaptive timed profile.
+
+ Absolute homing cannot prove an endpoint when the loaded legrest is
+ statically wedged and its first Hall edge never arrives. The active
+ pin diagnostic normally releases this bench with a bounded near/far
+ pair at 60% PWM. Loaded repetitions can need additional breakaway
+ torque, so retry at 75% and finally the ECU's normal 90% duty. Every
+ leg remains limited to 900 ms and is followed by STOP; multiple real
+ Hall edges are still required before proceeding.
+ """
+ motor = 3
+ attempts = []
+ initial = self.latest_diagnostics[motor]
+ initial_hall = None if initial is None else int(initial["hall"])
+ for attempt, duty_x10 in enumerate((600, 750, 900), start=1):
+ for direction in (2, 1):
+ before = self.latest_diagnostics[motor]
+ before_hall = None if before is None else int(before["hall"])
+ sequence = self.next_sequence()
+ state, response = self.send_command(
+ command_payload(0x03, motor, direction, sequence,
+ 900, duty_x10),
+ 1, 3.0,
+ "M3 HOME breakaway attempt=%d direction=%d" %
+ (attempt, direction))
+ if state == "EMERGENCY":
+ return False, {
+ "summary": "M3端点脱离期间收到紧急停止",
+ "attempts": attempts,
+ }
+ self.capture(1.45)
+ stop_sequence = self.next_sequence()
+ self.send_command(
+ command_payload(0x08, motor, 0, stop_sequence),
+ 1, 2.0, "M3 HOME breakaway bounded stop")
+ self.capture(0.35)
+ after = self.latest_diagnostics[motor]
+ after_hall = None if after is None else int(after["hall"])
+ hall_delta = None if before_hall is None or \
+ after_hall is None else abs(after_hall - before_hall)
+ cumulative_hall_delta = None if initial_hall is None or \
+ after_hall is None else abs(after_hall - initial_hall)
+ accepted = (state == "OK" and response is not None and
+ int(response.get("reject", 1)) == 0)
+ attempts.append({
+ "attempt": attempt,
+ "direction": direction,
+ "duty_percent": duty_x10 // 10,
+ "accepted": accepted,
+ "hall_before": before_hall,
+ "hall_after": after_hall,
+ "hall_delta": hall_delta,
+ "cumulative_hall_delta": cumulative_hall_delta,
+ })
+ if(direction == 1 and accepted and
+ ((hall_delta is not None and hall_delta >= 3) or
+ (cumulative_hall_delta is not None and
+ cumulative_hall_delta >= 2))):
+ return True, {
+ "summary": "M3已用%d%%受控近/远端序列脱离硬端点" %
+ (duty_x10 // 10),
+ "attempts": attempts,
+ }
+ return False, {
+ "summary": "M3受控脱离重试后仍无真实Hall边沿",
+ "attempts": attempts,
+ }
+
def execute_hardware_diagnostic(self, request):
request_id = request.get("request_id")
pin_results = {
@@ -884,7 +1007,12 @@ class SeatFunctionBridge(object):
self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0],
"HW fan safe off")
- # Heater branch: low level only, bounded to three seconds.
+ # Heater branch: use high level for a short, bounded interval.
+ # The heater PWM is 100 Hz while 0x305 is published every 100 ms;
+ # at low duty those periods can stay phase-aligned on the OFF
+ # portion and hide a healthy load. High duty breaks that sampling
+ # blind spot while the three-second bound keeps the diagnostic
+ # thermally safe.
self.capture(0.5)
heater_baseline = int((self.latest_thermal_current or {}).get(
"heater_raw", 0))
@@ -893,8 +1021,8 @@ class SeatFunctionBridge(object):
"HW heater mode")
self.transmit(0x2AA, [0x01, 0, 0x1B, 0, 0, 0, 0, 0],
"HW heater config")
- self.transmit(0x29E, [0x12, 0, 0x10, 0, 0, 0, 0, 0],
- "HW heater level 1")
+ self.transmit(0x29E, [0x12, 0, 0x30, 0, 0, 0, 0, 0],
+ "HW heater level 3 diagnostic pulse")
self.capture(3.0)
heater_samples = [int(sample.get("raw", 0))
for _, sample in self.heater_current_history
@@ -1005,6 +1133,283 @@ class SeatFunctionBridge(object):
expected_position))
return issues
+ def execute_command_plan(self, request):
+ """Execute a compiler-produced normal seat plan with this CAN owner.
+
+ The web server has already validated the FunctionConfig and CommandPlan.
+ This boundary validates the small physical allow-list again, replaces
+ placeholder motion sequences, and requires ECU acknowledgement plus
+ the matching physical feedback before reporting PASS.
+ """
+ payload = request.get("payload") or {}
+ commands = payload.get("commands") or []
+ operations = payload.get("operations") or []
+ operation_by_id = dict((item.get("id"), item) for item in operations)
+ if not commands or not operations:
+ return "BLOCKED", {"summary": "座椅命令计划为空"}
+
+ allowed_messages = {
+ "T2G_Seat_Move_Command_300": 0x300,
+ "T2G_Seat_Thermal_Control_29E": 0x29E,
+ "T2G_Seat_Thermal_Mode_3CE": 0x3CE,
+ }
+ for command in commands:
+ message = command.get("message")
+ if message not in allowed_messages or \
+ int(command.get("frame_id", -1)) != allowed_messages[message]:
+ return "BLOCKED", {
+ "summary": "桥接拒绝未授权CAN消息 %s" % message,
+ }
+ data = command.get("data") or []
+ if len(data) != 8 or any(int(value) < 0 or int(value) > 255
+ for value in data):
+ return "BLOCKED", {"summary": "%s的CAN数据无效" % message}
+ refs = str(command.get("operation_ref", "")).split(",")
+ if not refs or any(ref not in operation_by_id for ref in refs):
+ return "BLOCKED", {"summary": "%s引用了未知操作" % message}
+
+ self.capture(0.8)
+ if self.latest_system is None:
+ return "BLOCKED", {"summary": "未收到0x301系统反馈"}
+ motion_commands = [
+ command for command in commands
+ if command.get("message") == "T2G_Seat_Move_Command_300" and
+ int((command.get("signals") or {}).get("Opcode", -1)) not in (0x09, 0x0F)
+ ]
+ if motion_commands and not self.stop_all_sync():
+ return "FAIL", {
+ "summary": "自然语言座椅控制前的STOP_ALL无有效ACK",
+ "stop_all_attempted": True,
+ }
+
+ results = []
+ for command in commands:
+ if self.check_emergency():
+ return "STOPPED", {
+ "summary": "座椅控制过程中收到紧急停止",
+ "results": results,
+ "stop_all_attempted": bool(motion_commands),
+ }
+ message = command["message"]
+ refs = str(command["operation_ref"]).split(",")
+ referenced = [operation_by_id[ref] for ref in refs]
+ signals = command.get("signals") or {}
+
+ if message == "T2G_Seat_Thermal_Mode_3CE":
+ data = [int(value) & 0xFF for value in command["data"]]
+ if (data[0] & ~0x30) or any(data[1:]):
+ return "BLOCKED", {"summary": "3CE包含未授权位"}
+ self.transmit(0x3CE, data, command.get("id", "thermal mode"))
+ results.append({
+ "command_id": command.get("id"), "result": "PASS",
+ "summary": "热管理手动模式已下发",
+ })
+ continue
+
+ if message == "T2G_Seat_Thermal_Control_29E":
+ data = [int(value) & 0xFF for value in command["data"]]
+ if (data[0] & ~0x3F) or any(data[index] for index in (1, 3, 4, 5, 6, 7)):
+ return "BLOCKED", {"summary": "29E包含未授权位"}
+ expected = {}
+ for operation in referenced:
+ capability = operation.get("capability")
+ state = (operation.get("parameters") or {}).get("state")
+ level = int((operation.get("parameters") or {}).get("level", 1))
+ raw = 1 if state == "off" else min(level, 3) + 1
+ if capability == "seat.set_ventilation":
+ expected["ventilation"] = raw
+ elif capability == "seat.set_heating":
+ expected["heating"] = raw
+ else:
+ return "BLOCKED", {
+ "summary": "29E引用了非热管理操作 %s" % capability,
+ }
+ self.transmit(0x29E, data, command.get("id", "thermal control"))
+
+ def thermal_predicate(can_id, frame_data):
+ if can_id != 0x4FA or len(frame_data) < 1:
+ return None
+ ventilation = frame_data[0] & 0x07
+ heating = (frame_data[0] >> 3) & 0x07
+ if ("ventilation" in expected and
+ ventilation != expected["ventilation"]):
+ return None
+ if "heating" in expected and heating != expected["heating"]:
+ return None
+ return list(frame_data)
+
+ wait_state, feedback = self.wait(
+ thermal_predicate,
+ max(1.0, float((command.get("completion") or {}).get(
+ "timeout_ms", 3000)) / 1000.0))
+ if wait_state != "OK" or feedback is None:
+ return "FAIL", {
+ "summary": "0x4FA未确认热管理目标",
+ "results": results,
+ "expected": expected,
+ }
+ results.append({
+ "command_id": command.get("id"), "result": "PASS",
+ "summary": "0x4FA已确认热管理目标", "feedback": feedback,
+ })
+ continue
+
+ opcode = int(signals.get("Opcode", -1))
+ motor = int(signals.get("Motor_Selector", -1))
+ direction = int(signals.get("Direction", 0))
+ param_a = int(signals.get("Param_A", 0))
+ param_b = int(signals.get("Param_B", 0))
+ if opcode not in (0x01, 0x03, 0x09, 0x0B, 0x0E, 0x0F) or \
+ motor not in range(4):
+ return "BLOCKED", {
+ "summary": "0x300操作码或电机号未授权:opcode=0x%02X motor=%d" %
+ (opcode, motor),
+ }
+
+ if opcode in (0x01, 0x03) and self.latest_system is not None and \
+ not (self.latest_system["position_valid_mask"] & (1 << motor)):
+ if not payload.get("allow_auto_home", False):
+ return "BLOCKED", {
+ "summary": "M%d位置无效且请求未授权自动归零" % motor,
+ }
+ home_result, home_details = self.execute_initialize_known_ranges({
+ "payload": {"force_all_axes": False},
+ })
+ if home_result != "PASS":
+ return home_result, {
+ "summary": "自然语言控制前自动归零失败:%s" %
+ home_details.get("summary", ""),
+ "auto_home": home_details,
+ }
+
+ completion = command.get("completion") or {}
+ target = int(completion.get("value", param_a))
+ tolerance = max(0, int(completion.get("tolerance", 100)))
+ current = self.latest_motors[motor] or {}
+ already_at_target = (
+ opcode in (0x01, 0x0B) and
+ bool(current.get("position_valid")) and
+ not bool(current.get("active")) and
+ abs(int(current.get("position", -100000)) - target) <= tolerance)
+ if opcode == 0x0B:
+ already_at_target = already_at_target and bool(current.get("near"))
+ if already_at_target:
+ results.append({
+ "command_id": command.get("id"), "result": "PASS",
+ "summary": "M%d已由真实CAN确认处于目标位置,未重复驱动机械端点" % motor,
+ "terminal": current, "motion_skipped": True,
+ "skip_reason": "PHYSICAL_TARGET_ALREADY_CONFIRMED",
+ })
+ continue
+
+ sequence = self.next_sequence()
+ expected_ack = 4 if opcode == 0x09 else 1
+ send_state, acknowledgement = self.send_command(
+ command_payload(opcode, motor, direction, sequence,
+ param_a, param_b),
+ expected_ack, 2.5, command.get("id", "orchestration"))
+ if send_state == "EMERGENCY":
+ return "STOPPED", {"summary": "下发时收到紧急停止"}
+ if send_state != "OK" or acknowledgement is None or \
+ acknowledgement.get("reject") != 0:
+ self.stop_all_sync()
+ return "FAIL", {
+ "summary": "0x300命令未被ECU接受",
+ "command_id": command.get("id"),
+ "acknowledgement": acknowledgement,
+ "stop_all_attempted": True,
+ }
+
+ if opcode == 0x09:
+ results.append({
+ "command_id": command.get("id"), "result": "PASS",
+ "summary": "STOP_ALL已确认",
+ "acknowledgement": acknowledgement,
+ })
+ continue
+
+ if opcode in (0x0E, 0x0F):
+ mode_id = 0 if opcode == 0x0F else param_a
+ accepted_states = set(
+ (command.get("completion") or {}).get("accepted_states", [1, 2]))
+
+ def dynamic_predicate(can_id, frame_data):
+ if can_id != 0x306 or len(frame_data) < 8:
+ return None
+ if opcode == 0x0F:
+ matched = frame_data[0] == 0 and frame_data[1] == 0
+ else:
+ matched = frame_data[0] == mode_id and \
+ frame_data[1] in accepted_states
+ return list(frame_data) if matched else None
+
+ dynamic_state, dynamic_feedback = self.wait(
+ dynamic_predicate,
+ max(1.0, float((command.get("completion") or {}).get(
+ "timeout_ms", 5000)) / 1000.0))
+ if dynamic_state != "OK" or dynamic_feedback is None:
+ self.stop_all_sync()
+ return "FAIL", {
+ "summary": "0x306未确认动态模式状态",
+ "mode_id": mode_id,
+ "stop_all_attempted": True,
+ }
+ results.append({
+ "command_id": command.get("id"), "result": "PASS",
+ "summary": "0x301/0x306已确认动态模式",
+ "feedback": dynamic_feedback,
+ })
+ continue
+
+ timeout_s = max(
+ 1.0, float((command.get("completion") or {}).get(
+ "timeout_ms", POSITION_TIMEOUT_MS)) / 1000.0)
+
+ def motor_predicate(can_id, frame_data):
+ if can_id != 0x302:
+ return None
+ value = parse_302(frame_data)
+ if value is None or value["motor"] != motor or \
+ value["sequence"] != sequence:
+ return None
+ if not value["active"] and value["task"] in (6, 7):
+ return value
+ return None
+
+ motor_state, terminal = self.wait(motor_predicate, timeout_s + 2.0)
+ passed = (motor_state == "OK" and terminal is not None and
+ terminal.get("task") == 6 and
+ terminal.get("result") in (2, 4))
+ if opcode in (0x01, 0x0B):
+ passed = (passed and terminal.get("position_valid") and
+ abs(int(terminal.get("position", -100000)) - target) <=
+ tolerance)
+ if not passed:
+ self.stop_all_sync()
+ return "FAIL", {
+ "summary": "M%d运动反馈未达到目标" % motor,
+ "command_id": command.get("id"),
+ "target": target, "tolerance": tolerance,
+ "terminal": terminal, "stop_all_attempted": True,
+ }
+ results.append({
+ "command_id": command.get("id"), "result": "PASS",
+ "summary": "M%d物理反馈已达到目标" % motor,
+ "terminal": terminal,
+ })
+
+ self.capture(0.3)
+ return "PASS", {
+ "summary": "ZCANPRO共享桥接已完成%d条座椅命令并验证实物反馈" %
+ len(commands),
+ "results": results,
+ "system": self.latest_system,
+ "motors": self.latest_motors,
+ "thermal": self.latest_thermal,
+ "dynamic": self.latest_dynamic,
+ "stop_all_attempted": bool(motion_commands),
+ }
+
def execute_mode(self, request):
payload = request.get("payload") or {}
axes = payload.get("axes") or []
@@ -1174,6 +1579,7 @@ class SeatFunctionBridge(object):
def execute_initialize_known_ranges(self, request):
payload = request.get("payload") or request
force_all_axes = bool(payload.get("force_all_axes", False))
+ home_nonzero_axes = bool(payload.get("home_nonzero_axes", False))
if not self.stop_all_sync():
return "FAIL", {"summary": "基线STOP_ALL无有效ACK"}
if not self.capture(1.2):
@@ -1182,13 +1588,27 @@ class SeatFunctionBridge(object):
self.latest_system["position_valid_mask"]
homed = []
for motor, expected_max in enumerate(CONFIRMED_MAX_HALL):
- if not force_all_axes and (initial_mask & (1 << motor)) != 0:
+ initial_status = self.latest_motors[motor]
+ initial_diag = self.latest_diagnostics[motor]
+ already_zero = bool(
+ initial_status is not None and
+ initial_status.get("position_valid") and
+ initial_status.get("near") and
+ int(initial_status.get("position", 65535)) <= 100 and
+ initial_diag is not None and
+ int(initial_diag.get("hall", 65535)) <= 2)
+ position_valid = (initial_mask & (1 << motor)) != 0
+ should_home = (force_all_axes or not position_valid or
+ (home_nonzero_axes and not already_zero))
+ if not should_home:
homed.append({
"motor": motor,
"result": "ALREADY_VALID_NOT_HOMED",
- "status": self.latest_motors[motor],
- "diagnostic": self.latest_diagnostics[motor],
- "note": "位置记录有效,未执行机械归零",
+ "status": initial_status,
+ "diagnostic": initial_diag,
+ "note": ("位置已有效且处于零位,未重复机械归零" if
+ already_zero else
+ "位置记录有效,未执行机械归零"),
})
continue
if self.check_emergency():
@@ -1196,8 +1616,6 @@ class SeatFunctionBridge(object):
"summary": "回最近端过程中收到紧急停止",
"axes": homed,
}
- initial_status = self.latest_motors[motor]
- initial_diag = self.latest_diagnostics[motor]
initial_current = self.latest_currents[motor]
initial_status = dict(initial_status) \
if initial_status is not None else None
@@ -1210,6 +1628,28 @@ class SeatFunctionBridge(object):
if initial_diag is not None:
observed_halls.append(int(initial_diag["hall"]))
current_peak = initial_current
+ endpoint_departure = None
+ if motor == 3 and (initial_status is None or
+ not initial_status.get("position_valid") or
+ initial_status.get("near") or
+ int(initial_status.get("position", 0)) <= 300):
+ departure_ok, endpoint_departure = \
+ self._depart_legrest_endpoint_for_home()
+ if not departure_ok:
+ self.stop_all_sync()
+ homed.append({
+ "motor": motor,
+ "result": "FAIL",
+ "endpoint_departure": endpoint_departure,
+ "initial_status": initial_status,
+ "initial_diagnostic": initial_diag,
+ "initial_current": initial_current,
+ })
+ return "FAIL", {
+ "summary": endpoint_departure.get(
+ "summary", "M3端点脱离失败"),
+ "axes": homed,
+ }
home_started = time.monotonic()
sequence = self.next_sequence()
state, response = self.send_command(
@@ -1299,6 +1739,7 @@ class SeatFunctionBridge(object):
"initial_status": initial_status,
"initial_diagnostic": initial_diag,
"initial_current": initial_current,
+ "endpoint_departure": endpoint_departure,
"peak_current": current_peak,
"home_elapsed_s": round(time.monotonic() - home_started, 3),
"observed_hall_values": distinct_halls,
@@ -1371,6 +1812,7 @@ class SeatFunctionBridge(object):
"initial_position_valid_mask": initial_mask,
"final_position_valid_mask": final_mask,
"force_all_axes": force_all_axes,
+ "home_nonzero_axes": home_nonzero_axes,
"actually_homed_axes": actually_homed,
"axes": homed,
"range_issues": range_issues,
@@ -1517,10 +1959,17 @@ class SeatFunctionBridge(object):
arm_payload = self._self_heal_hook_payload(
case_index, 0, arm_token)
self.drain()
- self.transmit(SELF_HEAL_HOOK_REQUEST_ID, arm_payload,
- "ARM " + note)
- arm_ack = self._wait_self_heal_hook_response(
- case_index, 0, arm_token, 3.0)
+ arm_ack = None
+ # A controlled watchdog case deliberately makes CAN disappear between
+ # INJECT and REPAIR. Repeat the idempotent ARM exchange while the ECU
+ # reboots instead of classifying that bounded outage as CAN failure.
+ arm_deadline = time.monotonic() + 12.0
+ while arm_ack is None and time.monotonic() < arm_deadline:
+ self.transmit(SELF_HEAL_HOOK_REQUEST_ID, arm_payload,
+ "ARM " + note)
+ arm_ack = self._wait_self_heal_hook_response(
+ case_index, 0, arm_token,
+ min(2.0, max(0.1, arm_deadline - time.monotonic())))
if arm_ack is None or arm_ack["result"] != 0:
return None
if after_arm is not None and not after_arm():
@@ -1579,6 +2028,17 @@ class SeatFunctionBridge(object):
self._publish_healing_progress(
request_id, case_id, "BASELINE", "正常任务持续运行",
prelude_telemetry["bench_reaction"], prelude_telemetry)
+ departure_ok, departure = \
+ self._depart_legrest_endpoint_for_home()
+ base["normal_task_endpoint_departure"] = departure
+ if not departure_ok:
+ self._publish_healing_progress(
+ request_id, case_id, "FAILED", "正常任务未建立",
+ "CRC用例的故障前腿托无法真实离开机械端点,未注入故障",
+ dict(base, request_feedback_match=False))
+ return "FAIL", {
+ "summary": departure.get(
+ "summary", "CRC用例腿托端点脱离失败")}
prelude = self._demo_axis_task(
profile["demo_motor"], profile.get("prelude_delta", 900))
if (prelude is None or
@@ -1590,11 +2050,49 @@ class SeatFunctionBridge(object):
"CRC用例的故障前腿托调整未完成,未注入故障",
dict(base, request_feedback_match=False))
return "FAIL", {"summary": "CRC用例的正常腿托调整未完成"}
- self.capture(1.0)
- if "demo_endpoints" in profile:
+ # The ECU marks SMV8 dirty before motion and only commits the
+ # settled clean record after a 3000 ms quiet period. Injecting
+ # CRC corruption earlier is correctly rejected by the firmware
+ # because there is not yet a saved comfort position to protect.
+ self.capture(3.5)
+ saved_target = int(prelude["target"])
+ self.capture(0.35)
+ current_status = self.latest_motors[profile["demo_motor"]] or {}
+ retreat_start = int(current_status.get(
+ "position", saved_target))
+ retreat_target = max(100, retreat_start - 200)
+ retreat = {
+ "motor": int(profile["demo_motor"]),
+ "start": retreat_start,
+ "target": retreat_target,
+ "sequence": None,
+ "ack": None,
+ }
+ if (not current_status.get("position_valid") or
+ not self._start_demo_axis_task(
+ retreat, "NORMAL TASK leave saved comfort pose") or
+ not self._wait_demo_axis_task(retreat)):
+ self._publish_healing_progress(
+ request_id, case_id, "FAILED", "正常任务未建立",
+ "CRC用例无法从已保存舒适位安全回退,未注入故障",
+ dict(base, request_feedback_match=False))
+ return "FAIL", {"summary": "CRC用例舒适位回退未完成"}
+ # Retreat is another persisted position transaction. Wait
+ # through its clean SMV8 commit before deliberately writing a
+ # higher-sequence corrupt inactive slot; otherwise the ECU
+ # correctly rejects the HIL injection while the store is dirty.
+ self.capture(3.5)
+ demo_task = {
+ "motor": int(profile["demo_motor"]),
+ "start": int(retreat["target"]),
+ "target": saved_target,
+ "sequence": None,
+ "ack": None,
+ }
+ if demo_task is None and "demo_endpoints" in profile:
demo_task = self._demo_axis_far_endpoint_task(
profile["demo_motor"], profile["demo_endpoints"])
- else:
+ elif demo_task is None:
demo_task = self._demo_axis_task(
profile["demo_motor"], profile.get("demo_delta", 2000))
if demo_task is None:
@@ -1662,6 +2160,19 @@ class SeatFunctionBridge(object):
self._publish_healing_progress(
request_id, case_id, "BASELINE", "正常任务持续运行",
fan_running["bench_reaction"], fan_running)
+ self.latest_thermal = None
+ self.transmit(0x2AA, [0x01, 0, 0x1B, 0, 0, 0, 0, 0],
+ "FI-05 normal fan configuration")
+ self.transmit(0x29E, [0x25, 0, 0x02, 0, 0, 0, 0, 0],
+ "FI-05 normal fan gear 2")
+ if self._wait_thermal_feedback(0x0B, 3.0) is None:
+ return False
+ if not self.capture(profile.get("normal_observe_s", 5.5)):
+ return False
+ self.latest_thermal = None
+ self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0],
+ "FI-05 user requested fan off")
+ return self._wait_thermal_feedback(0x09, 3.0) is not None
return True
try:
injection_ack = self._run_self_heal_hook(
@@ -1721,6 +2232,16 @@ class SeatFunctionBridge(object):
"未收到台架故障钩子成功应答,AI拒绝执行修复", fault)
return "FAIL", {
"summary": "0x2F0故障注入没有收到有效0x2F1成功应答"}
+ if case_id == "FI-FIELD-05":
+ reentry_feedback = self._wait_thermal_feedback(0x0B, 3.0)
+ fault["fan_reentry_feedback"] = reentry_feedback
+ if reentry_feedback is None:
+ self._publish_healing_progress(
+ request_id, case_id, "FAILED", "风扇异常重启未建立",
+ "0x2F1已确认注入,但实物0x4FA未出现风扇2挡重入",
+ fault)
+ return "FAIL", {
+ "summary": "风扇重入故障没有形成实物反馈"}
self._publish_healing_progress(
request_id, case_id, "INJECTED", "实物故障已写入",
profile["fault_reaction"], fault)
@@ -1738,6 +2259,15 @@ class SeatFunctionBridge(object):
profile["fault_code"])
if not self.capture(1.2):
return "STOPPED", {"summary": "诊断展示阶段收到紧急停止"}
+ if case_id == "FI-FIELD-06":
+ # The real watchdog upper limit is 3200 ticks. The generic
+ # 1.8 s + 1.2 s display window ends just before expiry, which
+ # can race the repair request against the pending reset. Keep
+ # observing through the actual reboot; ARM below already
+ # retries idempotently while CAN is temporarily absent.
+ if not self.capture(2.0):
+ return "STOPPED", {
+ "summary": "WDT复位观察阶段收到紧急停止"}
repairing = dict(fault)
repairing["repair_action"] = profile["repair"]
@@ -1809,6 +2339,33 @@ class SeatFunctionBridge(object):
profile["index"], 3, 120.0,
"SELF HEAL VERIFY HOOK %s" % case_id)
protection_ok = verify_ack is not None and verify_ack["result"] == 0
+ fan_cycle_evidence = []
+ if protection_ok and case_id == "FI-FIELD-05":
+ for cycle in range(1, 4):
+ self.latest_thermal = None
+ self.transmit(
+ 0x2AA, [0x01, 0, 0x1B, 0, 0, 0, 0, 0],
+ "FI-05 verify cycle %d config" % cycle)
+ self.transmit(
+ 0x29E, [0x25, 0, 0x01, 0, 0, 0, 0, 0],
+ "FI-05 verify cycle %d fan on" % cycle)
+ on_feedback = self._wait_thermal_feedback(0x0A, 3.0)
+ if on_feedback is not None:
+ self.capture(0.8)
+ self.latest_thermal = None
+ self.transmit(
+ 0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0],
+ "FI-05 verify cycle %d fan off" % cycle)
+ off_feedback = self._wait_thermal_feedback(0x09, 3.0)
+ cycle_ok = on_feedback is not None and \
+ off_feedback is not None
+ fan_cycle_evidence.append({
+ "cycle": cycle, "pass": cycle_ok,
+ "on_feedback": on_feedback,
+ "off_feedback": off_feedback,
+ })
+ protection_ok = protection_ok and cycle_ok
+ verifying["fan_stop_cycles"] = fan_cycle_evidence
self.message(
"SAFETY VERIFY %s: %s" %
("PASS" if protection_ok else "FAIL",
@@ -2145,6 +2702,8 @@ class SeatFunctionBridge(object):
if not valid:
result = "BLOCKED"
details = {"summary": "请求已过期或schema无效,未驱动任何输出"}
+ elif request.get("action") == "execute_command_plan":
+ result, details = self.execute_command_plan(request)
elif request.get("action") == "execute_mode":
result, details = self.execute_mode(request)
elif request.get("action") == "execute_thermal":