From 9694a66552d196b456e8a6f11a3bae32913852f3 Mon Sep 17 00:00:00 2001 From: jominki354 Date: Thu, 30 Jul 2026 15:55:32 +0900 Subject: [PATCH] web --- .../web/css/generated/design-system.css | 2 +- .../carrot/web/css/generated/settings.css | 2 +- .../carrot/web/css/generated/tools.css | 2 +- .../carrot/web/generated/asset-manifest.json | 12 +- .../carrot/web/js/generated/drive.js | 39 ++-- .../carrot/web/js/generated/settings.js | 32 ++-- .../carrot/web/js/generated/tools.js | 166 ++++++++++-------- .../web/js/pages/setting_device_render.js | 2 +- .../carrot/web/js/realtime/vision_raw.js | 8 + .../carrot/web/js/translations/en.js | 9 + .../carrot/web/js/translations/ko.js | 9 + .../carrot/web/js/translations/zh.js | 9 + .../drive/contents/vision/hud/data_bridge.js | 36 +++- .../drive/contents/vision/hud/debug.js | 6 + .../drive/contents/vision/hud/index.js | 13 +- .../drive/contents/vision/hud/style.js | 29 +-- .../contents/vision/hud/widgets/lfa_icon.js | 20 ++- .../drive/contents/vision/hud_model.js | 7 +- .../drive/contents/vision/lane_mode.js | 67 +++++++ .../contents/vision/road_overlay_policy.js | 5 +- .../web/src/features/settings/dom_renderer.js | 2 +- .../carrot/web/src/features/settings/risk.js | 2 +- .../features/settings/styles/device_tab.css | 15 +- .../features/settings/styles/item_chrome.css | 7 + .../carrot/web/src/features/tools/index.js | 1 + .../web/src/features/tools/styles/base.css | 10 +- .../web/src/features/tools/styles/main.css | 7 +- .../features/tools/web_settings/components.js | 5 +- .../tools/web_settings/param_selects.js | 129 ++++++++++++++ .../src/features/tools/web_settings/render.js | 2 +- .../src/features/tools/web_settings/schema.js | 32 +++- .../carrot/web/src/ui/primitives/controls.css | 15 +- .../carrot/web/tests/hud_data_bridge.test.mjs | 45 ++++- .../carrot/web/tests/hud_debug.test.mjs | 4 + .../carrot/web/tests/hud_render.test.mjs | 39 +++- .../carrot/web/tests/lane_mode.test.mjs | 70 ++++++++ .../web/tests/settings_render_plan.test.mjs | 4 +- .../carrot/web/tests/settings_risk.test.mjs | 2 +- 38 files changed, 689 insertions(+), 177 deletions(-) create mode 100644 openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/lane_mode.js create mode 100644 openpilot/selfdrive/carrot/web/src/features/tools/web_settings/param_selects.js create mode 100644 openpilot/selfdrive/carrot/web/tests/lane_mode.test.mjs diff --git a/openpilot/selfdrive/carrot/web/css/generated/design-system.css b/openpilot/selfdrive/carrot/web/css/generated/design-system.css index 0c125c9cbe..b825425c06 100644 --- a/openpilot/selfdrive/carrot/web/css/generated/design-system.css +++ b/openpilot/selfdrive/carrot/web/css/generated/design-system.css @@ -1,2 +1,2 @@ /* @generated by web/build.mjs; edit web/src/entries/design_system.css instead. */ -.card{background:var(--md-surface-cont);border:1px solid var(--md-stroke-soft);border-radius:var(--r-md);padding:var(--sp-lg);margin-bottom:var(--sp-lg)}.value-surface{background:var(--md-surface-cont);border:1px solid var(--md-stroke-soft);padding:var(--sp-sm) var(--sp-md);border-radius:var(--control-radius);font-size:var(--fs-body-sm);color:var(--md-on-surface-var)}.c-switch{--switch-w: 52px;--switch-h: 32px;position:relative;display:inline-flex;flex:0 0 var(--switch-w);width:var(--switch-w);height:var(--switch-h);cursor:pointer;-webkit-tap-highlight-color:transparent}.c-switch--sm{--switch-w: 44px;--switch-h: 28px}.c-switch__input{position:absolute;opacity:0;pointer-events:none}.c-switch__track{position:absolute;inset:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 52%,transparent);border-radius:var(--r-round);background:var(--md-surface-cont-h);transition:background var(--motion-quick) var(--ease-standard),border-color var(--motion-quick) var(--ease-standard)}.c-switch__track:after{content:"";position:absolute;top:50%;left:4px;width:calc(var(--switch-h) - 10px);height:calc(var(--switch-h) - 10px);border-radius:var(--r-round);background:var(--md-on-surface-var);box-shadow:var(--shadow-1);transform:translateY(-50%);transition:transform var(--motion-base) var(--ease-standard),background var(--motion-quick) var(--ease-standard)}.c-switch__input:checked+.c-switch__track{border-color:color-mix(in srgb,var(--md-primary) 74%,var(--md-outline-var));background:color-mix(in srgb,var(--md-primary) 80%,var(--md-surface-cont-h))}.c-switch__input:checked+.c-switch__track:after{transform:translate(calc(var(--switch-w) - var(--switch-h)),-50%);background:var(--md-on-primary)}.c-switch__input:focus-visible+.c-switch__track{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.c-switch__input:disabled+.c-switch__track{opacity:var(--state-disabled-opacity)}.c-close{--close-size: 32px;--close-icon: 16px;--close-radius: 10px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:var(--close-size);height:var(--close-size);padding:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 40%,transparent);border-radius:var(--close-radius);background:color-mix(in srgb,var(--md-surface-cont) 82%,#000);color:var(--md-on-surface);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background var(--motion-quick) var(--ease-standard),color var(--motion-quick) var(--ease-standard),border-color var(--motion-quick) var(--ease-standard),transform var(--motion-quick) var(--ease-standard)}.c-close svg{width:var(--close-icon);height:var(--close-icon);display:block}.c-close svg path{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}.c-close:hover{background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont));border-color:color-mix(in srgb,var(--md-primary) 32%,var(--md-outline-var));color:var(--md-on-surface)}.c-close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.c-close:active{transform:scale(.94)}.c-close--sm{--close-size: 26px;--close-icon: 14px;--close-radius: 8px}.btn{padding:10px 20px;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);background:var(--md-surface-cont-h);color:var(--md-on-surface);border-radius:var(--control-radius);cursor:pointer;font-size:var(--fs-label-lg);font-weight:750;min-height:var(--control-min-height);box-sizing:border-box;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease;letter-spacing:.1px}.btn:hover,.btn:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.btn:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-primary));transform:translateY(1px)}.btn.active{border-color:color-mix(in srgb,var(--md-primary) 48%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary);font-weight:850}.smallBtn{padding:var(--sp-sm) var(--sp-md);border-radius:var(--control-radius);border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);background:var(--md-surface-cont-h);color:var(--md-on-surface);cursor:pointer;font-size:var(--fs-label-lg);font-weight:750;min-height:44px;box-sizing:border-box;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease}.smallBtn:hover,.smallBtn:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.smallBtn:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-primary));transform:translateY(1px)}.btn--filled,.smallBtn.btn--filled{background:var(--md-action-filled);border-color:color-mix(in srgb,var(--md-action-filled) 78%,var(--md-outline-var));color:var(--md-on-action-filled)}.btn--danger{color:var(--md-error)}.btn--danger:active{background:var(--md-error-cont);color:var(--md-on-error-cont)}.val{min-width:84px;text-align:center;font-weight:700;font-family:var(--font-mono);color:var(--md-on-surface)}.input-text{flex:1;min-width:200px;padding:var(--sp-md) var(--sp-lg);border-radius:var(--r-md);border:1px solid var(--md-outline-var);background:var(--md-surface-cont);color:var(--md-on-surface);font-size:var(--fs-body-md);font-family:var(--font-mono);box-sizing:border-box;outline:none;transition:border-color .15s}.input-text:focus{border-color:var(--md-primary)}.chip{--chip-font-size: var(--fs-label-sm);--chip-font-weight: 750;--chip-min-height: 22px;--chip-padding-block: 2px;--chip-padding-inline: 10px;display:inline-flex;align-items:center;gap:6px;min-height:var(--chip-min-height);padding:var(--chip-padding-block) var(--chip-padding-inline);border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:var(--r-round);background:color-mix(in srgb,var(--md-surface-cont-h) 80%,var(--md-surface-cont));color:var(--md-on-surface-var);font-size:var(--chip-font-size);font-weight:var(--chip-font-weight);line-height:1;white-space:nowrap}.chip--compact{--chip-font-size: 10px;--chip-font-weight: 820;--chip-min-height: 18px;--chip-padding-block: 0px;--chip-padding-inline: 7px}.chip--accent{border-color:color-mix(in srgb,var(--md-primary) 38%,transparent);background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h));color:color-mix(in srgb,var(--md-primary) 70%,var(--md-on-surface))}.chip--danger{border-color:color-mix(in srgb,var(--md-error) 42%,transparent);background:color-mix(in srgb,var(--md-error) 12%,var(--md-surface-cont-h));color:color-mix(in srgb,var(--md-error) 70%,var(--md-on-surface))}.chip--success{border-color:color-mix(in srgb,var(--md-success) 42%,transparent);background:var(--md-success-cont);color:var(--md-on-success-cont)}.chip--warning{border-color:color-mix(in srgb,var(--md-warning) 42%,transparent);background:var(--md-warning-cont);color:var(--md-on-warning-cont)}.chip--info{border-color:color-mix(in srgb,var(--md-info) 42%,transparent);background:var(--md-info-cont);color:var(--md-on-info-cont)}.app-dialog{position:fixed;top:var(--app-vv-top, 0px);left:0;right:0;height:var(--app-vv-height, 100dvh);z-index:var(--z-modal);display:flex;align-items:center;justify-content:center;padding:var(--sp-lg);pointer-events:none}#appDialog{z-index:calc(var(--z-modal) + 10)}.app-dialog[hidden]{display:none!important}.app-dialog.is-open{pointer-events:auto}.app-dialog__backdrop{position:absolute;inset:0;border:0;padding:0;background:var(--popup-backdrop);opacity:0;backdrop-filter:blur(2px) saturate(106%);-webkit-backdrop-filter:blur(2px) saturate(106%);transition:opacity var(--motion-base) var(--ease-linear)}.app-dialog__sheet{position:relative;z-index:1;width:min(100%,var(--dialog-sheet-width));max-height:var(--dialog-sheet-max-height);display:flex;flex-direction:column;padding:var(--sp-lg);border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--popup-bg);box-shadow:var(--popup-shadow);opacity:0;transform:translateY(14px) scale(.985);transition:opacity var(--motion-base) var(--ease-emphasized),transform var(--motion-medium) var(--ease-emphasized)}.app-dialog.is-open .app-dialog__backdrop,.app-dialog.is-open .app-dialog__sheet{opacity:1;transform:translateY(0) scale(1)}.app-dialog__head{margin-bottom:var(--sp-sm);flex-shrink:0}.app-dialog__title{font-size:var(--fs-title-sm);font-weight:800;color:var(--md-on-surface)}.app-dialog__body{color:var(--md-on-surface-var);font-size:var(--fs-body-md);line-height:1.55;white-space:pre-wrap;word-break:break-word;flex:1 1 auto;min-height:0;overflow-y:auto}.app-dialog__metaList{display:flex;flex-direction:column;gap:var(--sp-sm)}.app-dialog__metaLine{color:var(--md-on-surface-var);font-size:var(--fs-body-md);line-height:1.5}.app-dialog__metaSubtle{margin-top:4px;color:color-mix(in srgb,var(--md-on-surface-var) 82%,var(--md-outline));font-size:12px;line-height:1.45}.app-dialog__metaGroup{display:flex;flex-direction:column;gap:var(--sp-sm);padding-top:var(--sp-xs)}.app-dialog__metaLabel{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.app-dialog__metaCodeList{display:flex;flex-direction:column;gap:var(--sp-xs)}.app-dialog__metaCode{overflow-wrap:anywhere;color:var(--md-on-surface);font:700 var(--fs-label-sm)/1.45 var(--font-mono)}.app-dialog__metaSummary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-sm) var(--sp-lg);color:var(--md-on-surface-var);font-size:var(--fs-label-md)}.app-dialog__metaSummary strong{margin-left:auto;color:var(--md-on-surface);font-weight:850}.app-dialog__uploadBrief{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--sp-md);min-width:0;padding:var(--sp-xs) 0}.app-dialog__uploadBriefCopy,.app-dialog__uploadBriefAmount{display:grid;min-width:0;gap:2px}.app-dialog__uploadBriefTitle{color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:850;line-height:1.35}.app-dialog__uploadBriefKinds,.app-dialog__uploadBriefAmount span{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:750;line-height:1.4}.app-dialog__uploadBriefKinds{overflow-wrap:anywhere}.app-dialog__uploadBriefAmount{justify-items:end;text-align:right;white-space:nowrap}.app-dialog__uploadBriefAmount strong{color:var(--md-on-surface);font-size:var(--fs-title-xs);font-weight:850;line-height:1.2}.app-dialog__metaResultList{display:flex;flex-direction:column;gap:var(--sp-xs)}.app-dialog__metaResult{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md);min-width:0;padding:var(--sp-xs) 0}.app-dialog__metaResult .app-dialog__metaCode{min-width:0}.app-dialog__metaOverflow{padding:var(--sp-xs) 0;color:var(--md-error);font-size:var(--fs-label-sm);font-weight:800}.app-dialog__metaState{flex:0 0 auto;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:850}.app-dialog__metaState[data-tone=success]{color:var(--md-success)}.app-dialog__metaState[data-tone=error]{color:var(--md-error)}.app-dialog--progress .app-dialog__body{flex:0 0 auto;overflow:visible}.app-dialog__choices{--dialog-choice-heading-fg: var(--md-on-surface-var);--dialog-choice-heading-size: var(--fs-label-sm);display:grid;gap:6px;margin-top:var(--sp-md);overflow-y:auto;min-height:0;flex:1 1 auto;padding-right:2px}.app-dialog__choices[hidden]{display:none!important}.app-dialog__choiceBtn{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;padding:0 12px;border-radius:var(--dialog-choice-radius);overflow:hidden;text-overflow:ellipsis;min-height:var(--control-min-height);font-size:var(--fs-label-md);font-weight:800;letter-spacing:0}.app-dialog__choiceBtn.is-current{border-color:color-mix(in srgb,var(--md-primary) 56%,var(--md-stroke-soft));background:color-mix(in srgb,var(--md-surface-cont-hh) 74%,var(--md-primary-state));color:var(--md-on-surface);font-weight:800}.app-dialog__choices--list{gap:var(--sp-sm);padding:0;border:0;background:transparent}.app-dialog__choices--list .app-dialog__choiceGroup{display:flex;flex-direction:column;gap:inherit;min-width:0}.app-dialog__choiceHeading{padding:var(--sp-xs) var(--sp-sm) 0;color:var(--dialog-choice-heading-fg);font-size:var(--dialog-choice-heading-size);font-weight:800;line-height:1.4}.app-dialog__choices--list .app-dialog__choiceBtn--action{justify-content:space-between;text-align:left;white-space:normal;line-height:1.25;min-height:48px;padding:var(--sp-md) var(--sp-lg);border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg);box-shadow:none}.app-dialog__choices--list .app-dialog__choiceBtn--action:hover,.app-dialog__choices--list .app-dialog__choiceBtn--action:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.app-dialog__choices--list .app-dialog__choiceBtn--action:active{transform:translateY(1px)}.app-dialog__choices--list .app-dialog__choiceBtn--action.is-current{border-color:var(--popup-item-active-border);background:var(--popup-item-active-bg);color:var(--md-primary);font-weight:850}.app-dialog__choices--list .app-dialog__choiceBtn--action.is-current:after{content:"";display:block;width:6px;height:11px;margin-left:12px;border-right:2px solid color-mix(in srgb,var(--md-primary) 82%,var(--md-on-surface));border-bottom:2px solid color-mix(in srgb,var(--md-primary) 82%,var(--md-on-surface));transform:rotate(45deg);flex:0 0 auto}.app-dialog__choices--value-grid{grid-template-columns:repeat(var(--app-dialog-choice-columns, 5),minmax(0,1fr));gap:6px}.app-dialog__choices--value-grid .app-dialog__choiceBtn--value{min-height:42px;padding:0 6px;justify-content:center;border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg);text-align:center;white-space:nowrap;font-variant-numeric:tabular-nums}.app-dialog__choices--value-grid .app-dialog__choiceBtn--value:hover,.app-dialog__choices--value-grid .app-dialog__choiceBtn--value:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--popup-item-bg) 90%,var(--md-primary));outline:none}.app-dialog__choices--value-grid .app-dialog__choiceBtn--value.is-current{border-color:var(--popup-item-active-border);background:var(--popup-item-active-bg);color:var(--md-primary);font-weight:850}.app-dialog__inputWrap{margin-top:var(--sp-md)}.app-dialog__inputWrap[hidden]{display:none!important}.app-dialog__input{width:100%;min-width:0}.app-dialog__actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-top:var(--sp-md);flex-shrink:0}.app-dialog__actions .smallBtn,.app-dialog__actions .btn{border-radius:var(--dialog-control-radius)}.app-dialog--choice-grid .app-dialog__sheet,.app-dialog--choice-value-grid .app-dialog__sheet{width:min(100%,var(--dialog-sheet-width));max-height:min(82dvh,640px);padding:var(--sp-lg)}.app-dialog--choice-grid .app-dialog__body,.app-dialog--choice-value-grid .app-dialog__body{flex:0 0 auto;font-size:var(--fs-label-sm);line-height:1.4}#appDialogConfirm.btn--filled{background:var(--md-action-filled);border-color:color-mix(in srgb,var(--md-action-filled) 78%,var(--md-outline-var));color:var(--md-on-action-filled);box-shadow:none}#appDialogConfirm.btn--filled:hover,#appDialogConfirm.btn--filled:focus-visible{background:color-mix(in srgb,var(--md-action-filled) 88%,#fff);border-color:color-mix(in srgb,var(--md-action-filled) 84%,var(--md-outline-var));color:var(--md-on-action-filled)}#appDialogConfirm.btn--filled:active{background:color-mix(in srgb,var(--md-action-filled) 86%,#2a1204)}@media(max-width:640px)and (not (min-aspect-ratio:13/10)){.app-dialog{align-items:center;padding:calc(12px + env(safe-area-inset-top,0px)) 8px calc(12px + env(safe-area-inset-bottom,0px))}.app-dialog__sheet{width:calc(100vw - 16px);max-height:var(--dialog-sheet-mobile-max-height);padding:14px;border-radius:var(--dialog-sheet-radius-mobile);transform:translateY(10px) scale(.985)}.app-dialog__head{margin-bottom:6px}.app-dialog__title{font-size:var(--fs-title-xs)}.app-dialog__body{font-size:var(--fs-body-sm)}.app-dialog__choiceBtn{min-height:42px}.app-dialog__choiceBtn--value{min-height:40px}}.app-dialog--form .app-dialog__body[hidden]{display:none!important}.app-dialog--form .app-dialog__inputWrap{display:grid;gap:var(--sp-xs);margin-top:var(--sp-sm)}.app-dialog--input{align-items:center}html[data-kb-open="1"] .app-dialog--input{align-items:flex-end;padding-bottom:calc(var(--kb-gap) + var(--kb-inset) + env(safe-area-inset-bottom,0px))}.app-dialog__inputError{color:var(--md-error);font-size:var(--fs-label-sm);line-height:1.35;overflow-wrap:anywhere}.app-dialog__inputError[hidden]{display:none!important}.app-progress{display:grid;gap:var(--sp-md)}.app-progress__header{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-md);min-width:0}.app-progress__message{min-width:0;color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:800;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.app-progress__value{flex:0 0 auto;color:var(--md-primary);font-size:var(--fs-title-xs);font-weight:900;font-variant-numeric:tabular-nums}.app-progress__track{display:block;width:100%;min-width:0;height:10px;overflow:hidden;appearance:none;-webkit-appearance:none;box-sizing:border-box;border:0;border-radius:var(--r-round);background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-primary) 18%,transparent)}.app-progress__track::-webkit-progress-bar{border-radius:inherit;background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h))}.app-progress__track::-webkit-progress-value{border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--md-primary) 76%,var(--md-action-filled)),var(--md-primary));box-shadow:0 0 8px color-mix(in srgb,var(--md-primary) 62%,transparent);transition:width var(--motion-medium) var(--ease-linear)}.app-progress__track::-moz-progress-bar{border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--md-primary) 76%,var(--md-action-filled)),var(--md-primary));box-shadow:0 0 8px color-mix(in srgb,var(--md-primary) 62%,transparent);transition:width var(--motion-medium) var(--ease-linear)}.app-progress__track:indeterminate{background:linear-gradient(90deg,transparent 0 22%,var(--md-primary) 40% 60%,transparent 78% 100%) 0 0 / 220% 100% no-repeat,color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h));animation:app-progress-indeterminate 1.05s var(--ease-linear) infinite}.app-progress__summary{color:var(--md-on-surface-var);font-size:var(--fs-label-md);font-weight:750;font-variant-numeric:tabular-nums}@keyframes app-progress-indeterminate{0%{background-position:100% 0,0 0}to{background-position:-100% 0,0 0}}@media(prefers-reduced-motion:reduce){.app-progress__track::-webkit-progress-value,.app-progress__track::-moz-progress-bar{transition:none}.app-progress__track:indeterminate{animation:none;background-position:50% 0,0 0}}.ui-dropdown-menu{position:relative;display:inline-flex;align-items:center;justify-content:flex-end}.ui-dropdown-menu__button{appearance:none;-webkit-appearance:none;min-width:var(--menu-trigger-size);min-height:var(--menu-trigger-size);border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:8px;background:var(--md-surface-cont);color:var(--md-on-surface);display:inline-flex;align-items:center;justify-content:center;gap:6px;cursor:pointer;font:inherit;font-size:13px;font-weight:800;line-height:1;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease}.ui-menu-icon{width:var(--menu-icon-size);height:var(--menu-icon-size);flex:0 0 var(--menu-icon-size);display:inline-flex;flex-direction:column;align-items:stretch;justify-content:center;gap:var(--menu-icon-line-gap);color:currentColor;pointer-events:none}.ui-menu-icon__line{display:block;width:100%;height:var(--menu-icon-line-height);border-radius:var(--r-round);background:currentColor}.ui-dropdown-menu__button:hover,.ui-dropdown-menu__button:focus-visible,.ui-dropdown-menu.is-open .ui-dropdown-menu__button{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.ui-dropdown-menu__button:active{transform:translateY(1px)}.ui-dropdown-menu__panel{min-width:156px;display:grid;gap:6px;padding:var(--sp-sm);border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--popup-bg);color:var(--md-on-surface);box-shadow:var(--popup-shadow)}.ui-dropdown-menu__panel[hidden]{display:none!important}.ui-dropdown-menu__item{width:100%;min-height:40px;padding:0 12px;border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg);color:var(--md-on-surface);display:flex;align-items:center;justify-content:flex-start;gap:8px;font:inherit;font-size:13px;font-weight:800;text-align:left;cursor:pointer;transition:background .14s ease,color .14s ease}.ui-dropdown-menu__item:hover,.ui-dropdown-menu__item:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--popup-item-bg) 90%,var(--md-primary));color:var(--md-on-surface);outline:none}.ui-popover{position:relative}.ui-popover__panel{min-width:156px;padding:var(--sp-sm) var(--sp-md);border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--popup-bg);color:var(--md-on-surface);box-shadow:var(--popup-shadow)}.ui-popover__panel[hidden]{display:none!important}.ui-popover__text{display:block;color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:750;line-height:1.4;overflow-wrap:anywhere}.app-toast-host{position:fixed;left:var(--sp-lg);right:var(--sp-lg);bottom:calc(var(--nav-bar-height) + 18px + env(safe-area-inset-bottom,0px));z-index:var(--z-toast);display:flex;flex-direction:column;align-items:center;gap:var(--sp-sm);pointer-events:none}body[data-page=terminal] .app-toast-host{top:auto;bottom:var(--terminal-toast-bottom, calc(var(--nav-bar-height) + 96px + env(safe-area-inset-bottom, 0px)));left:var(--terminal-toast-left, var(--sp-lg));right:auto;width:var(--terminal-toast-width, calc(100vw - (var(--sp-lg) * 2)));z-index:calc(var(--z-toast) - 2)}.app-toast{display:flex;align-items:center;gap:12px;width:min(100%,440px);padding:14px 18px;border:1px solid var(--toast-border);border-radius:var(--toast-radius);background:var(--toast-bg);color:var(--toast-fg);box-shadow:var(--toast-shadow);font-size:15px;font-weight:600;line-height:1.45;opacity:0;transform:translateY(16px);transition:opacity .2s ease,transform .26s cubic-bezier(.2,0,0,1)}.app-toast.is-visible{opacity:1;transform:translateY(0)}.app-toast__icon{flex:none;width:var(--toast-icon-size);height:var(--toast-icon-size);border-radius:50%;display:grid;place-items:center;background:var(--toast-icon-default);color:var(--toast-icon-fg);font:900 14px/1 system-ui,sans-serif}.app-toast__msg{flex:1;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere}.app-toast.is-info .app-toast__icon{background:var(--toast-icon-info)}.app-toast.is-success .app-toast__icon{background:var(--toast-icon-success)}.app-toast.is-warn .app-toast__icon{background:var(--toast-icon-warn)}.app-toast.is-error .app-toast__icon{background:var(--toast-icon-error)}.c-state-surface{--state-surface-text: var(--md-on-surface);--state-surface-feature-color: var(--md-on-surface);--state-surface-title-color: color-mix(in srgb, var(--md-on-surface-var) 82%, var(--md-surface));--state-surface-description-color: color-mix(in srgb, var(--md-on-surface-var) 78%, transparent);--state-surface-font-weight: 700;--state-surface-overlay-bg: color-mix(in srgb, var(--md-surface) 84%, var(--drive-workspace-bg));--state-surface-max-width: 42ch;--state-surface-feature-size-min: 30px;--state-surface-feature-size-max: 50px;--state-surface-title-size-min: 34px;--state-surface-title-size-max: 58px;--state-surface-description-size: 14px;--state-surface-copy-gap: var(--sp-sm);--state-surface-action-gap: var(--sp-lg);--state-surface-action-row-gap: var(--sp-sm);--state-surface-action-min-height: 46px;--state-surface-action-max-width: 280px;--state-surface-action-font-size: 16px;--state-surface-secondary-bg: color-mix(in srgb, var(--md-surface-cont-h) 86%, transparent);--state-surface-status-accent: var(--md-outline-var);--state-surface-fog-neutral: color-mix(in srgb, var(--md-on-surface-var) 7%, transparent);--state-surface-fog-accent: color-mix(in srgb, var(--md-primary) 8%, transparent);--state-surface-fog-blur: 64px;--state-surface-fog-duration: 14s;--state-surface-fog-start-opacity: .62;--state-surface-fog-active-opacity: 1;position:absolute;z-index:var(--drive-layer-overlay);isolation:isolate;inset:0;display:grid;min-width:0;min-height:0;container-type:inline-size;place-items:safe center;padding:clamp(var(--sp-md),4cqi,var(--sp-2xl));overflow:auto;overscroll-behavior:contain;background:var(--state-surface-overlay-bg);color:var(--state-surface-text);pointer-events:auto}.c-state-surface:before,.c-state-surface:after{position:absolute;border-radius:var(--r-round);content:"";filter:blur(var(--state-surface-fog-blur));opacity:var(--state-surface-fog-active-opacity);pointer-events:none;will-change:opacity,transform}.c-state-surface:before{inset:6% 12%;background:var(--state-surface-fog-neutral);animation:state-surface-fog-neutral var(--state-surface-fog-duration) var(--ease-standard) infinite alternate}.c-state-surface:after{right:22%;bottom:18%;width:24%;height:30%;background:var(--state-surface-fog-accent);animation:state-surface-fog-accent var(--state-surface-fog-duration) var(--ease-standard) infinite alternate-reverse}.c-state-surface[hidden]{display:none!important}.c-state-surface--info{--state-surface-status-accent: var(--md-info)}.c-state-surface--warning{--state-surface-status-accent: var(--md-warning)}.c-state-surface--error{--state-surface-status-accent: var(--md-error)}.c-state-surface__body{position:relative;z-index:1;display:grid;width:min(100%,var(--state-surface-max-width));margin-block:auto;place-items:center;gap:var(--state-surface-action-gap);text-align:center}.c-state-surface__copy{display:grid;min-width:0;place-items:center;gap:var(--state-surface-copy-gap)}.c-state-surface__feature,.c-state-surface__title,.c-state-surface__description{max-inline-size:100%;margin:0;overflow-wrap:anywhere;text-wrap:balance;word-break:keep-all}.c-state-surface__feature,.c-state-surface__title{font-weight:var(--state-surface-font-weight)}.c-state-surface__feature{color:var(--state-surface-feature-color);font-size:clamp(var(--state-surface-feature-size-min),5cqi,var(--state-surface-feature-size-max));line-height:1.06;letter-spacing:-.05em}.c-state-surface__title{color:var(--state-surface-title-color);font-size:clamp(var(--state-surface-title-size-min),6.5cqi,var(--state-surface-title-size-max));line-height:1.02;letter-spacing:-.055em}.c-state-surface__description{color:var(--state-surface-description-color);font-size:var(--state-surface-description-size);font-weight:650;line-height:1.4}.c-state-surface__actions{display:grid;width:min(100%,var(--state-surface-action-max-width));grid-template-columns:minmax(0,1fr);gap:var(--state-surface-action-row-gap)}.c-state-surface__actions[data-layout=single]{grid-template-columns:minmax(0,1fr)}.c-state-surface__actions[data-layout=split]{grid-template-columns:repeat(2,minmax(0,1fr))}.c-state-surface__action{width:100%;min-width:0;min-height:var(--state-surface-action-min-height);margin:0;padding-inline:var(--sp-lg);overflow:hidden;font-size:var(--state-surface-action-font-size);text-overflow:ellipsis;white-space:nowrap}.c-state-surface__action--primary,.c-state-surface__action:where([data-tone=primary]){background:var(--md-action-filled);border-color:color-mix(in srgb,var(--md-action-filled) 78%,var(--md-outline-var));color:var(--md-on-action-filled)}.c-state-surface__action--secondary,.c-state-surface__action:where([data-tone=secondary]){background:var(--state-surface-secondary-bg);color:var(--state-surface-text)}.c-state-surface__action--danger,.c-state-surface__action:where([data-tone=danger]){border-color:color-mix(in srgb,var(--md-error) 54%,var(--md-outline-var));background:var(--md-error-cont);color:var(--md-on-error-cont)}.c-state-surface__action:disabled{opacity:var(--state-disabled-opacity);cursor:not-allowed}.c-state-surface[data-pending=true] .c-state-surface__action:disabled{cursor:wait}.c-state-surface--compact{place-items:start center;padding:var(--sp-sm);overflow:visible;background:transparent;pointer-events:none}.c-state-surface--compact:before,.c-state-surface--compact:after{display:none}.c-state-surface--compact .c-state-surface__body{width:min(100%,560px);margin:0;padding:10px 14px;place-items:stretch;gap:var(--sp-sm);border:1px solid color-mix(in srgb,var(--state-surface-status-accent) 54%,var(--md-outline-var));border-left-width:3px;border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont-h) 94%,transparent);box-shadow:0 8px 24px #00000052;text-align:left;pointer-events:auto}.c-state-surface--compact .c-state-surface__copy{place-items:start;gap:2px}.c-state-surface--compact .c-state-surface__feature{font-size:12px;line-height:1.25;letter-spacing:0}.c-state-surface--compact .c-state-surface__title{font-size:15px;line-height:1.3;letter-spacing:-.02em}.c-state-surface--compact .c-state-surface__description{font-size:12px;font-weight:650;line-height:1.35}.c-state-surface--compact .c-state-surface__feature,.c-state-surface--compact .c-state-surface__title,.c-state-surface--compact .c-state-surface__description{max-inline-size:100%;overflow-wrap:anywhere;text-wrap:pretty}.c-state-surface--compact .c-state-surface__actions{width:100%;max-width:none;pointer-events:auto}@keyframes state-surface-fog-neutral{0%{opacity:var(--state-surface-fog-start-opacity);transform:translate(-4%,3%) scale(.9)}to{opacity:var(--state-surface-fog-active-opacity);transform:translate(4%,-3%) scale(1.08)}}@keyframes state-surface-fog-accent{0%{transform:translate(8%,6%) scale(.88)}to{transform:translate(-8%,-6%) scale(1.12)}}@media(prefers-reduced-motion:reduce){.c-state-surface:before,.c-state-surface:after{animation:none;will-change:auto}}@media(prefers-contrast:more){.c-state-surface{--state-surface-title-color: var(--md-on-surface);--state-surface-fog-start-opacity: .3;--state-surface-fog-active-opacity: .42}}.c-segmented-control{--segmented-control-gap: var(--sp-xs);--segmented-control-padding: 0;--segmented-control-item-min-height: var(--control-min-height);--segmented-control-item-padding: var(--sp-sm) var(--sp-md);--segmented-control-item-flex: 1 0 max-content;--segmented-control-item-font-size: inherit;--segmented-control-item-font-weight: 750;--segmented-control-item-radius: var(--control-radius);--segmented-control-item-border: color-mix(in srgb, var(--md-outline-var) 46%, transparent);--segmented-control-item-bg: var(--md-surface-cont-h);--segmented-control-item-fg: var(--md-on-surface-var);--segmented-control-selected-border: var(--md-outline);--segmented-control-selected-bg: var(--md-surface-cont-hh);--segmented-control-selected-fg: var(--md-on-surface);--segmented-control-hover-border: var(--segmented-control-selected-border);--segmented-control-hover-fg: var(--segmented-control-selected-fg);display:flex;width:100%;min-width:0;max-width:100%;gap:var(--segmented-control-gap);padding:var(--segmented-control-padding);overflow-x:auto;overflow-y:hidden;overscroll-behavior-inline:contain;scrollbar-width:thin;-webkit-overflow-scrolling:touch}.c-segmented-control__item{appearance:none;flex:var(--segmented-control-item-flex);min-width:0;min-height:var(--segmented-control-item-min-height);padding:var(--segmented-control-item-padding);border:1px solid var(--segmented-control-item-border);border-radius:var(--segmented-control-item-radius);background:var(--segmented-control-item-bg);color:var(--segmented-control-item-fg);font:inherit;font-size:var(--segmented-control-item-font-size);font-weight:var(--segmented-control-item-font-weight);line-height:1;text-align:center;white-space:nowrap;cursor:pointer}.c-segmented-control__item:hover{border-color:var(--segmented-control-hover-border);color:var(--segmented-control-hover-fg)}.c-segmented-control__item:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.c-segmented-control__item[aria-selected=true],.c-segmented-control__item[aria-pressed=true],.c-segmented-control__item.is-active,.c-segmented-control__item.is-selected{border-color:var(--segmented-control-selected-border);background:var(--segmented-control-selected-bg);color:var(--segmented-control-selected-fg)}.c-segmented-control__item:disabled,.c-segmented-control__item[aria-disabled=true]{opacity:var(--state-disabled-opacity);cursor:not-allowed;pointer-events:none}.c-segmented-control--equal{--segmented-control-item-flex: 1 1 0}.c-segmented-control--equal>.c-segmented-control__item{min-inline-size:0}.c-segmented-control__label{min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} +.card{background:var(--md-surface-cont);border:1px solid var(--md-stroke-soft);border-radius:var(--r-md);padding:var(--sp-lg);margin-bottom:var(--sp-lg)}.value-surface{background:var(--md-surface-cont);border:1px solid var(--md-stroke-soft);padding:var(--sp-sm) var(--sp-md);border-radius:var(--control-radius);font-size:var(--fs-body-sm);color:var(--md-on-surface-var)}:root{--control-switch-width: 52px;--control-switch-height: 32px;--control-switch-sm-width: 44px;--control-switch-sm-height: 28px}.c-switch{--switch-w: var(--control-switch-width);--switch-h: var(--control-switch-height);position:relative;display:inline-flex;flex:0 0 var(--switch-w);width:var(--switch-w);height:var(--switch-h);cursor:pointer;-webkit-tap-highlight-color:transparent}.c-switch--sm{--switch-w: var(--control-switch-sm-width);--switch-h: var(--control-switch-sm-height)}.c-switch__input{position:absolute;opacity:0;pointer-events:none}.c-switch__track{position:absolute;inset:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 52%,transparent);border-radius:var(--r-round);background:var(--md-surface-cont-h);transition:background var(--motion-quick) var(--ease-standard),border-color var(--motion-quick) var(--ease-standard)}.c-switch__track:after{content:"";position:absolute;top:50%;left:4px;width:calc(var(--switch-h) - 10px);height:calc(var(--switch-h) - 10px);border-radius:var(--r-round);background:var(--md-on-surface-var);box-shadow:var(--shadow-1);transform:translateY(-50%);transition:transform var(--motion-base) var(--ease-standard),background var(--motion-quick) var(--ease-standard)}.c-switch__input:checked+.c-switch__track{border-color:color-mix(in srgb,var(--md-primary) 74%,var(--md-outline-var));background:color-mix(in srgb,var(--md-primary) 80%,var(--md-surface-cont-h))}.c-switch__input:checked+.c-switch__track:after{transform:translate(calc(var(--switch-w) - var(--switch-h)),-50%);background:var(--md-on-primary)}.c-switch__input:focus-visible+.c-switch__track{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.c-switch__input:disabled+.c-switch__track{opacity:var(--state-disabled-opacity)}.c-close{--close-size: 32px;--close-icon: 16px;--close-radius: 10px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:var(--close-size);height:var(--close-size);padding:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 40%,transparent);border-radius:var(--close-radius);background:color-mix(in srgb,var(--md-surface-cont) 82%,#000);color:var(--md-on-surface);cursor:pointer;-webkit-tap-highlight-color:transparent;transition:background var(--motion-quick) var(--ease-standard),color var(--motion-quick) var(--ease-standard),border-color var(--motion-quick) var(--ease-standard),transform var(--motion-quick) var(--ease-standard)}.c-close svg{width:var(--close-icon);height:var(--close-icon);display:block}.c-close svg path{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}.c-close:hover{background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont));border-color:color-mix(in srgb,var(--md-primary) 32%,var(--md-outline-var));color:var(--md-on-surface)}.c-close:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.c-close:active{transform:scale(.94)}.c-close--sm{--close-size: 26px;--close-icon: 14px;--close-radius: 8px}.btn{padding:10px 20px;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);background:var(--md-surface-cont-h);color:var(--md-on-surface);border-radius:var(--control-radius);cursor:pointer;font-size:var(--fs-label-lg);font-weight:750;min-height:var(--control-min-height);box-sizing:border-box;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease;letter-spacing:.1px}.btn:hover,.btn:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.btn:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-primary));transform:translateY(1px)}.btn.active{border-color:color-mix(in srgb,var(--md-primary) 48%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary);font-weight:850}.smallBtn{padding:var(--sp-sm) var(--sp-md);border-radius:var(--control-radius);border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);background:var(--md-surface-cont-h);color:var(--md-on-surface);cursor:pointer;font-size:var(--fs-label-lg);font-weight:750;min-height:44px;box-sizing:border-box;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease}.smallBtn:hover,.smallBtn:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.smallBtn:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-primary));transform:translateY(1px)}.btn--filled,.smallBtn.btn--filled{background:var(--md-action-filled);border-color:color-mix(in srgb,var(--md-action-filled) 78%,var(--md-outline-var));color:var(--md-on-action-filled)}.btn--danger{color:var(--md-error)}.btn--danger:active{background:var(--md-error-cont);color:var(--md-on-error-cont)}.val{min-width:84px;text-align:center;font-weight:700;font-family:var(--font-mono);color:var(--md-on-surface)}.input-text{flex:1;min-width:200px;padding:var(--sp-md) var(--sp-lg);border-radius:var(--r-md);border:1px solid var(--md-outline-var);background:var(--md-surface-cont);color:var(--md-on-surface);font-size:var(--fs-body-md);font-family:var(--font-mono);box-sizing:border-box;outline:none;transition:border-color .15s}.input-text:focus{border-color:var(--md-primary)}.chip{--chip-font-size: var(--fs-label-sm);--chip-font-weight: 750;--chip-min-height: 22px;--chip-padding-block: 2px;--chip-padding-inline: 10px;display:inline-flex;align-items:center;gap:6px;min-height:var(--chip-min-height);padding:var(--chip-padding-block) var(--chip-padding-inline);border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:var(--r-round);background:color-mix(in srgb,var(--md-surface-cont-h) 80%,var(--md-surface-cont));color:var(--md-on-surface-var);font-size:var(--chip-font-size);font-weight:var(--chip-font-weight);line-height:1;white-space:nowrap}.chip--compact{--chip-font-size: 10px;--chip-font-weight: 820;--chip-min-height: 18px;--chip-padding-block: 0px;--chip-padding-inline: 7px}.chip--accent{border-color:color-mix(in srgb,var(--md-primary) 38%,transparent);background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h));color:color-mix(in srgb,var(--md-primary) 70%,var(--md-on-surface))}.chip--danger{border-color:color-mix(in srgb,var(--md-error) 42%,transparent);background:color-mix(in srgb,var(--md-error) 12%,var(--md-surface-cont-h));color:color-mix(in srgb,var(--md-error) 70%,var(--md-on-surface))}.chip--success{border-color:color-mix(in srgb,var(--md-success) 42%,transparent);background:var(--md-success-cont);color:var(--md-on-success-cont)}.chip--warning{border-color:color-mix(in srgb,var(--md-warning) 42%,transparent);background:var(--md-warning-cont);color:var(--md-on-warning-cont)}.chip--info{border-color:color-mix(in srgb,var(--md-info) 42%,transparent);background:var(--md-info-cont);color:var(--md-on-info-cont)}.app-dialog{position:fixed;top:var(--app-vv-top, 0px);left:0;right:0;height:var(--app-vv-height, 100dvh);z-index:var(--z-modal);display:flex;align-items:center;justify-content:center;padding:var(--sp-lg);pointer-events:none}#appDialog{z-index:calc(var(--z-modal) + 10)}.app-dialog[hidden]{display:none!important}.app-dialog.is-open{pointer-events:auto}.app-dialog__backdrop{position:absolute;inset:0;border:0;padding:0;background:var(--popup-backdrop);opacity:0;backdrop-filter:blur(2px) saturate(106%);-webkit-backdrop-filter:blur(2px) saturate(106%);transition:opacity var(--motion-base) var(--ease-linear)}.app-dialog__sheet{position:relative;z-index:1;width:min(100%,var(--dialog-sheet-width));max-height:var(--dialog-sheet-max-height);display:flex;flex-direction:column;padding:var(--sp-lg);border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--popup-bg);box-shadow:var(--popup-shadow);opacity:0;transform:translateY(14px) scale(.985);transition:opacity var(--motion-base) var(--ease-emphasized),transform var(--motion-medium) var(--ease-emphasized)}.app-dialog.is-open .app-dialog__backdrop,.app-dialog.is-open .app-dialog__sheet{opacity:1;transform:translateY(0) scale(1)}.app-dialog__head{margin-bottom:var(--sp-sm);flex-shrink:0}.app-dialog__title{font-size:var(--fs-title-sm);font-weight:800;color:var(--md-on-surface)}.app-dialog__body{color:var(--md-on-surface-var);font-size:var(--fs-body-md);line-height:1.55;white-space:pre-wrap;word-break:break-word;flex:1 1 auto;min-height:0;overflow-y:auto}.app-dialog__metaList{display:flex;flex-direction:column;gap:var(--sp-sm)}.app-dialog__metaLine{color:var(--md-on-surface-var);font-size:var(--fs-body-md);line-height:1.5}.app-dialog__metaSubtle{margin-top:4px;color:color-mix(in srgb,var(--md-on-surface-var) 82%,var(--md-outline));font-size:12px;line-height:1.45}.app-dialog__metaGroup{display:flex;flex-direction:column;gap:var(--sp-sm);padding-top:var(--sp-xs)}.app-dialog__metaLabel{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.app-dialog__metaCodeList{display:flex;flex-direction:column;gap:var(--sp-xs)}.app-dialog__metaCode{overflow-wrap:anywhere;color:var(--md-on-surface);font:700 var(--fs-label-sm)/1.45 var(--font-mono)}.app-dialog__metaSummary{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-sm) var(--sp-lg);color:var(--md-on-surface-var);font-size:var(--fs-label-md)}.app-dialog__metaSummary strong{margin-left:auto;color:var(--md-on-surface);font-weight:850}.app-dialog__uploadBrief{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--sp-md);min-width:0;padding:var(--sp-xs) 0}.app-dialog__uploadBriefCopy,.app-dialog__uploadBriefAmount{display:grid;min-width:0;gap:2px}.app-dialog__uploadBriefTitle{color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:850;line-height:1.35}.app-dialog__uploadBriefKinds,.app-dialog__uploadBriefAmount span{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:750;line-height:1.4}.app-dialog__uploadBriefKinds{overflow-wrap:anywhere}.app-dialog__uploadBriefAmount{justify-items:end;text-align:right;white-space:nowrap}.app-dialog__uploadBriefAmount strong{color:var(--md-on-surface);font-size:var(--fs-title-xs);font-weight:850;line-height:1.2}.app-dialog__metaResultList{display:flex;flex-direction:column;gap:var(--sp-xs)}.app-dialog__metaResult{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md);min-width:0;padding:var(--sp-xs) 0}.app-dialog__metaResult .app-dialog__metaCode{min-width:0}.app-dialog__metaOverflow{padding:var(--sp-xs) 0;color:var(--md-error);font-size:var(--fs-label-sm);font-weight:800}.app-dialog__metaState{flex:0 0 auto;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:850}.app-dialog__metaState[data-tone=success]{color:var(--md-success)}.app-dialog__metaState[data-tone=error]{color:var(--md-error)}.app-dialog--progress .app-dialog__body{flex:0 0 auto;overflow:visible}.app-dialog__choices{--dialog-choice-heading-fg: var(--md-on-surface-var);--dialog-choice-heading-size: var(--fs-label-sm);display:grid;gap:6px;margin-top:var(--sp-md);overflow-y:auto;min-height:0;flex:1 1 auto;padding-right:2px}.app-dialog__choices[hidden]{display:none!important}.app-dialog__choiceBtn{display:inline-flex;align-items:center;justify-content:center;width:100%;min-width:0;padding:0 12px;border-radius:var(--dialog-choice-radius);overflow:hidden;text-overflow:ellipsis;min-height:var(--control-min-height);font-size:var(--fs-label-md);font-weight:800;letter-spacing:0}.app-dialog__choiceBtn.is-current{border-color:color-mix(in srgb,var(--md-primary) 56%,var(--md-stroke-soft));background:color-mix(in srgb,var(--md-surface-cont-hh) 74%,var(--md-primary-state));color:var(--md-on-surface);font-weight:800}.app-dialog__choices--list{gap:var(--sp-sm);padding:0;border:0;background:transparent}.app-dialog__choices--list .app-dialog__choiceGroup{display:flex;flex-direction:column;gap:inherit;min-width:0}.app-dialog__choiceHeading{padding:var(--sp-xs) var(--sp-sm) 0;color:var(--dialog-choice-heading-fg);font-size:var(--dialog-choice-heading-size);font-weight:800;line-height:1.4}.app-dialog__choices--list .app-dialog__choiceBtn--action{justify-content:space-between;text-align:left;white-space:normal;line-height:1.25;min-height:48px;padding:var(--sp-md) var(--sp-lg);border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg);box-shadow:none}.app-dialog__choices--list .app-dialog__choiceBtn--action:hover,.app-dialog__choices--list .app-dialog__choiceBtn--action:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.app-dialog__choices--list .app-dialog__choiceBtn--action:active{transform:translateY(1px)}.app-dialog__choices--list .app-dialog__choiceBtn--action.is-current{border-color:var(--popup-item-active-border);background:var(--popup-item-active-bg);color:var(--md-primary);font-weight:850}.app-dialog__choices--list .app-dialog__choiceBtn--action.is-current:after{content:"";display:block;width:6px;height:11px;margin-left:12px;border-right:2px solid color-mix(in srgb,var(--md-primary) 82%,var(--md-on-surface));border-bottom:2px solid color-mix(in srgb,var(--md-primary) 82%,var(--md-on-surface));transform:rotate(45deg);flex:0 0 auto}.app-dialog__choices--value-grid{grid-template-columns:repeat(var(--app-dialog-choice-columns, 5),minmax(0,1fr));gap:6px}.app-dialog__choices--value-grid .app-dialog__choiceBtn--value{min-height:42px;padding:0 6px;justify-content:center;border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg);text-align:center;white-space:nowrap;font-variant-numeric:tabular-nums}.app-dialog__choices--value-grid .app-dialog__choiceBtn--value:hover,.app-dialog__choices--value-grid .app-dialog__choiceBtn--value:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--popup-item-bg) 90%,var(--md-primary));outline:none}.app-dialog__choices--value-grid .app-dialog__choiceBtn--value.is-current{border-color:var(--popup-item-active-border);background:var(--popup-item-active-bg);color:var(--md-primary);font-weight:850}.app-dialog__inputWrap{margin-top:var(--sp-md)}.app-dialog__inputWrap[hidden]{display:none!important}.app-dialog__input{width:100%;min-width:0}.app-dialog__actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-top:var(--sp-md);flex-shrink:0}.app-dialog__actions .smallBtn,.app-dialog__actions .btn{border-radius:var(--dialog-control-radius)}.app-dialog--choice-grid .app-dialog__sheet,.app-dialog--choice-value-grid .app-dialog__sheet{width:min(100%,var(--dialog-sheet-width));max-height:min(82dvh,640px);padding:var(--sp-lg)}.app-dialog--choice-grid .app-dialog__body,.app-dialog--choice-value-grid .app-dialog__body{flex:0 0 auto;font-size:var(--fs-label-sm);line-height:1.4}#appDialogConfirm.btn--filled{background:var(--md-action-filled);border-color:color-mix(in srgb,var(--md-action-filled) 78%,var(--md-outline-var));color:var(--md-on-action-filled);box-shadow:none}#appDialogConfirm.btn--filled:hover,#appDialogConfirm.btn--filled:focus-visible{background:color-mix(in srgb,var(--md-action-filled) 88%,#fff);border-color:color-mix(in srgb,var(--md-action-filled) 84%,var(--md-outline-var));color:var(--md-on-action-filled)}#appDialogConfirm.btn--filled:active{background:color-mix(in srgb,var(--md-action-filled) 86%,#2a1204)}@media(max-width:640px)and (not (min-aspect-ratio:13/10)){.app-dialog{align-items:center;padding:calc(12px + env(safe-area-inset-top,0px)) 8px calc(12px + env(safe-area-inset-bottom,0px))}.app-dialog__sheet{width:calc(100vw - 16px);max-height:var(--dialog-sheet-mobile-max-height);padding:14px;border-radius:var(--dialog-sheet-radius-mobile);transform:translateY(10px) scale(.985)}.app-dialog__head{margin-bottom:6px}.app-dialog__title{font-size:var(--fs-title-xs)}.app-dialog__body{font-size:var(--fs-body-sm)}.app-dialog__choiceBtn{min-height:42px}.app-dialog__choiceBtn--value{min-height:40px}}.app-dialog--form .app-dialog__body[hidden]{display:none!important}.app-dialog--form .app-dialog__inputWrap{display:grid;gap:var(--sp-xs);margin-top:var(--sp-sm)}.app-dialog--input{align-items:center}html[data-kb-open="1"] .app-dialog--input{align-items:flex-end;padding-bottom:calc(var(--kb-gap) + var(--kb-inset) + env(safe-area-inset-bottom,0px))}.app-dialog__inputError{color:var(--md-error);font-size:var(--fs-label-sm);line-height:1.35;overflow-wrap:anywhere}.app-dialog__inputError[hidden]{display:none!important}.app-progress{display:grid;gap:var(--sp-md)}.app-progress__header{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-md);min-width:0}.app-progress__message{min-width:0;color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:800;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}.app-progress__value{flex:0 0 auto;color:var(--md-primary);font-size:var(--fs-title-xs);font-weight:900;font-variant-numeric:tabular-nums}.app-progress__track{display:block;width:100%;min-width:0;height:10px;overflow:hidden;appearance:none;-webkit-appearance:none;box-sizing:border-box;border:0;border-radius:var(--r-round);background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h));box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--md-primary) 18%,transparent)}.app-progress__track::-webkit-progress-bar{border-radius:inherit;background:color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h))}.app-progress__track::-webkit-progress-value{border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--md-primary) 76%,var(--md-action-filled)),var(--md-primary));box-shadow:0 0 8px color-mix(in srgb,var(--md-primary) 62%,transparent);transition:width var(--motion-medium) var(--ease-linear)}.app-progress__track::-moz-progress-bar{border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--md-primary) 76%,var(--md-action-filled)),var(--md-primary));box-shadow:0 0 8px color-mix(in srgb,var(--md-primary) 62%,transparent);transition:width var(--motion-medium) var(--ease-linear)}.app-progress__track:indeterminate{background:linear-gradient(90deg,transparent 0 22%,var(--md-primary) 40% 60%,transparent 78% 100%) 0 0 / 220% 100% no-repeat,color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h));animation:app-progress-indeterminate 1.05s var(--ease-linear) infinite}.app-progress__summary{color:var(--md-on-surface-var);font-size:var(--fs-label-md);font-weight:750;font-variant-numeric:tabular-nums}@keyframes app-progress-indeterminate{0%{background-position:100% 0,0 0}to{background-position:-100% 0,0 0}}@media(prefers-reduced-motion:reduce){.app-progress__track::-webkit-progress-value,.app-progress__track::-moz-progress-bar{transition:none}.app-progress__track:indeterminate{animation:none;background-position:50% 0,0 0}}.ui-dropdown-menu{position:relative;display:inline-flex;align-items:center;justify-content:flex-end}.ui-dropdown-menu__button{appearance:none;-webkit-appearance:none;min-width:var(--menu-trigger-size);min-height:var(--menu-trigger-size);border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:8px;background:var(--md-surface-cont);color:var(--md-on-surface);display:inline-flex;align-items:center;justify-content:center;gap:6px;cursor:pointer;font:inherit;font-size:13px;font-weight:800;line-height:1;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease}.ui-menu-icon{width:var(--menu-icon-size);height:var(--menu-icon-size);flex:0 0 var(--menu-icon-size);display:inline-flex;flex-direction:column;align-items:stretch;justify-content:center;gap:var(--menu-icon-line-gap);color:currentColor;pointer-events:none}.ui-menu-icon__line{display:block;width:100%;height:var(--menu-icon-line-height);border-radius:var(--r-round);background:currentColor}.ui-dropdown-menu__button:hover,.ui-dropdown-menu__button:focus-visible,.ui-dropdown-menu.is-open .ui-dropdown-menu__button{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.ui-dropdown-menu__button:active{transform:translateY(1px)}.ui-dropdown-menu__panel{min-width:156px;display:grid;gap:6px;padding:var(--sp-sm);border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--popup-bg);color:var(--md-on-surface);box-shadow:var(--popup-shadow)}.ui-dropdown-menu__panel[hidden]{display:none!important}.ui-dropdown-menu__item{width:100%;min-height:40px;padding:0 12px;border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg);color:var(--md-on-surface);display:flex;align-items:center;justify-content:flex-start;gap:8px;font:inherit;font-size:13px;font-weight:800;text-align:left;cursor:pointer;transition:background .14s ease,color .14s ease}.ui-dropdown-menu__item:hover,.ui-dropdown-menu__item:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--popup-item-bg) 90%,var(--md-primary));color:var(--md-on-surface);outline:none}.ui-popover{position:relative}.ui-popover__panel{min-width:156px;padding:var(--sp-sm) var(--sp-md);border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--popup-bg);color:var(--md-on-surface);box-shadow:var(--popup-shadow)}.ui-popover__panel[hidden]{display:none!important}.ui-popover__text{display:block;color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:750;line-height:1.4;overflow-wrap:anywhere}.app-toast-host{position:fixed;left:var(--sp-lg);right:var(--sp-lg);bottom:calc(var(--nav-bar-height) + 18px + env(safe-area-inset-bottom,0px));z-index:var(--z-toast);display:flex;flex-direction:column;align-items:center;gap:var(--sp-sm);pointer-events:none}body[data-page=terminal] .app-toast-host{top:auto;bottom:var(--terminal-toast-bottom, calc(var(--nav-bar-height) + 96px + env(safe-area-inset-bottom, 0px)));left:var(--terminal-toast-left, var(--sp-lg));right:auto;width:var(--terminal-toast-width, calc(100vw - (var(--sp-lg) * 2)));z-index:calc(var(--z-toast) - 2)}.app-toast{display:flex;align-items:center;gap:12px;width:min(100%,440px);padding:14px 18px;border:1px solid var(--toast-border);border-radius:var(--toast-radius);background:var(--toast-bg);color:var(--toast-fg);box-shadow:var(--toast-shadow);font-size:15px;font-weight:600;line-height:1.45;opacity:0;transform:translateY(16px);transition:opacity .2s ease,transform .26s cubic-bezier(.2,0,0,1)}.app-toast.is-visible{opacity:1;transform:translateY(0)}.app-toast__icon{flex:none;width:var(--toast-icon-size);height:var(--toast-icon-size);border-radius:50%;display:grid;place-items:center;background:var(--toast-icon-default);color:var(--toast-icon-fg);font:900 14px/1 system-ui,sans-serif}.app-toast__msg{flex:1;min-width:0;white-space:pre-wrap;overflow-wrap:anywhere}.app-toast.is-info .app-toast__icon{background:var(--toast-icon-info)}.app-toast.is-success .app-toast__icon{background:var(--toast-icon-success)}.app-toast.is-warn .app-toast__icon{background:var(--toast-icon-warn)}.app-toast.is-error .app-toast__icon{background:var(--toast-icon-error)}.c-state-surface{--state-surface-text: var(--md-on-surface);--state-surface-feature-color: var(--md-on-surface);--state-surface-title-color: color-mix(in srgb, var(--md-on-surface-var) 82%, var(--md-surface));--state-surface-description-color: color-mix(in srgb, var(--md-on-surface-var) 78%, transparent);--state-surface-font-weight: 700;--state-surface-overlay-bg: color-mix(in srgb, var(--md-surface) 84%, var(--drive-workspace-bg));--state-surface-max-width: 42ch;--state-surface-feature-size-min: 30px;--state-surface-feature-size-max: 50px;--state-surface-title-size-min: 34px;--state-surface-title-size-max: 58px;--state-surface-description-size: 14px;--state-surface-copy-gap: var(--sp-sm);--state-surface-action-gap: var(--sp-lg);--state-surface-action-row-gap: var(--sp-sm);--state-surface-action-min-height: 46px;--state-surface-action-max-width: 280px;--state-surface-action-font-size: 16px;--state-surface-secondary-bg: color-mix(in srgb, var(--md-surface-cont-h) 86%, transparent);--state-surface-status-accent: var(--md-outline-var);--state-surface-fog-neutral: color-mix(in srgb, var(--md-on-surface-var) 7%, transparent);--state-surface-fog-accent: color-mix(in srgb, var(--md-primary) 8%, transparent);--state-surface-fog-blur: 64px;--state-surface-fog-duration: 14s;--state-surface-fog-start-opacity: .62;--state-surface-fog-active-opacity: 1;position:absolute;z-index:var(--drive-layer-overlay);isolation:isolate;inset:0;display:grid;min-width:0;min-height:0;container-type:inline-size;place-items:safe center;padding:clamp(var(--sp-md),4cqi,var(--sp-2xl));overflow:auto;overscroll-behavior:contain;background:var(--state-surface-overlay-bg);color:var(--state-surface-text);pointer-events:auto}.c-state-surface:before,.c-state-surface:after{position:absolute;border-radius:var(--r-round);content:"";filter:blur(var(--state-surface-fog-blur));opacity:var(--state-surface-fog-active-opacity);pointer-events:none;will-change:opacity,transform}.c-state-surface:before{inset:6% 12%;background:var(--state-surface-fog-neutral);animation:state-surface-fog-neutral var(--state-surface-fog-duration) var(--ease-standard) infinite alternate}.c-state-surface:after{right:22%;bottom:18%;width:24%;height:30%;background:var(--state-surface-fog-accent);animation:state-surface-fog-accent var(--state-surface-fog-duration) var(--ease-standard) infinite alternate-reverse}.c-state-surface[hidden]{display:none!important}.c-state-surface--info{--state-surface-status-accent: var(--md-info)}.c-state-surface--warning{--state-surface-status-accent: var(--md-warning)}.c-state-surface--error{--state-surface-status-accent: var(--md-error)}.c-state-surface__body{position:relative;z-index:1;display:grid;width:min(100%,var(--state-surface-max-width));margin-block:auto;place-items:center;gap:var(--state-surface-action-gap);text-align:center}.c-state-surface__copy{display:grid;min-width:0;place-items:center;gap:var(--state-surface-copy-gap)}.c-state-surface__feature,.c-state-surface__title,.c-state-surface__description{max-inline-size:100%;margin:0;overflow-wrap:anywhere;text-wrap:balance;word-break:keep-all}.c-state-surface__feature,.c-state-surface__title{font-weight:var(--state-surface-font-weight)}.c-state-surface__feature{color:var(--state-surface-feature-color);font-size:clamp(var(--state-surface-feature-size-min),5cqi,var(--state-surface-feature-size-max));line-height:1.06;letter-spacing:-.05em}.c-state-surface__title{color:var(--state-surface-title-color);font-size:clamp(var(--state-surface-title-size-min),6.5cqi,var(--state-surface-title-size-max));line-height:1.02;letter-spacing:-.055em}.c-state-surface__description{color:var(--state-surface-description-color);font-size:var(--state-surface-description-size);font-weight:650;line-height:1.4}.c-state-surface__actions{display:grid;width:min(100%,var(--state-surface-action-max-width));grid-template-columns:minmax(0,1fr);gap:var(--state-surface-action-row-gap)}.c-state-surface__actions[data-layout=single]{grid-template-columns:minmax(0,1fr)}.c-state-surface__actions[data-layout=split]{grid-template-columns:repeat(2,minmax(0,1fr))}.c-state-surface__action{width:100%;min-width:0;min-height:var(--state-surface-action-min-height);margin:0;padding-inline:var(--sp-lg);overflow:hidden;font-size:var(--state-surface-action-font-size);text-overflow:ellipsis;white-space:nowrap}.c-state-surface__action--primary,.c-state-surface__action:where([data-tone=primary]){background:var(--md-action-filled);border-color:color-mix(in srgb,var(--md-action-filled) 78%,var(--md-outline-var));color:var(--md-on-action-filled)}.c-state-surface__action--secondary,.c-state-surface__action:where([data-tone=secondary]){background:var(--state-surface-secondary-bg);color:var(--state-surface-text)}.c-state-surface__action--danger,.c-state-surface__action:where([data-tone=danger]){border-color:color-mix(in srgb,var(--md-error) 54%,var(--md-outline-var));background:var(--md-error-cont);color:var(--md-on-error-cont)}.c-state-surface__action:disabled{opacity:var(--state-disabled-opacity);cursor:not-allowed}.c-state-surface[data-pending=true] .c-state-surface__action:disabled{cursor:wait}.c-state-surface--compact{place-items:start center;padding:var(--sp-sm);overflow:visible;background:transparent;pointer-events:none}.c-state-surface--compact:before,.c-state-surface--compact:after{display:none}.c-state-surface--compact .c-state-surface__body{width:min(100%,560px);margin:0;padding:10px 14px;place-items:stretch;gap:var(--sp-sm);border:1px solid color-mix(in srgb,var(--state-surface-status-accent) 54%,var(--md-outline-var));border-left-width:3px;border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont-h) 94%,transparent);box-shadow:0 8px 24px #00000052;text-align:left;pointer-events:auto}.c-state-surface--compact .c-state-surface__copy{place-items:start;gap:2px}.c-state-surface--compact .c-state-surface__feature{font-size:12px;line-height:1.25;letter-spacing:0}.c-state-surface--compact .c-state-surface__title{font-size:15px;line-height:1.3;letter-spacing:-.02em}.c-state-surface--compact .c-state-surface__description{font-size:12px;font-weight:650;line-height:1.35}.c-state-surface--compact .c-state-surface__feature,.c-state-surface--compact .c-state-surface__title,.c-state-surface--compact .c-state-surface__description{max-inline-size:100%;overflow-wrap:anywhere;text-wrap:pretty}.c-state-surface--compact .c-state-surface__actions{width:100%;max-width:none;pointer-events:auto}@keyframes state-surface-fog-neutral{0%{opacity:var(--state-surface-fog-start-opacity);transform:translate(-4%,3%) scale(.9)}to{opacity:var(--state-surface-fog-active-opacity);transform:translate(4%,-3%) scale(1.08)}}@keyframes state-surface-fog-accent{0%{transform:translate(8%,6%) scale(.88)}to{transform:translate(-8%,-6%) scale(1.12)}}@media(prefers-reduced-motion:reduce){.c-state-surface:before,.c-state-surface:after{animation:none;will-change:auto}}@media(prefers-contrast:more){.c-state-surface{--state-surface-title-color: var(--md-on-surface);--state-surface-fog-start-opacity: .3;--state-surface-fog-active-opacity: .42}}.c-segmented-control{--segmented-control-gap: var(--sp-xs);--segmented-control-padding: 0;--segmented-control-item-min-height: var(--control-min-height);--segmented-control-item-padding: var(--sp-sm) var(--sp-md);--segmented-control-item-flex: 1 0 max-content;--segmented-control-item-font-size: inherit;--segmented-control-item-font-weight: 750;--segmented-control-item-radius: var(--control-radius);--segmented-control-item-border: color-mix(in srgb, var(--md-outline-var) 46%, transparent);--segmented-control-item-bg: var(--md-surface-cont-h);--segmented-control-item-fg: var(--md-on-surface-var);--segmented-control-selected-border: var(--md-outline);--segmented-control-selected-bg: var(--md-surface-cont-hh);--segmented-control-selected-fg: var(--md-on-surface);--segmented-control-hover-border: var(--segmented-control-selected-border);--segmented-control-hover-fg: var(--segmented-control-selected-fg);display:flex;width:100%;min-width:0;max-width:100%;gap:var(--segmented-control-gap);padding:var(--segmented-control-padding);overflow-x:auto;overflow-y:hidden;overscroll-behavior-inline:contain;scrollbar-width:thin;-webkit-overflow-scrolling:touch}.c-segmented-control__item{appearance:none;flex:var(--segmented-control-item-flex);min-width:0;min-height:var(--segmented-control-item-min-height);padding:var(--segmented-control-item-padding);border:1px solid var(--segmented-control-item-border);border-radius:var(--segmented-control-item-radius);background:var(--segmented-control-item-bg);color:var(--segmented-control-item-fg);font:inherit;font-size:var(--segmented-control-item-font-size);font-weight:var(--segmented-control-item-font-weight);line-height:1;text-align:center;white-space:nowrap;cursor:pointer}.c-segmented-control__item:hover{border-color:var(--segmented-control-hover-border);color:var(--segmented-control-hover-fg)}.c-segmented-control__item:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:var(--focus-ring-offset)}.c-segmented-control__item[aria-selected=true],.c-segmented-control__item[aria-pressed=true],.c-segmented-control__item.is-active,.c-segmented-control__item.is-selected{border-color:var(--segmented-control-selected-border);background:var(--segmented-control-selected-bg);color:var(--segmented-control-selected-fg)}.c-segmented-control__item:disabled,.c-segmented-control__item[aria-disabled=true]{opacity:var(--state-disabled-opacity);cursor:not-allowed;pointer-events:none}.c-segmented-control--equal{--segmented-control-item-flex: 1 1 0}.c-segmented-control--equal>.c-segmented-control__item{min-inline-size:0}.c-segmented-control__label{min-inline-size:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} diff --git a/openpilot/selfdrive/carrot/web/css/generated/settings.css b/openpilot/selfdrive/carrot/web/css/generated/settings.css index aee4a33300..312264730b 100644 --- a/openpilot/selfdrive/carrot/web/css/generated/settings.css +++ b/openpilot/selfdrive/carrot/web/css/generated/settings.css @@ -1,2 +1,2 @@ /* @generated by web/build.mjs; edit web/src/entries/settings.css instead. */ -:root{--setting-fab-accent: #ffab66;--setting-fab-accent-pressed: #ff9c4a;--setting-on-fab-accent: #111;--setting-restored-ink: #a9e8b2;--setting-info-ink: #bae6fd;--setting-shade: #000;--setting-media-backdrop: #000;--setting-disabled-ink: #474d55;--setting-disabled-label: #505761;--setting-disabled-label-hover: #58606a;--setting-disabled-surface-top: #22272e;--setting-disabled-surface-bottom: #171b20;--setting-disabled-surface-top-hover: #262b32;--setting-disabled-surface-bottom-hover: #191d22;--setting-disabled-track: #2f343a;--setting-disabled-knob: #6a7078}.page--setting{--setting-menu-list-gap: 6px;--setting-menu-item-min-height: 46px;--setting-menu-item-padding-inline: 12px;--setting-profile-accent: var(--md-primary, var(--setting-fab-accent));--setting-profile-ink: var(--md-on-surface);--setting-profile-surface: var(--md-surface-cont-h);--setting-profile-outline: color-mix(in srgb, var(--md-outline-var) 46%, transparent);--setting-profile-toolbar-height: 58px;--setting-card-surface: var(--md-surface-cont);--setting-card-outline: color-mix(in srgb, var(--md-outline-var) 22%, transparent);--setting-card-radius: var(--r-xl);--setting-card-shadow: var(--shadow-1)}.page--setting #settingScreenHost.setting-screen-transitioning{overflow:hidden!important}.page--setting #settingScreenHost.setting-screen-transitioning>.page-transitioning{overflow:hidden;background:var(--md-surface);pointer-events:none;contain:paint}.page--setting.setting-screen-transitioning #carrotTabContent,.page--setting.setting-screen-transitioning #deviceTabContent,.page--setting.setting-screen-transitioning #items,.page--setting.setting-screen-transitioning #deviceItems,.page--setting .setting-screen-snapshot,.page--setting .setting-screen-snapshot *{animation:none!important}.page--setting .setting.is-restored-live .val{border-color:color-mix(in srgb,var(--md-success) 62%,var(--md-outline-var));background:color-mix(in srgb,var(--md-success) 14%,var(--md-surface-cont-h));color:color-mix(in srgb,var(--setting-restored-ink) 82%,var(--md-on-surface))}.page--setting #groupList>.groupBtn.ui-stagger-item,.page--setting #deviceGroupList>.groupBtn.ui-stagger-item,.page--setting #items>.setting.ui-stagger-item,.page--setting #items>.setting-section-block.ui-stagger-item,.page--setting #items>.setting-group-card.ui-stagger-item,.page--setting #items>.setting-profile-section.ui-stagger-item,.page--setting #deviceItems>.setting.ui-stagger-item{animation-name:setting-item-stagger-in;animation-duration:.32s;animation-timing-function:cubic-bezier(.2,0,0,1);animation-fill-mode:both;animation-delay:min(calc(var(--i, 0) * 34ms),.36s)}.setting-search-backdrop{position:fixed;inset:0;z-index:170;border:0;background:color-mix(in srgb,var(--md-surface) 38%,transparent);backdrop-filter:blur(6px) saturate(108%);-webkit-backdrop-filter:blur(6px) saturate(108%)}.page-fab-layer--setting .setting-fab-menu{--fab-size: 68px;position:fixed;right:max(var(--sp-lg),env(safe-area-inset-right,0px));bottom:calc(var(--nav-bar-height) + env(safe-area-inset-bottom,0px) + 10px + var(--sp-lg));z-index:130;display:flex;flex-direction:column;align-items:flex-end;pointer-events:auto;transform-origin:right bottom}@keyframes setting-fab-enter{0%{opacity:0}to{opacity:1}}body[data-page=setting] .page-fab-layer--setting .setting-fab-menu{animation:setting-fab-enter var(--motion-medium) var(--ease-emphasized) both}.page--setting.setting-screen-transitioning .setting-fab-menu{pointer-events:none}@media(prefers-reduced-motion:reduce){body[data-page=setting] .page-fab-layer--setting .setting-fab-menu{animation:none}}.setting-fab-actions{position:absolute;right:0;bottom:calc(var(--fab-size) + 10px);display:flex;flex-direction:column;align-items:flex-end;gap:10px;opacity:0;transform:translateY(8px) scale(.96);transform-origin:right bottom;transition:opacity .16s cubic-bezier(.3,0,.8,.15),transform .18s cubic-bezier(.3,0,.8,.15);pointer-events:none;will-change:opacity,transform}.setting-fab-actions[hidden]{display:none!important}.setting-fab-menu.is-open .setting-fab-actions{opacity:1;transform:translateY(0) scale(1);pointer-events:auto;visibility:visible;transition:opacity .22s cubic-bezier(.2,0,0,1),transform .26s cubic-bezier(.2,0,0,1)}.setting-fab-action{min-width:152px;min-height:44px;display:inline-grid;grid-template-columns:20px minmax(0,1fr);align-items:center;gap:10px;padding:0 16px;border:1px solid color-mix(in srgb,var(--md-outline-var) 84%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont) 92%,var(--setting-shade));color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:800;line-height:1;text-align:left;box-shadow:0 12px 28px #00000042;cursor:pointer;-webkit-tap-highlight-color:transparent;opacity:0;transform:translateY(6px) scale(.96);transform-origin:right center;transition:opacity .14s cubic-bezier(.3,0,.8,.15),transform .14s cubic-bezier(.3,0,.8,.15)}.setting-fab-menu.is-open .setting-fab-action{opacity:1;transform:translateY(0) scale(1);transition:opacity .22s cubic-bezier(.2,0,0,1),transform .26s cubic-bezier(.2,0,0,1)}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(1){transition-delay:0ms}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(2){transition-delay:40ms}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(3){transition-delay:80ms}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(4){transition-delay:.12s}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(5){transition-delay:.16s}.setting-fab-action svg{width:20px;height:20px;color:var(--md-primary)}.setting-fab-action span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setting-fab-action:active{background:color-mix(in srgb,var(--md-primary) 12%,var(--md-surface-cont))}.setting-fab-action:disabled,.setting-fab-action[aria-disabled=true]{color:color-mix(in srgb,var(--md-on-surface-var) 64%,transparent);cursor:default;opacity:.72}.setting-fab-action:disabled svg,.setting-fab-action[aria-disabled=true] svg{color:color-mix(in srgb,var(--md-on-surface-var) 72%,transparent)}.fab--setting-menu{background:var(--setting-fab-accent);border-color:var(--setting-fab-accent);color:var(--setting-on-fab-accent);box-shadow:0 12px 28px #ff873a38;transition:background .18s ease,border-color .18s ease,box-shadow .2s ease,transform .2s cubic-bezier(.2,0,0,1)}.fab--setting-menu.active,.fab--setting-menu:active{background:var(--setting-fab-accent-pressed);border-color:var(--setting-fab-accent-pressed);color:var(--setting-on-fab-accent);box-shadow:0 12px 30px #ff873a4d}.fab--setting-menu:active{transform:scale(.94)}.setting-fab-menu.is-open .fab--setting-menu{box-shadow:0 16px 34px #ff873a57}.fab--setting-menu.is-bouncing{animation:setting-fab-bounce .3s cubic-bezier(.2,0,0,1)}.fab--setting-menu svg{width:26px;height:26px}.fab--setting-menu .setting-fab-menu-icon{fill:none}.fab--setting-menu .setting-fab-menu-icon path,.fab--setting-menu .setting-fab-menu-icon circle{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}@keyframes setting-fab-bounce{0%{transform:scale(1)}30%{transform:scale(.93)}62%{transform:scale(1.03)}to{transform:scale(1)}}@media(prefers-reduced-motion:reduce){.setting-fab-actions,.setting-fab-action,.fab--setting-menu svg{transition:none!important}.fab--setting-menu.is-bouncing{animation:none!important}.setting-fab-menu.is-open .setting-fab-action{transition-delay:0ms!important}}.setting-search-panel{--setting-search-form-width: clamp(320px, 42vw, 520px);--setting-search-results-width: min(72vw, 760px);--setting-search-results-max-height: 680px;position:fixed;top:var(--app-vv-top, 0px);right:0;bottom:auto;left:0;width:100vw;height:var(--app-vv-height, 100dvh);min-height:0;box-sizing:border-box;z-index:171;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:14px;padding:calc(18px + env(safe-area-inset-top,0px)) var(--sp-lg) calc(var(--app-nav-bottom-gap, var(--nav-bar-height)) + 18px + var(--kb-inset) + env(safe-area-inset-bottom,0px));pointer-events:none}.setting-search-panel:before{content:none}.setting-search-form{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:0;width:min(var(--setting-search-form-width),calc(100vw - 40px));min-height:clamp(56px,7vh,62px);padding-left:20px;border:1px solid color-mix(in srgb,var(--md-primary) 26%,var(--md-stroke-soft));border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont) 76%,transparent);backdrop-filter:blur(10px) saturate(112%);-webkit-backdrop-filter:blur(10px) saturate(112%);box-shadow:0 18px 40px #00000042;pointer-events:auto;position:relative;z-index:1;flex:0 0 auto}.setting-search-backdrop[hidden],.setting-search-panel[hidden]{display:none!important}.setting-search-form:focus-within{border-color:color-mix(in srgb,var(--md-primary) 46%,var(--md-stroke-strong))}.setting-search-form__input{min-width:0;min-height:56px;border:0;background:transparent;color:var(--md-on-surface);font-size:var(--fs-body-md);outline:none}.setting-search-form__submit{width:56px;height:100%;border:0;border-left:1px solid color-mix(in srgb,var(--md-stroke-soft) 42%,transparent);border-radius:0 var(--control-radius) var(--control-radius) 0;background:transparent;color:var(--md-primary);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.setting-search-form__submit:active{background:color-mix(in srgb,var(--md-primary) 12%,transparent)}.setting-search-form__submit svg{width:20px;height:20px}.setting-search-results{display:flex;flex-direction:column;gap:0;width:min(var(--setting-search-results-width),calc(100vw - 40px));min-height:0;padding:0 4px 12px;max-height:var(--setting-search-results-max-height);flex:1 1 auto;overflow:auto;overscroll-behavior:contain;scroll-padding-block:8px 18px;scrollbar-gutter:stable;pointer-events:auto;position:relative;z-index:1}.setting-search-results:empty{display:none}.setting-search-section{display:grid;gap:var(--sp-sm);padding:0 0 var(--sp-lg)}.setting-search-section__title{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 4px;color:var(--md-primary);font-size:var(--fs-title-sm);font-weight:900;letter-spacing:0}.setting-search-section__title strong{color:var(--md-on-surface-var);font-size:var(--fs-label-md);font-weight:800}.setting-search-section__body{overflow:hidden;background:var(--md-surface-cont);border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--r-xl);box-shadow:var(--shadow-1)}.page--setting #groupList,.page--setting #deviceGroupList{display:flex;flex-direction:column;gap:var(--setting-menu-list-gap)}.page--setting .setting-group-skeleton{display:flex;align-items:center;min-height:var(--setting-menu-item-min-height);padding:0 var(--setting-menu-item-padding-inline);border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--control-radius);background:var(--md-surface-cont)}.page--setting .setting-group-skeleton__line{width:clamp(92px,52%,180px);height:12px;border-radius:var(--r-round);background:color-mix(in srgb,var(--md-on-surface-var) 14%,transparent);animation:setting-skeleton-pulse 1.25s ease-in-out infinite alternate}@keyframes setting-skeleton-pulse{0%{opacity:.42}to{opacity:.82}}@media(prefers-reduced-motion:reduce){.page--setting .setting-group-skeleton__line{animation:none;opacity:.62}}.page--setting #groupList .groupBtn,.page--setting #deviceGroupList .groupBtn{display:flex;align-items:center;min-height:var(--setting-menu-item-min-height);margin-bottom:0;padding:0 var(--setting-menu-item-padding-inline);font-size:14px;line-height:1.18}.page--setting #groupList .groupBtn--favorites{border-color:color-mix(in srgb,var(--md-info) 34%,var(--md-outline-var));background:color-mix(in srgb,var(--md-info) 7%,var(--md-surface-cont-h))}.page--setting #groupList .groupBtn--favorites.active{border-color:color-mix(in srgb,var(--md-info) 64%,var(--md-outline-var));color:color-mix(in srgb,var(--setting-info-ink) 82%,var(--md-on-surface))}.page--setting #groupList .groupBtn--profile{border-color:var(--setting-profile-outline);background:var(--md-surface-cont-h);color:var(--md-on-surface)}.page--setting #groupList .groupBtn--profile.active{border-color:color-mix(in srgb,var(--md-primary) 48%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary)}.setting-profile-divider{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:10px;padding:10px 2px 4px;color:var(--md-on-surface-var);font-size:12px;font-weight:900;letter-spacing:0}.setting-profile-divider span{height:1px;background:color-mix(in srgb,var(--md-outline-var) 46%,transparent)}.setting-profile-divider strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setting-profile-section{--setting-profile-accent: var(--md-primary, var(--setting-fab-accent));--setting-profile-divider: color-mix(in srgb, var(--setting-profile-accent) 34%, var(--md-outline-var));min-width:0;border-top:0;scroll-margin-top:calc(var(--setting-profile-section-sticky-top, 64px) + 8px)}.setting-profile-section+.setting-profile-section{border-top:0}.setting-profile-section__header{position:static;min-width:0;width:100%;box-sizing:border-box;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) auto 18px;align-items:center;gap:8px;padding:0 2px;border:0;background:transparent;box-shadow:none;color:var(--setting-profile-accent);font:inherit;font-size:var(--fs-title-sm);font-weight:900;letter-spacing:0;text-align:left;cursor:pointer;transition:background .14s ease,color .14s ease,border-color .14s ease}.setting-profile-section__header:hover,.setting-profile-section__header:focus-visible{background:transparent;color:color-mix(in srgb,var(--setting-profile-accent) 82%,var(--md-on-surface));outline:none}.setting-profile-section__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setting-profile-section__count{min-width:0;padding:2px 0;color:var(--setting-profile-accent);font-size:12px;font-weight:900;text-align:right}.setting-profile-section__chevron{width:18px;height:18px;color:color-mix(in srgb,var(--setting-profile-accent) 84%,var(--md-on-surface));fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;transition:transform .16s ease}.setting-profile-section.is-collapsed .setting-profile-section__chevron{transform:rotate(-90deg)}.setting-profile-section__body{min-width:0;display:grid;grid-template-rows:1fr;overflow:hidden;opacity:1;transform:translateY(0);will-change:grid-template-rows,opacity,transform}.setting-profile-section.is-collapsed .setting-profile-section__body{grid-template-rows:0fr;opacity:0;pointer-events:none;transform:translateY(-4px)}.setting-profile-section__bodyInner{min-height:0;overflow:hidden}.setting-profile-section.is-collapsing .setting-profile-section__body{pointer-events:none;animation:setting-profile-section-fold .24s cubic-bezier(.2,0,0,1) both}.setting-profile-section.is-expanding .setting-profile-section__body{animation:setting-profile-section-fold .24s cubic-bezier(.2,0,0,1) reverse both}.setting-profile-panel{--setting-profile-accent: var(--md-primary, var(--setting-fab-accent));--setting-profile-ink: var(--md-on-surface);--setting-profile-section-sticky-top: 68px;min-width:0;color:var(--setting-profile-ink);animation:setting-profile-toolbar-enter .2s cubic-bezier(.2,0,0,1) both}.setting-profile-manage-card{min-width:0;display:grid;gap:0}.setting-profile-card__rows{min-width:0;display:grid}.setting-profile-card__rows>.setting-profile-row:first-child{border-top:none;padding-top:var(--sp-md)}.setting-profile-row{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md);min-height:52px;padding:var(--sp-sm) 0;border-top:1px solid color-mix(in srgb,var(--md-stroke-soft) 32%,transparent)}.setting-profile-row:last-child{padding-bottom:var(--sp-md)}.setting-profile-row__label{flex:0 0 auto;color:var(--md-on-surface-var);font-size:var(--fs-label-md);font-weight:800;line-height:1.2}.setting-profile-row__value{min-width:0;flex:1 1 auto;overflow:hidden;color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:700;line-height:1.3;text-align:right;text-overflow:ellipsis;white-space:nowrap}.setting-profile-row__value a{color:var(--md-primary);font-weight:800;text-decoration:none}.setting-profile-row--name .setting-profile-row__label{color:var(--md-primary);font-size:var(--fs-title-sm);font-weight:900}.setting-profile-name-input{flex:1 1 auto;min-width:0;height:40px;box-sizing:border-box;padding:0 var(--sp-md);border:1px solid color-mix(in srgb,var(--md-outline-var) 30%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 60%,transparent);color:var(--md-on-surface);font:inherit;font-size:var(--fs-body-sm);font-weight:800;text-align:right;outline:none;transition:border-color .14s ease,background .14s ease,color .14s ease}.setting-profile-name-input:focus{border-color:color-mix(in srgb,var(--md-primary) 58%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 82%,var(--md-primary))}.setting-profile-name-input.is-saving{color:color-mix(in srgb,var(--md-on-surface) 72%,var(--md-primary))}.setting-profile-menu{flex:0 0 auto}.setting-profile-menu__button{width:40px;min-width:40px;min-height:40px;border-color:color-mix(in srgb,var(--md-outline-var) 24%,transparent);background:color-mix(in srgb,var(--md-surface-cont-h) 48%,transparent)}.setting-profile-menu__button svg{width:22px;height:22px}.setting-profile-menu__panel{position:absolute;top:calc(100% + 8px);right:0;z-index:9;min-width:168px}.setting-profile-menu__item .setting-profile-action__icon{width:18px;height:18px}.setting-profile-menu__item--primary,.setting-profile-menu__item--primary .setting-profile-action__icon{color:var(--md-primary)}.setting-profile-menu__item--danger,.setting-profile-menu__item--danger .setting-profile-action__icon{color:var(--md-error)}.setting-profile-action__icon{width:22px;height:22px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.setting-toolbar-action{min-width:56px;min-height:42px;padding:0 14px;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:8px;background:var(--md-surface-cont);color:var(--md-on-surface);cursor:pointer;font:inherit;font-size:13px;font-weight:850;line-height:1;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease}.setting-toolbar-action:hover,.setting-toolbar-action:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.setting-toolbar-action:active{transform:translateY(1px)}.setting-toolbar-action--primary{border-color:color-mix(in srgb,var(--md-primary) 76%,var(--md-outline-var));background:var(--md-primary);color:var(--md-on-primary)}.setting-toolbar-action--danger{color:var(--md-error)}@keyframes setting-profile-toolbar-enter{0%{opacity:0}to{opacity:1}}@keyframes setting-item-stagger-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes setting-profile-section-fold{0%{grid-template-rows:1fr;opacity:1;transform:translateY(0)}to{grid-template-rows:0fr;opacity:0;transform:translateY(-4px)}}@media(prefers-reduced-motion:reduce){.setting-profile-panel,.page--setting #groupList>.groupBtn.ui-stagger-item,.page--setting #deviceGroupList>.groupBtn.ui-stagger-item,.page--setting #items>.setting.ui-stagger-item,.page--setting #items>.setting-section-block.ui-stagger-item,.page--setting #items>.setting-group-card.ui-stagger-item,.page--setting #items>.setting-profile-section.ui-stagger-item,.page--setting #deviceItems>.setting.ui-stagger-item,.setting-profile-section.is-collapsing .setting-profile-section__body,.setting-profile-section.is-expanding .setting-profile-section__body{animation:none}.setting-profile-section__header,.setting-profile-section__chevron,.setting-toolbar-action{transition:none}}.setting-category-divider{padding-top:var(--sp-lg)}.setting-category-divider strong{color:var(--md-primary);font-size:var(--fs-label-md);font-weight:900;letter-spacing:.01em}.setting-category-divider span{background:color-mix(in srgb,var(--md-primary) 30%,transparent)}.setting-section-block{display:grid;gap:8px;margin:0 0 var(--sp-lg)}.setting-group-card{background:var(--setting-card-surface);border:1px solid var(--setting-card-outline);border-radius:var(--setting-card-radius);padding:0 var(--sp-lg);margin:0;box-shadow:var(--setting-card-shadow)}.setting-group-card__title{padding:0 2px;color:var(--md-primary);font-size:var(--fs-title-sm);font-weight:900;letter-spacing:0}.setting-group-card__body>.setting{margin-left:calc(-1 * var(--sp-lg));margin-right:calc(-1 * var(--sp-lg));border-radius:0;padding-left:var(--sp-lg);padding-right:var(--sp-lg);border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 32%,transparent)}.setting-group-card__body>.setting:first-child{border-top-left-radius:calc(var(--r-xl) - 1px);border-top-right-radius:calc(var(--r-xl) - 1px)}.setting-group-card__body>.setting:last-child{border-bottom-left-radius:calc(var(--r-xl) - 1px);border-bottom-right-radius:calc(var(--r-xl) - 1px);border-bottom:none}.app-dialog--settings-diff .app-dialog__sheet{width:min(calc(100vw - 24px),520px);max-height:min(calc(100dvh - 24px),680px);overflow:hidden}.app-dialog--settings-diff .app-dialog__body{min-height:0;overflow:auto;white-space:normal}.setting-profile-apply{min-width:0;display:grid;gap:10px}.setting-profile-apply__title{min-width:0;overflow:hidden;color:var(--md-on-surface);font-size:14px;font-weight:900;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.setting-search-result{width:100%;padding:12px 14px;border:0;border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 32%,transparent);border-radius:0;background:transparent;color:inherit;text-align:left;cursor:pointer}.setting-search-section__body>.setting-search-result:last-child{border-bottom:0}.setting-search-result:hover,.setting-search-result:focus-visible{background:color-mix(in srgb,var(--md-surface-cont) 88%,var(--md-primary));outline:none}.setting-search-result:active{transform:translateY(1px)}.setting-search-result--empty{cursor:default;color:var(--md-on-surface-var);border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg)}.setting-search-result__group{color:var(--md-primary);font-size:var(--fs-label-md);font-weight:700}.setting-search-result__title{margin-top:4px;color:var(--md-on-surface);font-size:var(--fs-body-lg);font-weight:700}.setting-search-result__name{margin-top:2px;color:var(--md-outline);font-family:var(--font-mono);font-size:var(--fs-label-md)}.setting-search-result__descr{margin-top:6px;color:var(--md-on-surface-var);font-size:var(--fs-body-sm);display:block;overflow:visible}.setting-search-result__mark{background:color-mix(in srgb,var(--md-primary) 20%,transparent);color:var(--md-primary);padding:0 1px;border-radius:4px}.page--setting.setting-search-open .fab--setting-search{opacity:0;transform:scale(.92);pointer-events:none}.page--setting.setting-search-open #settingScreenHost,.page--setting.setting-search-open #settingsMeta{pointer-events:none}@media(min-width:769px)and (min-aspect-ratio:13/10),(min-width:769px)and (horizontal-viewport-segments:2),(min-width:769px)and (vertical-viewport-segments:2),(min-width:769px)and (min-height:650px){.setting-search-panel{--setting-search-form-width: clamp(360px, 34vw, 540px);--setting-search-results-width: min(64vw, 820px);--setting-search-results-max-height: 680px;gap:14px;padding-top:calc(22px + env(safe-area-inset-top,0px));padding-bottom:calc(var(--app-nav-bottom-gap, var(--nav-bar-height-desktop)) + 18px + env(safe-area-inset-bottom,0px))}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting .settingTop{flex-direction:column;align-items:stretch}.page--setting .ctrl{justify-content:flex-start}.page--setting .val{min-width:100px}.setting-search-panel{--setting-search-form-width: calc(100vw - 28px) ;--setting-search-results-width: calc(100vw - 28px) ;--setting-search-results-max-height: 560px;gap:12px;padding:calc(14px + env(safe-area-inset-top,0px)) 12px calc(var(--app-nav-bottom-gap, var(--nav-bar-height)) + 14px + env(safe-area-inset-bottom,0px))}.setting-search-form{width:min(var(--setting-search-form-width),calc(100vw - 28px))}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #settingScreenItems{padding-top:0}.page--setting #settingScreenItems.setting-screen-items--profile{padding-top:0;--setting-profile-panel-sticky-top: 0px;--setting-profile-section-sticky-top: 72px}.page--setting #settingScreenItems.setting-screen-items--profile #items{padding-top:0}.page--setting #settingScreenItems.setting-screen-items--profile .setting-profile-row{min-height:46px;gap:var(--sp-sm)}.page--setting #settingScreenItems.setting-screen-items--profile .setting-profile-action__icon{width:20px;height:20px}.page--setting #settingScreenItems.setting-screen-items--profile .setting-profile-section__header{margin-left:0;margin-right:0;padding-left:2px;padding-right:2px}.page--setting #settingScreenItems.setting-screen-items--profile>.row-between.mb-sm{display:grid}.page.page--setting{display:flex;flex-direction:column;height:calc(var(--app-vv-height, 100dvh) - var(--nav-bar-height) - env(safe-area-inset-bottom,0px));min-block-size:0;padding-bottom:0;overflow:hidden}.page.page--setting>#settingsMeta{flex:0 0 auto}.page.page--setting>#settingScreenHost{flex:1 1 auto;position:relative;min-height:0;overflow:hidden}.page.page--setting>#settingScreenHost>#settingScreenGroups,.page.page--setting>#settingScreenHost>#settingScreenItems{position:absolute;inset:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable;padding-bottom:calc(var(--nav-bar-height) + 24px + env(safe-area-inset-bottom,0px));will-change:transform}.page.page--setting>#settingScreenHost>#settingScreenGroups{-webkit-mask-image:none;mask-image:none}.page.page--setting>#settingScreenHost>#settingScreenItems{-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%)}}@media(max-height:760px){.setting-search-panel{--setting-search-results-max-height: 620px;gap:10px;padding-top:calc(12px + env(safe-area-inset-top,0px))}}@media(min-aspect-ratio:13/10),(horizontal-viewport-segments:2),(vertical-viewport-segments:2),(min-width:640px)and (min-height:650px){.page.page--setting{--setting-landscape-left-width: clamp(208px, 28vw, 260px);--setting-landscape-gap: 12px;--setting-landscape-page-inset: var(--setting-landscape-content-inset, var(--page-rail-content-inset, 24px));--setting-landscape-fab-reserve: calc(var(--fab-size, 56px) + 18px);--setting-landscape-scroll-pad-bottom: 4px;display:flex;flex-direction:column;max-width:none;margin:0;min-height:var(--page-content-height, calc(var(--app-vv-height, 100dvh) - 24px));height:var(--page-content-height, calc(var(--app-vv-height, 100dvh) - 24px));padding:0;box-sizing:border-box;overflow:hidden}.page.page--setting>#settingsMeta{flex:0 0 auto;margin:var(--setting-landscape-page-inset) var(--setting-landscape-page-inset) 12px;padding:0}.page.page--setting>#settingScreenHost{flex:1 1 auto;display:grid;grid-template-columns:var(--setting-landscape-left-width) minmax(0,1fr);column-gap:14px;align-items:stretch;width:100%;min-height:0;margin:0;box-sizing:border-box;overflow:hidden;position:relative;padding:0}.page.page--setting>#settingScreenHost>#settingScreenGroups,.page.page--setting>#settingScreenHost>#settingScreenItems{height:100%;min-height:0;max-height:none;overflow:auto;box-sizing:border-box;scrollbar-gutter:stable;transition:none}.page.page--setting>#settingScreenHost>#settingScreenGroups{-webkit-mask-image:none;mask-image:none}.page.page--setting>#settingScreenHost>#settingScreenItems{-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%)}.page.page--setting>#settingScreenHost>#settingScreenGroups{position:relative;align-self:stretch;margin-left:0;padding:var(--setting-landscape-page-inset) 8px calc(var(--setting-landscape-page-inset) + var(--setting-landscape-fab-reserve)) var(--setting-landscape-page-inset)}.page.page--setting>#settingScreenHost>#settingScreenItems{min-width:0;padding:var(--setting-landscape-page-inset) var(--setting-landscape-page-inset) var(--setting-landscape-page-inset) var(--setting-landscape-page-inset)}.page.page--setting>#settingScreenHost>#settingScreenItems.setting-screen-items--profile{padding-top:0;--setting-profile-panel-sticky-top: 0px;--setting-profile-section-sticky-top: 68px}.page--setting.setting-layout-split #groupList{display:flex;flex-direction:column;gap:6px}.page--setting.setting-layout-split .groupBtn,.page--setting.setting-layout-split .setting-group-skeleton{margin-bottom:0;min-width:0;min-height:44px;padding:9px 12px}.page--setting.setting-layout-split .groupBtn{font-size:14px;line-height:1.16;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none;text-overflow:clip;touch-action:pan-x pan-y}.page--setting.setting-layout-split .groupBtn::-webkit-scrollbar{display:none}.page--setting.setting-layout-split #groupList .groupBtn .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn .setting-group-label{display:inline-block;min-width:max-content;transform:translate(0);will-change:transform}.page--setting.setting-layout-split #groupList .groupBtn.is-overflowing:hover .setting-group-label,.page--setting.setting-layout-split #groupList .groupBtn.is-overflowing:focus .setting-group-label,.page--setting.setting-layout-split #groupList .groupBtn.is-overflowing:active .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn.is-overflowing:hover .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn.is-overflowing:focus .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn.is-overflowing:active .setting-group-label{animation:setting-left-text-pan 4.2s ease-in-out 1}.page.page--setting>.page-fab-layer--setting{position:absolute;top:auto;left:var(--setting-landscape-page-inset);bottom:var(--setting-landscape-page-inset);width:var(--setting-landscape-left-width);max-width:100%;height:auto;display:flex;justify-content:flex-end;z-index:70;pointer-events:none}.page.page--setting>.page-fab-layer--setting .fab{position:relative;inset:auto;display:inline-flex;opacity:1!important;visibility:visible!important;margin-right:0;pointer-events:auto}.page.page--setting>.page-fab-layer--setting .fab:not(.is-bouncing){transform:none!important}.page.page--setting>.page-fab-layer--setting .setting-fab-menu{position:relative;right:auto;left:auto;bottom:auto}.page--setting.setting-layout-split #settingScreenItems .title{font-size:16px;font-weight:700;line-height:1.18}.page--setting.setting-layout-split #settingScreenItems .name{font-size:12px;line-height:1.28}.page--setting.setting-layout-split #settingScreenItems .muted,.page--setting.setting-layout-split #settingScreenItems .descr{font-size:13px;line-height:1.38}.page--setting.setting-layout-split #settingScreenItems .setting{overflow:hidden}.page--setting.setting-layout-split #settingScreenItems .settingTop{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:start}.page--setting.setting-layout-split #settingScreenItems .settingTop>:first-child{min-width:0}.page--setting.setting-layout-split #settingScreenItems .title,.page--setting.setting-layout-split #settingScreenItems .name,.page--setting.setting-layout-split #settingScreenItems .muted,.page--setting.setting-layout-split #settingScreenItems .descr{max-width:100%;overflow-wrap:anywhere;word-break:break-word}.page--setting.setting-layout-split #settingScreenItems .setting-copy{min-width:0;max-width:100%}.setting-search-panel{--setting-search-form-width: min(76vw, 540px);--setting-search-results-width: min(82vw, 760px);--setting-search-results-max-height: 680px;gap:10px;padding:calc(12px + env(safe-area-inset-top,0px)) 12px calc(var(--app-nav-bottom-gap, 0px) + 12px + env(safe-area-inset-bottom,0px))}}@media(max-width:760px)and (min-aspect-ratio:13/10),(max-width:760px)and (horizontal-viewport-segments:2),(max-width:760px)and (vertical-viewport-segments:2),(min-width:640px)and (max-width:760px)and (min-height:650px){.page.page--setting{--setting-landscape-left-width: clamp(184px, 27vw, 220px)}.page.page--setting>#settingScreenHost{column-gap:10px}.page--setting.setting-layout-split #settingScreenItems .settingTop{grid-template-columns:minmax(0,1fr)}}.page--setting #settingScreenItems .settingTop{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--sp-md);align-items:start}.page--setting #settingScreenItems .settingTop>:first-child{min-width:0}.page--setting #settingScreenItems .title,.page--setting #settingScreenItems .name,.page--setting #settingScreenItems .muted,.page--setting #settingScreenItems .descr{max-width:100%;overflow-wrap:anywhere;word-break:break-word}.page--setting #settingScreenItems .setting{overflow:hidden}.page--setting #settingScreenItems .ctrl{--setting-control-side: 42px;--setting-control-value: 88px;--setting-control-gap: 6px;display:grid;grid-template-columns:var(--setting-control-side) var(--setting-control-value) var(--setting-control-side);gap:var(--setting-control-gap);justify-content:end;align-items:center;flex:0 0 auto;max-width:100%}.page--setting #settingScreenItems .ctrl>:nth-child(1){grid-column:1;grid-row:2}.page--setting #settingScreenItems .ctrl>:nth-child(2){grid-column:2;grid-row:2}.page--setting #settingScreenItems .ctrl>:nth-child(3){grid-column:3;grid-row:2}.page--setting #settingScreenItems .ctrl>:nth-child(4){grid-column:1 / -1;grid-row:1;justify-self:stretch;width:100%}.page--setting #settingScreenItems .smallBtn{width:100%;min-width:var(--setting-control-side);padding-inline:9px}.page--setting #settingScreenItems .val{width:100%;min-width:var(--setting-control-value);max-width:var(--setting-control-value)}.page--setting #settingScreenItems .ctrl--toggle,.page--setting #settingScreenItems .ctrl--value,.page--setting #settingScreenItems .ctrl--segmented,.page--setting #settingScreenItems .ctrl--select{display:flex;justify-content:flex-end;align-items:center;width:auto}.page--setting #settingScreenItems .ctrl--value{display:inline-grid;grid-template-columns:38px minmax(66px,auto) 38px;gap:0;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont-h)}.page--setting #settingScreenItems .ctrl--value>:nth-child(1),.page--setting #settingScreenItems .ctrl--value>:nth-child(2),.page--setting #settingScreenItems .ctrl--value>:nth-child(3){grid-row:1}.page--setting #settingScreenItems .ctrl--value .val{position:relative;width:auto;min-width:66px;max-width:min(120px,34vw);min-height:32px;padding:0 10px;border:0;border-left:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-right:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.page--setting #settingScreenItems .setting-value-compact{border-color:transparent;background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,var(--md-surface-cont-h));color:var(--md-on-surface);box-shadow:none;font-weight:900}.page--setting #settingScreenItems .setting-value-arrow{display:inline-flex;align-items:center;justify-content:center;width:38px;min-width:38px;min-height:32px;padding:0;border:0;border-radius:0;background:transparent;color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:900;line-height:1;touch-action:manipulation}.page--setting #settingScreenItems .setting-value-arrow:active,.page--setting #settingScreenItems .setting-value-arrow.is-holding,.page--setting #settingScreenItems .setting-step:active,.page--setting #settingScreenItems .setting-step.is-holding{background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-on-surface))}.page--setting #settingScreenItems .setting-icon{display:block;width:18px;height:18px}.page--setting #settingScreenItems .setting-icon path{fill:none;stroke:currentColor;stroke-width:2.7;stroke-linecap:round;stroke-linejoin:round}.page--setting #settingScreenItems .ctrl--toggle .val,.page--setting #settingScreenItems .ctrl--segmented .val,.page--setting #settingScreenItems .ctrl--select .val{display:none}.page--setting #settingScreenItems .setting-segment:focus-visible,.page--setting #settingScreenItems .setting-select:focus-visible,.page--setting #settingScreenItems .setting-slider__input:focus-visible{outline:var(--focus-ring-width, 2px) solid var(--focus-ring-color, var(--md-primary));outline-offset:2px}.page--setting #settingScreenItems .setting-segments{display:inline-flex;max-width:min(216px,100%);overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont-h)}.page--setting #settingScreenItems .setting-segment{min-width:38px;min-height:32px;padding:0 10px;border:0;border-right:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);background:transparent;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.page--setting #settingScreenItems .setting-segment:last-child{border-right:0}.page--setting #settingScreenItems .setting-segment.is-active{background:var(--md-primary-state);color:var(--md-primary)}.page--setting #settingScreenItems .setting-select{display:inline-flex;align-items:center;justify-content:center;min-width:92px;min-height:32px;padding:0 14px;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont-h);color:var(--md-on-surface);font-family:inherit;font-size:var(--fs-label-sm);font-weight:850;line-height:1;text-align:center;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;appearance:none}.page--setting #settingScreenItems .ctrl--slider{grid-template-columns:var(--setting-control-side) var(--setting-control-value) var(--setting-control-side)}.page--setting #settingScreenItems .ctrl--slider .setting-slider{grid-column:1 / -1;grid-row:1;width:100%}.page--setting #settingScreenItems .ctrl--slider .setting-step--minus{grid-column:1;grid-row:2}.page--setting #settingScreenItems .ctrl--slider .val{grid-column:2;grid-row:2}.page--setting #settingScreenItems .ctrl--slider .setting-step--plus{grid-column:3;grid-row:2}.page--setting #settingScreenItems .setting-slider__input{width:100%;accent-color:var(--md-primary);touch-action:pan-y}.page--setting #settingScreenItems .setting{position:relative}.page--setting #settingScreenItems .setting--has-unit-cycle{padding-bottom:var(--sp-md)}.page--setting #settingScreenItems .setting-unit-cycle{display:flex;align-items:center;justify-content:center;margin:8px 0 0 auto;min-width:54px;min-height:32px;padding:0 12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,var(--md-surface-cont-h));color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:900;line-height:1;letter-spacing:0;box-shadow:none}.page--setting #settingScreenItems .setting-unit-cycle:active{border-color:color-mix(in srgb,var(--md-outline-var) 68%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-on-surface));color:var(--md-on-surface)}.page--setting #settingScreenItems .setting--has-actions{padding-bottom:var(--sp-md)}.page--setting #settingScreenItems .setting-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px}.page--setting #settingScreenItems .setting-popular-value-chip{display:inline-flex;align-items:center;justify-content:flex-start;flex-wrap:nowrap;gap:3px;min-width:0;max-width:min(360px,52vw);min-height:18px;margin-right:auto;padding:0;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface-var) 42%,transparent);font-size:11px;font-weight:700;line-height:1.18;letter-spacing:0;text-align:left;white-space:nowrap;box-shadow:none;opacity:.74}.page--setting #settingScreenItems .setting-popular-value-chip__car{min-width:0;max-width:170px;overflow:hidden;color:inherit;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems .setting-popular-value-chip__accent{color:color-mix(in srgb,var(--md-primary) 56%,var(--md-on-surface-var));font-weight:800}.page--setting #settingScreenItems .setting-popular-value-chip__label{color:inherit}.page--setting #settingScreenItems .setting-actions .setting-unit-cycle{margin:0}.page--setting #settingScreenItems .setting-default-reset{display:inline-flex;align-items:center;justify-content:center;min-width:54px;min-height:32px;padding:0 12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,var(--md-surface-cont-h));color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:900;line-height:1;letter-spacing:0;box-shadow:none}.page--setting #settingScreenItems .setting-default-reset:active{border-color:color-mix(in srgb,var(--md-outline-var) 68%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-on-surface));color:var(--md-on-surface)}.setting-popular-detail{display:grid;gap:12px;min-width:min(360px,calc(100vw - 56px))}.page--setting #settingScreenItems .setting-popular-detail-block{width:min(520px,100%);margin-top:12px}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail{gap:9px;min-width:0;width:100%}.setting-popular-detail__head{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.setting-popular-detail__name{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:800;overflow-wrap:anywhere}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__name{color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:12px;font-weight:780}.setting-popular-detail__range{flex:0 0 auto;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 8%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);font-size:10px;font-weight:820;line-height:20px}.setting-popular-detail__rows{display:grid;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 32%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont)}.setting-popular-detail__row{display:grid;grid-template-columns:52px minmax(0,1fr) 58px;align-items:center;gap:10px;width:100%;min-height:38px;padding:0 12px;border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 40%,transparent);border-left:0;border-right:0;border-top:0;background:transparent;color:var(--md-on-surface);font-family:inherit;font-size:var(--fs-body-sm);font-weight:850;letter-spacing:0;text-align:left;cursor:pointer}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__rows{gap:6px;overflow:visible;border:0;border-radius:0;background:transparent}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__row{grid-template-columns:18px minmax(0,1fr) 48px;min-height:48px;padding:8px 11px;gap:10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 16%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-surface-cont) 54%,transparent);color:color-mix(in srgb,var(--md-on-surface) 82%,transparent);font-size:12px;font-weight:760}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__row:active{border-color:color-mix(in srgb,var(--md-primary) 24%,var(--md-outline-var));background:color-mix(in srgb,var(--md-primary) 9%,var(--md-surface-cont))}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail--single .setting-popular-detail__row{min-height:44px}.setting-popular-detail__row:last-child{border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 16%,transparent)}.setting-popular-detail__count{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:850}.setting-popular-detail__marker{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px}.setting-popular-detail__marker:before{content:"";display:block;width:6px;height:6px;border-radius:999px;background:color-mix(in srgb,var(--md-primary) 46%,var(--md-on-surface-var));opacity:.72}.setting-popular-detail__main{display:grid;gap:7px;min-width:0}.setting-popular-detail__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__value{color:color-mix(in srgb,var(--md-primary) 68%,var(--md-on-surface));font-size:13px;font-weight:860}.setting-popular-detail__count{text-align:right}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__count{color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:11px;font-weight:820}.setting-popular-detail__bar{display:block;width:100%;max-width:260px;height:5px;appearance:none;overflow:hidden;border:0;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 10%,transparent)}.setting-popular-detail__bar::-webkit-progress-bar{border-radius:inherit;background:color-mix(in srgb,var(--md-on-surface-var) 10%,transparent)}.setting-popular-detail__bar::-webkit-progress-value{border-radius:inherit;background:color-mix(in srgb,var(--md-primary) 52%,var(--md-on-surface-var));opacity:.78}.setting-popular-detail__bar::-moz-progress-bar{border-radius:inherit;background:color-mix(in srgb,var(--md-primary) 52%,var(--md-on-surface-var));opacity:.78}.setting-popular-detail__updated{margin-top:var(--sp-sm);color:color-mix(in srgb,var(--md-on-surface-var) 54%,transparent);font-size:var(--fs-label-sm)}.setting-popular-detail__empty{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:750}.page--setting #settingScreenItems .setting-copy{min-width:0;max-width:100%;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.page--setting #settingScreenItems .setting-title-row{display:flex;align-items:center;gap:7px;min-width:0}.page--setting #settingScreenItems .setting-title-row .title{flex:1 1 auto;min-width:0}.page--setting #settingScreenItems .setting-risk-badge{flex:0 0 auto;align-self:center}.page--setting #settingScreenItems .setting-favorite-mark{display:none;flex:0 0 auto;width:16px;height:16px;color:var(--md-info);opacity:.92}.page--setting #settingScreenItems .setting-favorite-mark.is-active{display:inline-flex}.page--setting #settingScreenItems .setting-favorite-mark svg{display:block;width:16px;height:16px;fill:currentColor}.page--setting #settingScreenItems>.row-between.mb-sm{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:end;min-height:56px;margin:0 0 14px;padding:2px 2px 10px}.page--setting #settingScreenItems #itemsTitle{display:inline-flex;align-items:center;gap:8px;min-width:0;color:var(--md-on-surface);font-size:34px;font-weight:900;line-height:1;letter-spacing:0}.page--setting #settingScreenItems .setting-title-backIcon{display:inline-flex;align-items:center;justify-content:center;width:42px;height:42px;flex:0 0 42px;margin-left:-10px;border:0;border-radius:999px;background:transparent;color:var(--md-on-surface);transition:background .14s ease,color .14s ease,transform .14s ease}.page--setting #settingScreenItems #itemsTitle:active .setting-title-backIcon{background:color-mix(in srgb,var(--md-on-surface) 10%,transparent);color:var(--md-on-surface);transform:translate(-1px)}.page--setting #settingScreenItems .setting-title-backIcon .setting-icon{width:24px;height:24px}.page--setting #settingScreenItems .setting-title-backIcon .setting-icon path{stroke-width:3.05}.page--setting #settingScreenItems .setting-title-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems #groupMeta{padding-bottom:3px;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.page--setting #settingScreenItems .setting.is-longpressing{background:color-mix(in srgb,var(--md-info) 7%,transparent)}.page--setting #settingScreenItems.setting-screen-items--detail #items:after{display:none}.page--setting #settingScreenItems .setting-favorites-empty{max-width:min(460px,100%);margin:0 auto;padding:22px 4px;text-align:center;border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 52%,transparent)}.page--setting #settingScreenItems .setting-favorites-empty__title{color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:800}.page--setting #settingScreenItems .setting-favorites-empty__desc{margin-top:6px;color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:650;line-height:1.35;overflow-wrap:anywhere;text-wrap:balance}:lang(ko) .page--setting #settingScreenItems .setting-favorites-empty__desc,:lang(zh) .page--setting #settingScreenItems .setting-favorites-empty__desc{word-break:keep-all;overflow-wrap:break-word}.page--setting #settingScreenItems .setting-marquee{max-width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y;scrollbar-width:none;white-space:nowrap;overflow-wrap:normal;word-break:normal}.page--setting #settingScreenItems .setting-marquee::-webkit-scrollbar{display:none}.page--setting #settingScreenItems .setting-marquee__content{display:inline-block;min-width:max-content;will-change:transform}.page--setting #settingScreenItems .setting-marquee.is-overflowing .setting-marquee__content{animation:setting-marquee-pan 6s linear .5s infinite alternate}.page--setting #settingScreenItems .setting-marquee.is-manual .setting-marquee__content{animation:none;transform:none;will-change:auto}.page--setting #settingScreenItems .title.setting-marquee,.page--setting #settingScreenItems .name.setting-marquee{text-align:left}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #settingScreenItems .ctrl{justify-content:center}}@media(max-width:760px)and (min-aspect-ratio:13/10),(max-width:760px)and (horizontal-viewport-segments:2),(max-width:760px)and (vertical-viewport-segments:2),(min-width:640px)and (max-width:760px)and (min-height:650px){.page--setting #settingScreenItems .ctrl{justify-content:start}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #settingScreenItems>.row-between.mb-sm{min-height:0;margin-bottom:10px;padding-top:0;padding-bottom:8px}.page--setting #settingScreenItems #itemsTitle{font-size:28px}.page--setting #settingScreenItems .setting{padding:18px 0 20px}.page--setting #settingScreenItems .setting-group-card__body>.setting{padding-left:var(--sp-lg);padding-right:var(--sp-lg)}.page--setting #settingScreenItems .settingTop{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.page--setting #settingScreenItems .ctrl{--setting-control-side: 34px;--setting-control-value: 70px;--setting-control-gap: 6px;justify-self:end;justify-content:end;width:calc((var(--setting-control-side) * 2) + var(--setting-control-value) + (var(--setting-control-gap) * 2));max-width:100%}.page--setting #settingScreenItems .ctrl--toggle,.page--setting #settingScreenItems .ctrl--value,.page--setting #settingScreenItems .ctrl--segmented,.page--setting #settingScreenItems .ctrl--select{width:auto}.page--setting #settingScreenItems .smallBtn,.page--setting #settingScreenItems .val{min-height:34px;font-size:12px}.page--setting #settingScreenItems .ctrl--value .val,.page--setting #settingScreenItems .setting-value-arrow{min-height:36px;font-size:var(--fs-label-sm)}.page--setting #settingScreenItems .setting-unit-cycle{min-height:32px;font-size:var(--fs-label-sm)}.page--setting #settingScreenItems .title,.page--setting #settingScreenItems .name{text-align:left}.page--setting #settingScreenItems .descr{margin-top:4px}}@keyframes setting-left-text-pan{0%,16%{transform:translate(0)}72%,86%{transform:translate(var(--setting-label-shift, -24px))}to{transform:translate(0)}}@keyframes setting-marquee-pan{0%,6%{transform:translate(0)}94%,to{transform:translate(calc(var(--setting-marquee-distance, 0px) * -1))}}.setting-tabbar{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:0 0 var(--sp-md);padding:4px;border:1px solid color-mix(in srgb,var(--md-outline-var) 44%,transparent);border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont) 88%,var(--setting-shade))}.setting-tab{min-width:0;min-height:38px;padding:0 10px;border:0;border-radius:calc(var(--r-md) - 4px);background:transparent;color:var(--md-on-surface-var);font-size:14px;font-weight:800;line-height:1;cursor:pointer;transition:background .14s ease,color .14s ease,transform .12s ease}.setting-tab.is-active{background:var(--md-primary);color:var(--md-on-primary)}.setting-tab:active{transform:translateY(1px)}.page--setting #carrotTabContent[hidden],.page--setting #deviceTabContent[hidden],.page--setting #items[hidden],.page--setting #deviceItems[hidden]{display:none!important}.page--setting.setting-tab-device .page-fab-layer--setting{display:none}.page--setting #deviceItems .ctrl{display:flex;grid-template-columns:none;gap:var(--sp-sm);justify-content:flex-end;align-items:center;width:auto}.page--setting #deviceItems .smallBtn,.page--setting #deviceItems .val{width:auto;min-width:78px;max-width:none}.page--setting #deviceItems .device-value{max-width:min(56vw,320px);overflow:hidden;overflow-wrap:normal;text-align:right;text-overflow:ellipsis;white-space:nowrap}.page--setting #deviceItems .device-version-value{display:flex;flex-direction:column;align-items:flex-end;gap:3px;white-space:normal;text-overflow:clip}.page--setting #deviceItems .device-version-value span{display:block;max-width:min(56vw,320px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #deviceItems .device-ssh-control{width:min(68vw,720px);min-width:0}.device-ssh-form{width:100%;min-width:0}.app-dialog--device-ssh .app-dialog__sheet{width:min(520px,calc(100vw - 28px));max-height:min(560px,calc(100dvh - 28px))}.app-dialog--device-ssh .app-dialog__body{flex:1 1 auto;overflow:auto}.device-ssh-dialog{display:grid;gap:18px;min-width:0}.device-ssh-dialog__empty{padding:18px;border:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:var(--r-sm);color:var(--md-on-surface-var);font-weight:800;text-align:center}.device-ssh-key-list{display:grid;gap:8px}.device-ssh-key-list__item{display:grid;gap:5px;min-width:0;padding:10px 12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 72%,transparent)}.device-ssh-key-list__item span{color:color-mix(in srgb,var(--md-primary) 78%,var(--md-on-surface));font-size:12px;font-weight:900}.device-ssh-key-list__item code{min-width:0;overflow-wrap:anywhere;color:var(--md-on-surface);font-family:var(--font-mono);font-size:11px;font-weight:850;line-height:1.25}.page--setting #deviceItems .settingTop>:first-child{min-width:0}.page--setting #deviceItems .ctrl{min-width:0}.page--setting #deviceItems .title{font-size:16px;line-height:1.22}.page--setting #deviceItems .descr{font-size:13px;line-height:1.36}.page--setting #deviceItems .smallBtn{font-size:13px;white-space:nowrap}.page--setting #deviceItems .device-setting{overflow:hidden}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #deviceItems .device-ssh-control{grid-column:1 / -1;width:100%;min-width:0}}.device-toggle{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md);width:100%;cursor:pointer}.device-toggle__text{min-width:0;flex:1 1 auto}.device-toggle--readonly{width:auto;cursor:default;pointer-events:none}.device-setting--disabled{cursor:pointer}.device-setting--disabled .title,.device-setting--disabled .descr,.device-setting--disabled .device-value{color:color-mix(in srgb,var(--md-on-surface-var) 42%,var(--setting-disabled-ink))}.page--setting #deviceItems .device-setting--disabled .ctrl .smallBtn,.page--setting #deviceItems .device-setting--disabled .ctrl .val,.page--setting #deviceItems .device-setting button.is-device-disabled{border-color:color-mix(in srgb,var(--md-outline-var) 28%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-surface-cont-h) 42%,var(--setting-disabled-surface-top)),color-mix(in srgb,var(--md-surface-cont) 40%,var(--setting-disabled-surface-bottom)));color:color-mix(in srgb,var(--md-on-surface-var) 46%,var(--setting-disabled-label));box-shadow:inset 0 1px #ffffff05;filter:grayscale(1) saturate(.35);opacity:.76}.page--setting #deviceItems .device-setting--disabled .ctrl .smallBtn:hover,.page--setting #deviceItems .device-setting--disabled .ctrl .smallBtn:focus-visible,.page--setting #deviceItems .device-setting button.is-device-disabled:hover,.page--setting #deviceItems .device-setting button.is-device-disabled:focus-visible{border-color:color-mix(in srgb,var(--md-outline-var) 34%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-surface-cont-h) 46%,var(--setting-disabled-surface-top-hover)),color-mix(in srgb,var(--md-surface-cont) 42%,var(--setting-disabled-surface-bottom-hover)));color:color-mix(in srgb,var(--md-on-surface-var) 52%,var(--setting-disabled-label-hover));outline:none}.device-setting--disabled .c-switch__track,.device-setting--disabled .c-switch__input:checked+.c-switch__track{opacity:1;border-color:color-mix(in srgb,var(--md-outline-var) 36%,transparent);background:color-mix(in srgb,var(--md-surface-cont-h) 54%,var(--setting-disabled-track))}.device-setting--disabled .c-switch__track:after,.device-setting--disabled .c-switch__input:checked+.c-switch__track:after{background:color-mix(in srgb,var(--md-on-surface-var) 54%,var(--setting-disabled-knob))}.device-setting button:disabled,.device-setting select:disabled{opacity:.56;cursor:default}.device-select{min-width:min(240px,44vw);min-height:38px;padding:6px 10px;border:1px solid var(--md-outline-var);border-radius:var(--r-sm);background:var(--md-surface-cont-h);color:var(--md-on-surface);font-size:var(--fs-body-md);outline:none}.device-tab-error{padding:var(--sp-lg);color:var(--md-error);font-weight:700;text-align:center}.wifi-view-status{min-width:72px;padding:7px 10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 52%,transparent);border-radius:var(--r-sm);color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:800;line-height:1;text-align:center}.wifi-view-status.is-connected{border-color:color-mix(in srgb,var(--md-primary) 78%,var(--md-outline-var));color:var(--md-primary)}.training-guide-modal{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;padding:var(--sp-md);background:var(--popup-backdrop)}.training-guide-modal__surface{position:relative;display:grid;grid-template-rows:minmax(0,1fr) auto;width:min(100%,960px);height:min(100%,540px);overflow:hidden;border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--setting-media-backdrop);box-shadow:var(--popup-shadow)}.training-guide-modal__image{width:100%;height:100%;min-height:0;object-fit:contain;background:var(--setting-media-backdrop)}.training-guide-modal__close{position:absolute;top:10px;right:10px;z-index:1}.training-guide-modal__bar{display:grid;grid-template-columns:minmax(92px,auto) 1fr minmax(92px,auto);gap:var(--sp-sm);align-items:center;padding:var(--sp-sm);border-top:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);background:color-mix(in srgb,var(--md-surface-cont) 82%,var(--setting-shade))}.training-guide-modal__count{color:var(--md-on-surface-var);font-size:var(--fs-body-md);font-weight:800;text-align:center}.device-info-modal__surface{grid-template-rows:auto minmax(0,1fr);width:min(100%,760px);height:min(100%,620px);background:var(--popup-bg)}.device-info-modal__header{padding:var(--sp-md) calc(var(--sp-xl) + 42px) var(--sp-sm) var(--sp-md);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);color:var(--md-on-surface);font-size:var(--fs-title-lg);font-weight:900}.device-info-modal__body{min-height:0;overflow:auto;padding:var(--sp-md);color:var(--md-on-surface);font-size:var(--fs-body-md);line-height:1.45}.device-info-modal__body h2,.device-info-modal__body h3,.device-info-modal__body h5{margin:0 0 var(--sp-sm);color:var(--md-primary)}.device-info-modal__body p{margin:0 0 var(--sp-sm)}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page.page--setting>.page-fab-layer--setting{position:absolute;top:auto;left:auto;right:max(var(--sp-lg),env(safe-area-inset-right,0px));bottom:calc(10px + var(--sp-lg));width:auto;height:auto;display:flex;justify-content:flex-end;z-index:130;pointer-events:none}.page.page--setting>.page-fab-layer--setting .setting-fab-menu{position:relative;right:auto;left:auto;bottom:auto}}.youtube-live-section{display:grid;gap:var(--sp-md);margin:0}.youtube-live-key-card,.youtube-live-card,.youtube-live-help-card{display:grid;gap:var(--sp-md);padding-top:var(--sp-lg);padding-bottom:var(--sp-lg)}.youtube-live-card__summary{min-width:0}.youtube-live-card__title{color:var(--md-on-surface);font-size:var(--fs-title-sm);font-weight:800;letter-spacing:0}.youtube-live-card__desc,.youtube-live-metric__label{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);letter-spacing:0;overflow-wrap:anywhere}.youtube-live-help-list{display:grid;gap:var(--sp-sm);margin:0;padding-left:1.35em;color:var(--md-on-surface-var);font-size:var(--fs-body-sm);letter-spacing:0}.youtube-live-help-list>li{min-width:0;overflow-wrap:anywhere}.youtube-live-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-sm)}.youtube-live-metric{min-width:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--r-md);padding:var(--sp-sm) var(--sp-md);background:color-mix(in srgb,var(--md-surface) 55%,transparent)}.youtube-live-metric__value{margin-top:2px;color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:800;letter-spacing:0;overflow-wrap:anywhere}.youtube-live-actions{--ui-action-min: 136px}.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch{cursor:not-allowed}.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__track,.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__input:checked+.c-switch__track{opacity:1;border-color:color-mix(in srgb,var(--setting-shade) 84%,var(--md-outline-var));background:var(--setting-shade)}.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__track:after,.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__input:checked+.c-switch__track:after{transform:translateY(-50%);background:color-mix(in srgb,var(--md-on-surface-var) 42%,var(--setting-shade));box-shadow:none}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.youtube-live-metrics{grid-template-columns:1fr}}.mapbox-token-card{container-name:mapbox-token-card;container-type:inline-size;display:grid;gap:var(--sp-md);inline-size:100%;min-inline-size:0;padding:var(--sp-md) 0 var(--sp-lg)}.mapbox-token-card__head{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,max-content);align-items:baseline;justify-content:space-between;gap:var(--sp-md);min-width:0}.mapbox-token-card__title,.mapbox-token-field__title{color:var(--md-on-surface);font-size:var(--fs-title-sm);font-weight:850;letter-spacing:0}.mapbox-token-card__desc,.mapbox-token-card__status,.mapbox-token-field__status,.mapbox-token-field__hint{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);letter-spacing:0;overflow-wrap:anywhere}.mapbox-token-card__status{min-width:0;max-width:100%;line-height:1.35;text-align:end}.mapbox-token-list{display:grid;gap:var(--sp-md);min-width:0}.mapbox-token-field{display:grid;gap:var(--sp-sm);min-width:0}.mapbox-token-field__meta{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-md);min-width:0}.mapbox-token-field__status{text-align:right;white-space:nowrap}@container mapbox-token-card (max-width: 360px){.mapbox-token-card__head{grid-template-columns:minmax(0,1fr);gap:var(--sp-xs)}.mapbox-token-card__status{text-align:start}}.page--setting #settingScreenItems .setting-history-detail-block{width:min(520px,100%);margin-top:12px}.setting-history-detail{display:grid;gap:9px;min-width:0;width:100%}.setting-history-detail__head{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.setting-history-detail__name{color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:12px;font-weight:780;overflow-wrap:anywhere}.setting-history-detail__range{flex:0 0 auto;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 8%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);font-size:10px;font-weight:820;line-height:20px}.setting-history-detail__rows{display:grid;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 32%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont)}.setting-history-detail__row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.setting-history-detail__row:last-child{border-bottom:0}.setting-history-detail__marker{width:6px;height:6px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 34%,transparent)}.setting-history-detail__row:first-child .setting-history-detail__marker{background:var(--md-primary)}.setting-history-detail__main{display:grid;gap:3px;min-width:0}.setting-history-detail__param{color:var(--md-on-surface-var);font-size:11px;font-weight:820;overflow-wrap:anywhere}.setting-history-detail__change{display:flex;align-items:center;gap:6px;min-width:0;font-size:var(--fs-label-sm);font-weight:850;overflow-wrap:anywhere}.setting-fingerprint-history{margin-top:12px;max-height:min(40dvh,320px);overflow:auto}.setting-history-detail__prev{color:color-mix(in srgb,var(--md-on-surface-var) 52%,transparent);text-decoration:line-through}.setting-history-detail__arrow{flex:0 0 auto;color:color-mix(in srgb,var(--md-on-surface-var) 42%,transparent)}.setting-history-detail__next{color:var(--md-on-surface)}.setting-history-detail__meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-width:0}.setting-history-detail__time{white-space:nowrap;color:color-mix(in srgb,var(--md-on-surface-var) 50%,transparent);font-size:11px;font-weight:760}.setting-history-detail__badge{min-height:17px;padding:0 6px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 8%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 56%,transparent);font-size:10px;font-weight:800;line-height:17px;white-space:nowrap}.setting-history-detail__badge--engaged{background:color-mix(in srgb,var(--md-warning) 16%,transparent);color:color-mix(in srgb,var(--md-warning) 82%,var(--md-on-surface))}.setting-history-detail__undo{flex:0 0 auto;min-height:28px;padding:0 10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 44%,transparent);border-radius:var(--r-sm);background:transparent;color:var(--md-on-surface-var);font-family:inherit;font-size:11px;font-weight:820;line-height:1;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.setting-history-detail__undo:hover,.setting-history-detail__undo:focus-visible{border-color:color-mix(in srgb,var(--md-outline-var) 64%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,transparent)}.setting-history-detail__undo:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 92%,var(--md-on-surface))}.setting-history-detail__undo:disabled{opacity:var(--state-disabled-opacity);cursor:default}.setting-fingerprint{display:grid;gap:4px;justify-items:center;text-align:center}.setting-fingerprint__code{font-family:var(--font-mono);font-size:var(--fs-title-lg);font-weight:850;letter-spacing:.1em;color:var(--md-primary);user-select:all}.setting-fingerprint__hint{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:780}.setting-fingerprint__status{min-height:22px;padding:0 10px;border-radius:999px;font-size:12px;font-weight:820;line-height:22px}.setting-fingerprint__status--same{background:color-mix(in srgb,var(--md-success) 16%,transparent);color:color-mix(in srgb,var(--md-success) 82%,var(--md-on-surface))}.setting-fingerprint__status--changed{background:color-mix(in srgb,var(--md-warning) 18%,transparent);color:color-mix(in srgb,var(--md-warning) 82%,var(--md-on-surface))}.setting-fingerprint__save{min-height:30px;margin-top:2px;padding:0 14px;border:1px solid color-mix(in srgb,var(--md-outline-var) 50%,transparent);border-radius:999px;background:transparent;color:var(--md-on-surface-var);font-family:inherit;font-size:12px;font-weight:820;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.setting-fingerprint__save:hover,.setting-fingerprint__save:focus-visible{border-color:color-mix(in srgb,var(--md-outline-var) 70%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,transparent)}.setting-fingerprint__save:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 92%,var(--md-on-surface))}.setting-fingerprint__save:disabled{opacity:var(--state-disabled-opacity);cursor:default}.setting-fingerprint__note{color:color-mix(in srgb,var(--md-on-surface-var) 52%,transparent);font-size:11px;font-weight:720}.setting-fingerprint-history__title{margin-bottom:6px;color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:12px;font-weight:800}.setting-history-detail__empty{padding:12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 26%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont);color:color-mix(in srgb,var(--md-on-surface-var) 50%,transparent);font-size:var(--fs-label-sm);font-weight:760;text-align:center}.page--setting #settingScreenItems .setting-doc-language-fallback{margin-bottom:12px;padding:9px 11px;border-left:3px solid var(--md-primary);border-radius:0 var(--r-sm) var(--r-sm) 0;background:color-mix(in srgb,var(--md-primary) 9%,transparent);color:color-mix(in srgb,var(--md-on-surface) 82%,var(--md-on-surface-var));font-size:11px;font-weight:780}.page--setting #settingScreenItems .setting-doc-markdown>:first-child{margin-top:0}.page--setting #settingScreenItems .setting-doc-markdown>:last-child{margin-bottom:0}.page--setting #settingScreenItems .setting-doc-markdown h2,.page--setting #settingScreenItems .setting-doc-markdown h3,.page--setting #settingScreenItems .setting-doc-markdown h4,.page--setting #settingScreenItems .setting-doc-markdown h5,.page--setting #settingScreenItems .setting-doc-markdown h6{margin:18px 0 8px;color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:860;line-height:1.3}.page--setting #settingScreenItems .setting-doc-markdown h3,.page--setting #settingScreenItems .setting-doc-markdown h4,.page--setting #settingScreenItems .setting-doc-markdown h5,.page--setting #settingScreenItems .setting-doc-markdown h6{font-size:var(--fs-body-sm)}.page--setting #settingScreenItems .setting-doc-markdown p{margin:8px 0}.page--setting #settingScreenItems .setting-doc-markdown ul,.page--setting #settingScreenItems .setting-doc-markdown ol{margin:8px 0;padding-left:22px}.page--setting #settingScreenItems .setting-doc-markdown li+li{margin-top:4px}.page--setting #settingScreenItems .setting-doc-markdown code{padding:1px 5px;border-radius:5px;background:color-mix(in srgb,var(--md-on-surface) 7%,transparent);color:color-mix(in srgb,var(--md-primary) 74%,var(--md-on-surface));font-family:var(--font-mono);font-size:.94em}.page--setting #settingScreenItems .setting-doc-markdown pre{max-width:100%;margin:10px 0;padding:11px 12px;overflow:auto;border:1px solid color-mix(in srgb,var(--md-outline-var) 26%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,#05080c 78%,var(--md-surface-cont))}.page--setting #settingScreenItems .setting-doc-markdown pre code{padding:0;border-radius:0;background:transparent;color:var(--md-on-surface);white-space:pre-wrap}.page--setting #settingScreenItems .setting-doc-markdown a{color:var(--md-primary);text-decoration:none}.page--setting #settingScreenItems .setting-doc-table-wrap{max-width:100%;margin:10px 0;overflow-x:auto;border:1px solid color-mix(in srgb,var(--md-outline-var) 28%,transparent);border-radius:var(--r-sm)}.page--setting #settingScreenItems .setting-doc-markdown table{width:100%;border-collapse:collapse;font-size:11px}.page--setting #settingScreenItems .setting-doc-markdown th,.page--setting #settingScreenItems .setting-doc-markdown td{min-width:72px;padding:8px 10px;border-right:1px solid color-mix(in srgb,var(--md-outline-var) 20%,transparent);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 20%,transparent);text-align:left;vertical-align:top}.page--setting #settingScreenItems .setting-doc-markdown th:last-child,.page--setting #settingScreenItems .setting-doc-markdown td:last-child{border-right:0}.page--setting #settingScreenItems .setting-doc-markdown tbody tr:last-child td{border-bottom:0}.page--setting #settingScreenItems .setting-doc-markdown th{background:color-mix(in srgb,var(--md-on-surface) 6%,transparent);color:var(--md-on-surface);font-weight:820}.page--setting #settingScreenItems .setting-doc-callout{margin:10px 0;padding:10px 12px;border-left:3px solid color-mix(in srgb,var(--md-primary) 76%,transparent);border-radius:0 var(--r-sm) var(--r-sm) 0;background:color-mix(in srgb,var(--md-primary) 8%,transparent)}.page--setting #settingScreenItems .setting-doc-callout--warning,.page--setting #settingScreenItems .setting-doc-callout--caution{border-left-color:var(--md-warning);background:color-mix(in srgb,var(--md-warning) 9%,transparent)}.page--setting #settingScreenItems .setting-doc-markdown hr{margin:14px 0;border:0;border-top:1px solid color-mix(in srgb,var(--md-outline-var) 28%,transparent)}.page--setting #settingScreenItems .setting-context{width:100%;min-width:0;margin:14px 0 var(--sp-md);overflow:hidden;border:1px solid var(--setting-card-outline);border-radius:var(--setting-card-radius);background:var(--setting-card-surface);box-shadow:var(--setting-card-shadow)}.page--setting #settingScreenItems .setting-context__tabs{--segmented-control-gap: 0;--segmented-control-padding: 0;--segmented-control-item-min-height: var(--control-min-height);--segmented-control-item-padding: 0 var(--sp-sm);--segmented-control-item-flex: 1 1 0;--segmented-control-item-font-size: var(--fs-label-md);--segmented-control-item-radius: 0;--segmented-control-item-border: transparent;--segmented-control-item-bg: transparent;--segmented-control-item-fg: color-mix(in srgb, var(--md-on-surface-var) 72%, transparent);--segmented-control-selected-border: transparent;--segmented-control-selected-bg: color-mix(in srgb, var(--md-primary) 11%, var(--md-surface-cont-h));--segmented-control-selected-fg: var(--md-primary);width:100%;margin:0;overflow:hidden;border:0;border-bottom:1px solid var(--setting-card-outline);border-radius:var(--setting-card-radius) var(--setting-card-radius) 0 0;background:color-mix(in srgb,var(--md-surface-cont-h) 72%,var(--setting-card-surface))}.page--setting #settingScreenItems .setting-context__tab{position:relative;gap:5px;overflow:hidden;font-family:inherit;font-weight:850;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:border-color var(--motion-quick) var(--ease-standard),background var(--motion-quick) var(--ease-standard),color var(--motion-quick) var(--ease-standard)}.page--setting #settingScreenItems .setting-context__tab:not(:last-child){border-right-color:color-mix(in srgb,var(--setting-card-outline) 62%,transparent)}.page--setting #settingScreenItems .setting-context__tab:first-child{border-top-left-radius:var(--setting-card-radius)}.page--setting #settingScreenItems .setting-context__tab:last-child{border-top-right-radius:var(--setting-card-radius)}.page--setting #settingScreenItems .setting-context__tab:hover{background:color-mix(in srgb,var(--md-on-surface) 5%,var(--md-surface-cont-h));color:var(--md-on-surface)}.page--setting #settingScreenItems .setting-context__tab[aria-selected=true]{border-color:var(--segmented-control-selected-border);background:var(--segmented-control-selected-bg);color:var(--segmented-control-selected-fg)}.page--setting #settingScreenItems .setting-context__tab:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:-2px}.page--setting #settingScreenItems .setting-context__tab-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems .setting-context__tab-count{display:inline-grid;min-width:18px;height:18px;flex:0 0 auto;place-items:center;padding-inline:5px;border-radius:999px;background:var(--md-surface-cont-hh);color:var(--md-on-surface-var);font-size:10px;font-variant-numeric:tabular-nums;font-weight:850}.page--setting #settingScreenItems .setting-context__tab[aria-selected=true] .setting-context__tab-count{background:color-mix(in srgb,var(--md-primary) 16%,var(--md-surface-cont-hh));color:var(--md-primary)}.page--setting #settingScreenItems .setting-context__panel{min-width:0}.page--setting #settingScreenItems .setting-context__panel[hidden]{display:none}.page--setting #settingScreenItems .setting-context__content{min-width:0;min-height:168px;padding:clamp(var(--sp-md),2.5vw,var(--sp-lg));color:var(--md-on-surface-var)}.page--setting #settingScreenItems .setting-context__state{display:grid;min-height:136px;align-content:center;justify-items:center;padding:var(--sp-lg);color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);text-align:center}.page--setting #settingScreenItems .setting-context__state strong{max-width:34rem;font-size:var(--fs-label-md);font-weight:780;line-height:1.45;text-wrap:balance}.page--setting #settingScreenItems .setting-context__state--loading strong{animation:setting-context-loading 1.2s ease-in-out infinite alternate}.page--setting #settingScreenItems .setting-context .setting-popular-detail-block,.page--setting #settingScreenItems .setting-context .setting-history-detail-block{width:100%;margin:0}.page--setting #settingScreenItems .setting-context .setting-popular-detail{width:100%;min-width:0}.page--setting #settingScreenItems .setting-context .setting-popular-detail__rows{gap:6px;overflow:visible;border:0;border-radius:0;background:transparent}.page--setting #settingScreenItems .setting-context .setting-popular-detail__row{grid-template-columns:18px minmax(0,1fr) minmax(44px,auto);min-height:46px;padding:7px 11px;gap:10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-l) 62%,transparent);font-size:var(--fs-label-md)}.page--setting #settingScreenItems .setting-context .setting-popular-detail__row:last-child{border-bottom-color:color-mix(in srgb,var(--md-outline-var) 22%,transparent)}.page--setting #settingScreenItems .setting-context .setting-popular-detail__row:active{border-color:color-mix(in srgb,var(--md-primary) 32%,var(--md-outline-var));background:var(--md-primary-state-soft)}.page--setting #settingScreenItems .setting-context .setting-popular-detail__updated{margin-top:var(--sp-sm);color:color-mix(in srgb,var(--md-on-surface-var) 54%,transparent);font-size:var(--fs-label-sm)}.page--setting #settingScreenItems .setting-context__history-summary{display:grid;gap:var(--sp-md)}.page--setting #settingScreenItems .setting-context__more{width:100%;min-height:var(--control-min-height);border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:var(--control-radius);background:var(--md-surface-cont-h);color:var(--md-on-surface-var);font-family:inherit;font-size:var(--fs-label-md);font-weight:820;cursor:pointer}.page--setting #settingScreenItems .setting-context__more:hover,.page--setting #settingScreenItems .setting-context__more:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 42%,var(--md-outline-var));background:var(--md-primary-state-soft)}.setting-context__history-dialog{width:min(640px,calc(100vw - 32px));max-width:100%;max-height:min(82dvh,720px);padding:0;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-lg);background:var(--md-surface-cont);color:var(--md-on-surface);box-shadow:var(--shadow-4)}.setting-context__history-dialog::backdrop{background:#000000ad;backdrop-filter:blur(2px)}.setting-context__dialog-header{display:flex;min-height:56px;align-items:center;justify-content:space-between;gap:var(--sp-md);padding:8px var(--sp-md);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent)}.setting-context__dialog-header h3{margin:0;font-size:var(--fs-body-md);font-weight:880}.setting-context__dialog-close{width:40px;height:40px;flex:0 0 auto;border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:var(--control-radius);background:var(--md-surface-cont-h);color:var(--md-on-surface);font-family:inherit;font-size:21px;cursor:pointer}.setting-context__dialog-body{max-height:calc(min(82dvh,720px) - 56px);overflow:auto;padding:var(--sp-md);overscroll-behavior:contain}.setting-context__dialog-body .setting-history-detail__head{display:none}.page--setting #settingScreenItems .setting-doc-ast details{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent)}.page--setting #settingScreenItems .setting-doc-ast details>summary{display:flex;min-height:var(--control-min-height);align-items:center;justify-content:space-between;gap:var(--sp-md);cursor:pointer;color:var(--md-on-surface);font-weight:820;list-style:none}.page--setting #settingScreenItems .setting-doc-ast details>summary::-webkit-details-marker{display:none}.page--setting #settingScreenItems .setting-doc-ast details>summary:after{content:"+";color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);font-size:18px}.page--setting #settingScreenItems .setting-doc-ast details[open]>summary:after{content:"−"}.page--setting #settingScreenItems .setting-doc-callout__label{display:block;margin-bottom:5px;color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:880}.page--setting #settingScreenItems .setting-doc-markdown img{display:block;width:auto;max-width:100%;height:auto;margin:var(--sp-md) auto;border-radius:var(--r-sm)}.page--setting #settingScreenItems .setting-doc-task-item{list-style:none}.page--setting #settingScreenItems .setting-doc-task{margin-right:var(--sp-sm);accent-color:var(--md-primary)}.page--setting #settingScreenItems .setting-doc-markdown [data-align=center]{text-align:center}.page--setting #settingScreenItems .setting-doc-markdown [data-align=right]{text-align:right}@media(max-width:640px){.page--setting #settingScreenItems .setting-context{margin-top:12px}.page--setting #settingScreenItems .setting-context__tabs{--segmented-control-item-min-height: 42px;--segmented-control-item-padding: 0 var(--sp-xs);--segmented-control-item-font-size: var(--fs-label-sm)}.page--setting #settingScreenItems .setting-context__content{min-height:152px;padding:var(--sp-md)}.setting-context__history-dialog{width:100%;max-height:82dvh;margin:auto 0 0;border-right:0;border-bottom:0;border-left:0;border-radius:var(--r-lg) var(--r-lg) 0 0}.setting-context__dialog-body{max-height:calc(82dvh - 56px)}}@media(max-height:500px)and (orientation:landscape){.page--setting #settingScreenItems .setting-context__content{min-height:132px}.setting-context__history-dialog{max-height:calc(100dvh - 16px)}.setting-context__dialog-body{max-height:calc(100dvh - 72px)}}@media(prefers-reduced-motion:reduce){.page--setting #settingScreenItems .setting-context__state--loading strong{animation:none}}@keyframes setting-context-loading{0%{opacity:.48}to{opacity:.86}} +:root{--setting-fab-accent: #ffab66;--setting-fab-accent-pressed: #ff9c4a;--setting-on-fab-accent: #111;--setting-restored-ink: #a9e8b2;--setting-info-ink: #bae6fd;--setting-shade: #000;--setting-media-backdrop: #000;--setting-disabled-ink: #474d55;--setting-disabled-label: #505761;--setting-disabled-label-hover: #58606a;--setting-disabled-surface-top: #22272e;--setting-disabled-surface-bottom: #171b20;--setting-disabled-surface-top-hover: #262b32;--setting-disabled-surface-bottom-hover: #191d22;--setting-disabled-track: #2f343a;--setting-disabled-knob: #6a7078}.page--setting{--setting-menu-list-gap: 6px;--setting-menu-item-min-height: 46px;--setting-menu-item-padding-inline: 12px;--setting-profile-accent: var(--md-primary, var(--setting-fab-accent));--setting-profile-ink: var(--md-on-surface);--setting-profile-surface: var(--md-surface-cont-h);--setting-profile-outline: color-mix(in srgb, var(--md-outline-var) 46%, transparent);--setting-profile-toolbar-height: 58px;--setting-card-surface: var(--md-surface-cont);--setting-card-outline: color-mix(in srgb, var(--md-outline-var) 22%, transparent);--setting-card-radius: var(--r-xl);--setting-card-shadow: var(--shadow-1)}.page--setting #settingScreenHost.setting-screen-transitioning{overflow:hidden!important}.page--setting #settingScreenHost.setting-screen-transitioning>.page-transitioning{overflow:hidden;background:var(--md-surface);pointer-events:none;contain:paint}.page--setting.setting-screen-transitioning #carrotTabContent,.page--setting.setting-screen-transitioning #deviceTabContent,.page--setting.setting-screen-transitioning #items,.page--setting.setting-screen-transitioning #deviceItems,.page--setting .setting-screen-snapshot,.page--setting .setting-screen-snapshot *{animation:none!important}.page--setting .setting.is-restored-live .val{border-color:color-mix(in srgb,var(--md-success) 62%,var(--md-outline-var));background:color-mix(in srgb,var(--md-success) 14%,var(--md-surface-cont-h));color:color-mix(in srgb,var(--setting-restored-ink) 82%,var(--md-on-surface))}.page--setting #groupList>.groupBtn.ui-stagger-item,.page--setting #deviceGroupList>.groupBtn.ui-stagger-item,.page--setting #items>.setting.ui-stagger-item,.page--setting #items>.setting-section-block.ui-stagger-item,.page--setting #items>.setting-group-card.ui-stagger-item,.page--setting #items>.setting-profile-section.ui-stagger-item,.page--setting #deviceItems>.setting.ui-stagger-item{animation-name:setting-item-stagger-in;animation-duration:.32s;animation-timing-function:cubic-bezier(.2,0,0,1);animation-fill-mode:both;animation-delay:min(calc(var(--i, 0) * 34ms),.36s)}.setting-search-backdrop{position:fixed;inset:0;z-index:170;border:0;background:color-mix(in srgb,var(--md-surface) 38%,transparent);backdrop-filter:blur(6px) saturate(108%);-webkit-backdrop-filter:blur(6px) saturate(108%)}.page-fab-layer--setting .setting-fab-menu{--fab-size: 68px;position:fixed;right:max(var(--sp-lg),env(safe-area-inset-right,0px));bottom:calc(var(--nav-bar-height) + env(safe-area-inset-bottom,0px) + 10px + var(--sp-lg));z-index:130;display:flex;flex-direction:column;align-items:flex-end;pointer-events:auto;transform-origin:right bottom}@keyframes setting-fab-enter{0%{opacity:0}to{opacity:1}}body[data-page=setting] .page-fab-layer--setting .setting-fab-menu{animation:setting-fab-enter var(--motion-medium) var(--ease-emphasized) both}.page--setting.setting-screen-transitioning .setting-fab-menu{pointer-events:none}@media(prefers-reduced-motion:reduce){body[data-page=setting] .page-fab-layer--setting .setting-fab-menu{animation:none}}.setting-fab-actions{position:absolute;right:0;bottom:calc(var(--fab-size) + 10px);display:flex;flex-direction:column;align-items:flex-end;gap:10px;opacity:0;transform:translateY(8px) scale(.96);transform-origin:right bottom;transition:opacity .16s cubic-bezier(.3,0,.8,.15),transform .18s cubic-bezier(.3,0,.8,.15);pointer-events:none;will-change:opacity,transform}.setting-fab-actions[hidden]{display:none!important}.setting-fab-menu.is-open .setting-fab-actions{opacity:1;transform:translateY(0) scale(1);pointer-events:auto;visibility:visible;transition:opacity .22s cubic-bezier(.2,0,0,1),transform .26s cubic-bezier(.2,0,0,1)}.setting-fab-action{min-width:152px;min-height:44px;display:inline-grid;grid-template-columns:20px minmax(0,1fr);align-items:center;gap:10px;padding:0 16px;border:1px solid color-mix(in srgb,var(--md-outline-var) 84%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont) 92%,var(--setting-shade));color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:800;line-height:1;text-align:left;box-shadow:0 12px 28px #00000042;cursor:pointer;-webkit-tap-highlight-color:transparent;opacity:0;transform:translateY(6px) scale(.96);transform-origin:right center;transition:opacity .14s cubic-bezier(.3,0,.8,.15),transform .14s cubic-bezier(.3,0,.8,.15)}.setting-fab-menu.is-open .setting-fab-action{opacity:1;transform:translateY(0) scale(1);transition:opacity .22s cubic-bezier(.2,0,0,1),transform .26s cubic-bezier(.2,0,0,1)}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(1){transition-delay:0ms}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(2){transition-delay:40ms}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(3){transition-delay:80ms}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(4){transition-delay:.12s}.setting-fab-menu.is-open .setting-fab-action:nth-last-child(5){transition-delay:.16s}.setting-fab-action svg{width:20px;height:20px;color:var(--md-primary)}.setting-fab-action span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setting-fab-action:active{background:color-mix(in srgb,var(--md-primary) 12%,var(--md-surface-cont))}.setting-fab-action:disabled,.setting-fab-action[aria-disabled=true]{color:color-mix(in srgb,var(--md-on-surface-var) 64%,transparent);cursor:default;opacity:.72}.setting-fab-action:disabled svg,.setting-fab-action[aria-disabled=true] svg{color:color-mix(in srgb,var(--md-on-surface-var) 72%,transparent)}.fab--setting-menu{background:var(--setting-fab-accent);border-color:var(--setting-fab-accent);color:var(--setting-on-fab-accent);box-shadow:0 12px 28px #ff873a38;transition:background .18s ease,border-color .18s ease,box-shadow .2s ease,transform .2s cubic-bezier(.2,0,0,1)}.fab--setting-menu.active,.fab--setting-menu:active{background:var(--setting-fab-accent-pressed);border-color:var(--setting-fab-accent-pressed);color:var(--setting-on-fab-accent);box-shadow:0 12px 30px #ff873a4d}.fab--setting-menu:active{transform:scale(.94)}.setting-fab-menu.is-open .fab--setting-menu{box-shadow:0 16px 34px #ff873a57}.fab--setting-menu.is-bouncing{animation:setting-fab-bounce .3s cubic-bezier(.2,0,0,1)}.fab--setting-menu svg{width:26px;height:26px}.fab--setting-menu .setting-fab-menu-icon{fill:none}.fab--setting-menu .setting-fab-menu-icon path,.fab--setting-menu .setting-fab-menu-icon circle{fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}@keyframes setting-fab-bounce{0%{transform:scale(1)}30%{transform:scale(.93)}62%{transform:scale(1.03)}to{transform:scale(1)}}@media(prefers-reduced-motion:reduce){.setting-fab-actions,.setting-fab-action,.fab--setting-menu svg{transition:none!important}.fab--setting-menu.is-bouncing{animation:none!important}.setting-fab-menu.is-open .setting-fab-action{transition-delay:0ms!important}}.setting-search-panel{--setting-search-form-width: clamp(320px, 42vw, 520px);--setting-search-results-width: min(72vw, 760px);--setting-search-results-max-height: 680px;position:fixed;top:var(--app-vv-top, 0px);right:0;bottom:auto;left:0;width:100vw;height:var(--app-vv-height, 100dvh);min-height:0;box-sizing:border-box;z-index:171;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:14px;padding:calc(18px + env(safe-area-inset-top,0px)) var(--sp-lg) calc(var(--app-nav-bottom-gap, var(--nav-bar-height)) + 18px + var(--kb-inset) + env(safe-area-inset-bottom,0px));pointer-events:none}.setting-search-panel:before{content:none}.setting-search-form{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:0;width:min(var(--setting-search-form-width),calc(100vw - 40px));min-height:clamp(56px,7vh,62px);padding-left:20px;border:1px solid color-mix(in srgb,var(--md-primary) 26%,var(--md-stroke-soft));border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont) 76%,transparent);backdrop-filter:blur(10px) saturate(112%);-webkit-backdrop-filter:blur(10px) saturate(112%);box-shadow:0 18px 40px #00000042;pointer-events:auto;position:relative;z-index:1;flex:0 0 auto}.setting-search-backdrop[hidden],.setting-search-panel[hidden]{display:none!important}.setting-search-form:focus-within{border-color:color-mix(in srgb,var(--md-primary) 46%,var(--md-stroke-strong))}.setting-search-form__input{min-width:0;min-height:56px;border:0;background:transparent;color:var(--md-on-surface);font-size:var(--fs-body-md);outline:none}.setting-search-form__submit{width:56px;height:100%;border:0;border-left:1px solid color-mix(in srgb,var(--md-stroke-soft) 42%,transparent);border-radius:0 var(--control-radius) var(--control-radius) 0;background:transparent;color:var(--md-primary);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}.setting-search-form__submit:active{background:color-mix(in srgb,var(--md-primary) 12%,transparent)}.setting-search-form__submit svg{width:20px;height:20px}.setting-search-results{display:flex;flex-direction:column;gap:0;width:min(var(--setting-search-results-width),calc(100vw - 40px));min-height:0;padding:0 4px 12px;max-height:var(--setting-search-results-max-height);flex:1 1 auto;overflow:auto;overscroll-behavior:contain;scroll-padding-block:8px 18px;scrollbar-gutter:stable;pointer-events:auto;position:relative;z-index:1}.setting-search-results:empty{display:none}.setting-search-section{display:grid;gap:var(--sp-sm);padding:0 0 var(--sp-lg)}.setting-search-section__title{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 4px;color:var(--md-primary);font-size:var(--fs-title-sm);font-weight:900;letter-spacing:0}.setting-search-section__title strong{color:var(--md-on-surface-var);font-size:var(--fs-label-md);font-weight:800}.setting-search-section__body{overflow:hidden;background:var(--md-surface-cont);border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--r-xl);box-shadow:var(--shadow-1)}.page--setting #groupList,.page--setting #deviceGroupList{display:flex;flex-direction:column;gap:var(--setting-menu-list-gap)}.page--setting .setting-group-skeleton{display:flex;align-items:center;min-height:var(--setting-menu-item-min-height);padding:0 var(--setting-menu-item-padding-inline);border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--control-radius);background:var(--md-surface-cont)}.page--setting .setting-group-skeleton__line{width:clamp(92px,52%,180px);height:12px;border-radius:var(--r-round);background:color-mix(in srgb,var(--md-on-surface-var) 14%,transparent);animation:setting-skeleton-pulse 1.25s ease-in-out infinite alternate}@keyframes setting-skeleton-pulse{0%{opacity:.42}to{opacity:.82}}@media(prefers-reduced-motion:reduce){.page--setting .setting-group-skeleton__line{animation:none;opacity:.62}}.page--setting #groupList .groupBtn,.page--setting #deviceGroupList .groupBtn{display:flex;align-items:center;min-height:var(--setting-menu-item-min-height);margin-bottom:0;padding:0 var(--setting-menu-item-padding-inline);font-size:14px;line-height:1.18}.page--setting #groupList .groupBtn--favorites{border-color:color-mix(in srgb,var(--md-info) 34%,var(--md-outline-var));background:color-mix(in srgb,var(--md-info) 7%,var(--md-surface-cont-h))}.page--setting #groupList .groupBtn--favorites.active{border-color:color-mix(in srgb,var(--md-info) 64%,var(--md-outline-var));color:color-mix(in srgb,var(--setting-info-ink) 82%,var(--md-on-surface))}.page--setting #groupList .groupBtn--profile{border-color:var(--setting-profile-outline);background:var(--md-surface-cont-h);color:var(--md-on-surface)}.page--setting #groupList .groupBtn--profile.active{border-color:color-mix(in srgb,var(--md-primary) 48%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary)}.setting-profile-divider{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:10px;padding:10px 2px 4px;color:var(--md-on-surface-var);font-size:12px;font-weight:900;letter-spacing:0}.setting-profile-divider span{height:1px;background:color-mix(in srgb,var(--md-outline-var) 46%,transparent)}.setting-profile-divider strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setting-profile-section{--setting-profile-accent: var(--md-primary, var(--setting-fab-accent));--setting-profile-divider: color-mix(in srgb, var(--setting-profile-accent) 34%, var(--md-outline-var));min-width:0;border-top:0;scroll-margin-top:calc(var(--setting-profile-section-sticky-top, 64px) + 8px)}.setting-profile-section+.setting-profile-section{border-top:0}.setting-profile-section__header{position:static;min-width:0;width:100%;box-sizing:border-box;min-height:0;display:grid;grid-template-columns:minmax(0,1fr) auto 18px;align-items:center;gap:8px;padding:0 2px;border:0;background:transparent;box-shadow:none;color:var(--setting-profile-accent);font:inherit;font-size:var(--fs-title-sm);font-weight:900;letter-spacing:0;text-align:left;cursor:pointer;transition:background .14s ease,color .14s ease,border-color .14s ease}.setting-profile-section__header:hover,.setting-profile-section__header:focus-visible{background:transparent;color:color-mix(in srgb,var(--setting-profile-accent) 82%,var(--md-on-surface));outline:none}.setting-profile-section__label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.setting-profile-section__count{min-width:0;padding:2px 0;color:var(--setting-profile-accent);font-size:12px;font-weight:900;text-align:right}.setting-profile-section__chevron{width:18px;height:18px;color:color-mix(in srgb,var(--setting-profile-accent) 84%,var(--md-on-surface));fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;transition:transform .16s ease}.setting-profile-section.is-collapsed .setting-profile-section__chevron{transform:rotate(-90deg)}.setting-profile-section__body{min-width:0;display:grid;grid-template-rows:1fr;overflow:hidden;opacity:1;transform:translateY(0);will-change:grid-template-rows,opacity,transform}.setting-profile-section.is-collapsed .setting-profile-section__body{grid-template-rows:0fr;opacity:0;pointer-events:none;transform:translateY(-4px)}.setting-profile-section__bodyInner{min-height:0;overflow:hidden}.setting-profile-section.is-collapsing .setting-profile-section__body{pointer-events:none;animation:setting-profile-section-fold .24s cubic-bezier(.2,0,0,1) both}.setting-profile-section.is-expanding .setting-profile-section__body{animation:setting-profile-section-fold .24s cubic-bezier(.2,0,0,1) reverse both}.setting-profile-panel{--setting-profile-accent: var(--md-primary, var(--setting-fab-accent));--setting-profile-ink: var(--md-on-surface);--setting-profile-section-sticky-top: 68px;min-width:0;color:var(--setting-profile-ink);animation:setting-profile-toolbar-enter .2s cubic-bezier(.2,0,0,1) both}.setting-profile-manage-card{min-width:0;display:grid;gap:0}.setting-profile-card__rows{min-width:0;display:grid}.setting-profile-card__rows>.setting-profile-row:first-child{border-top:none;padding-top:var(--sp-md)}.setting-profile-row{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md);min-height:52px;padding:var(--sp-sm) 0;border-top:1px solid color-mix(in srgb,var(--md-stroke-soft) 32%,transparent)}.setting-profile-row:last-child{padding-bottom:var(--sp-md)}.setting-profile-row__label{flex:0 0 auto;color:var(--md-on-surface-var);font-size:var(--fs-label-md);font-weight:800;line-height:1.2}.setting-profile-row__value{min-width:0;flex:1 1 auto;overflow:hidden;color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:700;line-height:1.3;text-align:right;text-overflow:ellipsis;white-space:nowrap}.setting-profile-row__value a{color:var(--md-primary);font-weight:800;text-decoration:none}.setting-profile-row--name .setting-profile-row__label{color:var(--md-primary);font-size:var(--fs-title-sm);font-weight:900}.setting-profile-name-input{flex:1 1 auto;min-width:0;height:40px;box-sizing:border-box;padding:0 var(--sp-md);border:1px solid color-mix(in srgb,var(--md-outline-var) 30%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 60%,transparent);color:var(--md-on-surface);font:inherit;font-size:var(--fs-body-sm);font-weight:800;text-align:right;outline:none;transition:border-color .14s ease,background .14s ease,color .14s ease}.setting-profile-name-input:focus{border-color:color-mix(in srgb,var(--md-primary) 58%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 82%,var(--md-primary))}.setting-profile-name-input.is-saving{color:color-mix(in srgb,var(--md-on-surface) 72%,var(--md-primary))}.setting-profile-menu{flex:0 0 auto}.setting-profile-menu__button{width:40px;min-width:40px;min-height:40px;border-color:color-mix(in srgb,var(--md-outline-var) 24%,transparent);background:color-mix(in srgb,var(--md-surface-cont-h) 48%,transparent)}.setting-profile-menu__button svg{width:22px;height:22px}.setting-profile-menu__panel{position:absolute;top:calc(100% + 8px);right:0;z-index:9;min-width:168px}.setting-profile-menu__item .setting-profile-action__icon{width:18px;height:18px}.setting-profile-menu__item--primary,.setting-profile-menu__item--primary .setting-profile-action__icon{color:var(--md-primary)}.setting-profile-menu__item--danger,.setting-profile-menu__item--danger .setting-profile-action__icon{color:var(--md-error)}.setting-profile-action__icon{width:22px;height:22px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.setting-toolbar-action{min-width:56px;min-height:42px;padding:0 14px;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:8px;background:var(--md-surface-cont);color:var(--md-on-surface);cursor:pointer;font:inherit;font-size:13px;font-weight:850;line-height:1;transition:background .14s ease,border-color .14s ease,color .14s ease,transform .12s ease}.setting-toolbar-action:hover,.setting-toolbar-action:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-surface-cont-h) 88%,var(--md-primary));outline:none}.setting-toolbar-action:active{transform:translateY(1px)}.setting-toolbar-action--primary{border-color:color-mix(in srgb,var(--md-primary) 76%,var(--md-outline-var));background:var(--md-primary);color:var(--md-on-primary)}.setting-toolbar-action--danger{color:var(--md-error)}@keyframes setting-profile-toolbar-enter{0%{opacity:0}to{opacity:1}}@keyframes setting-item-stagger-in{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@keyframes setting-profile-section-fold{0%{grid-template-rows:1fr;opacity:1;transform:translateY(0)}to{grid-template-rows:0fr;opacity:0;transform:translateY(-4px)}}@media(prefers-reduced-motion:reduce){.setting-profile-panel,.page--setting #groupList>.groupBtn.ui-stagger-item,.page--setting #deviceGroupList>.groupBtn.ui-stagger-item,.page--setting #items>.setting.ui-stagger-item,.page--setting #items>.setting-section-block.ui-stagger-item,.page--setting #items>.setting-group-card.ui-stagger-item,.page--setting #items>.setting-profile-section.ui-stagger-item,.page--setting #deviceItems>.setting.ui-stagger-item,.setting-profile-section.is-collapsing .setting-profile-section__body,.setting-profile-section.is-expanding .setting-profile-section__body{animation:none}.setting-profile-section__header,.setting-profile-section__chevron,.setting-toolbar-action{transition:none}}.setting-category-divider{padding-top:var(--sp-lg)}.setting-category-divider strong{color:var(--md-primary);font-size:var(--fs-label-md);font-weight:900;letter-spacing:.01em}.setting-category-divider span{background:color-mix(in srgb,var(--md-primary) 30%,transparent)}.setting-section-block{display:grid;gap:8px;margin:0 0 var(--sp-lg)}.setting-group-card{background:var(--setting-card-surface);border:1px solid var(--setting-card-outline);border-radius:var(--setting-card-radius);padding:0 var(--sp-lg);margin:0;box-shadow:var(--setting-card-shadow)}.setting-group-card__title{padding:0 2px;color:var(--md-primary);font-size:var(--fs-title-sm);font-weight:900;letter-spacing:0}.setting-group-card__body>.setting{margin-left:calc(-1 * var(--sp-lg));margin-right:calc(-1 * var(--sp-lg));border-radius:0;padding-left:var(--sp-lg);padding-right:var(--sp-lg);border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 32%,transparent)}.setting-group-card__body>.setting:first-child{border-top-left-radius:calc(var(--r-xl) - 1px);border-top-right-radius:calc(var(--r-xl) - 1px)}.setting-group-card__body>.setting:last-child{border-bottom-left-radius:calc(var(--r-xl) - 1px);border-bottom-right-radius:calc(var(--r-xl) - 1px);border-bottom:none}.app-dialog--settings-diff .app-dialog__sheet{width:min(calc(100vw - 24px),520px);max-height:min(calc(100dvh - 24px),680px);overflow:hidden}.app-dialog--settings-diff .app-dialog__body{min-height:0;overflow:auto;white-space:normal}.setting-profile-apply{min-width:0;display:grid;gap:10px}.setting-profile-apply__title{min-width:0;overflow:hidden;color:var(--md-on-surface);font-size:14px;font-weight:900;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.setting-search-result{width:100%;padding:12px 14px;border:0;border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 32%,transparent);border-radius:0;background:transparent;color:inherit;text-align:left;cursor:pointer}.setting-search-section__body>.setting-search-result:last-child{border-bottom:0}.setting-search-result:hover,.setting-search-result:focus-visible{background:color-mix(in srgb,var(--md-surface-cont) 88%,var(--md-primary));outline:none}.setting-search-result:active{transform:translateY(1px)}.setting-search-result--empty{cursor:default;color:var(--md-on-surface-var);border:1px solid var(--popup-item-border);border-radius:var(--popup-item-radius);background:var(--popup-item-bg)}.setting-search-result__group{color:var(--md-primary);font-size:var(--fs-label-md);font-weight:700}.setting-search-result__title{margin-top:4px;color:var(--md-on-surface);font-size:var(--fs-body-lg);font-weight:700}.setting-search-result__name{margin-top:2px;color:var(--md-outline);font-family:var(--font-mono);font-size:var(--fs-label-md)}.setting-search-result__descr{margin-top:6px;color:var(--md-on-surface-var);font-size:var(--fs-body-sm);display:block;overflow:visible}.setting-search-result__mark{background:color-mix(in srgb,var(--md-primary) 20%,transparent);color:var(--md-primary);padding:0 1px;border-radius:4px}.page--setting.setting-search-open .fab--setting-search{opacity:0;transform:scale(.92);pointer-events:none}.page--setting.setting-search-open #settingScreenHost,.page--setting.setting-search-open #settingsMeta{pointer-events:none}@media(min-width:769px)and (min-aspect-ratio:13/10),(min-width:769px)and (horizontal-viewport-segments:2),(min-width:769px)and (vertical-viewport-segments:2),(min-width:769px)and (min-height:650px){.setting-search-panel{--setting-search-form-width: clamp(360px, 34vw, 540px);--setting-search-results-width: min(64vw, 820px);--setting-search-results-max-height: 680px;gap:14px;padding-top:calc(22px + env(safe-area-inset-top,0px));padding-bottom:calc(var(--app-nav-bottom-gap, var(--nav-bar-height-desktop)) + 18px + env(safe-area-inset-bottom,0px))}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting .settingTop{flex-direction:column;align-items:stretch}.page--setting .ctrl{justify-content:flex-start}.page--setting .val{min-width:100px}.setting-search-panel{--setting-search-form-width: calc(100vw - 28px) ;--setting-search-results-width: calc(100vw - 28px) ;--setting-search-results-max-height: 560px;gap:12px;padding:calc(14px + env(safe-area-inset-top,0px)) 12px calc(var(--app-nav-bottom-gap, var(--nav-bar-height)) + 14px + env(safe-area-inset-bottom,0px))}.setting-search-form{width:min(var(--setting-search-form-width),calc(100vw - 28px))}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #settingScreenItems{padding-top:0}.page--setting #settingScreenItems.setting-screen-items--profile{padding-top:0;--setting-profile-panel-sticky-top: 0px;--setting-profile-section-sticky-top: 72px}.page--setting #settingScreenItems.setting-screen-items--profile #items{padding-top:0}.page--setting #settingScreenItems.setting-screen-items--profile .setting-profile-row{min-height:46px;gap:var(--sp-sm)}.page--setting #settingScreenItems.setting-screen-items--profile .setting-profile-action__icon{width:20px;height:20px}.page--setting #settingScreenItems.setting-screen-items--profile .setting-profile-section__header{margin-left:0;margin-right:0;padding-left:2px;padding-right:2px}.page--setting #settingScreenItems.setting-screen-items--profile>.row-between.mb-sm{display:grid}.page.page--setting{display:flex;flex-direction:column;height:calc(var(--app-vv-height, 100dvh) - var(--nav-bar-height) - env(safe-area-inset-bottom,0px));min-block-size:0;padding-bottom:0;overflow:hidden}.page.page--setting>#settingsMeta{flex:0 0 auto}.page.page--setting>#settingScreenHost{flex:1 1 auto;position:relative;min-height:0;overflow:hidden}.page.page--setting>#settingScreenHost>#settingScreenGroups,.page.page--setting>#settingScreenHost>#settingScreenItems{position:absolute;inset:0;overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable;padding-bottom:calc(var(--nav-bar-height) + 24px + env(safe-area-inset-bottom,0px));will-change:transform}.page.page--setting>#settingScreenHost>#settingScreenGroups{-webkit-mask-image:none;mask-image:none}.page.page--setting>#settingScreenHost>#settingScreenItems{-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%)}}@media(max-height:760px){.setting-search-panel{--setting-search-results-max-height: 620px;gap:10px;padding-top:calc(12px + env(safe-area-inset-top,0px))}}@media(min-aspect-ratio:13/10),(horizontal-viewport-segments:2),(vertical-viewport-segments:2),(min-width:640px)and (min-height:650px){.page.page--setting{--setting-landscape-left-width: clamp(208px, 28vw, 260px);--setting-landscape-gap: 12px;--setting-landscape-page-inset: var(--setting-landscape-content-inset, var(--page-rail-content-inset, 24px));--setting-landscape-fab-reserve: calc(var(--fab-size, 56px) + 18px);--setting-landscape-scroll-pad-bottom: 4px;display:flex;flex-direction:column;max-width:none;margin:0;min-height:var(--page-content-height, calc(var(--app-vv-height, 100dvh) - 24px));height:var(--page-content-height, calc(var(--app-vv-height, 100dvh) - 24px));padding:0;box-sizing:border-box;overflow:hidden}.page.page--setting>#settingsMeta{flex:0 0 auto;margin:var(--setting-landscape-page-inset) var(--setting-landscape-page-inset) 12px;padding:0}.page.page--setting>#settingScreenHost{flex:1 1 auto;display:grid;grid-template-columns:var(--setting-landscape-left-width) minmax(0,1fr);column-gap:14px;align-items:stretch;width:100%;min-height:0;margin:0;box-sizing:border-box;overflow:hidden;position:relative;padding:0}.page.page--setting>#settingScreenHost>#settingScreenGroups,.page.page--setting>#settingScreenHost>#settingScreenItems{height:100%;min-height:0;max-height:none;overflow:auto;box-sizing:border-box;scrollbar-gutter:stable;transition:none}.page.page--setting>#settingScreenHost>#settingScreenGroups{-webkit-mask-image:none;mask-image:none}.page.page--setting>#settingScreenHost>#settingScreenItems{-webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%);mask-image:linear-gradient(to bottom,transparent 0,#000 12px,#000 calc(100% - 6px),transparent 100%)}.page.page--setting>#settingScreenHost>#settingScreenGroups{position:relative;align-self:stretch;margin-left:0;padding:var(--setting-landscape-page-inset) 8px calc(var(--setting-landscape-page-inset) + var(--setting-landscape-fab-reserve)) var(--setting-landscape-page-inset)}.page.page--setting>#settingScreenHost>#settingScreenItems{min-width:0;padding:var(--setting-landscape-page-inset) var(--setting-landscape-page-inset) var(--setting-landscape-page-inset) var(--setting-landscape-page-inset)}.page.page--setting>#settingScreenHost>#settingScreenItems.setting-screen-items--profile{padding-top:0;--setting-profile-panel-sticky-top: 0px;--setting-profile-section-sticky-top: 68px}.page--setting.setting-layout-split #groupList{display:flex;flex-direction:column;gap:6px}.page--setting.setting-layout-split .groupBtn,.page--setting.setting-layout-split .setting-group-skeleton{margin-bottom:0;min-width:0;min-height:44px;padding:9px 12px}.page--setting.setting-layout-split .groupBtn{font-size:14px;line-height:1.16;overflow-x:auto;overflow-y:hidden;white-space:nowrap;scrollbar-width:none;text-overflow:clip;touch-action:pan-x pan-y}.page--setting.setting-layout-split .groupBtn::-webkit-scrollbar{display:none}.page--setting.setting-layout-split #groupList .groupBtn .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn .setting-group-label{display:inline-block;min-width:max-content;transform:translate(0);will-change:transform}.page--setting.setting-layout-split #groupList .groupBtn.is-overflowing:hover .setting-group-label,.page--setting.setting-layout-split #groupList .groupBtn.is-overflowing:focus .setting-group-label,.page--setting.setting-layout-split #groupList .groupBtn.is-overflowing:active .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn.is-overflowing:hover .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn.is-overflowing:focus .setting-group-label,.page--setting.setting-layout-split #deviceGroupList .groupBtn.is-overflowing:active .setting-group-label{animation:setting-left-text-pan 4.2s ease-in-out 1}.page.page--setting>.page-fab-layer--setting{position:absolute;top:auto;left:var(--setting-landscape-page-inset);bottom:var(--setting-landscape-page-inset);width:var(--setting-landscape-left-width);max-width:100%;height:auto;display:flex;justify-content:flex-end;z-index:70;pointer-events:none}.page.page--setting>.page-fab-layer--setting .fab{position:relative;inset:auto;display:inline-flex;opacity:1!important;visibility:visible!important;margin-right:0;pointer-events:auto}.page.page--setting>.page-fab-layer--setting .fab:not(.is-bouncing){transform:none!important}.page.page--setting>.page-fab-layer--setting .setting-fab-menu{position:relative;right:auto;left:auto;bottom:auto}.page--setting.setting-layout-split #settingScreenItems .title{font-size:16px;font-weight:700;line-height:1.18}.page--setting.setting-layout-split #settingScreenItems .name{font-size:12px;line-height:1.28}.page--setting.setting-layout-split #settingScreenItems .muted,.page--setting.setting-layout-split #settingScreenItems .descr{font-size:13px;line-height:1.38}.page--setting.setting-layout-split #settingScreenItems .setting{overflow:hidden}.page--setting.setting-layout-split #settingScreenItems .settingTop{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:start}.page--setting.setting-layout-split #settingScreenItems .settingTop>:first-child{min-width:0}.page--setting.setting-layout-split #settingScreenItems .title,.page--setting.setting-layout-split #settingScreenItems .name,.page--setting.setting-layout-split #settingScreenItems .muted,.page--setting.setting-layout-split #settingScreenItems .descr{max-width:100%;overflow-wrap:anywhere;word-break:break-word}.page--setting.setting-layout-split #settingScreenItems .setting-copy{min-width:0;max-width:100%}.setting-search-panel{--setting-search-form-width: min(76vw, 540px);--setting-search-results-width: min(82vw, 760px);--setting-search-results-max-height: 680px;gap:10px;padding:calc(12px + env(safe-area-inset-top,0px)) 12px calc(var(--app-nav-bottom-gap, 0px) + 12px + env(safe-area-inset-bottom,0px))}}@media(max-width:760px)and (min-aspect-ratio:13/10),(max-width:760px)and (horizontal-viewport-segments:2),(max-width:760px)and (vertical-viewport-segments:2),(min-width:640px)and (max-width:760px)and (min-height:650px){.page.page--setting{--setting-landscape-left-width: clamp(184px, 27vw, 220px)}.page.page--setting>#settingScreenHost{column-gap:10px}.page--setting.setting-layout-split #settingScreenItems .settingTop{grid-template-columns:minmax(0,1fr)}}.page--setting #settingScreenItems .settingTop{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--sp-md);align-items:start}.page--setting #settingScreenItems .settingTop>:first-child{min-width:0}.page--setting #settingScreenItems .title,.page--setting #settingScreenItems .name,.page--setting #settingScreenItems .muted,.page--setting #settingScreenItems .descr{max-width:100%;overflow-wrap:anywhere;word-break:break-word}.page--setting #settingScreenItems .setting{overflow:hidden}.page--setting #settingScreenItems .ctrl{--setting-control-side: 42px;--setting-control-value: 88px;--setting-control-gap: 6px;display:grid;grid-template-columns:var(--setting-control-side) var(--setting-control-value) var(--setting-control-side);gap:var(--setting-control-gap);justify-content:end;align-items:center;flex:0 0 auto;max-width:100%}.page--setting #settingScreenItems .ctrl>:nth-child(1){grid-column:1;grid-row:2}.page--setting #settingScreenItems .ctrl>:nth-child(2){grid-column:2;grid-row:2}.page--setting #settingScreenItems .ctrl>:nth-child(3){grid-column:3;grid-row:2}.page--setting #settingScreenItems .ctrl>:nth-child(4){grid-column:1 / -1;grid-row:1;justify-self:stretch;width:100%}.page--setting #settingScreenItems .smallBtn{width:100%;min-width:var(--setting-control-side);padding-inline:9px}.page--setting #settingScreenItems .val{width:100%;min-width:var(--setting-control-value);max-width:var(--setting-control-value)}.page--setting #settingScreenItems .ctrl--toggle,.page--setting #settingScreenItems .ctrl--value,.page--setting #settingScreenItems .ctrl--segmented,.page--setting #settingScreenItems .ctrl--select{display:flex;justify-content:flex-end;align-items:center;width:auto}.page--setting #settingScreenItems .ctrl--value{display:inline-grid;grid-template-columns:38px minmax(66px,auto) 38px;gap:0;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont-h)}.page--setting #settingScreenItems .ctrl--value>:nth-child(1),.page--setting #settingScreenItems .ctrl--value>:nth-child(2),.page--setting #settingScreenItems .ctrl--value>:nth-child(3){grid-row:1}.page--setting #settingScreenItems .ctrl--value .val{position:relative;width:auto;min-width:66px;max-width:min(120px,34vw);min-height:32px;padding:0 10px;border:0;border-left:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-right:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}.page--setting #settingScreenItems .setting-value-compact{border-color:transparent;background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,var(--md-surface-cont-h));color:var(--md-on-surface);box-shadow:none;font-weight:900}.page--setting #settingScreenItems .setting-value-arrow{display:inline-flex;align-items:center;justify-content:center;width:38px;min-width:38px;min-height:32px;padding:0;border:0;border-radius:0;background:transparent;color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:900;line-height:1;touch-action:manipulation}.page--setting #settingScreenItems .setting-value-arrow:active,.page--setting #settingScreenItems .setting-value-arrow.is-holding,.page--setting #settingScreenItems .setting-step:active,.page--setting #settingScreenItems .setting-step.is-holding{background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-on-surface))}.page--setting #settingScreenItems .setting-icon{display:block;width:18px;height:18px}.page--setting #settingScreenItems .setting-icon path{fill:none;stroke:currentColor;stroke-width:2.7;stroke-linecap:round;stroke-linejoin:round}.page--setting #settingScreenItems .ctrl--toggle .val,.page--setting #settingScreenItems .ctrl--segmented .val,.page--setting #settingScreenItems .ctrl--select .val{display:none}.page--setting #settingScreenItems .setting-segment:focus-visible,.page--setting #settingScreenItems .setting-select:focus-visible,.page--setting #settingScreenItems .setting-slider__input:focus-visible{outline:var(--focus-ring-width, 2px) solid var(--focus-ring-color, var(--md-primary));outline-offset:2px}.page--setting #settingScreenItems .setting-segments{display:inline-flex;max-width:min(216px,100%);overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont-h)}.page--setting #settingScreenItems .setting-segment{min-width:38px;min-height:32px;padding:0 10px;border:0;border-right:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);background:transparent;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.page--setting #settingScreenItems .setting-segment:last-child{border-right:0}.page--setting #settingScreenItems .setting-segment.is-active{background:var(--md-primary-state);color:var(--md-primary)}.page--setting #settingScreenItems .setting-select{display:inline-flex;align-items:center;justify-content:center;min-width:92px;min-height:32px;padding:0 14px;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont-h);color:var(--md-on-surface);font-family:inherit;font-size:var(--fs-label-sm);font-weight:850;line-height:1;text-align:center;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent;appearance:none}.page--setting #settingScreenItems .ctrl--slider{grid-template-columns:var(--setting-control-side) var(--setting-control-value) var(--setting-control-side)}.page--setting #settingScreenItems .ctrl--slider .setting-slider{grid-column:1 / -1;grid-row:1;width:100%}.page--setting #settingScreenItems .ctrl--slider .setting-step--minus{grid-column:1;grid-row:2}.page--setting #settingScreenItems .ctrl--slider .val{grid-column:2;grid-row:2}.page--setting #settingScreenItems .ctrl--slider .setting-step--plus{grid-column:3;grid-row:2}.page--setting #settingScreenItems .setting-slider__input{width:100%;accent-color:var(--md-primary);touch-action:pan-y}.page--setting #settingScreenItems .setting{position:relative}.page--setting #settingScreenItems .setting--has-unit-cycle{padding-bottom:var(--sp-md)}.page--setting #settingScreenItems .setting-unit-cycle{display:flex;align-items:center;justify-content:center;margin:8px 0 0 auto;min-width:54px;min-height:32px;padding:0 12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,var(--md-surface-cont-h));color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:900;line-height:1;letter-spacing:0;box-shadow:none}.page--setting #settingScreenItems .setting-unit-cycle:active{border-color:color-mix(in srgb,var(--md-outline-var) 68%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-on-surface));color:var(--md-on-surface)}.page--setting #settingScreenItems .setting--has-actions{padding-bottom:var(--sp-md)}.page--setting #settingScreenItems .setting-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:8px}.page--setting #settingScreenItems .setting-popular-value-chip{display:inline-flex;align-items:center;justify-content:flex-start;flex-wrap:nowrap;gap:3px;min-width:0;max-width:min(360px,52vw);min-height:18px;margin-right:auto;padding:0;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface-var) 42%,transparent);font-size:11px;font-weight:700;line-height:1.18;letter-spacing:0;text-align:left;white-space:nowrap;box-shadow:none;opacity:.74}.page--setting #settingScreenItems .setting-popular-value-chip__car{min-width:0;max-width:170px;overflow:hidden;color:inherit;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems .setting-popular-value-chip__accent{color:color-mix(in srgb,var(--md-primary) 56%,var(--md-on-surface-var));font-weight:800}.page--setting #settingScreenItems .setting-popular-value-chip__label{color:inherit}.page--setting #settingScreenItems .setting-actions .setting-unit-cycle{margin:0}.page--setting #settingScreenItems .setting-default-reset{display:inline-flex;align-items:center;justify-content:center;min-width:54px;min-height:32px;padding:0 12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,var(--md-surface-cont-h));color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:900;line-height:1;letter-spacing:0;box-shadow:none}.page--setting #settingScreenItems .setting-default-reset:active{border-color:color-mix(in srgb,var(--md-outline-var) 68%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 88%,var(--md-on-surface));color:var(--md-on-surface)}.setting-popular-detail{display:grid;gap:12px;min-width:min(360px,calc(100vw - 56px))}.page--setting #settingScreenItems .setting-popular-detail-block{width:min(520px,100%);margin-top:12px}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail{gap:9px;min-width:0;width:100%}.setting-popular-detail__head{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.setting-popular-detail__name{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:800;overflow-wrap:anywhere}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__name{color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:12px;font-weight:780}.setting-popular-detail__range{flex:0 0 auto;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 8%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);font-size:10px;font-weight:820;line-height:20px}.setting-popular-detail__rows{display:grid;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 32%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont)}.setting-popular-detail__row{display:grid;grid-template-columns:52px minmax(0,1fr) 58px;align-items:center;gap:10px;width:100%;min-height:38px;padding:0 12px;border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 40%,transparent);border-left:0;border-right:0;border-top:0;background:transparent;color:var(--md-on-surface);font-family:inherit;font-size:var(--fs-body-sm);font-weight:850;letter-spacing:0;text-align:left;cursor:pointer}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__rows{gap:6px;overflow:visible;border:0;border-radius:0;background:transparent}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__row{grid-template-columns:18px minmax(0,1fr) 48px;min-height:48px;padding:8px 11px;gap:10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 16%,transparent);border-radius:8px;background:color-mix(in srgb,var(--md-surface-cont) 54%,transparent);color:color-mix(in srgb,var(--md-on-surface) 82%,transparent);font-size:12px;font-weight:760}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__row:active{border-color:color-mix(in srgb,var(--md-primary) 24%,var(--md-outline-var));background:color-mix(in srgb,var(--md-primary) 9%,var(--md-surface-cont))}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail--single .setting-popular-detail__row{min-height:44px}.setting-popular-detail__row:last-child{border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 16%,transparent)}.setting-popular-detail__count{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:850}.setting-popular-detail__marker{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px}.setting-popular-detail__marker:before{content:"";display:block;width:6px;height:6px;border-radius:999px;background:color-mix(in srgb,var(--md-primary) 46%,var(--md-on-surface-var));opacity:.72}.setting-popular-detail__main{display:grid;gap:7px;min-width:0}.setting-popular-detail__value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__value{color:color-mix(in srgb,var(--md-primary) 68%,var(--md-on-surface));font-size:13px;font-weight:860}.setting-popular-detail__count{text-align:right}.page--setting #settingScreenItems .setting-popular-detail-block .setting-popular-detail__count{color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:11px;font-weight:820}.setting-popular-detail__bar{display:block;width:100%;max-width:260px;height:5px;appearance:none;overflow:hidden;border:0;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 10%,transparent)}.setting-popular-detail__bar::-webkit-progress-bar{border-radius:inherit;background:color-mix(in srgb,var(--md-on-surface-var) 10%,transparent)}.setting-popular-detail__bar::-webkit-progress-value{border-radius:inherit;background:color-mix(in srgb,var(--md-primary) 52%,var(--md-on-surface-var));opacity:.78}.setting-popular-detail__bar::-moz-progress-bar{border-radius:inherit;background:color-mix(in srgb,var(--md-primary) 52%,var(--md-on-surface-var));opacity:.78}.setting-popular-detail__updated{margin-top:var(--sp-sm);color:color-mix(in srgb,var(--md-on-surface-var) 54%,transparent);font-size:var(--fs-label-sm)}.setting-popular-detail__empty{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:750}.page--setting #settingScreenItems .setting-copy{min-width:0;max-width:100%;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.page--setting #settingScreenItems .setting-title-row{display:flex;align-items:center;gap:7px;min-width:0}.page--setting #settingScreenItems .setting-title-row .title{flex:1 1 auto;min-width:0}.page--setting #settingScreenItems .setting-risk-badge{--chip-font-size: var(--fs-label-sm);--chip-min-height: var(--control-switch-height);--chip-padding-block: 0;--chip-padding-inline: var(--sp-sm);flex:0 0 auto;align-self:center;justify-content:center;min-width:var(--control-switch-width);box-sizing:border-box}.page--setting #settingScreenItems .setting-favorite-mark{display:none;flex:0 0 auto;width:16px;height:16px;color:var(--md-info);opacity:.92}.page--setting #settingScreenItems .setting-favorite-mark.is-active{display:inline-flex}.page--setting #settingScreenItems .setting-favorite-mark svg{display:block;width:16px;height:16px;fill:currentColor}.page--setting #settingScreenItems>.row-between.mb-sm{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:end;min-height:56px;margin:0 0 14px;padding:2px 2px 10px}.page--setting #settingScreenItems #itemsTitle{display:inline-flex;align-items:center;gap:8px;min-width:0;color:var(--md-on-surface);font-size:34px;font-weight:900;line-height:1;letter-spacing:0}.page--setting #settingScreenItems .setting-title-backIcon{display:inline-flex;align-items:center;justify-content:center;width:42px;height:42px;flex:0 0 42px;margin-left:-10px;border:0;border-radius:999px;background:transparent;color:var(--md-on-surface);transition:background .14s ease,color .14s ease,transform .14s ease}.page--setting #settingScreenItems #itemsTitle:active .setting-title-backIcon{background:color-mix(in srgb,var(--md-on-surface) 10%,transparent);color:var(--md-on-surface);transform:translate(-1px)}.page--setting #settingScreenItems .setting-title-backIcon .setting-icon{width:24px;height:24px}.page--setting #settingScreenItems .setting-title-backIcon .setting-icon path{stroke-width:3.05}.page--setting #settingScreenItems .setting-title-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems #groupMeta{padding-bottom:3px;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.page--setting #settingScreenItems .setting.is-longpressing{background:color-mix(in srgb,var(--md-info) 7%,transparent)}.page--setting #settingScreenItems.setting-screen-items--detail #items:after{display:none}.page--setting #settingScreenItems .setting-favorites-empty{max-width:min(460px,100%);margin:0 auto;padding:22px 4px;text-align:center;border-bottom:1px solid color-mix(in srgb,var(--md-stroke-soft) 52%,transparent)}.page--setting #settingScreenItems .setting-favorites-empty__title{color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:800}.page--setting #settingScreenItems .setting-favorites-empty__desc{margin-top:6px;color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:650;line-height:1.35;overflow-wrap:anywhere;text-wrap:balance}:lang(ko) .page--setting #settingScreenItems .setting-favorites-empty__desc,:lang(zh) .page--setting #settingScreenItems .setting-favorites-empty__desc{word-break:keep-all;overflow-wrap:break-word}.page--setting #settingScreenItems .setting-marquee{max-width:100%;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;touch-action:pan-x pan-y;scrollbar-width:none;white-space:nowrap;overflow-wrap:normal;word-break:normal}.page--setting #settingScreenItems .setting-marquee::-webkit-scrollbar{display:none}.page--setting #settingScreenItems .setting-marquee__content{display:inline-block;min-width:max-content;will-change:transform}.page--setting #settingScreenItems .setting-marquee.is-overflowing .setting-marquee__content{animation:setting-marquee-pan 6s linear .5s infinite alternate}.page--setting #settingScreenItems .setting-marquee.is-manual .setting-marquee__content{animation:none;transform:none;will-change:auto}.page--setting #settingScreenItems .title.setting-marquee,.page--setting #settingScreenItems .name.setting-marquee{text-align:left}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #settingScreenItems .ctrl{justify-content:center}}@media(max-width:760px)and (min-aspect-ratio:13/10),(max-width:760px)and (horizontal-viewport-segments:2),(max-width:760px)and (vertical-viewport-segments:2),(min-width:640px)and (max-width:760px)and (min-height:650px){.page--setting #settingScreenItems .ctrl{justify-content:start}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #settingScreenItems>.row-between.mb-sm{min-height:0;margin-bottom:10px;padding-top:0;padding-bottom:8px}.page--setting #settingScreenItems #itemsTitle{font-size:28px}.page--setting #settingScreenItems .setting{padding:18px 0 20px}.page--setting #settingScreenItems .setting-group-card__body>.setting{padding-left:var(--sp-lg);padding-right:var(--sp-lg)}.page--setting #settingScreenItems .settingTop{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start}.page--setting #settingScreenItems .ctrl{--setting-control-side: 34px;--setting-control-value: 70px;--setting-control-gap: 6px;justify-self:end;justify-content:end;width:calc((var(--setting-control-side) * 2) + var(--setting-control-value) + (var(--setting-control-gap) * 2));max-width:100%}.page--setting #settingScreenItems .ctrl--toggle,.page--setting #settingScreenItems .ctrl--value,.page--setting #settingScreenItems .ctrl--segmented,.page--setting #settingScreenItems .ctrl--select{width:auto}.page--setting #settingScreenItems .smallBtn,.page--setting #settingScreenItems .val{min-height:34px;font-size:12px}.page--setting #settingScreenItems .ctrl--value .val,.page--setting #settingScreenItems .setting-value-arrow{min-height:36px;font-size:var(--fs-label-sm)}.page--setting #settingScreenItems .setting-unit-cycle{min-height:32px;font-size:var(--fs-label-sm)}.page--setting #settingScreenItems .title,.page--setting #settingScreenItems .name{text-align:left}.page--setting #settingScreenItems .descr{margin-top:4px}}@keyframes setting-left-text-pan{0%,16%{transform:translate(0)}72%,86%{transform:translate(var(--setting-label-shift, -24px))}to{transform:translate(0)}}@keyframes setting-marquee-pan{0%,6%{transform:translate(0)}94%,to{transform:translate(calc(var(--setting-marquee-distance, 0px) * -1))}}.setting-tabbar{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:0 0 var(--sp-md);padding:4px;border:1px solid color-mix(in srgb,var(--md-outline-var) 44%,transparent);border-radius:var(--r-md);background:color-mix(in srgb,var(--md-surface-cont) 88%,var(--setting-shade))}.setting-tab{min-width:0;min-height:38px;padding:0 10px;border:0;border-radius:calc(var(--r-md) - 4px);background:transparent;color:var(--md-on-surface-var);font-size:14px;font-weight:800;line-height:1;cursor:pointer;transition:background .14s ease,color .14s ease,transform .12s ease}.setting-tab.is-active{background:var(--md-primary);color:var(--md-on-primary)}.setting-tab:active{transform:translateY(1px)}.page--setting #carrotTabContent[hidden],.page--setting #deviceTabContent[hidden],.page--setting #items[hidden],.page--setting #deviceItems[hidden]{display:none!important}.page--setting.setting-tab-device .page-fab-layer--setting{display:none}.page--setting #deviceItems .ctrl{display:flex;grid-template-columns:none;gap:var(--sp-sm);justify-content:flex-end;align-items:center;width:auto}.page--setting #deviceItems .smallBtn,.page--setting #deviceItems .val{width:auto;min-width:78px;max-width:none}.page--setting #deviceItems .device-value{max-width:min(56vw,320px);overflow:hidden;overflow-wrap:normal;text-align:right;text-overflow:ellipsis;white-space:nowrap}.page--setting #deviceItems .device-version-value{display:flex;flex-direction:column;align-items:flex-end;gap:3px;white-space:normal;text-overflow:clip}.page--setting #deviceItems .device-version-value span{display:block;max-width:min(56vw,320px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #deviceItems .device-setting--ssh .settingTop{display:grid;grid-template-columns:minmax(88px,max-content) minmax(0,1fr);gap:var(--sp-md);align-items:start}.page--setting #deviceItems .device-ssh-control,.device-ssh-form{width:100%;min-width:0}.app-dialog--device-ssh .app-dialog__sheet{width:min(520px,calc(100vw - 28px));max-height:min(560px,calc(100dvh - 28px))}.app-dialog--device-ssh .app-dialog__body{flex:1 1 auto;overflow:auto}.device-ssh-dialog{display:grid;gap:18px;min-width:0}.device-ssh-dialog__empty{padding:18px;border:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:var(--r-sm);color:var(--md-on-surface-var);font-weight:800;text-align:center}.device-ssh-key-list{display:grid;gap:8px}.device-ssh-key-list__item{display:grid;gap:5px;min-width:0;padding:10px 12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 72%,transparent)}.device-ssh-key-list__item span{color:color-mix(in srgb,var(--md-primary) 78%,var(--md-on-surface));font-size:12px;font-weight:900}.device-ssh-key-list__item code{min-width:0;overflow-wrap:anywhere;color:var(--md-on-surface);font-family:var(--font-mono);font-size:11px;font-weight:850;line-height:1.25}.page--setting #deviceItems .settingTop>:first-child{min-width:0}.page--setting #deviceItems .ctrl{min-width:0}.page--setting #deviceItems .title{font-size:16px;line-height:1.22}.page--setting #deviceItems .descr{font-size:13px;line-height:1.36}.page--setting #deviceItems .smallBtn{font-size:13px;white-space:nowrap}.page--setting #deviceItems .device-setting{overflow:hidden}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--setting #deviceItems .device-setting--ssh .settingTop{grid-template-columns:minmax(0,1fr)}.page--setting #deviceItems .device-ssh-control{grid-column:1;width:100%;min-width:0}}.device-toggle{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md);width:100%;cursor:pointer}.device-toggle__text{min-width:0;flex:1 1 auto}.device-toggle--readonly{width:auto;cursor:default;pointer-events:none}.device-setting--disabled{cursor:pointer}.device-setting--disabled .title,.device-setting--disabled .descr,.device-setting--disabled .device-value{color:color-mix(in srgb,var(--md-on-surface-var) 42%,var(--setting-disabled-ink))}.page--setting #deviceItems .device-setting--disabled .ctrl .smallBtn,.page--setting #deviceItems .device-setting--disabled .ctrl .val,.page--setting #deviceItems .device-setting button.is-device-disabled{border-color:color-mix(in srgb,var(--md-outline-var) 28%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-surface-cont-h) 42%,var(--setting-disabled-surface-top)),color-mix(in srgb,var(--md-surface-cont) 40%,var(--setting-disabled-surface-bottom)));color:color-mix(in srgb,var(--md-on-surface-var) 46%,var(--setting-disabled-label));box-shadow:inset 0 1px #ffffff05;filter:grayscale(1) saturate(.35);opacity:.76}.page--setting #deviceItems .device-setting--disabled .ctrl .smallBtn:hover,.page--setting #deviceItems .device-setting--disabled .ctrl .smallBtn:focus-visible,.page--setting #deviceItems .device-setting button.is-device-disabled:hover,.page--setting #deviceItems .device-setting button.is-device-disabled:focus-visible{border-color:color-mix(in srgb,var(--md-outline-var) 34%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-surface-cont-h) 46%,var(--setting-disabled-surface-top-hover)),color-mix(in srgb,var(--md-surface-cont) 42%,var(--setting-disabled-surface-bottom-hover)));color:color-mix(in srgb,var(--md-on-surface-var) 52%,var(--setting-disabled-label-hover));outline:none}.device-setting--disabled .c-switch__track,.device-setting--disabled .c-switch__input:checked+.c-switch__track{opacity:1;border-color:color-mix(in srgb,var(--md-outline-var) 36%,transparent);background:color-mix(in srgb,var(--md-surface-cont-h) 54%,var(--setting-disabled-track))}.device-setting--disabled .c-switch__track:after,.device-setting--disabled .c-switch__input:checked+.c-switch__track:after{background:color-mix(in srgb,var(--md-on-surface-var) 54%,var(--setting-disabled-knob))}.device-setting button:disabled,.device-setting select:disabled{opacity:.56;cursor:default}.device-select{min-width:min(240px,44vw);min-height:38px;padding:6px 10px;border:1px solid var(--md-outline-var);border-radius:var(--r-sm);background:var(--md-surface-cont-h);color:var(--md-on-surface);font-size:var(--fs-body-md);outline:none}.device-tab-error{padding:var(--sp-lg);color:var(--md-error);font-weight:700;text-align:center}.wifi-view-status{min-width:72px;padding:7px 10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 52%,transparent);border-radius:var(--r-sm);color:var(--md-on-surface-var);font-size:var(--fs-body-sm);font-weight:800;line-height:1;text-align:center}.wifi-view-status.is-connected{border-color:color-mix(in srgb,var(--md-primary) 78%,var(--md-outline-var));color:var(--md-primary)}.training-guide-modal{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;padding:var(--sp-md);background:var(--popup-backdrop)}.training-guide-modal__surface{position:relative;display:grid;grid-template-rows:minmax(0,1fr) auto;width:min(100%,960px);height:min(100%,540px);overflow:hidden;border:1px solid var(--popup-border-color);border-radius:var(--popup-radius);background:var(--setting-media-backdrop);box-shadow:var(--popup-shadow)}.training-guide-modal__image{width:100%;height:100%;min-height:0;object-fit:contain;background:var(--setting-media-backdrop)}.training-guide-modal__close{position:absolute;top:10px;right:10px;z-index:1}.training-guide-modal__bar{display:grid;grid-template-columns:minmax(92px,auto) 1fr minmax(92px,auto);gap:var(--sp-sm);align-items:center;padding:var(--sp-sm);border-top:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);background:color-mix(in srgb,var(--md-surface-cont) 82%,var(--setting-shade))}.training-guide-modal__count{color:var(--md-on-surface-var);font-size:var(--fs-body-md);font-weight:800;text-align:center}.device-info-modal__surface{grid-template-rows:auto minmax(0,1fr);width:min(100%,760px);height:min(100%,620px);background:var(--popup-bg)}.device-info-modal__header{padding:var(--sp-md) calc(var(--sp-xl) + 42px) var(--sp-sm) var(--sp-md);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);color:var(--md-on-surface);font-size:var(--fs-title-lg);font-weight:900}.device-info-modal__body{min-height:0;overflow:auto;padding:var(--sp-md);color:var(--md-on-surface);font-size:var(--fs-body-md);line-height:1.45}.device-info-modal__body h2,.device-info-modal__body h3,.device-info-modal__body h5{margin:0 0 var(--sp-sm);color:var(--md-primary)}.device-info-modal__body p{margin:0 0 var(--sp-sm)}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page.page--setting>.page-fab-layer--setting{position:absolute;top:auto;left:auto;right:max(var(--sp-lg),env(safe-area-inset-right,0px));bottom:calc(10px + var(--sp-lg));width:auto;height:auto;display:flex;justify-content:flex-end;z-index:130;pointer-events:none}.page.page--setting>.page-fab-layer--setting .setting-fab-menu{position:relative;right:auto;left:auto;bottom:auto}}.youtube-live-section{display:grid;gap:var(--sp-md);margin:0}.youtube-live-key-card,.youtube-live-card,.youtube-live-help-card{display:grid;gap:var(--sp-md);padding-top:var(--sp-lg);padding-bottom:var(--sp-lg)}.youtube-live-card__summary{min-width:0}.youtube-live-card__title{color:var(--md-on-surface);font-size:var(--fs-title-sm);font-weight:800;letter-spacing:0}.youtube-live-card__desc,.youtube-live-metric__label{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);letter-spacing:0;overflow-wrap:anywhere}.youtube-live-help-list{display:grid;gap:var(--sp-sm);margin:0;padding-left:1.35em;color:var(--md-on-surface-var);font-size:var(--fs-body-sm);letter-spacing:0}.youtube-live-help-list>li{min-width:0;overflow-wrap:anywhere}.youtube-live-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-sm)}.youtube-live-metric{min-width:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--r-md);padding:var(--sp-sm) var(--sp-md);background:color-mix(in srgb,var(--md-surface) 55%,transparent)}.youtube-live-metric__value{margin-top:2px;color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:800;letter-spacing:0;overflow-wrap:anywhere}.youtube-live-actions{--ui-action-min: 136px}.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch{cursor:not-allowed}.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__track,.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__input:checked+.c-switch__track{opacity:1;border-color:color-mix(in srgb,var(--setting-shade) 84%,var(--md-outline-var));background:var(--setting-shade)}.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__track:after,.page--setting #settingScreenItems .youtube-timestamp-disabled .c-switch__input:checked+.c-switch__track:after{transform:translateY(-50%);background:color-mix(in srgb,var(--md-on-surface-var) 42%,var(--setting-shade));box-shadow:none}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.youtube-live-metrics{grid-template-columns:1fr}}.mapbox-token-card{container-name:mapbox-token-card;container-type:inline-size;display:grid;gap:var(--sp-md);inline-size:100%;min-inline-size:0;padding:var(--sp-md) 0 var(--sp-lg)}.mapbox-token-card__head{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,max-content);align-items:baseline;justify-content:space-between;gap:var(--sp-md);min-width:0}.mapbox-token-card__title,.mapbox-token-field__title{color:var(--md-on-surface);font-size:var(--fs-title-sm);font-weight:850;letter-spacing:0}.mapbox-token-card__desc,.mapbox-token-card__status,.mapbox-token-field__status,.mapbox-token-field__hint{color:var(--md-on-surface-var);font-size:var(--fs-body-sm);letter-spacing:0;overflow-wrap:anywhere}.mapbox-token-card__status{min-width:0;max-width:100%;line-height:1.35;text-align:end}.mapbox-token-list{display:grid;gap:var(--sp-md);min-width:0}.mapbox-token-field{display:grid;gap:var(--sp-sm);min-width:0}.mapbox-token-field__meta{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-md);min-width:0}.mapbox-token-field__status{text-align:right;white-space:nowrap}@container mapbox-token-card (max-width: 360px){.mapbox-token-card__head{grid-template-columns:minmax(0,1fr);gap:var(--sp-xs)}.mapbox-token-card__status{text-align:start}}.page--setting #settingScreenItems .setting-history-detail-block{width:min(520px,100%);margin-top:12px}.setting-history-detail{display:grid;gap:9px;min-width:0;width:100%}.setting-history-detail__head{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0}.setting-history-detail__name{color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:12px;font-weight:780;overflow-wrap:anywhere}.setting-history-detail__range{flex:0 0 auto;min-height:20px;padding:0 8px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 8%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);font-size:10px;font-weight:820;line-height:20px}.setting-history-detail__rows{display:grid;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 32%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont)}.setting-history-detail__row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.setting-history-detail__row:last-child{border-bottom:0}.setting-history-detail__marker{width:6px;height:6px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 34%,transparent)}.setting-history-detail__row:first-child .setting-history-detail__marker{background:var(--md-primary)}.setting-history-detail__main{display:grid;gap:3px;min-width:0}.setting-history-detail__param{color:var(--md-on-surface-var);font-size:11px;font-weight:820;overflow-wrap:anywhere}.setting-history-detail__change{display:flex;align-items:center;gap:6px;min-width:0;font-size:var(--fs-label-sm);font-weight:850;overflow-wrap:anywhere}.setting-fingerprint-history{margin-top:12px;max-height:min(40dvh,320px);overflow:auto}.setting-history-detail__prev{color:color-mix(in srgb,var(--md-on-surface-var) 52%,transparent);text-decoration:line-through}.setting-history-detail__arrow{flex:0 0 auto;color:color-mix(in srgb,var(--md-on-surface-var) 42%,transparent)}.setting-history-detail__next{color:var(--md-on-surface)}.setting-history-detail__meta{display:flex;align-items:center;flex-wrap:wrap;gap:6px;min-width:0}.setting-history-detail__time{white-space:nowrap;color:color-mix(in srgb,var(--md-on-surface-var) 50%,transparent);font-size:11px;font-weight:760}.setting-history-detail__badge{min-height:17px;padding:0 6px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface-var) 8%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 56%,transparent);font-size:10px;font-weight:800;line-height:17px;white-space:nowrap}.setting-history-detail__badge--engaged{background:color-mix(in srgb,var(--md-warning) 16%,transparent);color:color-mix(in srgb,var(--md-warning) 82%,var(--md-on-surface))}.setting-history-detail__undo{flex:0 0 auto;min-height:28px;padding:0 10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 44%,transparent);border-radius:var(--r-sm);background:transparent;color:var(--md-on-surface-var);font-family:inherit;font-size:11px;font-weight:820;line-height:1;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.setting-history-detail__undo:hover,.setting-history-detail__undo:focus-visible{border-color:color-mix(in srgb,var(--md-outline-var) 64%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,transparent)}.setting-history-detail__undo:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 92%,var(--md-on-surface))}.setting-history-detail__undo:disabled{opacity:var(--state-disabled-opacity);cursor:default}.setting-fingerprint{display:grid;gap:4px;justify-items:center;text-align:center}.setting-fingerprint__code{font-family:var(--font-mono);font-size:var(--fs-title-lg);font-weight:850;letter-spacing:.1em;color:var(--md-primary);user-select:all}.setting-fingerprint__hint{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:780}.setting-fingerprint__status{min-height:22px;padding:0 10px;border-radius:999px;font-size:12px;font-weight:820;line-height:22px}.setting-fingerprint__status--same{background:color-mix(in srgb,var(--md-success) 16%,transparent);color:color-mix(in srgb,var(--md-success) 82%,var(--md-on-surface))}.setting-fingerprint__status--changed{background:color-mix(in srgb,var(--md-warning) 18%,transparent);color:color-mix(in srgb,var(--md-warning) 82%,var(--md-on-surface))}.setting-fingerprint__save{min-height:30px;margin-top:2px;padding:0 14px;border:1px solid color-mix(in srgb,var(--md-outline-var) 50%,transparent);border-radius:999px;background:transparent;color:var(--md-on-surface-var);font-family:inherit;font-size:12px;font-weight:820;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.setting-fingerprint__save:hover,.setting-fingerprint__save:focus-visible{border-color:color-mix(in srgb,var(--md-outline-var) 70%,transparent);background:color-mix(in srgb,var(--md-surface-cont-hh) 72%,transparent)}.setting-fingerprint__save:active{background:color-mix(in srgb,var(--md-surface-cont-hh) 92%,var(--md-on-surface))}.setting-fingerprint__save:disabled{opacity:var(--state-disabled-opacity);cursor:default}.setting-fingerprint__note{color:color-mix(in srgb,var(--md-on-surface-var) 52%,transparent);font-size:11px;font-weight:720}.setting-fingerprint-history__title{margin-bottom:6px;color:color-mix(in srgb,var(--md-on-surface-var) 66%,transparent);font-size:12px;font-weight:800}.setting-history-detail__empty{padding:12px;border:1px solid color-mix(in srgb,var(--md-outline-var) 26%,transparent);border-radius:var(--r-md);background:var(--md-surface-cont);color:color-mix(in srgb,var(--md-on-surface-var) 50%,transparent);font-size:var(--fs-label-sm);font-weight:760;text-align:center}.page--setting #settingScreenItems .setting-doc-language-fallback{margin-bottom:12px;padding:9px 11px;border-left:3px solid var(--md-primary);border-radius:0 var(--r-sm) var(--r-sm) 0;background:color-mix(in srgb,var(--md-primary) 9%,transparent);color:color-mix(in srgb,var(--md-on-surface) 82%,var(--md-on-surface-var));font-size:11px;font-weight:780}.page--setting #settingScreenItems .setting-doc-markdown>:first-child{margin-top:0}.page--setting #settingScreenItems .setting-doc-markdown>:last-child{margin-bottom:0}.page--setting #settingScreenItems .setting-doc-markdown h2,.page--setting #settingScreenItems .setting-doc-markdown h3,.page--setting #settingScreenItems .setting-doc-markdown h4,.page--setting #settingScreenItems .setting-doc-markdown h5,.page--setting #settingScreenItems .setting-doc-markdown h6{margin:18px 0 8px;color:var(--md-on-surface);font-size:var(--fs-body-md);font-weight:860;line-height:1.3}.page--setting #settingScreenItems .setting-doc-markdown h3,.page--setting #settingScreenItems .setting-doc-markdown h4,.page--setting #settingScreenItems .setting-doc-markdown h5,.page--setting #settingScreenItems .setting-doc-markdown h6{font-size:var(--fs-body-sm)}.page--setting #settingScreenItems .setting-doc-markdown p{margin:8px 0}.page--setting #settingScreenItems .setting-doc-markdown ul,.page--setting #settingScreenItems .setting-doc-markdown ol{margin:8px 0;padding-left:22px}.page--setting #settingScreenItems .setting-doc-markdown li+li{margin-top:4px}.page--setting #settingScreenItems .setting-doc-markdown code{padding:1px 5px;border-radius:5px;background:color-mix(in srgb,var(--md-on-surface) 7%,transparent);color:color-mix(in srgb,var(--md-primary) 74%,var(--md-on-surface));font-family:var(--font-mono);font-size:.94em}.page--setting #settingScreenItems .setting-doc-markdown pre{max-width:100%;margin:10px 0;padding:11px 12px;overflow:auto;border:1px solid color-mix(in srgb,var(--md-outline-var) 26%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,#05080c 78%,var(--md-surface-cont))}.page--setting #settingScreenItems .setting-doc-markdown pre code{padding:0;border-radius:0;background:transparent;color:var(--md-on-surface);white-space:pre-wrap}.page--setting #settingScreenItems .setting-doc-markdown a{color:var(--md-primary);text-decoration:none}.page--setting #settingScreenItems .setting-doc-table-wrap{max-width:100%;margin:10px 0;overflow-x:auto;border:1px solid color-mix(in srgb,var(--md-outline-var) 28%,transparent);border-radius:var(--r-sm)}.page--setting #settingScreenItems .setting-doc-markdown table{width:100%;border-collapse:collapse;font-size:11px}.page--setting #settingScreenItems .setting-doc-markdown th,.page--setting #settingScreenItems .setting-doc-markdown td{min-width:72px;padding:8px 10px;border-right:1px solid color-mix(in srgb,var(--md-outline-var) 20%,transparent);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 20%,transparent);text-align:left;vertical-align:top}.page--setting #settingScreenItems .setting-doc-markdown th:last-child,.page--setting #settingScreenItems .setting-doc-markdown td:last-child{border-right:0}.page--setting #settingScreenItems .setting-doc-markdown tbody tr:last-child td{border-bottom:0}.page--setting #settingScreenItems .setting-doc-markdown th{background:color-mix(in srgb,var(--md-on-surface) 6%,transparent);color:var(--md-on-surface);font-weight:820}.page--setting #settingScreenItems .setting-doc-callout{margin:10px 0;padding:10px 12px;border-left:3px solid color-mix(in srgb,var(--md-primary) 76%,transparent);border-radius:0 var(--r-sm) var(--r-sm) 0;background:color-mix(in srgb,var(--md-primary) 8%,transparent)}.page--setting #settingScreenItems .setting-doc-callout--warning,.page--setting #settingScreenItems .setting-doc-callout--caution{border-left-color:var(--md-warning);background:color-mix(in srgb,var(--md-warning) 9%,transparent)}.page--setting #settingScreenItems .setting-doc-markdown hr{margin:14px 0;border:0;border-top:1px solid color-mix(in srgb,var(--md-outline-var) 28%,transparent)}.page--setting #settingScreenItems .setting-context{width:100%;min-width:0;margin:14px 0 var(--sp-md);overflow:hidden;border:1px solid var(--setting-card-outline);border-radius:var(--setting-card-radius);background:var(--setting-card-surface);box-shadow:var(--setting-card-shadow)}.page--setting #settingScreenItems .setting-context__tabs{--segmented-control-gap: 0;--segmented-control-padding: 0;--segmented-control-item-min-height: var(--control-min-height);--segmented-control-item-padding: 0 var(--sp-sm);--segmented-control-item-flex: 1 1 0;--segmented-control-item-font-size: var(--fs-label-md);--segmented-control-item-radius: 0;--segmented-control-item-border: transparent;--segmented-control-item-bg: transparent;--segmented-control-item-fg: color-mix(in srgb, var(--md-on-surface-var) 72%, transparent);--segmented-control-selected-border: transparent;--segmented-control-selected-bg: color-mix(in srgb, var(--md-primary) 11%, var(--md-surface-cont-h));--segmented-control-selected-fg: var(--md-primary);width:100%;margin:0;overflow:hidden;border:0;border-bottom:1px solid var(--setting-card-outline);border-radius:var(--setting-card-radius) var(--setting-card-radius) 0 0;background:color-mix(in srgb,var(--md-surface-cont-h) 72%,var(--setting-card-surface))}.page--setting #settingScreenItems .setting-context__tab{position:relative;gap:5px;overflow:hidden;font-family:inherit;font-weight:850;touch-action:manipulation;-webkit-tap-highlight-color:transparent;transition:border-color var(--motion-quick) var(--ease-standard),background var(--motion-quick) var(--ease-standard),color var(--motion-quick) var(--ease-standard)}.page--setting #settingScreenItems .setting-context__tab:not(:last-child){border-right-color:color-mix(in srgb,var(--setting-card-outline) 62%,transparent)}.page--setting #settingScreenItems .setting-context__tab:first-child{border-top-left-radius:var(--setting-card-radius)}.page--setting #settingScreenItems .setting-context__tab:last-child{border-top-right-radius:var(--setting-card-radius)}.page--setting #settingScreenItems .setting-context__tab:hover{background:color-mix(in srgb,var(--md-on-surface) 5%,var(--md-surface-cont-h));color:var(--md-on-surface)}.page--setting #settingScreenItems .setting-context__tab[aria-selected=true]{border-color:var(--segmented-control-selected-border);background:var(--segmented-control-selected-bg);color:var(--segmented-control-selected-fg)}.page--setting #settingScreenItems .setting-context__tab:focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring-color);outline-offset:-2px}.page--setting #settingScreenItems .setting-context__tab-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page--setting #settingScreenItems .setting-context__tab-count{display:inline-grid;min-width:18px;height:18px;flex:0 0 auto;place-items:center;padding-inline:5px;border-radius:999px;background:var(--md-surface-cont-hh);color:var(--md-on-surface-var);font-size:10px;font-variant-numeric:tabular-nums;font-weight:850}.page--setting #settingScreenItems .setting-context__tab[aria-selected=true] .setting-context__tab-count{background:color-mix(in srgb,var(--md-primary) 16%,var(--md-surface-cont-hh));color:var(--md-primary)}.page--setting #settingScreenItems .setting-context__panel{min-width:0}.page--setting #settingScreenItems .setting-context__panel[hidden]{display:none}.page--setting #settingScreenItems .setting-context__content{min-width:0;min-height:168px;padding:clamp(var(--sp-md),2.5vw,var(--sp-lg));color:var(--md-on-surface-var)}.page--setting #settingScreenItems .setting-context__state{display:grid;min-height:136px;align-content:center;justify-items:center;padding:var(--sp-lg);color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);text-align:center}.page--setting #settingScreenItems .setting-context__state strong{max-width:34rem;font-size:var(--fs-label-md);font-weight:780;line-height:1.45;text-wrap:balance}.page--setting #settingScreenItems .setting-context__state--loading strong{animation:setting-context-loading 1.2s ease-in-out infinite alternate}.page--setting #settingScreenItems .setting-context .setting-popular-detail-block,.page--setting #settingScreenItems .setting-context .setting-history-detail-block{width:100%;margin:0}.page--setting #settingScreenItems .setting-context .setting-popular-detail{width:100%;min-width:0}.page--setting #settingScreenItems .setting-context .setting-popular-detail__rows{gap:6px;overflow:visible;border:0;border-radius:0;background:transparent}.page--setting #settingScreenItems .setting-context .setting-popular-detail__row{grid-template-columns:18px minmax(0,1fr) minmax(44px,auto);min-height:46px;padding:7px 11px;gap:10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-l) 62%,transparent);font-size:var(--fs-label-md)}.page--setting #settingScreenItems .setting-context .setting-popular-detail__row:last-child{border-bottom-color:color-mix(in srgb,var(--md-outline-var) 22%,transparent)}.page--setting #settingScreenItems .setting-context .setting-popular-detail__row:active{border-color:color-mix(in srgb,var(--md-primary) 32%,var(--md-outline-var));background:var(--md-primary-state-soft)}.page--setting #settingScreenItems .setting-context .setting-popular-detail__updated{margin-top:var(--sp-sm);color:color-mix(in srgb,var(--md-on-surface-var) 54%,transparent);font-size:var(--fs-label-sm)}.page--setting #settingScreenItems .setting-context__history-summary{display:grid;gap:var(--sp-md)}.page--setting #settingScreenItems .setting-context__more{width:100%;min-height:var(--control-min-height);border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:var(--control-radius);background:var(--md-surface-cont-h);color:var(--md-on-surface-var);font-family:inherit;font-size:var(--fs-label-md);font-weight:820;cursor:pointer}.page--setting #settingScreenItems .setting-context__more:hover,.page--setting #settingScreenItems .setting-context__more:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 42%,var(--md-outline-var));background:var(--md-primary-state-soft)}.setting-context__history-dialog{width:min(640px,calc(100vw - 32px));max-width:100%;max-height:min(82dvh,720px);padding:0;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 54%,transparent);border-radius:var(--r-lg);background:var(--md-surface-cont);color:var(--md-on-surface);box-shadow:var(--shadow-4)}.setting-context__history-dialog::backdrop{background:#000000ad;backdrop-filter:blur(2px)}.setting-context__dialog-header{display:flex;min-height:56px;align-items:center;justify-content:space-between;gap:var(--sp-md);padding:8px var(--sp-md);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent)}.setting-context__dialog-header h3{margin:0;font-size:var(--fs-body-md);font-weight:880}.setting-context__dialog-close{width:40px;height:40px;flex:0 0 auto;border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:var(--control-radius);background:var(--md-surface-cont-h);color:var(--md-on-surface);font-family:inherit;font-size:21px;cursor:pointer}.setting-context__dialog-body{max-height:calc(min(82dvh,720px) - 56px);overflow:auto;padding:var(--sp-md);overscroll-behavior:contain}.setting-context__dialog-body .setting-history-detail__head{display:none}.page--setting #settingScreenItems .setting-doc-ast details{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent)}.page--setting #settingScreenItems .setting-doc-ast details>summary{display:flex;min-height:var(--control-min-height);align-items:center;justify-content:space-between;gap:var(--sp-md);cursor:pointer;color:var(--md-on-surface);font-weight:820;list-style:none}.page--setting #settingScreenItems .setting-doc-ast details>summary::-webkit-details-marker{display:none}.page--setting #settingScreenItems .setting-doc-ast details>summary:after{content:"+";color:color-mix(in srgb,var(--md-on-surface-var) 58%,transparent);font-size:18px}.page--setting #settingScreenItems .setting-doc-ast details[open]>summary:after{content:"−"}.page--setting #settingScreenItems .setting-doc-callout__label{display:block;margin-bottom:5px;color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:880}.page--setting #settingScreenItems .setting-doc-markdown img{display:block;width:auto;max-width:100%;height:auto;margin:var(--sp-md) auto;border-radius:var(--r-sm)}.page--setting #settingScreenItems .setting-doc-task-item{list-style:none}.page--setting #settingScreenItems .setting-doc-task{margin-right:var(--sp-sm);accent-color:var(--md-primary)}.page--setting #settingScreenItems .setting-doc-markdown [data-align=center]{text-align:center}.page--setting #settingScreenItems .setting-doc-markdown [data-align=right]{text-align:right}@media(max-width:640px){.page--setting #settingScreenItems .setting-context{margin-top:12px}.page--setting #settingScreenItems .setting-context__tabs{--segmented-control-item-min-height: 42px;--segmented-control-item-padding: 0 var(--sp-xs);--segmented-control-item-font-size: var(--fs-label-sm)}.page--setting #settingScreenItems .setting-context__content{min-height:152px;padding:var(--sp-md)}.setting-context__history-dialog{width:100%;max-height:82dvh;margin:auto 0 0;border-right:0;border-bottom:0;border-left:0;border-radius:var(--r-lg) var(--r-lg) 0 0}.setting-context__dialog-body{max-height:calc(82dvh - 56px)}}@media(max-height:500px)and (orientation:landscape){.page--setting #settingScreenItems .setting-context__content{min-height:132px}.setting-context__history-dialog{max-height:calc(100dvh - 16px)}.setting-context__dialog-body{max-height:calc(100dvh - 72px)}}@media(prefers-reduced-motion:reduce){.page--setting #settingScreenItems .setting-context__state--loading strong{animation:none}}@keyframes setting-context-loading{0%{opacity:.48}to{opacity:.86}} diff --git a/openpilot/selfdrive/carrot/web/css/generated/tools.css b/openpilot/selfdrive/carrot/web/css/generated/tools.css index c6931514ce..6b93247d45 100644 --- a/openpilot/selfdrive/carrot/web/css/generated/tools.css +++ b/openpilot/selfdrive/carrot/web/css/generated/tools.css @@ -1,2 +1,2 @@ /* @generated by web/build.mjs; edit web/src/entries/tools.css instead. */ -.page--tools{--tools-page-height: var(--page-content-height, calc(var(--app-vv-height, 100dvh) - var(--nav-bar-height) - env(safe-area-inset-bottom, 0px)));--tools-motion-standard: cubic-bezier(.4, 0, .2, 1);--tools-motion-decelerate: cubic-bezier(0, 0, .2, 1);--tools-detail-duration: .32s;--tools-console-form-height: 40px;--tools-console-log-font-size: 12px;--tools-console-log-line-height: 1.45;--tools-console-peek-lines: 2;--tools-console-attention-lines: 5;--tools-console-expanded-lines: 9;--tools-console-visible-lines: var(--tools-console-peek-lines);--tools-console-handle-height: 18px;--tools-console-log-pad-top: 10px;--tools-console-log-pad-bottom: 14px;--tools-console-log-height: calc( (var(--tools-console-log-font-size) * var(--tools-console-log-line-height) * var(--tools-console-visible-lines)) + var(--tools-console-handle-height) + var(--tools-console-log-pad-top) + var(--tools-console-log-pad-bottom) );--tools-console-height: var(--tools-console-log-height);--tools-console-inline: var(--sp-lg);--tools-console-bg: #080b10;--tools-console-surface: #0c131b;--tools-console-current: #d9f1ff;--tools-console-history: #7f95a7;--tools-console-divider: color-mix(in srgb, var(--md-outline-var) 24%, transparent);--tools-log-scroll-gap: 6px;--tools-detail-scroll-gap: 8px;--tools-scrollbar-content-gap: 8px;display:flex;flex-direction:column;position:relative;min-height:var(--tools-page-height);height:var(--tools-page-height);max-height:var(--tools-page-height);box-sizing:border-box;padding-block-start:var(--tools-page-gutter-block);padding-block-end:0;padding-inline:var(--tools-page-gutter-inline);background:var(--tools-console-bg);overflow:visible}.page--tools.tools-log-attention{--tools-console-visible-lines: var(--tools-console-attention-lines)}.page--tools.tools-log-expanded{--tools-console-visible-lines: var(--tools-console-expanded-lines)}#toolsMeta{height:30px;min-height:30px;max-height:30px;display:grid;grid-template-columns:minmax(0,1fr);align-items:center;gap:16px;overflow:visible;line-height:1.2;position:relative;z-index:90}.tools-meta__status{min-width:0;height:100%;display:flex;align-items:center;gap:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;touch-action:none;-webkit-mask-image:none;mask-image:none}.tools-meta__status:focus-visible{outline:2px solid color-mix(in srgb,var(--md-primary) 72%,transparent);outline-offset:2px;border-radius:6px}.tools-meta__statusTrack{display:inline-block;min-width:0;max-width:none;overflow:visible;text-overflow:clip;white-space:nowrap;will-change:transform}.tools-meta__status.is-overflowing .tools-meta__statusTrack{animation:toolsMetaFlow var(--tools-meta-scroll-duration, 3.8s) cubic-bezier(.35,0,.65,1) .2s infinite alternate}@keyframes toolsMetaFlow{0%{transform:translate(0)}to{transform:translate(calc(-1 * var(--tools-meta-scroll-distance, 32px)))}}.tools-meta__info{display:none}.app-dialog--web-settings .app-dialog__sheet{width:min(calc(100vw - 32px),var(--preference-sheet-width));height:min(var(--preference-sheet-height),calc(100dvh - 32px));max-height:min(var(--preference-sheet-height),calc(100dvh - 32px));padding:16px;overflow:hidden}.app-dialog--web-settings .app-dialog__head{margin-bottom:14px}.app-dialog--web-settings .app-dialog__body{flex:1 1 auto;display:flex;min-height:0;max-height:none;white-space:normal;overflow:hidden}.app-dialog--web-settings .app-dialog__actions{margin-top:14px}.web-settings-dialog{display:grid;grid-template-columns:var(--preference-nav-width) minmax(0,1fr);align-items:start;gap:var(--sp-lg);min-width:0;min-height:0;height:100%;max-height:none;width:100%}.web-settings-nav{min-width:0;min-height:0;max-height:100%;display:flex;flex-direction:column;gap:var(--sp-sm);overflow:auto;overscroll-behavior:contain;padding-right:2px}.web-settings-nav__item{appearance:none;-webkit-appearance:none;width:100%;min-height:40px;padding:var(--sp-sm) var(--sp-md);border:1px solid color-mix(in srgb,var(--md-outline-var) 36%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont) 58%,transparent);color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800;line-height:1.2;text-align:left;white-space:normal;word-break:keep-all;overflow-wrap:anywhere;cursor:pointer;transition:background var(--motion-quick) var(--ease-standard),border-color var(--motion-quick) var(--ease-standard),color var(--motion-quick) var(--ease-standard)}.web-settings-nav__item:hover,.web-settings-nav__item:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-on-surface) 5%,var(--md-surface-cont));color:var(--md-on-surface)}.web-settings-nav__item.is-active{border-color:color-mix(in srgb,var(--md-primary) 56%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary);font-weight:850}.web-settings-panels,.web-settings-group{min-width:0;min-height:0}.web-settings-panels{height:100%;max-height:none;overflow:hidden}.web-settings-group{height:100%;max-height:none;display:flex;flex-direction:column}.web-settings-group[hidden]{display:none!important}.web-settings-group__title{margin-bottom:var(--sp-md);padding-bottom:var(--sp-sm);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);color:var(--md-on-surface);font-size:var(--fs-title-sm);font-weight:800;line-height:1.2;text-align:left;white-space:normal;word-break:keep-all;overflow-wrap:anywhere}.web-settings-group__body{display:grid;grid-auto-rows:max-content;gap:var(--sp-sm);align-content:start;flex:1 1 auto;min-height:0;max-height:none;overflow:auto;overscroll-behavior:contain;padding-right:2px}.web-settings-row,.web-settings-empty{min-height:var(--preference-row-min-height);padding:var(--sp-md) var(--sp-lg);border:1px solid color-mix(in srgb,var(--md-outline-var) 48%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont) 88%,transparent)}.web-settings-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--sp-md)}.web-settings-empty{display:flex;flex-direction:column;justify-content:center}.web-settings-row--toggle{cursor:pointer}.web-settings-row--disabled{cursor:not-allowed;opacity:var(--state-disabled-opacity)}.web-settings-row--select{cursor:default}.web-settings-row__copy{min-width:0;display:flex;flex-direction:column;gap:3px}.web-settings-row__title-line{min-width:0;display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-xs) var(--sp-sm)}.web-settings-row__title{min-width:0;color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:800;line-height:1.25;white-space:normal;word-break:keep-all;overflow-wrap:anywhere}.web-settings-row__desc,.web-settings-empty{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);line-height:1.35;white-space:normal;word-break:normal;overflow-wrap:anywhere}.web-settings-select{width:var(--preference-select-width);min-width:var(--preference-select-min-width);min-height:34px;padding:0 34px 0 11px;border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:700;line-height:1.2}.web-upload-settings{display:grid;gap:var(--sp-sm)}.web-settings-row--field{grid-template-columns:minmax(0,1fr) minmax(190px,44%)}.web-settings-text{width:100%;min-width:0;min-height:36px;padding:0 11px;border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface);font-size:var(--fs-label-sm)}.web-upload-settings__actions{display:flex;align-items:center;gap:var(--sp-sm);min-height:40px}.web-upload-settings__status{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);overflow-wrap:anywhere}.app-dialog--tools-qr .app-dialog__sheet{width:min(calc(100vw - 32px),520px);max-height:min(calc(100dvh - 32px),720px);padding:16px;overflow:hidden}.app-dialog--tools-qr .app-dialog__body{min-height:0;white-space:normal;overflow:auto}.tools-qr-backup,.tools-qr-restore{min-width:0;display:grid;gap:14px}.tools-qr-code{display:flex;justify-content:center;padding:12px;border-radius:8px;background:#f8fafc}.tools-qr-code svg{display:block;width:min(100%,300px);height:auto}.tools-qr-stats,.tools-qr-actions,.tools-qr-summary{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.tools-qr-restore .tools-qr-actions{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px;padding:4px;border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-surface-cont-h) 70%,#000)}.tools-qr-action-btn{width:100%;min-height:52px;padding-inline:10px;border-radius:8px;border-color:transparent;background:transparent;justify-content:center;font-size:14px;font-weight:850}.tools-qr-action-btn:hover,.tools-qr-action-btn:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 34%,transparent);background:color-mix(in srgb,var(--md-primary) 10%,transparent)}.tools-qr-action-btn--camera.is-disabled,.tools-qr-action-btn--camera:disabled{cursor:not-allowed;opacity:.56;color:color-mix(in srgb,var(--md-on-surface-var) 82%,transparent);background:color-mix(in srgb,var(--md-on-surface) 5%,transparent)}.tools-qr-action-btn--camera.is-disabled:before,.tools-qr-action-btn--camera:disabled:before{content:"X";width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;margin-right:7px;border-radius:50%;border:1px solid currentColor;font-size:11px;font-weight:900;line-height:1}.tools-qr-stats{color:var(--md-on-surface-var);font-size:12px;line-height:1.35}.tools-qr-camera{position:relative;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:8px;background:#05080d;transition:border-color .16s ease,box-shadow .16s ease}.tools-qr-camera video{display:block;width:100%;min-height:260px;max-height:min(54dvh,420px);aspect-ratio:1 / 1;object-fit:cover}.tools-qr-camera__overlay{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none}.tools-qr-camera__guide{position:relative;width:74%;aspect-ratio:1 / 1;border:1px solid color-mix(in srgb,var(--md-outline-var) 78%,transparent);border-radius:10px;box-shadow:0 0 0 999px #0000006b;transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease}.tools-qr-camera__corner{position:absolute;width:30px;height:30px;color:color-mix(in srgb,var(--md-primary) 82%,#ffffff);border-color:currentColor;transition:color .16s ease,filter .16s ease}.tools-qr-camera__corner--tl{top:-2px;left:-2px;border-top:3px solid;border-left:3px solid;border-top-left-radius:10px}.tools-qr-camera__corner--tr{top:-2px;right:-2px;border-top:3px solid;border-right:3px solid;border-top-right-radius:10px}.tools-qr-camera__corner--bl{bottom:-2px;left:-2px;border-bottom:3px solid;border-left:3px solid;border-bottom-left-radius:10px}.tools-qr-camera__corner--br{right:-2px;bottom:-2px;border-right:3px solid;border-bottom:3px solid;border-bottom-right-radius:10px}.tools-qr-camera[data-scan-state=detected]{border-color:color-mix(in srgb,var(--md-primary) 82%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-primary) 24%,transparent)}.tools-qr-camera[data-scan-state=detected] .tools-qr-camera__guide{border-color:color-mix(in srgb,var(--md-primary) 80%,#ffffff);box-shadow:0 0 0 999px #00000057,0 0 0 2px color-mix(in srgb,var(--md-primary) 28%,transparent)}.tools-qr-camera[data-scan-state=aligned],.tools-qr-camera[data-scan-state=locked]{border-color:color-mix(in srgb,#4fd18b 82%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,#4fd18b 34%,transparent)}.tools-qr-camera[data-scan-state=aligned] .tools-qr-camera__guide,.tools-qr-camera[data-scan-state=locked] .tools-qr-camera__guide{border-color:#4fd18b;box-shadow:0 0 0 999px #00000047,0 0 0 2px color-mix(in srgb,#4fd18b 38%,transparent);transform:scale(1.015)}.tools-qr-camera[data-scan-state=aligned] .tools-qr-camera__corner,.tools-qr-camera[data-scan-state=locked] .tools-qr-camera__corner{color:#4fd18b;filter:drop-shadow(0 0 7px color-mix(in srgb,#4fd18b 68%,transparent))}.tools-qr-camera[data-scan-state=locked] .tools-qr-camera__guide{animation:toolsQrLockPulse .26s ease-out}@keyframes toolsQrLockPulse{0%{transform:scale(1.015)}55%{transform:scale(1.045)}to{transform:scale(1.015)}}.tools-qr-status,.tools-qr-empty,.tools-qr-more{color:var(--md-on-surface-var);font-size:13px;line-height:1.4}.tools-qr-status{min-height:24px;display:flex;align-items:center;color:color-mix(in srgb,var(--md-on-surface) 86%,var(--md-on-surface-var));font-weight:750}.tools-qr-chip{min-height:28px;display:inline-flex;align-items:center;gap:6px;padding:3px 0;border-radius:0;background:transparent;color:var(--md-on-surface-var);font-size:12px;line-height:1.2}.tools-qr-chip strong{color:var(--md-on-surface)}.tools-qr-summary{justify-content:flex-start;gap:14px;padding:2px 0 4px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 28%,transparent)}.tools-qr-diff{min-height:0}.tools-qr-diff__list{max-height:min(36dvh,300px);overflow:auto;display:grid;gap:0;margin-top:2px;padding-right:4px;overscroll-behavior:contain}.tools-qr-diff__row{min-width:0;display:grid;gap:8px;padding:12px 0 14px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 30%,transparent)}.tools-qr-diff__row:first-child{padding-top:4px}.tools-qr-diff__head{min-width:0;display:flex;align-items:baseline;justify-content:space-between;gap:10px}.tools-qr-diff__key{min-width:0;overflow:hidden;color:var(--md-on-surface);font-size:13px;font-weight:800;line-height:1.3;text-overflow:ellipsis;white-space:nowrap}.tools-qr-diff__status{flex:0 0 auto;padding:2px 0;border-radius:999px;background:transparent;color:color-mix(in srgb,#8fdc9b 82%,var(--md-on-surface));font-size:11px;font-weight:800;line-height:1.1}.tools-qr-diff__compare{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) 20px minmax(0,1fr);align-items:start;gap:10px}.tools-qr-diff__value{min-width:0;display:grid;align-content:start;gap:4px;padding:0;border:0;background:transparent}.tools-qr-diff__value span{min-width:0;color:var(--md-on-surface-var);font-size:12px;font-weight:800;line-height:1.2}.tools-qr-diff__value code{min-width:0;overflow-wrap:anywhere;color:var(--md-on-surface);font-family:var(--font-mono);font-size:14px;line-height:1.4;white-space:pre-wrap}.tools-qr-diff__value--old{color:color-mix(in srgb,#ff8a80 74%,var(--md-on-surface))}.tools-qr-diff__value--new{color:color-mix(in srgb,#8fdc9b 78%,var(--md-on-surface))}.tools-qr-diff__value--old code{color:color-mix(in srgb,#ff8a80 76%,var(--md-on-surface))}.tools-qr-diff__value--new code{color:color-mix(in srgb,#8fdc9b 82%,var(--md-on-surface))}.tools-qr-diff__arrow{width:20px;min-width:20px;display:flex;align-items:center;justify-content:center;color:var(--md-on-surface-var);font-size:15px;font-weight:900}@media(max-width:640px),(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.app-dialog--web-settings .app-dialog__sheet{--preference-sheet-width: 420px;--preference-sheet-height: clamp(440px, 72dvh, 560px);--preference-row-min-height: 64px;--preference-select-width: min(132px, 40vw);--preference-select-min-width: 104px;width:min(calc(100vw - 24px),var(--preference-sheet-width));height:min(var(--preference-sheet-height),calc(100dvh - 24px));max-height:min(var(--preference-sheet-height),calc(100dvh - 24px));padding:14px}.web-settings-dialog{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);align-content:start;gap:12px;height:100%;width:100%}.web-settings-nav{flex-direction:row;gap:8px;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch;touch-action:pan-x;padding-bottom:2px;padding-right:0}.web-settings-nav::-webkit-scrollbar{display:none;width:0;height:0}.web-settings-nav__item{width:auto;min-width:76px;flex:0 0 auto;text-align:center}.web-settings-row{grid-template-columns:minmax(0,1fr) auto;gap:10px}.app-dialog--tools-qr .app-dialog__sheet{width:min(calc(100vw - 24px),440px);max-height:min(calc(100dvh - 24px),680px);padding:14px}.tools-qr-code svg{width:min(100%,276px)}.tools-qr-camera video{min-height:270px;max-height:min(52dvh,390px)}.tools-qr-diff__row{padding:12px 0 14px}.tools-qr-diff__compare{grid-template-columns:minmax(0,1fr) 18px minmax(0,1fr);gap:8px}.tools-qr-diff__value code{font-size:13px}}@media(max-height:430px)and (min-aspect-ratio:13/10){.app-dialog--web-settings .app-dialog__sheet{--preference-sheet-height: calc(100dvh - 20px) ;--preference-row-min-height: 56px;height:var(--preference-sheet-height);max-height:calc(100dvh - 20px);padding:12px 14px}.app-dialog--web-settings .app-dialog__head{margin-bottom:10px}.app-dialog--web-settings .app-dialog__actions{margin-top:10px}.web-settings-row,.web-settings-empty{padding-block:10px}}@media(max-width:420px){.web-settings-row--select,.web-settings-row--field{grid-template-columns:minmax(0,1fr);align-items:stretch}.web-settings-select,.web-settings-text{width:100%;min-width:0}}.tools-scroll-stack{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:2px var(--tools-scrollbar-content-gap) 0 0}.tools-primary-actions{margin-bottom:16px}.tools-group__toggle{width:100%;min-height:34px;display:inline-flex;align-items:center;justify-content:space-between;gap:10px;padding:0 2px;border:0;background:transparent;text-align:left;color:inherit;cursor:pointer}.tools-group__title{margin-bottom:0}.tools-group__chevron{width:9px;height:9px;flex:0 0 auto;border-right:2px solid color-mix(in srgb,var(--md-primary) 88%,#fff);border-bottom:2px solid color-mix(in srgb,var(--md-primary) 88%,#fff);transform:rotate(45deg) translateY(-1px);transition:transform .18s ease,opacity .18s ease;opacity:.82}.tools-group.is-open .tools-group__chevron{transform:rotate(225deg) translateY(-1px)}.tools-group__body{margin-top:8px;display:grid;grid-template-rows:1fr;overflow:hidden;will-change:grid-template-rows,opacity}.tools-group:not(.is-open)>.tools-group__body{grid-template-rows:0fr;margin-top:0;opacity:0;pointer-events:none}.tools-group.is-collapsing>.tools-group__body{animation:tools-group-fold var(--motion-medium) var(--ease-emphasized) both}.tools-group.is-expanding>.tools-group__body{animation:tools-group-fold var(--motion-medium) var(--ease-emphasized) reverse both}.tools-group__bodyInner{min-height:0;overflow:hidden}@keyframes tools-group-fold{0%{grid-template-rows:1fr;margin-top:8px;opacity:1}to{grid-template-rows:0fr;margin-top:0;opacity:0}}@media(prefers-reduced-motion:reduce){.tools-group.is-collapsing>.tools-group__body,.tools-group.is-expanding>.tools-group__body{animation:none}}.page--tools .section.tools-group{margin-bottom:0}.page--tools .divider{margin:16px 0 14px;border-top-color:color-mix(in srgb,var(--md-outline-var) 44%,transparent)}.tools-progress{position:relative;width:100%;height:4px;margin:0 0 var(--sp-md);border-radius:999px;background:color-mix(in srgb,var(--md-stroke-soft) 26%,transparent);overflow:hidden}.tools-progress[hidden]{display:block;visibility:visible}.tools-progress__bar{width:0%;height:100%;border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--md-primary) 58%,transparent),var(--md-primary));transition:width .18s ease,transform .22s ease,opacity .18s ease}.tools-progress.is-indeterminate .tools-progress__bar{width:34%;animation:tools-progress-sweep 1.1s linear infinite}@keyframes tools-progress-sweep{0%{transform:translate(-120%)}to{transform:translate(320%)}}.tools-console-dock{position:absolute;left:var(--tools-page-gutter-inline);right:var(--tools-page-gutter-inline);top:calc(var(--tools-page-gutter-block) + 38px);bottom:auto;width:auto;margin:0;padding:0;z-index:120;flex:none;background:transparent;border-top:0;overflow:visible;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;opacity:0;pointer-events:none;transform:translateY(-14px) scale(.985);transform-origin:top center;transition:opacity .19s ease,transform .23s cubic-bezier(.2,0,0,1)}.page--tools.tools-log-expanded .tools-console-dock{opacity:1;pointer-events:auto;transform:translateY(0) scale(1)}.page--tools.tools-log-attention .tools-meta__status{color:var(--md-primary)}.page--tools.page-transitioning .tools-console-shell,.page--tools.page-transitioning .tools-console-log{transition:none;animation:none}.tools-console-dock:before,.tools-console-dock:after{display:none}.tools-console-shell{display:flex;flex-direction:column;height:auto;min-height:0;max-height:none;padding:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:18px;background:color-mix(in srgb,var(--md-surface-cont) 92%,#05080d);-webkit-backdrop-filter:none;backdrop-filter:none;overflow:hidden;box-shadow:0 1px color-mix(in srgb,#fff 5%,transparent) inset,0 14px 34px #00000061;transition:max-height .22s cubic-bezier(.2,0,0,1)}.tools-console-meta{display:none}.tools-console-form{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:var(--sp-sm);align-items:center;margin:0;height:var(--tools-console-form-height);min-height:var(--tools-console-form-height);padding:8px var(--tools-console-inline);border-bottom:1px solid var(--tools-console-divider);background:var(--tools-console-bg);box-sizing:border-box;padding-block:var(--tools-page-gutter-block);padding-inline:var(--tools-page-gutter-inline)}.page--tools .tools-console-form,.page--tools .tools-console-help{display:none!important}.tools-console-prompt{color:var(--md-primary);font-family:var(--font-mono);font-size:var(--fs-body-sm);font-weight:700;line-height:1;letter-spacing:0}.tools-console-form .input-text{min-width:0;padding:0;border:0;border-radius:0;background:transparent;color:var(--md-on-surface);box-shadow:none;outline:none;font-size:var(--fs-body-sm);line-height:1.25}.tools-console-form .input-text::placeholder{color:var(--md-outline)}.tools-console-form .input-text:focus{border-color:transparent}.tools-console-iconBtn{min-width:34px;width:34px;height:auto;align-self:stretch;margin-block:-8px;padding:0;border:0;border-left:1px solid var(--tools-console-divider);border-radius:0;background:transparent;color:var(--md-outline);font-family:var(--font-mono);font-size:13px;font-weight:700;line-height:1;box-shadow:none;display:inline-flex;align-items:center;justify-content:center}.tools-console-iconBtn[aria-expanded=true]{color:var(--md-primary)}.tools-console-iconBtn__svg{width:16px;height:16px;display:block;transform:translate(-.5px,-.5px)}.tools-console-help{padding:8px var(--tools-console-inline);border-bottom:1px solid var(--tools-console-divider);color:var(--md-on-surface-var);font-size:12px;line-height:1.35;background:var(--tools-console-bg);box-sizing:border-box;padding-block:var(--tools-page-gutter-block);padding-inline:var(--tools-page-gutter-inline)}.tools-console-log{display:block;flex:none;height:auto;min-height:62px;max-height:min(38dvh,260px);margin:0;padding:10px;border:0;border-radius:0;background:transparent;color:var(--md-on-surface);font-family:inherit;font-size:13px;line-height:1.35;white-space:normal;word-break:break-word;overflow:auto;box-sizing:border-box;box-shadow:none;cursor:default;transition:max-height .24s cubic-bezier(.2,0,0,1),color .18s ease,background .18s ease}.tools-console-log:focus-visible{outline:2px solid color-mix(in srgb,var(--md-primary) 72%,transparent);outline-offset:-3px}.page--tools.tools-log-attention .tools-console-log,.page--tools.tools-log-expanded .tools-console-log{background:transparent;color:color-mix(in srgb,var(--md-on-surface) 92%,var(--md-on-surface-var))}@media(prefers-reduced-motion:reduce){.tools-meta__status.is-overflowing .tools-meta__statusTrack,.tools-console-shell,.tools-console-log{animation:none;transition:none}}.page--tools.tools-log-expanded .tools-console-log{max-height:min(58dvh,460px)}.tools-console-log__header{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 2px 8px;color:var(--md-on-surface);font-family:inherit;font-size:13px;font-weight:800;line-height:1.2;white-space:nowrap}.tools-console-log__headerTitle{min-width:0;overflow:hidden;text-overflow:ellipsis}.tools-console-log__headerActions{flex:0 0 auto;display:flex;align-items:center}.tools-console-log__body{display:block;min-height:0;box-sizing:border-box}.tools-console-log__history,.tools-console-log__current{display:block;white-space:pre-wrap}.tools-console-log__card{position:relative;display:block;appearance:none;-webkit-appearance:none;width:100%;min-height:58px;margin:0;padding:14px 4px 14px 8px;border:0;border-radius:0;background:transparent;color:inherit;box-shadow:none;font:inherit;text-align:left;cursor:pointer;transition:background var(--motion-base) var(--ease-standard),box-shadow var(--motion-base) var(--ease-standard),opacity var(--motion-base) var(--ease-standard)}.tools-console-log__card+.tools-console-log__card{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.tools-console-log__card:after{display:none}@media(hover:hover){.tools-console-log__card:hover{background:color-mix(in srgb,var(--md-on-surface) var(--state-hover-pct),transparent)}}.tools-console-log__card:active{transform:none}.tools-console-log__card:focus-visible{outline:2px solid color-mix(in srgb,var(--md-primary) 72%,transparent);outline-offset:2px}.tools-console-log__body>.tools-console-log__card:last-child{margin-bottom:0}.tools-console-log__card.is-expanded{background:color-mix(in srgb,var(--md-primary) 6%,transparent)}.tools-console-log__card.is-unread-update .tools-console-log__cardTitle:before{content:"";display:inline-block;width:8px;height:8px;margin-right:8px;border-radius:999px;background:var(--md-primary);vertical-align:middle;transform:translateY(-1px);transition:opacity var(--motion-base) var(--ease-emphasized)}.tools-console-log__card.is-update-read .tools-console-log__cardTitle:before{opacity:0}.tools-console-log__card.is-git-update .tools-console-log__cardBody{white-space:pre-wrap}.tools-console-log__card.is-collapsing{pointer-events:none}.tools-console-log__cardHead{display:flex;align-items:baseline;justify-content:space-between;gap:10px;min-width:0;margin:0 0 4px}.tools-console-log__cardTitle{display:block;min-width:0;margin:0;color:var(--md-on-surface);font-family:inherit;font-size:13px;font-weight:800;line-height:1.25;white-space:normal}.tools-console-log__cardTime{flex:0 0 auto;max-width:42%;overflow:hidden;color:color-mix(in srgb,var(--md-primary) 58%,var(--md-on-surface-var));font-family:inherit;font-size:11px;font-weight:700;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.tools-console-log__cardBody{display:block;color:inherit;font-family:var(--font-mono);font-size:12px;line-height:1.45;white-space:pre-wrap}.tools-console-log__cardBody--update{display:flex;flex-direction:column;gap:7px;font-family:inherit;white-space:normal}.tools-console-log__updateLabel{display:block;color:var(--md-on-surface);font-size:13px;font-weight:900;line-height:1.2}.tools-console-log__updateMessages{display:grid;gap:3px;min-width:0}.tools-console-log__updateMessage{display:block;min-width:0;overflow:hidden;color:color-mix(in srgb,var(--md-on-surface) 90%,var(--md-primary));font-size:12px;font-weight:760;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.tools-console-log__updateStats{display:flex;flex-wrap:wrap;gap:6px;min-width:0;margin-top:2px}.tools-console-log__updateStat{display:inline-flex;align-items:center;min-height:28px;padding:0 10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 32%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-on-surface) 6%,transparent);color:color-mix(in srgb,var(--md-on-surface) 88%,var(--md-on-surface-var));font-family:var(--font-mono);font-size:12px;font-weight:700;line-height:1;white-space:nowrap}.tools-console-log__updateStat--add{border-color:color-mix(in srgb,#46d17f 36%,transparent);background:color-mix(in srgb,#46d17f 13%,transparent);color:color-mix(in srgb,#68e49a 84%,var(--md-on-surface))}.tools-console-log__updateStat--delete{border-color:color-mix(in srgb,#ff7373 34%,transparent);background:color-mix(in srgb,#ff7373 12%,transparent);color:color-mix(in srgb,#ff8a8a 82%,var(--md-on-surface))}.tools-console-log__detailWrap{display:block;max-height:0;overflow:hidden;opacity:0;transform:translateY(-6px);transition:max-height var(--tools-detail-duration) var(--tools-motion-decelerate),opacity calc(var(--tools-detail-duration) * .78) var(--tools-motion-decelerate),transform var(--tools-detail-duration) var(--tools-motion-decelerate)}.tools-console-log__card.is-expanded .tools-console-log__detailWrap{max-height:var(--tools-detail-height, min(42dvh, 360px));opacity:1;transform:translateY(0);animation:tools-detail-open var(--tools-detail-duration) var(--tools-motion-decelerate) both}.tools-console-log__detailInner{display:block;min-height:0;overflow:hidden}@keyframes tools-detail-open{0%{max-height:0;opacity:0;transform:translateY(-6px)}to{max-height:var(--tools-detail-height, min(42dvh, 360px));opacity:1;transform:translateY(0)}}.tools-console-log__detailTitle{display:block;margin:12px 0 6px;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 86%,var(--md-on-surface));font-size:11px;font-weight:700;letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.tools-console-log__detail{display:block;box-sizing:border-box;width:100%;max-height:min(40dvh,320px);overflow:auto;overflow-anchor:none;scrollbar-width:thin;padding:2px 14px 4px 6px;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface-var) 92%,var(--md-on-surface));font-family:var(--font-mono);font-size:12px;line-height:1.5;white-space:pre-wrap}.tools-console-log__empty{display:block;margin:12px 0;padding:14px 4px;border:0;border-radius:0;background:transparent;color:var(--md-on-surface-var);font-size:13px;line-height:1.35;text-align:center;opacity:.82}.tools-console-log__footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;margin-top:12px}.tools-console-log__clearBtn{appearance:none;-webkit-appearance:none;min-height:38px;padding:0 16px;border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-surface-cont-h) 74%,#05080d);color:var(--md-on-surface);font:inherit;font-size:13px;font-weight:800;cursor:pointer}.tools-console-log__clearBtn{border-color:color-mix(in srgb,var(--md-primary) 58%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-primary) 22%,var(--md-surface-cont-hh)),color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h)));color:var(--md-on-surface)}.tools-console-log__clearBtn:disabled{cursor:default;opacity:.42}.tools-console-log__history{color:color-mix(in srgb,var(--tools-console-history) 86%,var(--md-on-surface-var));opacity:.92}.tools-console-log__current{border-color:color-mix(in srgb,var(--md-primary) 52%,var(--md-outline-var));background:linear-gradient(180deg,color-mix(in srgb,var(--md-primary) 18%,var(--md-surface-cont-h)),color-mix(in srgb,var(--md-primary) 12%,var(--md-surface-cont)));color:var(--tools-console-current)}.tools-console-log.is-clearing .tools-console-log__card{opacity:0;transform:translateY(-8px) scale(.985)}@media(min-aspect-ratio:13/10),(horizontal-viewport-segments:2),(vertical-viewport-segments:2),(min-width:640px)and (min-height:650px){.page--tools{--tools-detail-duration: .34s;--tools-log-scroll-gap: 10px;--tools-detail-scroll-gap: 12px;--tools-console-form-height: 40px;--tools-console-log-font-size: 14px;--tools-console-log-line-height: 1.55;--tools-console-log-pad-top: 14px;--tools-console-log-pad-bottom: 14px;--tools-console-inline: 16px;display:grid;grid-template-columns:minmax(0,1fr) clamp(340px,32vw,460px);grid-template-rows:auto auto minmax(0,1fr);column-gap:20px;align-items:stretch;height:var(--tools-page-height);min-height:0;max-height:var(--tools-page-height);background:var(--tools-console-bg);overflow:hidden}.page--tools>.page-header--hidden{display:none!important}.page--tools>#toolsMeta{grid-column:1;grid-row:1;align-self:start;height:32px;min-height:32px;max-height:32px;font-size:13px;font-weight:600}.page--tools>#toolsProgress{grid-column:1;grid-row:2;margin-bottom:8px}.page--tools>.tools-scroll-stack{grid-column:1;grid-row:3;min-height:0;overflow-y:auto;padding-bottom:0;scroll-padding-bottom:0}.page--tools>.tools-console-dock{position:relative;inset:auto;grid-column:2;grid-row:1 / span 3;width:auto;min-height:0;max-height:calc(100% - var(--tools-page-gutter-block));margin-bottom:var(--tools-page-gutter-block);padding:0;display:flex;align-self:stretch;opacity:1;pointer-events:auto;transform:none}.page--tools>.tools-console-dock:before,.page--tools>.tools-console-dock:after{display:none}.page--tools>.tools-console-dock .tools-console-shell{flex:1 1 auto;height:100%;min-height:0;max-height:100%;border:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:16px;background:color-mix(in srgb,var(--md-surface-cont) 88%,#060a10);box-shadow:0 1px color-mix(in srgb,#fff 4%,transparent) inset,0 10px 28px #00000038}.page--tools>.tools-console-dock .tools-console-log{flex:1 1 auto;display:flex;flex-direction:column;height:auto;min-height:0;max-height:none;padding:14px 12px 12px;overflow:hidden}.page--tools>.tools-console-dock .tools-console-log__header{flex:0 0 auto;margin:0 0 8px;padding:0 4px 10px 8px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent)}.page--tools>.tools-console-dock .tools-console-log__body{flex:1 1 auto;min-height:0;overflow:auto;overflow-anchor:none;overscroll-behavior:contain;padding:0 0 16px;scroll-padding-bottom:20px;scrollbar-gutter:stable;scrollbar-width:thin}.page--tools>.tools-console-dock .tools-console-log__card{margin:0;padding:13px 4px 13px 8px;border:0;border-radius:0;background:transparent;box-shadow:none;transition:background var(--motion-base) var(--ease-standard),box-shadow var(--motion-base) var(--ease-standard),color var(--motion-base) var(--ease-standard),opacity var(--motion-base) var(--ease-standard)}.page--tools>.tools-console-dock .tools-console-log__card+.tools-console-log__card{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.page--tools>.tools-console-dock .tools-console-log__card:hover{background:color-mix(in srgb,var(--md-on-surface) var(--state-hover-pct),transparent)}.page--tools>.tools-console-dock .tools-console-log__card.is-expanded{background:color-mix(in srgb,var(--md-primary) 6%,transparent);color:color-mix(in srgb,var(--md-on-surface) 94%,var(--tools-console-current))}.page--tools>.tools-console-dock .tools-console-log__cardHead{margin-bottom:3px}.page--tools>.tools-console-dock .tools-console-log__cardTitle{font-size:13px;font-weight:800}.page--tools>.tools-console-dock .tools-console-log__cardTime{color:color-mix(in srgb,var(--md-primary) 62%,var(--md-on-surface-var))}.page--tools>.tools-console-dock .tools-console-log__cardBody{color:color-mix(in srgb,var(--md-on-surface-var) 86%,var(--md-on-surface));font-family:inherit;font-size:12px;line-height:1.35;white-space:normal}.page--tools>.tools-console-dock .tools-console-log__cardBody--update{display:flex;flex-direction:column;gap:7px}.page--tools>.tools-console-dock .tools-console-log__card.is-git-update .tools-console-log__cardBody{line-height:1.42;white-space:pre-wrap}.page--tools>.tools-console-dock .tools-console-log__card.is-git-update .tools-console-log__cardBody--update{-webkit-line-clamp:unset;white-space:normal}.page--tools>.tools-console-dock .tools-console-log__detail{width:100%;max-height:min(32dvh,240px);overflow:auto;overflow-anchor:none;scrollbar-width:thin;padding:2px 12px 4px 4px;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface) 86%,var(--tools-console-current));font-size:12px;line-height:1.48}.page--tools>.tools-console-dock .tools-console-log__empty{margin:6px 0 0;padding:18px 4px;border:0;border-radius:0;background:transparent;text-align:center}.page--tools>.tools-console-dock .tools-console-log__clearBtn{min-height:26px;padding-inline:10px;border-radius:999px;background:transparent;font-size:11px;box-shadow:none}.page--tools .section{margin-bottom:20px}.page--tools .btn,.page--tools .smallBtn{min-height:44px;padding:10px 16px;font-size:14px;font-weight:600}.page--tools .section h4{font-size:calc(var(--fs-title-xs) * 1.16);font-weight:800}.tools-console-form{gap:6px;padding:6px var(--tools-console-inline)}.tools-console-prompt{font-size:17px;font-weight:800}.tools-console-iconBtn{min-width:32px;width:32px;margin-block:-6px}.tools-console-log{padding-right:max(var(--tools-console-inline),14px)}.tools-console-log__history,.tools-console-log__current{font-size:14px;line-height:1.55}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--tools{--tools-detail-duration: .36s;--tools-log-scroll-gap: 6px;--tools-detail-scroll-gap: 10px}.page--tools>#toolsMeta{height:32px;min-height:32px;max-height:32px;margin-bottom:8px;overflow:visible;align-items:center;line-height:1.2}.page--tools>#toolsProgress{margin-bottom:10px}.page--tools>.tools-console-dock{position:fixed;inset:0;padding:calc(env(safe-area-inset-top,0px) + 12px) var(--tools-page-gutter-inline) max(var(--tools-page-gutter-block),10px);z-index:2200;background:radial-gradient(circle at 50% 16%,color-mix(in srgb,var(--md-primary) 8%,transparent),transparent 34%),linear-gradient(180deg,color-mix(in srgb,#03060a 68%,transparent),color-mix(in srgb,var(--tools-console-bg) 74%,#020408));border-top:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent);overflow:hidden;box-shadow:0 -1px color-mix(in srgb,#fff 4%,transparent) inset,0 -14px 34px #00000038 inset;-webkit-backdrop-filter:blur(8px) saturate(1.02);backdrop-filter:blur(8px) saturate(1.02);opacity:1;pointer-events:none;touch-action:none;transform:translateY(-100%);transition:transform .25s cubic-bezier(.2,0,0,1)}.page--tools.tools-log-expanded>.tools-console-dock.tools-notifications--portrait{pointer-events:auto;transform:translateY(0)}.page--tools>.tools-console-dock.tools-notifications--portrait.is-dragging{pointer-events:auto;transition:none;transform:translateY(calc(-100% + var(--tools-notification-drag-y, 0px)))}.page--tools.tools-log-expanded>.tools-console-dock.tools-notifications--portrait.is-dragging{transform:translateY(var(--tools-notification-drag-y, 0px))}.page--tools>.tools-console-dock.tools-notifications--portrait:after{content:"";display:block;position:absolute;left:50%;bottom:max(14px,calc(env(safe-area-inset-bottom,0px) + 6px));width:58px;height:5px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface) 42%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,#fff 8%,transparent) inset,0 6px 18px #00000047;opacity:.74;transform:translate(-50%);pointer-events:none;z-index:3}.page--tools>.tools-console-dock .tools-console-shell{height:100%;border:0;border-radius:0;background:transparent;box-shadow:none;overflow:hidden}.page--tools>.tools-console-dock .tools-console-log{display:flex;flex-direction:column;height:100%;min-height:0;max-height:none;padding:clamp(22px,7dvh,58px) var(--tools-log-scroll-gap) 0;overflow:auto;overflow-anchor:none;overscroll-behavior:contain;touch-action:pan-y;-webkit-user-select:none;user-select:none;scroll-padding-top:clamp(22px,7dvh,58px);scroll-padding-bottom:132px}.page--tools>.tools-console-dock .tools-console-log__body{flex:0 0 auto;min-height:0;overflow:visible;padding-bottom:0}.page--tools>.tools-console-dock .tools-console-log__detail{-webkit-user-select:text;user-select:text}.tools-console-log__header{margin:0 4px 12px;font-size:15px;font-weight:900}.tools-console-log__card{min-height:62px;margin:0;padding:15px 6px 15px 10px;border:0;border-radius:0;background:transparent;box-shadow:none}.tools-console-log__card+.tools-console-log__card{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.tools-console-log__card.is-expanded{background:color-mix(in srgb,var(--md-primary) 6%,transparent);color:color-mix(in srgb,var(--md-on-surface) 94%,var(--tools-console-current))}.tools-console-log__detailWrap{transform:translateY(-8px)}.tools-console-log__card.is-expanded .tools-console-log__detailWrap{animation-duration:var(--tools-detail-duration)}.tools-console-log__cardTitle{font-size:14px}.tools-console-log__cardBody{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px}.tools-console-log__cardBody--update{display:flex;flex-direction:column;gap:7px;overflow:visible;-webkit-line-clamp:unset}.tools-console-log__card.is-git-update .tools-console-log__cardBody{line-height:1.42;-webkit-line-clamp:3;white-space:pre-wrap}.tools-console-log__card.is-git-update .tools-console-log__cardBody--update{-webkit-line-clamp:unset;white-space:normal}.tools-console-log__card.is-expanded .tools-console-log__cardBody{display:block;overflow:visible;-webkit-line-clamp:unset}.tools-console-log__card.is-expanded .tools-console-log__cardBody--update{display:flex}.tools-console-log__detail{width:100%;max-height:min(44dvh,360px);overflow:auto;overflow-anchor:none;scrollbar-width:thin;padding:2px 14px 4px 6px;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface) 86%,var(--tools-console-current))}.tools-console-log__empty{margin:12px 0;padding:18px 4px;border:0;border-radius:0;background:transparent;text-align:center}.tools-console-log__footer{position:relative;bottom:auto;flex:0 0 auto;margin-top:auto;min-height:104px;padding:18px 6px max(32px,calc(env(safe-area-inset-bottom,0px) + 10px));align-items:flex-start;justify-content:flex-end;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--tools-console-bg) 24%,transparent) 60%,color-mix(in srgb,#020408 46%,transparent));touch-action:none;cursor:grab}.tools-console-log__footer:after{display:none}.tools-console-log__footer:active{cursor:grabbing}.tools-console-log__clearBtn{min-height:50px;padding-inline:28px;border-color:transparent;border-radius:999px;background:color-mix(in srgb,#05070c 76%,transparent);box-shadow:0 1px color-mix(in srgb,#fff 5%,transparent) inset,0 12px 26px #00000047}.tools-console-log__clearBtn{background:color-mix(in srgb,var(--md-primary) 16%,#05070c);border-color:color-mix(in srgb,var(--md-primary) 42%,transparent)}}@media(prefers-reduced-motion:reduce){.tools-console-log__detailWrap{animation:none;transition:none}.tools-console-log__card.is-expanded .tools-console-log__detailWrap{max-height:none;opacity:1;transform:none}}.drive-layout-setting{display:grid;gap:var(--sp-md);padding:var(--sp-md);border:1px solid color-mix(in srgb,var(--md-outline-var) 48%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont) 88%,transparent)}.drive-layout-setting__header,.drive-layout-control-row{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md)}.drive-layout-setting__header h3{margin:0;color:var(--md-on-surface);font-size:var(--fs-body-sm);line-height:1.25;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-segmented{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:var(--sp-xs);min-width:0}.drive-layout-segmented button{min-height:var(--drive-layout-segment-height);border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800;line-height:1.15;cursor:pointer;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-segmented button{min-width:0;padding:var(--sp-xs) var(--sp-sm)}.drive-layout-segmented--compact button{min-width:48px}.drive-layout-segmented button[aria-pressed=true]{border-color:color-mix(in srgb,var(--md-primary) 58%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary)}.drive-layout-segmented button:focus-visible,.drive-layout-content-selects select:focus-visible{outline:2px solid var(--focus-ring-color);outline-offset:1px}.drive-layout-content-selects{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:var(--sp-sm)}.drive-layout-content-selects label{display:grid;min-width:0;gap:var(--sp-xs)}.drive-layout-content-selects label>span{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-content-selects select{width:100%;min-width:0;min-height:var(--drive-layout-segment-height);padding:0 var(--sp-sm);border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:750}.drive-layout-content-swap{display:grid;align-self:end;width:var(--drive-layout-segment-height);min-width:var(--drive-layout-segment-height);height:var(--drive-layout-segment-height);padding:0;place-items:center;border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface-var);font-size:var(--fs-body-sm);cursor:pointer}.drive-layout-content-swap:focus-visible{outline:2px solid var(--focus-ring-color);outline-offset:1px}.drive-layout-preview{display:grid;grid-template-columns:minmax(0,var(--drive-layout-preview-area-1-size, 1fr)) var(--drive-layout-preview-divider-size) minmax(0,var(--drive-layout-preview-area-2-size, 1fr));width:100%;aspect-ratio:var(--drive-layout-preview-landscape-aspect);overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 62%,transparent);border-radius:var(--r-md);background:var(--md-surface)}.drive-layout-setting[data-orientation=vertical] .drive-layout-preview{justify-self:center;width:min(62%,280px);aspect-ratio:4 / 3;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,var(--drive-layout-preview-area-1-size, 1fr)) var(--drive-layout-preview-divider-size) minmax(0,var(--drive-layout-preview-area-2-size, 1fr))}.drive-layout-setting[data-mode=area_1] .drive-layout-preview,.drive-layout-setting[data-mode=area_2] .drive-layout-preview{grid-template-columns:minmax(0,1fr)}.drive-layout-setting[data-orientation=vertical][data-mode=area_1] .drive-layout-preview,.drive-layout-setting[data-orientation=vertical][data-mode=area_2] .drive-layout-preview{grid-template-rows:minmax(0,1fr)}.drive-layout-setting[data-mode=area_1] .drive-layout-preview__divider,.drive-layout-setting[data-mode=area_2] .drive-layout-preview__divider,.drive-layout-setting[data-mode=area_1] .drive-layout-preview__area[data-area=area_2],.drive-layout-setting[data-mode=area_2] .drive-layout-preview__area[data-area=area_1]{display:none}.drive-layout-preview__area{display:grid;min-width:0;min-height:0;place-content:center;gap:var(--sp-xs);padding:var(--sp-sm);text-align:center}.drive-layout-preview__area[data-area=area_1]{background:var(--drive-layout-area-1-surface)}.drive-layout-preview__area[data-area=area_2]{background:var(--drive-layout-area-2-surface)}.drive-layout-preview__area span{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:700}.drive-layout-preview__area strong{color:var(--md-on-surface);font-size:var(--fs-label-sm);line-height:1.2;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-preview__divider{background:color-mix(in srgb,var(--md-outline-var) 72%,transparent)}.drive-layout-setting__controls{display:grid;gap:var(--sp-sm)}.drive-layout-control-row>span{flex:0 0 auto;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.drive-layout-control-row .drive-layout-segmented{flex:1 1 auto}@media(max-width:640px){.drive-layout-control-row{align-items:stretch;flex-direction:column;gap:var(--sp-xs)}} +.page--tools{--tools-page-height: var(--page-content-height, calc(var(--app-vv-height, 100dvh) - var(--nav-bar-height) - env(safe-area-inset-bottom, 0px)));--tools-motion-standard: cubic-bezier(.4, 0, .2, 1);--tools-motion-decelerate: cubic-bezier(0, 0, .2, 1);--tools-detail-duration: .32s;--tools-console-form-height: 40px;--tools-console-log-font-size: 12px;--tools-console-log-line-height: 1.45;--tools-console-peek-lines: 2;--tools-console-attention-lines: 5;--tools-console-expanded-lines: 9;--tools-console-visible-lines: var(--tools-console-peek-lines);--tools-console-handle-height: 18px;--tools-console-log-pad-top: 10px;--tools-console-log-pad-bottom: 14px;--tools-console-log-height: calc( (var(--tools-console-log-font-size) * var(--tools-console-log-line-height) * var(--tools-console-visible-lines)) + var(--tools-console-handle-height) + var(--tools-console-log-pad-top) + var(--tools-console-log-pad-bottom) );--tools-console-height: var(--tools-console-log-height);--tools-console-inline: var(--sp-lg);--tools-console-bg: #080b10;--tools-console-surface: #0c131b;--tools-console-current: #d9f1ff;--tools-console-history: #7f95a7;--tools-console-divider: color-mix(in srgb, var(--md-outline-var) 24%, transparent);--tools-log-scroll-gap: 6px;--tools-detail-scroll-gap: 8px;--tools-scrollbar-content-gap: 8px;--tools-content-end-gap: max( var(--tools-page-gutter-block), env(safe-area-inset-bottom, 0px) );display:flex;flex-direction:column;position:relative;min-height:var(--tools-page-height);height:var(--tools-page-height);max-height:var(--tools-page-height);box-sizing:border-box;padding-block-start:var(--tools-page-gutter-block);padding-block-end:0;padding-inline:var(--tools-page-gutter-inline);background:var(--tools-console-bg);overflow:visible}.page--tools.tools-log-attention{--tools-console-visible-lines: var(--tools-console-attention-lines)}.page--tools.tools-log-expanded{--tools-console-visible-lines: var(--tools-console-expanded-lines)}#toolsMeta{height:30px;min-height:30px;max-height:30px;display:grid;grid-template-columns:minmax(0,1fr);align-items:center;gap:16px;overflow:visible;line-height:1.2;position:relative;z-index:90}.tools-meta__status{min-width:0;height:100%;display:flex;align-items:center;gap:7px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer;touch-action:none;-webkit-mask-image:none;mask-image:none}.tools-meta__status:focus-visible{outline:2px solid color-mix(in srgb,var(--md-primary) 72%,transparent);outline-offset:2px;border-radius:6px}.tools-meta__statusTrack{display:inline-block;min-width:0;max-width:none;overflow:visible;text-overflow:clip;white-space:nowrap;will-change:transform}.tools-meta__status.is-overflowing .tools-meta__statusTrack{animation:toolsMetaFlow var(--tools-meta-scroll-duration, 3.8s) cubic-bezier(.35,0,.65,1) .2s infinite alternate}@keyframes toolsMetaFlow{0%{transform:translate(0)}to{transform:translate(calc(-1 * var(--tools-meta-scroll-distance, 32px)))}}.tools-meta__info{display:none}.app-dialog--web-settings .app-dialog__sheet{width:min(calc(100vw - 32px),var(--preference-sheet-width));height:min(var(--preference-sheet-height),calc(100dvh - 32px));max-height:min(var(--preference-sheet-height),calc(100dvh - 32px));padding:16px;overflow:hidden}.app-dialog--web-settings .app-dialog__head{margin-bottom:14px}.app-dialog--web-settings .app-dialog__body{flex:1 1 auto;display:flex;min-height:0;max-height:none;white-space:normal;overflow:hidden}.app-dialog--web-settings .app-dialog__actions{margin-top:14px}.web-settings-dialog{display:grid;grid-template-columns:var(--preference-nav-width) minmax(0,1fr);align-items:start;gap:var(--sp-lg);min-width:0;min-height:0;height:100%;max-height:none;width:100%}.web-settings-nav{min-width:0;min-height:0;max-height:100%;display:flex;flex-direction:column;gap:var(--sp-sm);overflow:auto;overscroll-behavior:contain;padding-right:2px}.web-settings-nav__item{appearance:none;-webkit-appearance:none;width:100%;min-height:40px;padding:var(--sp-sm) var(--sp-md);border:1px solid color-mix(in srgb,var(--md-outline-var) 36%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont) 58%,transparent);color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800;line-height:1.2;text-align:left;white-space:normal;word-break:keep-all;overflow-wrap:anywhere;cursor:pointer;transition:background var(--motion-quick) var(--ease-standard),border-color var(--motion-quick) var(--ease-standard),color var(--motion-quick) var(--ease-standard)}.web-settings-nav__item:hover,.web-settings-nav__item:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 38%,var(--md-outline-var));background:color-mix(in srgb,var(--md-on-surface) 5%,var(--md-surface-cont));color:var(--md-on-surface)}.web-settings-nav__item.is-active{border-color:color-mix(in srgb,var(--md-primary) 56%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary);font-weight:850}.web-settings-panels,.web-settings-group{min-width:0;min-height:0}.web-settings-panels{height:100%;max-height:none;overflow:hidden}.web-settings-group{height:100%;max-height:none;display:flex;flex-direction:column}.web-settings-group[hidden]{display:none!important}.web-settings-group__title{margin-bottom:var(--sp-md);padding-bottom:var(--sp-sm);border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);color:var(--md-on-surface);font-size:var(--fs-title-sm);font-weight:800;line-height:1.2;text-align:left;white-space:normal;word-break:keep-all;overflow-wrap:anywhere}.web-settings-group__body,.web-settings-list{display:grid;grid-auto-rows:max-content;gap:var(--sp-sm);align-content:start}.web-settings-group__body{flex:1 1 auto;min-height:0;max-height:none;overflow:auto;overscroll-behavior:contain;padding-right:2px}.web-settings-row,.web-settings-empty{min-height:var(--preference-row-min-height);padding:var(--sp-md) var(--sp-lg);border:1px solid color-mix(in srgb,var(--md-outline-var) 48%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont) 88%,transparent)}.web-settings-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--sp-md)}.web-settings-empty{display:flex;flex-direction:column;justify-content:center}.web-settings-row--toggle{cursor:pointer}.web-settings-row--disabled{cursor:not-allowed;opacity:var(--state-disabled-opacity)}.web-settings-row--select{cursor:default}.web-settings-row__copy{min-width:0;display:flex;flex-direction:column;gap:3px}.web-settings-row__title-line{min-width:0;display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-xs) var(--sp-sm)}.web-settings-row__title{min-width:0;color:var(--md-on-surface);font-size:var(--fs-body-sm);font-weight:800;line-height:1.25;white-space:normal;word-break:keep-all;overflow-wrap:anywhere}.web-settings-row__desc,.web-settings-empty{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);line-height:1.35;white-space:normal;word-break:normal;overflow-wrap:anywhere}.web-settings-select{width:var(--preference-select-width);min-width:var(--preference-select-min-width);min-height:34px;padding:0 34px 0 11px;border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:700;line-height:1.2}.web-upload-settings{display:grid;gap:var(--sp-sm)}.web-settings-row--field{grid-template-columns:minmax(0,1fr) minmax(190px,44%)}.web-settings-text{width:100%;min-width:0;min-height:36px;padding:0 11px;border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface);font-size:var(--fs-label-sm)}.web-upload-settings__actions{display:flex;align-items:center;gap:var(--sp-sm);min-height:40px}.web-upload-settings__status{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);overflow-wrap:anywhere}.app-dialog--tools-qr .app-dialog__sheet{width:min(calc(100vw - 32px),520px);max-height:min(calc(100dvh - 32px),720px);padding:16px;overflow:hidden}.app-dialog--tools-qr .app-dialog__body{min-height:0;white-space:normal;overflow:auto}.tools-qr-backup,.tools-qr-restore{min-width:0;display:grid;gap:14px}.tools-qr-code{display:flex;justify-content:center;padding:12px;border-radius:8px;background:#f8fafc}.tools-qr-code svg{display:block;width:min(100%,300px);height:auto}.tools-qr-stats,.tools-qr-actions,.tools-qr-summary{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.tools-qr-restore .tools-qr-actions{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px;padding:4px;border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:10px;background:color-mix(in srgb,var(--md-surface-cont-h) 70%,#000)}.tools-qr-action-btn{width:100%;min-height:52px;padding-inline:10px;border-radius:8px;border-color:transparent;background:transparent;justify-content:center;font-size:14px;font-weight:850}.tools-qr-action-btn:hover,.tools-qr-action-btn:focus-visible{border-color:color-mix(in srgb,var(--md-primary) 34%,transparent);background:color-mix(in srgb,var(--md-primary) 10%,transparent)}.tools-qr-action-btn--camera.is-disabled,.tools-qr-action-btn--camera:disabled{cursor:not-allowed;opacity:.56;color:color-mix(in srgb,var(--md-on-surface-var) 82%,transparent);background:color-mix(in srgb,var(--md-on-surface) 5%,transparent)}.tools-qr-action-btn--camera.is-disabled:before,.tools-qr-action-btn--camera:disabled:before{content:"X";width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;margin-right:7px;border-radius:50%;border:1px solid currentColor;font-size:11px;font-weight:900;line-height:1}.tools-qr-stats{color:var(--md-on-surface-var);font-size:12px;line-height:1.35}.tools-qr-camera{position:relative;overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:8px;background:#05080d;transition:border-color .16s ease,box-shadow .16s ease}.tools-qr-camera video{display:block;width:100%;min-height:260px;max-height:min(54dvh,420px);aspect-ratio:1 / 1;object-fit:cover}.tools-qr-camera__overlay{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none}.tools-qr-camera__guide{position:relative;width:74%;aspect-ratio:1 / 1;border:1px solid color-mix(in srgb,var(--md-outline-var) 78%,transparent);border-radius:10px;box-shadow:0 0 0 999px #0000006b;transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease}.tools-qr-camera__corner{position:absolute;width:30px;height:30px;color:color-mix(in srgb,var(--md-primary) 82%,#ffffff);border-color:currentColor;transition:color .16s ease,filter .16s ease}.tools-qr-camera__corner--tl{top:-2px;left:-2px;border-top:3px solid;border-left:3px solid;border-top-left-radius:10px}.tools-qr-camera__corner--tr{top:-2px;right:-2px;border-top:3px solid;border-right:3px solid;border-top-right-radius:10px}.tools-qr-camera__corner--bl{bottom:-2px;left:-2px;border-bottom:3px solid;border-left:3px solid;border-bottom-left-radius:10px}.tools-qr-camera__corner--br{right:-2px;bottom:-2px;border-right:3px solid;border-bottom:3px solid;border-bottom-right-radius:10px}.tools-qr-camera[data-scan-state=detected]{border-color:color-mix(in srgb,var(--md-primary) 82%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-primary) 24%,transparent)}.tools-qr-camera[data-scan-state=detected] .tools-qr-camera__guide{border-color:color-mix(in srgb,var(--md-primary) 80%,#ffffff);box-shadow:0 0 0 999px #00000057,0 0 0 2px color-mix(in srgb,var(--md-primary) 28%,transparent)}.tools-qr-camera[data-scan-state=aligned],.tools-qr-camera[data-scan-state=locked]{border-color:color-mix(in srgb,#4fd18b 82%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,#4fd18b 34%,transparent)}.tools-qr-camera[data-scan-state=aligned] .tools-qr-camera__guide,.tools-qr-camera[data-scan-state=locked] .tools-qr-camera__guide{border-color:#4fd18b;box-shadow:0 0 0 999px #00000047,0 0 0 2px color-mix(in srgb,#4fd18b 38%,transparent);transform:scale(1.015)}.tools-qr-camera[data-scan-state=aligned] .tools-qr-camera__corner,.tools-qr-camera[data-scan-state=locked] .tools-qr-camera__corner{color:#4fd18b;filter:drop-shadow(0 0 7px color-mix(in srgb,#4fd18b 68%,transparent))}.tools-qr-camera[data-scan-state=locked] .tools-qr-camera__guide{animation:toolsQrLockPulse .26s ease-out}@keyframes toolsQrLockPulse{0%{transform:scale(1.015)}55%{transform:scale(1.045)}to{transform:scale(1.015)}}.tools-qr-status,.tools-qr-empty,.tools-qr-more{color:var(--md-on-surface-var);font-size:13px;line-height:1.4}.tools-qr-status{min-height:24px;display:flex;align-items:center;color:color-mix(in srgb,var(--md-on-surface) 86%,var(--md-on-surface-var));font-weight:750}.tools-qr-chip{min-height:28px;display:inline-flex;align-items:center;gap:6px;padding:3px 0;border-radius:0;background:transparent;color:var(--md-on-surface-var);font-size:12px;line-height:1.2}.tools-qr-chip strong{color:var(--md-on-surface)}.tools-qr-summary{justify-content:flex-start;gap:14px;padding:2px 0 4px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 28%,transparent)}.tools-qr-diff{min-height:0}.tools-qr-diff__list{max-height:min(36dvh,300px);overflow:auto;display:grid;gap:0;margin-top:2px;padding-right:4px;overscroll-behavior:contain}.tools-qr-diff__row{min-width:0;display:grid;gap:8px;padding:12px 0 14px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 30%,transparent)}.tools-qr-diff__row:first-child{padding-top:4px}.tools-qr-diff__head{min-width:0;display:flex;align-items:baseline;justify-content:space-between;gap:10px}.tools-qr-diff__key{min-width:0;overflow:hidden;color:var(--md-on-surface);font-size:13px;font-weight:800;line-height:1.3;text-overflow:ellipsis;white-space:nowrap}.tools-qr-diff__status{flex:0 0 auto;padding:2px 0;border-radius:999px;background:transparent;color:color-mix(in srgb,#8fdc9b 82%,var(--md-on-surface));font-size:11px;font-weight:800;line-height:1.1}.tools-qr-diff__compare{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) 20px minmax(0,1fr);align-items:start;gap:10px}.tools-qr-diff__value{min-width:0;display:grid;align-content:start;gap:4px;padding:0;border:0;background:transparent}.tools-qr-diff__value span{min-width:0;color:var(--md-on-surface-var);font-size:12px;font-weight:800;line-height:1.2}.tools-qr-diff__value code{min-width:0;overflow-wrap:anywhere;color:var(--md-on-surface);font-family:var(--font-mono);font-size:14px;line-height:1.4;white-space:pre-wrap}.tools-qr-diff__value--old{color:color-mix(in srgb,#ff8a80 74%,var(--md-on-surface))}.tools-qr-diff__value--new{color:color-mix(in srgb,#8fdc9b 78%,var(--md-on-surface))}.tools-qr-diff__value--old code{color:color-mix(in srgb,#ff8a80 76%,var(--md-on-surface))}.tools-qr-diff__value--new code{color:color-mix(in srgb,#8fdc9b 82%,var(--md-on-surface))}.tools-qr-diff__arrow{width:20px;min-width:20px;display:flex;align-items:center;justify-content:center;color:var(--md-on-surface-var);font-size:15px;font-weight:900}@media(max-width:640px),(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.app-dialog--web-settings .app-dialog__sheet{--preference-sheet-width: 420px;--preference-sheet-height: clamp(440px, 72dvh, 560px);--preference-row-min-height: 64px;--preference-select-width: min(132px, 40vw);--preference-select-min-width: 104px;width:min(calc(100vw - 24px),var(--preference-sheet-width));height:min(var(--preference-sheet-height),calc(100dvh - 24px));max-height:min(var(--preference-sheet-height),calc(100dvh - 24px));padding:14px}.web-settings-dialog{grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr);align-content:start;gap:12px;height:100%;width:100%}.web-settings-nav{flex-direction:row;gap:8px;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-width:none;-webkit-overflow-scrolling:touch;touch-action:pan-x;padding-bottom:2px;padding-right:0}.web-settings-nav::-webkit-scrollbar{display:none;width:0;height:0}.web-settings-nav__item{width:auto;min-width:76px;flex:0 0 auto;text-align:center}.web-settings-row{grid-template-columns:minmax(0,1fr) auto;gap:10px}.app-dialog--tools-qr .app-dialog__sheet{width:min(calc(100vw - 24px),440px);max-height:min(calc(100dvh - 24px),680px);padding:14px}.tools-qr-code svg{width:min(100%,276px)}.tools-qr-camera video{min-height:270px;max-height:min(52dvh,390px)}.tools-qr-diff__row{padding:12px 0 14px}.tools-qr-diff__compare{grid-template-columns:minmax(0,1fr) 18px minmax(0,1fr);gap:8px}.tools-qr-diff__value code{font-size:13px}}@media(max-height:430px)and (min-aspect-ratio:13/10){.app-dialog--web-settings .app-dialog__sheet{--preference-sheet-height: calc(100dvh - 20px) ;--preference-row-min-height: 56px;height:var(--preference-sheet-height);max-height:calc(100dvh - 20px);padding:12px 14px}.app-dialog--web-settings .app-dialog__head{margin-bottom:10px}.app-dialog--web-settings .app-dialog__actions{margin-top:10px}.web-settings-row,.web-settings-empty{padding-block:10px}}@media(max-width:420px){.web-settings-row--select,.web-settings-row--field{grid-template-columns:minmax(0,1fr);align-items:stretch}.web-settings-select,.web-settings-text{width:100%;min-width:0}}.tools-scroll-stack{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:2px var(--tools-scrollbar-content-gap) var(--tools-content-end-gap) 0;scroll-padding-bottom:var(--tools-content-end-gap)}.tools-primary-actions{margin-bottom:16px}.tools-group__toggle{width:100%;min-height:34px;display:inline-flex;align-items:center;justify-content:space-between;gap:10px;padding:0 2px;border:0;background:transparent;text-align:left;color:inherit;cursor:pointer}.tools-group__title{margin-bottom:0}.tools-group__chevron{width:9px;height:9px;flex:0 0 auto;border-right:2px solid color-mix(in srgb,var(--md-primary) 88%,#fff);border-bottom:2px solid color-mix(in srgb,var(--md-primary) 88%,#fff);transform:rotate(45deg) translateY(-1px);transition:transform .18s ease,opacity .18s ease;opacity:.82}.tools-group.is-open .tools-group__chevron{transform:rotate(225deg) translateY(-1px)}.tools-group__body{margin-top:8px;display:grid;grid-template-rows:1fr;overflow:hidden;will-change:grid-template-rows,opacity}.tools-group:not(.is-open)>.tools-group__body{grid-template-rows:0fr;margin-top:0;opacity:0;pointer-events:none}.tools-group.is-collapsing>.tools-group__body{animation:tools-group-fold var(--motion-medium) var(--ease-emphasized) both}.tools-group.is-expanding>.tools-group__body{animation:tools-group-fold var(--motion-medium) var(--ease-emphasized) reverse both}.tools-group__bodyInner{min-height:0;overflow:hidden}@keyframes tools-group-fold{0%{grid-template-rows:1fr;margin-top:8px;opacity:1}to{grid-template-rows:0fr;margin-top:0;opacity:0}}@media(prefers-reduced-motion:reduce){.tools-group.is-collapsing>.tools-group__body,.tools-group.is-expanding>.tools-group__body{animation:none}}.page--tools .section.tools-group{margin-bottom:0}.page--tools .divider{margin:16px 0 14px;border-top-color:color-mix(in srgb,var(--md-outline-var) 44%,transparent)}.tools-progress{position:relative;width:100%;height:4px;margin:0 0 var(--sp-md);border-radius:999px;background:color-mix(in srgb,var(--md-stroke-soft) 26%,transparent);overflow:hidden}.tools-progress[hidden]{display:block;visibility:visible}.tools-progress__bar{width:0%;height:100%;border-radius:inherit;background:linear-gradient(90deg,color-mix(in srgb,var(--md-primary) 58%,transparent),var(--md-primary));transition:width .18s ease,transform .22s ease,opacity .18s ease}.tools-progress.is-indeterminate .tools-progress__bar{width:34%;animation:tools-progress-sweep 1.1s linear infinite}@keyframes tools-progress-sweep{0%{transform:translate(-120%)}to{transform:translate(320%)}}.tools-console-dock{position:absolute;left:var(--tools-page-gutter-inline);right:var(--tools-page-gutter-inline);top:calc(var(--tools-page-gutter-block) + 38px);bottom:auto;width:auto;margin:0;padding:0;z-index:120;flex:none;background:transparent;border-top:0;overflow:visible;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;opacity:0;pointer-events:none;transform:translateY(-14px) scale(.985);transform-origin:top center;transition:opacity .19s ease,transform .23s cubic-bezier(.2,0,0,1)}.page--tools.tools-log-expanded .tools-console-dock{opacity:1;pointer-events:auto;transform:translateY(0) scale(1)}.page--tools.tools-log-attention .tools-meta__status{color:var(--md-primary)}.page--tools.page-transitioning .tools-console-shell,.page--tools.page-transitioning .tools-console-log{transition:none;animation:none}.tools-console-dock:before,.tools-console-dock:after{display:none}.tools-console-shell{display:flex;flex-direction:column;height:auto;min-height:0;max-height:none;padding:0;border:1px solid color-mix(in srgb,var(--md-outline-var) 46%,transparent);border-radius:18px;background:color-mix(in srgb,var(--md-surface-cont) 92%,#05080d);-webkit-backdrop-filter:none;backdrop-filter:none;overflow:hidden;box-shadow:0 1px color-mix(in srgb,#fff 5%,transparent) inset,0 14px 34px #00000061;transition:max-height .22s cubic-bezier(.2,0,0,1)}.tools-console-meta{display:none}.tools-console-form{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:var(--sp-sm);align-items:center;margin:0;height:var(--tools-console-form-height);min-height:var(--tools-console-form-height);padding:8px var(--tools-console-inline);border-bottom:1px solid var(--tools-console-divider);background:var(--tools-console-bg);box-sizing:border-box;padding-block:var(--tools-page-gutter-block);padding-inline:var(--tools-page-gutter-inline)}.page--tools .tools-console-form,.page--tools .tools-console-help{display:none!important}.tools-console-prompt{color:var(--md-primary);font-family:var(--font-mono);font-size:var(--fs-body-sm);font-weight:700;line-height:1;letter-spacing:0}.tools-console-form .input-text{min-width:0;padding:0;border:0;border-radius:0;background:transparent;color:var(--md-on-surface);box-shadow:none;outline:none;font-size:var(--fs-body-sm);line-height:1.25}.tools-console-form .input-text::placeholder{color:var(--md-outline)}.tools-console-form .input-text:focus{border-color:transparent}.tools-console-iconBtn{min-width:34px;width:34px;height:auto;align-self:stretch;margin-block:-8px;padding:0;border:0;border-left:1px solid var(--tools-console-divider);border-radius:0;background:transparent;color:var(--md-outline);font-family:var(--font-mono);font-size:13px;font-weight:700;line-height:1;box-shadow:none;display:inline-flex;align-items:center;justify-content:center}.tools-console-iconBtn[aria-expanded=true]{color:var(--md-primary)}.tools-console-iconBtn__svg{width:16px;height:16px;display:block;transform:translate(-.5px,-.5px)}.tools-console-help{padding:8px var(--tools-console-inline);border-bottom:1px solid var(--tools-console-divider);color:var(--md-on-surface-var);font-size:12px;line-height:1.35;background:var(--tools-console-bg);box-sizing:border-box;padding-block:var(--tools-page-gutter-block);padding-inline:var(--tools-page-gutter-inline)}.tools-console-log{display:block;flex:none;height:auto;min-height:62px;max-height:min(38dvh,260px);margin:0;padding:10px;border:0;border-radius:0;background:transparent;color:var(--md-on-surface);font-family:inherit;font-size:13px;line-height:1.35;white-space:normal;word-break:break-word;overflow:auto;box-sizing:border-box;box-shadow:none;cursor:default;transition:max-height .24s cubic-bezier(.2,0,0,1),color .18s ease,background .18s ease}.tools-console-log:focus-visible{outline:2px solid color-mix(in srgb,var(--md-primary) 72%,transparent);outline-offset:-3px}.page--tools.tools-log-attention .tools-console-log,.page--tools.tools-log-expanded .tools-console-log{background:transparent;color:color-mix(in srgb,var(--md-on-surface) 92%,var(--md-on-surface-var))}@media(prefers-reduced-motion:reduce){.tools-meta__status.is-overflowing .tools-meta__statusTrack,.tools-console-shell,.tools-console-log{animation:none;transition:none}}.page--tools.tools-log-expanded .tools-console-log{max-height:min(58dvh,460px)}.tools-console-log__header{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 2px 8px;color:var(--md-on-surface);font-family:inherit;font-size:13px;font-weight:800;line-height:1.2;white-space:nowrap}.tools-console-log__headerTitle{min-width:0;overflow:hidden;text-overflow:ellipsis}.tools-console-log__headerActions{flex:0 0 auto;display:flex;align-items:center}.tools-console-log__body{display:block;min-height:0;box-sizing:border-box}.tools-console-log__history,.tools-console-log__current{display:block;white-space:pre-wrap}.tools-console-log__card{position:relative;display:block;appearance:none;-webkit-appearance:none;width:100%;min-height:58px;margin:0;padding:14px 4px 14px 8px;border:0;border-radius:0;background:transparent;color:inherit;box-shadow:none;font:inherit;text-align:left;cursor:pointer;transition:background var(--motion-base) var(--ease-standard),box-shadow var(--motion-base) var(--ease-standard),opacity var(--motion-base) var(--ease-standard)}.tools-console-log__card+.tools-console-log__card{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.tools-console-log__card:after{display:none}@media(hover:hover){.tools-console-log__card:hover{background:color-mix(in srgb,var(--md-on-surface) var(--state-hover-pct),transparent)}}.tools-console-log__card:active{transform:none}.tools-console-log__card:focus-visible{outline:2px solid color-mix(in srgb,var(--md-primary) 72%,transparent);outline-offset:2px}.tools-console-log__body>.tools-console-log__card:last-child{margin-bottom:0}.tools-console-log__card.is-expanded{background:color-mix(in srgb,var(--md-primary) 6%,transparent)}.tools-console-log__card.is-unread-update .tools-console-log__cardTitle:before{content:"";display:inline-block;width:8px;height:8px;margin-right:8px;border-radius:999px;background:var(--md-primary);vertical-align:middle;transform:translateY(-1px);transition:opacity var(--motion-base) var(--ease-emphasized)}.tools-console-log__card.is-update-read .tools-console-log__cardTitle:before{opacity:0}.tools-console-log__card.is-git-update .tools-console-log__cardBody{white-space:pre-wrap}.tools-console-log__card.is-collapsing{pointer-events:none}.tools-console-log__cardHead{display:flex;align-items:baseline;justify-content:space-between;gap:10px;min-width:0;margin:0 0 4px}.tools-console-log__cardTitle{display:block;min-width:0;margin:0;color:var(--md-on-surface);font-family:inherit;font-size:13px;font-weight:800;line-height:1.25;white-space:normal}.tools-console-log__cardTime{flex:0 0 auto;max-width:42%;overflow:hidden;color:color-mix(in srgb,var(--md-primary) 58%,var(--md-on-surface-var));font-family:inherit;font-size:11px;font-weight:700;line-height:1.2;text-overflow:ellipsis;white-space:nowrap}.tools-console-log__cardBody{display:block;color:inherit;font-family:var(--font-mono);font-size:12px;line-height:1.45;white-space:pre-wrap}.tools-console-log__cardBody--update{display:flex;flex-direction:column;gap:7px;font-family:inherit;white-space:normal}.tools-console-log__updateLabel{display:block;color:var(--md-on-surface);font-size:13px;font-weight:900;line-height:1.2}.tools-console-log__updateMessages{display:grid;gap:3px;min-width:0}.tools-console-log__updateMessage{display:block;min-width:0;overflow:hidden;color:color-mix(in srgb,var(--md-on-surface) 90%,var(--md-primary));font-size:12px;font-weight:760;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.tools-console-log__updateStats{display:flex;flex-wrap:wrap;gap:6px;min-width:0;margin-top:2px}.tools-console-log__updateStat{display:inline-flex;align-items:center;min-height:28px;padding:0 10px;border:1px solid color-mix(in srgb,var(--md-outline-var) 32%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-on-surface) 6%,transparent);color:color-mix(in srgb,var(--md-on-surface) 88%,var(--md-on-surface-var));font-family:var(--font-mono);font-size:12px;font-weight:700;line-height:1;white-space:nowrap}.tools-console-log__updateStat--add{border-color:color-mix(in srgb,#46d17f 36%,transparent);background:color-mix(in srgb,#46d17f 13%,transparent);color:color-mix(in srgb,#68e49a 84%,var(--md-on-surface))}.tools-console-log__updateStat--delete{border-color:color-mix(in srgb,#ff7373 34%,transparent);background:color-mix(in srgb,#ff7373 12%,transparent);color:color-mix(in srgb,#ff8a8a 82%,var(--md-on-surface))}.tools-console-log__detailWrap{display:block;max-height:0;overflow:hidden;opacity:0;transform:translateY(-6px);transition:max-height var(--tools-detail-duration) var(--tools-motion-decelerate),opacity calc(var(--tools-detail-duration) * .78) var(--tools-motion-decelerate),transform var(--tools-detail-duration) var(--tools-motion-decelerate)}.tools-console-log__card.is-expanded .tools-console-log__detailWrap{max-height:var(--tools-detail-height, min(42dvh, 360px));opacity:1;transform:translateY(0);animation:tools-detail-open var(--tools-detail-duration) var(--tools-motion-decelerate) both}.tools-console-log__detailInner{display:block;min-height:0;overflow:hidden}@keyframes tools-detail-open{0%{max-height:0;opacity:0;transform:translateY(-6px)}to{max-height:var(--tools-detail-height, min(42dvh, 360px));opacity:1;transform:translateY(0)}}.tools-console-log__detailTitle{display:block;margin:12px 0 6px;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--md-outline-var) 22%,transparent);color:color-mix(in srgb,var(--md-on-surface-var) 86%,var(--md-on-surface));font-size:11px;font-weight:700;letter-spacing:.02em;line-height:1.2;text-transform:uppercase}.tools-console-log__detail{display:block;box-sizing:border-box;width:100%;max-height:min(40dvh,320px);overflow:auto;overflow-anchor:none;scrollbar-width:thin;padding:2px 14px 4px 6px;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface-var) 92%,var(--md-on-surface));font-family:var(--font-mono);font-size:12px;line-height:1.5;white-space:pre-wrap}.tools-console-log__empty{display:block;margin:12px 0;padding:14px 4px;border:0;border-radius:0;background:transparent;color:var(--md-on-surface-var);font-size:13px;line-height:1.35;text-align:center;opacity:.82}.tools-console-log__footer{display:flex;align-items:center;justify-content:flex-end;gap:10px;margin-top:12px}.tools-console-log__clearBtn{appearance:none;-webkit-appearance:none;min-height:38px;padding:0 16px;border:1px solid color-mix(in srgb,var(--md-outline-var) 42%,transparent);border-radius:999px;background:color-mix(in srgb,var(--md-surface-cont-h) 74%,#05080d);color:var(--md-on-surface);font:inherit;font-size:13px;font-weight:800;cursor:pointer}.tools-console-log__clearBtn{border-color:color-mix(in srgb,var(--md-primary) 58%,transparent);background:linear-gradient(180deg,color-mix(in srgb,var(--md-primary) 22%,var(--md-surface-cont-hh)),color-mix(in srgb,var(--md-primary) 14%,var(--md-surface-cont-h)));color:var(--md-on-surface)}.tools-console-log__clearBtn:disabled{cursor:default;opacity:.42}.tools-console-log__history{color:color-mix(in srgb,var(--tools-console-history) 86%,var(--md-on-surface-var));opacity:.92}.tools-console-log__current{border-color:color-mix(in srgb,var(--md-primary) 52%,var(--md-outline-var));background:linear-gradient(180deg,color-mix(in srgb,var(--md-primary) 18%,var(--md-surface-cont-h)),color-mix(in srgb,var(--md-primary) 12%,var(--md-surface-cont)));color:var(--tools-console-current)}.tools-console-log.is-clearing .tools-console-log__card{opacity:0;transform:translateY(-8px) scale(.985)}@media(min-aspect-ratio:13/10),(horizontal-viewport-segments:2),(vertical-viewport-segments:2),(min-width:640px)and (min-height:650px){.page--tools{--tools-detail-duration: .34s;--tools-log-scroll-gap: 10px;--tools-detail-scroll-gap: 12px;--tools-console-form-height: 40px;--tools-console-log-font-size: 14px;--tools-console-log-line-height: 1.55;--tools-console-log-pad-top: 14px;--tools-console-log-pad-bottom: 14px;--tools-console-inline: 16px;display:grid;grid-template-columns:minmax(0,1fr) clamp(340px,32vw,460px);grid-template-rows:auto auto minmax(0,1fr);column-gap:20px;align-items:stretch;height:var(--tools-page-height);min-height:0;max-height:var(--tools-page-height);background:var(--tools-console-bg);overflow:hidden}.page--tools>.page-header--hidden{display:none!important}.page--tools>#toolsMeta{grid-column:1;grid-row:1;align-self:start;height:32px;min-height:32px;max-height:32px;font-size:13px;font-weight:600}.page--tools>#toolsProgress{grid-column:1;grid-row:2;margin-bottom:8px}.page--tools>.tools-scroll-stack{grid-column:1;grid-row:3;min-height:0;overflow-y:auto;padding-bottom:var(--tools-content-end-gap);scroll-padding-bottom:var(--tools-content-end-gap)}.page--tools>.tools-console-dock{position:relative;inset:auto;grid-column:2;grid-row:1 / span 3;width:auto;min-height:0;max-height:calc(100% - var(--tools-page-gutter-block));margin-bottom:var(--tools-page-gutter-block);padding:0;display:flex;align-self:stretch;opacity:1;pointer-events:auto;transform:none}.page--tools>.tools-console-dock:before,.page--tools>.tools-console-dock:after{display:none}.page--tools>.tools-console-dock .tools-console-shell{flex:1 1 auto;height:100%;min-height:0;max-height:100%;border:1px solid color-mix(in srgb,var(--md-outline-var) 34%,transparent);border-radius:16px;background:color-mix(in srgb,var(--md-surface-cont) 88%,#060a10);box-shadow:0 1px color-mix(in srgb,#fff 4%,transparent) inset,0 10px 28px #00000038}.page--tools>.tools-console-dock .tools-console-log{flex:1 1 auto;display:flex;flex-direction:column;height:auto;min-height:0;max-height:none;padding:14px 12px 12px;overflow:hidden}.page--tools>.tools-console-dock .tools-console-log__header{flex:0 0 auto;margin:0 0 8px;padding:0 4px 10px 8px;border-bottom:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent)}.page--tools>.tools-console-dock .tools-console-log__body{flex:1 1 auto;min-height:0;overflow:auto;overflow-anchor:none;overscroll-behavior:contain;padding:0 0 16px;scroll-padding-bottom:20px;scrollbar-gutter:stable;scrollbar-width:thin}.page--tools>.tools-console-dock .tools-console-log__card{margin:0;padding:13px 4px 13px 8px;border:0;border-radius:0;background:transparent;box-shadow:none;transition:background var(--motion-base) var(--ease-standard),box-shadow var(--motion-base) var(--ease-standard),color var(--motion-base) var(--ease-standard),opacity var(--motion-base) var(--ease-standard)}.page--tools>.tools-console-dock .tools-console-log__card+.tools-console-log__card{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.page--tools>.tools-console-dock .tools-console-log__card:hover{background:color-mix(in srgb,var(--md-on-surface) var(--state-hover-pct),transparent)}.page--tools>.tools-console-dock .tools-console-log__card.is-expanded{background:color-mix(in srgb,var(--md-primary) 6%,transparent);color:color-mix(in srgb,var(--md-on-surface) 94%,var(--tools-console-current))}.page--tools>.tools-console-dock .tools-console-log__cardHead{margin-bottom:3px}.page--tools>.tools-console-dock .tools-console-log__cardTitle{font-size:13px;font-weight:800}.page--tools>.tools-console-dock .tools-console-log__cardTime{color:color-mix(in srgb,var(--md-primary) 62%,var(--md-on-surface-var))}.page--tools>.tools-console-dock .tools-console-log__cardBody{color:color-mix(in srgb,var(--md-on-surface-var) 86%,var(--md-on-surface));font-family:inherit;font-size:12px;line-height:1.35;white-space:normal}.page--tools>.tools-console-dock .tools-console-log__cardBody--update{display:flex;flex-direction:column;gap:7px}.page--tools>.tools-console-dock .tools-console-log__card.is-git-update .tools-console-log__cardBody{line-height:1.42;white-space:pre-wrap}.page--tools>.tools-console-dock .tools-console-log__card.is-git-update .tools-console-log__cardBody--update{-webkit-line-clamp:unset;white-space:normal}.page--tools>.tools-console-dock .tools-console-log__detail{width:100%;max-height:min(32dvh,240px);overflow:auto;overflow-anchor:none;scrollbar-width:thin;padding:2px 12px 4px 4px;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface) 86%,var(--tools-console-current));font-size:12px;line-height:1.48}.page--tools>.tools-console-dock .tools-console-log__empty{margin:6px 0 0;padding:18px 4px;border:0;border-radius:0;background:transparent;text-align:center}.page--tools>.tools-console-dock .tools-console-log__clearBtn{min-height:26px;padding-inline:10px;border-radius:999px;background:transparent;font-size:11px;box-shadow:none}.page--tools .section{margin-bottom:20px}.page--tools .btn,.page--tools .smallBtn{min-height:44px;padding:10px 16px;font-size:14px;font-weight:600}.page--tools .section h4{font-size:calc(var(--fs-title-xs) * 1.16);font-weight:800}.tools-console-form{gap:6px;padding:6px var(--tools-console-inline)}.tools-console-prompt{font-size:17px;font-weight:800}.tools-console-iconBtn{min-width:32px;width:32px;margin-block:-6px}.tools-console-log{padding-right:max(var(--tools-console-inline),14px)}.tools-console-log__history,.tools-console-log__current{font-size:14px;line-height:1.55}}@media(not (min-aspect-ratio:13/10))and (max-width:639px),(not (min-aspect-ratio:13/10))and (max-height:649px){.page--tools{--tools-detail-duration: .36s;--tools-log-scroll-gap: 6px;--tools-detail-scroll-gap: 10px}.page--tools>#toolsMeta{height:32px;min-height:32px;max-height:32px;margin-bottom:8px;overflow:visible;align-items:center;line-height:1.2}.page--tools>#toolsProgress{margin-bottom:10px}.page--tools>.tools-console-dock{position:fixed;inset:0;padding:calc(env(safe-area-inset-top,0px) + 12px) var(--tools-page-gutter-inline) max(var(--tools-page-gutter-block),10px);z-index:2200;background:radial-gradient(circle at 50% 16%,color-mix(in srgb,var(--md-primary) 8%,transparent),transparent 34%),linear-gradient(180deg,color-mix(in srgb,#03060a 68%,transparent),color-mix(in srgb,var(--tools-console-bg) 74%,#020408));border-top:1px solid color-mix(in srgb,var(--md-outline-var) 24%,transparent);overflow:hidden;box-shadow:0 -1px color-mix(in srgb,#fff 4%,transparent) inset,0 -14px 34px #00000038 inset;-webkit-backdrop-filter:blur(8px) saturate(1.02);backdrop-filter:blur(8px) saturate(1.02);opacity:1;pointer-events:none;touch-action:none;transform:translateY(-100%);transition:transform .25s cubic-bezier(.2,0,0,1)}.page--tools.tools-log-expanded>.tools-console-dock.tools-notifications--portrait{pointer-events:auto;transform:translateY(0)}.page--tools>.tools-console-dock.tools-notifications--portrait.is-dragging{pointer-events:auto;transition:none;transform:translateY(calc(-100% + var(--tools-notification-drag-y, 0px)))}.page--tools.tools-log-expanded>.tools-console-dock.tools-notifications--portrait.is-dragging{transform:translateY(var(--tools-notification-drag-y, 0px))}.page--tools>.tools-console-dock.tools-notifications--portrait:after{content:"";display:block;position:absolute;left:50%;bottom:max(14px,calc(env(safe-area-inset-bottom,0px) + 6px));width:58px;height:5px;border-radius:999px;background:color-mix(in srgb,var(--md-on-surface) 42%,transparent);box-shadow:0 0 0 1px color-mix(in srgb,#fff 8%,transparent) inset,0 6px 18px #00000047;opacity:.74;transform:translate(-50%);pointer-events:none;z-index:3}.page--tools>.tools-console-dock .tools-console-shell{height:100%;border:0;border-radius:0;background:transparent;box-shadow:none;overflow:hidden}.page--tools>.tools-console-dock .tools-console-log{display:flex;flex-direction:column;height:100%;min-height:0;max-height:none;padding:clamp(22px,7dvh,58px) var(--tools-log-scroll-gap) 0;overflow:auto;overflow-anchor:none;overscroll-behavior:contain;touch-action:pan-y;-webkit-user-select:none;user-select:none;scroll-padding-top:clamp(22px,7dvh,58px);scroll-padding-bottom:132px}.page--tools>.tools-console-dock .tools-console-log__body{flex:0 0 auto;min-height:0;overflow:visible;padding-bottom:0}.page--tools>.tools-console-dock .tools-console-log__detail{-webkit-user-select:text;user-select:text}.tools-console-log__header{margin:0 4px 12px;font-size:15px;font-weight:900}.tools-console-log__card{min-height:62px;margin:0;padding:15px 6px 15px 10px;border:0;border-radius:0;background:transparent;box-shadow:none}.tools-console-log__card+.tools-console-log__card{border-top:1px solid color-mix(in srgb,var(--md-outline-var) 18%,transparent)}.tools-console-log__card.is-expanded{background:color-mix(in srgb,var(--md-primary) 6%,transparent);color:color-mix(in srgb,var(--md-on-surface) 94%,var(--tools-console-current))}.tools-console-log__detailWrap{transform:translateY(-8px)}.tools-console-log__card.is-expanded .tools-console-log__detailWrap{animation-duration:var(--tools-detail-duration)}.tools-console-log__cardTitle{font-size:14px}.tools-console-log__cardBody{display:-webkit-box;overflow:hidden;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12px}.tools-console-log__cardBody--update{display:flex;flex-direction:column;gap:7px;overflow:visible;-webkit-line-clamp:unset}.tools-console-log__card.is-git-update .tools-console-log__cardBody{line-height:1.42;-webkit-line-clamp:3;white-space:pre-wrap}.tools-console-log__card.is-git-update .tools-console-log__cardBody--update{-webkit-line-clamp:unset;white-space:normal}.tools-console-log__card.is-expanded .tools-console-log__cardBody{display:block;overflow:visible;-webkit-line-clamp:unset}.tools-console-log__card.is-expanded .tools-console-log__cardBody--update{display:flex}.tools-console-log__detail{width:100%;max-height:min(44dvh,360px);overflow:auto;overflow-anchor:none;scrollbar-width:thin;padding:2px 14px 4px 6px;border:0;border-radius:0;background:transparent;color:color-mix(in srgb,var(--md-on-surface) 86%,var(--tools-console-current))}.tools-console-log__empty{margin:12px 0;padding:18px 4px;border:0;border-radius:0;background:transparent;text-align:center}.tools-console-log__footer{position:relative;bottom:auto;flex:0 0 auto;margin-top:auto;min-height:104px;padding:18px 6px max(32px,calc(env(safe-area-inset-bottom,0px) + 10px));align-items:flex-start;justify-content:flex-end;background:linear-gradient(180deg,transparent,color-mix(in srgb,var(--tools-console-bg) 24%,transparent) 60%,color-mix(in srgb,#020408 46%,transparent));touch-action:none;cursor:grab}.tools-console-log__footer:after{display:none}.tools-console-log__footer:active{cursor:grabbing}.tools-console-log__clearBtn{min-height:50px;padding-inline:28px;border-color:transparent;border-radius:999px;background:color-mix(in srgb,#05070c 76%,transparent);box-shadow:0 1px color-mix(in srgb,#fff 5%,transparent) inset,0 12px 26px #00000047}.tools-console-log__clearBtn{background:color-mix(in srgb,var(--md-primary) 16%,#05070c);border-color:color-mix(in srgb,var(--md-primary) 42%,transparent)}}@media(prefers-reduced-motion:reduce){.tools-console-log__detailWrap{animation:none;transition:none}.tools-console-log__card.is-expanded .tools-console-log__detailWrap{max-height:none;opacity:1;transform:none}}.drive-layout-setting{display:grid;gap:var(--sp-md);padding:var(--sp-md);border:1px solid color-mix(in srgb,var(--md-outline-var) 48%,transparent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--md-surface-cont) 88%,transparent)}.drive-layout-setting__header,.drive-layout-control-row{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-md)}.drive-layout-setting__header h3{margin:0;color:var(--md-on-surface);font-size:var(--fs-body-sm);line-height:1.25;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-segmented{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(0,1fr);gap:var(--sp-xs);min-width:0}.drive-layout-segmented button{min-height:var(--drive-layout-segment-height);border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800;line-height:1.15;cursor:pointer;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-segmented button{min-width:0;padding:var(--sp-xs) var(--sp-sm)}.drive-layout-segmented--compact button{min-width:48px}.drive-layout-segmented button[aria-pressed=true]{border-color:color-mix(in srgb,var(--md-primary) 58%,var(--md-outline-var));background:var(--md-primary-state);color:var(--md-primary)}.drive-layout-segmented button:focus-visible,.drive-layout-content-selects select:focus-visible{outline:2px solid var(--focus-ring-color);outline-offset:1px}.drive-layout-content-selects{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:var(--sp-sm)}.drive-layout-content-selects label{display:grid;min-width:0;gap:var(--sp-xs)}.drive-layout-content-selects label>span{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-content-selects select{width:100%;min-width:0;min-height:var(--drive-layout-segment-height);padding:0 var(--sp-sm);border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface);font-size:var(--fs-label-sm);font-weight:750}.drive-layout-content-swap{display:grid;align-self:end;width:var(--drive-layout-segment-height);min-width:var(--drive-layout-segment-height);height:var(--drive-layout-segment-height);padding:0;place-items:center;border:1px solid color-mix(in srgb,var(--md-outline-var) 68%,transparent);border-radius:var(--control-radius);background:color-mix(in srgb,var(--md-surface-cont-h) 84%,transparent);color:var(--md-on-surface-var);font-size:var(--fs-body-sm);cursor:pointer}.drive-layout-content-swap:focus-visible{outline:2px solid var(--focus-ring-color);outline-offset:1px}.drive-layout-preview{display:grid;grid-template-columns:minmax(0,var(--drive-layout-preview-area-1-size, 1fr)) var(--drive-layout-preview-divider-size) minmax(0,var(--drive-layout-preview-area-2-size, 1fr));width:100%;aspect-ratio:var(--drive-layout-preview-landscape-aspect);overflow:hidden;border:1px solid color-mix(in srgb,var(--md-outline-var) 62%,transparent);border-radius:var(--r-md);background:var(--md-surface)}.drive-layout-setting[data-orientation=vertical] .drive-layout-preview{justify-self:center;width:min(62%,280px);aspect-ratio:4 / 3;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,var(--drive-layout-preview-area-1-size, 1fr)) var(--drive-layout-preview-divider-size) minmax(0,var(--drive-layout-preview-area-2-size, 1fr))}.drive-layout-setting[data-mode=area_1] .drive-layout-preview,.drive-layout-setting[data-mode=area_2] .drive-layout-preview{grid-template-columns:minmax(0,1fr)}.drive-layout-setting[data-orientation=vertical][data-mode=area_1] .drive-layout-preview,.drive-layout-setting[data-orientation=vertical][data-mode=area_2] .drive-layout-preview{grid-template-rows:minmax(0,1fr)}.drive-layout-setting[data-mode=area_1] .drive-layout-preview__divider,.drive-layout-setting[data-mode=area_2] .drive-layout-preview__divider,.drive-layout-setting[data-mode=area_1] .drive-layout-preview__area[data-area=area_2],.drive-layout-setting[data-mode=area_2] .drive-layout-preview__area[data-area=area_1]{display:none}.drive-layout-preview__area{display:grid;min-width:0;min-height:0;place-content:center;gap:var(--sp-xs);padding:var(--sp-sm);text-align:center}.drive-layout-preview__area[data-area=area_1]{background:var(--drive-layout-area-1-surface)}.drive-layout-preview__area[data-area=area_2]{background:var(--drive-layout-area-2-surface)}.drive-layout-preview__area span{color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:700}.drive-layout-preview__area strong{color:var(--md-on-surface);font-size:var(--fs-label-sm);line-height:1.2;overflow-wrap:anywhere;word-break:keep-all}.drive-layout-preview__divider{background:color-mix(in srgb,var(--md-outline-var) 72%,transparent)}.drive-layout-setting__controls{display:grid;gap:var(--sp-sm)}.drive-layout-control-row>span{flex:0 0 auto;color:var(--md-on-surface-var);font-size:var(--fs-label-sm);font-weight:800}.drive-layout-control-row .drive-layout-segmented{flex:1 1 auto}@media(max-width:640px){.drive-layout-control-row{align-items:stretch;flex-direction:column;gap:var(--sp-xs)}} diff --git a/openpilot/selfdrive/carrot/web/generated/asset-manifest.json b/openpilot/selfdrive/carrot/web/generated/asset-manifest.json index e20a662720..bb695c10d9 100644 --- a/openpilot/selfdrive/carrot/web/generated/asset-manifest.json +++ b/openpilot/selfdrive/carrot/web/generated/asset-manifest.json @@ -13,7 +13,7 @@ "kind": "bundle", "source": "src/entries/drive.js", "path": "js/generated/drive.js", - "hash": "2e11c9e9141b9396373097180dcaed046a405b962112f0c26e025d768d799c20" + "hash": "943d8a1b246ecaec44eef755b993462d000377aedc1dddf4a339645876b1170f" }, { "id": "replay.runtime", @@ -27,14 +27,14 @@ "kind": "bundle", "source": "src/entries/settings.js", "path": "js/generated/settings.js", - "hash": "1020feb80e629f5607a61390b980f36577be8ac01d1a05e2389a1fcaf89a162a" + "hash": "3a942b6194bd1ce7e08f30b873fd6cabb3bdd94cc96dcd8c7c4c96d900bb3071" }, { "id": "tools.runtime", "kind": "bundle", "source": "src/entries/tools.js", "path": "js/generated/tools.js", - "hash": "7a2c0e3cf0ae6e063fa5540007d679ccca2cad5c6339bbae7a184a3d9e6af98e" + "hash": "9f1d6a68db1f27b849ca2f7b7550b39f94e84bbe5ec01ce6969f4a2c6e564427" }, { "id": "logs.runtime", @@ -90,7 +90,7 @@ "kind": "bundle", "source": "src/entries/design_system.css", "path": "css/generated/design-system.css", - "hash": "68169a78e3fa9e18be4d2ca3f4d9c97a4281df52e27d6fe1396c8413bd737211" + "hash": "daeefa6282ba71d465e91f6622c35bef55a64b345a1e67367a85b1ebfecb1713" }, { "id": "drive.styles", @@ -111,14 +111,14 @@ "kind": "bundle", "source": "src/entries/settings.css", "path": "css/generated/settings.css", - "hash": "c0aa3fae081eb2f72fcf9195a5392371c1029cb25731788e609c177c9cb9f208" + "hash": "fd8e6f6f2f156797c29bbcac562b66dcff94023353a778db00036183aa5059ad" }, { "id": "tools.styles", "kind": "bundle", "source": "src/entries/tools.css", "path": "css/generated/tools.css", - "hash": "e11a953164b6be5134ff1920f7f6dd8541f28255bdde39fdd54ea1886e3a8c2d" + "hash": "e6e2426c73eace81c6cd5d1d08e519c7d2223869c0609fc72ec58bf1ac51f07a" }, { "id": "logs.styles", diff --git a/openpilot/selfdrive/carrot/web/js/generated/drive.js b/openpilot/selfdrive/carrot/web/js/generated/drive.js index 83d214da5a..1991d50c2b 100644 --- a/openpilot/selfdrive/carrot/web/js/generated/drive.js +++ b/openpilot/selfdrive/carrot/web/js/generated/drive.js @@ -1,10 +1,10 @@ /* @generated by web/build.mjs; edit web/src/entries/drive.js instead. */ -(()=>{var Nc={schemaVersion:1,defaults:{primary:"vision",secondary:"navigation"},contents:[{id:"vision",labelKey:"web_settings_carrot_vision",supportedSlots:["primary","secondary"],supportedSources:["live","replay"],singleton:!0},{id:"navigation",labelKey:"web_settings_navigation",supportedSlots:["primary","secondary"],supportedSources:["live","replay"],singleton:!0},{id:"drive_insights",labelKey:"web_drive_layout_content_drive_insights",supportedSlots:["primary","secondary"],supportedSources:["live","replay"],singleton:!0}]};var kt=Object.freeze({UNMOUNTED:"unmounted",INACTIVE:"inactive",ACTIVE:"active",DESTROYED:"destroyed"}),Dc=Object.freeze(["mount","activate","deactivate","resize","status","destroy"]),Pc=new WeakSet;function am(e){return e?.target||globalThis}function sm(e,t={},n={}){let r=String(e||"").trim();if(!r)throw new TypeError("DriveContent requires a name");for(let y of Dc)if(t[y]!=null&&typeof t[y]!="function")throw new TypeError(`DriveContent ${r}.${y} must be a function`);let o=am(n),i=null,a=kt.UNMOUNTED,s=!1,u=0;function c(y){if(a===kt.DESTROYED)throw new Error(`DriveContent ${r} cannot ${y} after destroy`)}function l(){return{name:r,state:a,mounted:i!==null,active:a===kt.ACTIVE,keepWarm:s,rootConnected:!!(i&&(i.isConnected??!0)),generation:u}}function d(y){typeof o.dispatchEvent!="function"||typeof o.CustomEvent!="function"||o.dispatchEvent(new o.CustomEvent("drive:contentstatechange",{detail:{...l(),reason:String(y||"")}}))}function f(y){if(c("mount"),!y||typeof y!="object")throw new TypeError(`DriveContent ${r}.mount requires a root element`);if(i===y)return!1;if(a===kt.ACTIVE)throw new Error(`DriveContent ${r} must deactivate before moving to another root`);let O=i;return t.mount?.(y,Object.freeze({previousRoot:O,remount:O!==null})),i=y,a=kt.INACTIVE,s=!1,u+=1,d(O===null?"mount":"remount"),!0}function p(y={}){if(c("activate"),i===null)throw new Error(`DriveContent ${r} must mount before activate`);let O=t.activate?.(y),C=a!==kt.ACTIVE||s;return a=kt.ACTIVE,s=!1,C&&(u+=1,d("activate")),O??C}function m(y={}){if(c("deactivate"),i===null||a!==kt.ACTIVE)return!1;let O=!!y.keepWarm,C=t.deactivate?.({...y,keepWarm:O});return a=kt.INACTIVE,s=O,u+=1,d("deactivate"),C??!0}function b(y){return c("resize"),i===null?!1:t.resize?.(y,{active:a===kt.ACTIVE})??!1}function g(){let y={};try{let O=t.status?.();O&&typeof O=="object"&&(y=O)}catch(O){y={error:String(O?.message||O||"status failed")}}return{...y,...l()}}function x(){if(a===kt.DESTROYED)return!1;let y=null;try{a===kt.ACTIVE&&t.deactivate?.({keepWarm:!1,reason:"destroy"})}catch(O){y=O}try{t.destroy?.(i)}catch(O){y??=O}finally{i=null,a=kt.DESTROYED,s=!1,u+=1,d("destroy")}if(y)throw y;return!0}let E=Object.freeze({name:r,mount:f,activate:p,deactivate:m,resize:b,status:g,destroy:x});return Pc.add(E),E}function to(e){return!!(e&&typeof e=="object"&&Pc.has(e))}var Ho=Object.freeze({STATE:kt,HOOK_NAMES:Dc,create:sm,isContent:to});function Lc(e=globalThis){return e.DriveContent=Ho,Ho}var $i=Object.freeze(["primary","secondary"]),Ui=Object.freeze(["live","replay"]),cm="NO_SUPPORTED_CONTENT",kc=/^[a-z][a-z0-9_]*$/,lm=Object.freeze(["id","labelKey","factory","supportedSlots","supportedSources","singleton"]),um=Object.freeze(["schemaVersion","defaults","contents"]),dm=Object.freeze(["id","labelKey","supportedSlots","supportedSources","singleton"]),fm=Object.freeze(["primary","secondary"]),pm=Object.freeze(["slot","source","fallbackId","selectedIds"]),mm=Object.freeze(["mount","activate","deactivate","resize","status","destroy"]),Gi=class extends Error{constructor(t,n){super(n),this.name="DriveContentRegistryError",this.code=t}};function Fe(e,t){throw new Gi(e,t)}function Fc(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function no(e,t,n,r){Fc(e)||Fe(r,`${n} must be an object`);let o=Object.keys(e).sort(),i=[...t].sort();(o.length!==i.length||o.some((a,s)=>a!==i[s]))&&Fe(r,`${n} must contain exactly: ${t.join(", ")}`)}function Rr(e,t,n){return(typeof e!="string"||!kc.test(e))&&Fe(n,`${t} must match ${kc}`),e}function zc(e,t,n){return(typeof e!="string"||!e.trim())&&Fe(n,`${t} must be a non-empty string`),e.trim()}function Bo(e,t,n,r){(!Array.isArray(e)||e.length===0)&&Fe(r,`${n} must be a non-empty array`);let o=[],i=new Set;for(let a of e)(typeof a!="string"||!t.includes(a))&&Fe(r,`${n} contains unsupported value: ${String(a)}`),i.has(a)&&Fe(r,`${n} must not contain duplicates`),i.add(a),o.push(a);return Object.freeze(o)}function hm(e,t){let n="INVALID_CONTENT_CATALOG",r=`content catalog entry ${t}`;return no(e,dm,r,n),typeof e.singleton!="boolean"&&Fe(n,`${r}.singleton must be boolean`),Object.freeze({id:Rr(e.id,`${r}.id`,n),labelKey:zc(e.labelKey,`${r}.labelKey`,n),supportedSlots:Bo(e.supportedSlots,$i,`${r}.supportedSlots`,n),supportedSources:Bo(e.supportedSources,Ui,`${r}.supportedSources`,n),singleton:e.singleton})}function Yi(e){let t="INVALID_CONTENT_CATALOG";no(e,um,"content catalog",t),e.schemaVersion!==1&&Fe(t,"content catalog schemaVersion must be 1"),no(e.defaults,fm,"content catalog defaults",t),(!Array.isArray(e.contents)||e.contents.length===0)&&Fe(t,"content catalog contents must be a non-empty array");let n=e.contents.map(hm),r=new Set;for(let i of n)r.has(i.id)&&Fe(t,`duplicate content catalog id: ${i.id}`),r.add(i.id);let o=Object.freeze({primary:Rr(e.defaults.primary,"content catalog defaults.primary",t),secondary:Rr(e.defaults.secondary,"content catalog defaults.secondary",t)});for(let[i,a]of Object.entries(o))r.has(a)||Fe(t,`content catalog defaults.${i} references unknown id: ${a}`);return Object.freeze({schemaVersion:1,defaults:o,contents:Object.freeze(n)})}function gm(e){let t="INVALID_DESCRIPTOR";return no(e,lm,"drive content descriptor",t),typeof e.factory!="function"&&Fe(t,"drive content descriptor.factory must be a function"),typeof e.singleton!="boolean"&&Fe(t,"drive content descriptor.singleton must be boolean"),Object.freeze({id:Rr(e.id,"drive content descriptor.id",t),labelKey:zc(e.labelKey,"drive content descriptor.labelKey",t),factory:e.factory,supportedSlots:Bo(e.supportedSlots,$i,"drive content descriptor.supportedSlots",t),supportedSources:Bo(e.supportedSources,Ui,"drive content descriptor.supportedSources",t),singleton:e.singleton})}function Wi(e){let t="INVALID_CONTEXT";no(e,pm,"drive content context",t),$i.includes(e.slot)||Fe(t,`unsupported drive content slot: ${String(e.slot)}`),Ui.includes(e.source)||Fe(t,`unsupported drive content source: ${String(e.source)}`);let n=Rr(e.fallbackId,"drive content context.fallbackId",t);Array.isArray(e.selectedIds)||Fe(t,"drive content context.selectedIds must be an array");let r=e.selectedIds.map((o,i)=>Rr(o,`drive content context.selectedIds[${i}]`,t));return Object.freeze({slot:e.slot,source:e.source,fallbackId:n,selectedIds:Object.freeze(r)})}function jc(e){(!e||typeof e!="object")&&Fe("INVALID_REGISTRY","drive content registry is required");for(let t of["register","get","list","create","has"])typeof e[t]!="function"&&Fe("INVALID_REGISTRY",`drive content registry.${t} is required`);return e}function Vc(e,t){return e.supportedSlots.includes(t.slot)&&e.supportedSources.includes(t.source)}function bm(e,t){return e.singleton&&t.has(e.id)}function ym(e){return!!(e&&typeof e=="object"&&mm.every(t=>typeof e[t]=="function"))}function Go(e,t,n){let r=jc(e),o=Wi(n),i=new Set(o.selectedIds),a=c=>!!(c&&Vc(c,o)&&!bm(c,i)),s=typeof t=="string"?r.get(t):null;if(a(s))return s;let u=r.get(o.fallbackId);if(a(u))return u;for(let c of r.list(o))if(a(c))return c;Fe(cm,`No supported drive content for ${o.slot}/${o.source}`)}function vm(){let e=[],t=new Map,n=new Map,r;function o(c){let l=gm(c);return t.has(l.id)&&Fe("DUPLICATE_CONTENT_ID",`drive content id is already registered: ${l.id}`),e.push(l),t.set(l.id,l),l}function i(c){return typeof c=="string"&&t.get(c)||null}function a(c){return typeof c=="string"&&t.has(c)}function s(c){let l=Wi(c);return Object.freeze(e.filter(d=>Vc(d,l)))}function u(c,l){let d=Wi(l),f=Go(r,c,d);if(n.has(f.id))return n.get(f.id);let p=f.factory(d);return ym(p)||Fe("INVALID_CONTENT_INSTANCE",`drive content factory ${f.id} must return a DriveContent instance`),n.set(f.id,p),p}return r=Object.freeze({register:o,get:i,list:s,create:u,has:a}),r}function Sm(e){return e instanceof Map?new Map(e):(Fc(e)||Fe("INVALID_FACTORY_MAP","drive content factories must be an object or Map"),new Map(Object.keys(e).map(t=>[t,e[t]])))}function Hc(e,t){let n=Yi(e),r=Sm(t),o=new Set(n.contents.map(({id:a})=>a));for(let a of r.keys())o.has(a)||Fe("UNKNOWN_FACTORY_ID",`factory has no content catalog entry: ${String(a)}`);let i=vm();for(let a of n.contents){r.has(a.id)||Fe("MISSING_FACTORY",`content catalog id has no factory: ${a.id}`);let s=r.get(a.id);typeof s!="function"&&Fe("INVALID_FACTORY",`factory must be a function: ${a.id}`),i.register({...a,factory:s})}return i}function Bc(e,t=globalThis){let n=jc(e);return(!t||typeof t!="object"&&typeof t!="function")&&Fe("INVALID_FACADE_TARGET","drive content registry facade target must be an object"),t.DriveContentRegistry=n,n}var vn=Object.freeze({HORIZONTAL:"horizontal",VERTICAL:"vertical"}),qi=Object.freeze({SPLIT:"split",AREA_1:"area_1",AREA_2:"area_2"}),Xi=Object.freeze({VISION:"vision",NAVIGATION:"navigation"}),Qi=Object.freeze({[vn.HORIZONTAL]:Object.freeze({mode:"carrot_navi_horizontal_mode",area1Content:"carrot_navi_horizontal_area_1",area2Content:"carrot_navi_horizontal_area_2",ratio:"carrot_navi_split_ratio"}),[vn.VERTICAL]:Object.freeze({mode:"carrot_navi_vertical_mode",area1Content:"carrot_navi_vertical_area_1",area2Content:"carrot_navi_vertical_area_2",ratio:"carrot_navi_vertical_split_ratio"})}),Mm=Object.freeze(Object.values(Qi).flatMap(e=>Object.values(e))),Ki=Object.freeze({primary:Xi.VISION,secondary:Xi.NAVIGATION});function Zi(e){return String(e||"").toLowerCase()===vn.VERTICAL?vn.VERTICAL:vn.HORIZONTAL}function Am(e=globalThis,t=e?.document){let n=e?.CarrotLayout?.orientation?.();if(n==="portrait")return vn.VERTICAL;if(n==="landscape")return vn.HORIZONTAL;let r=e?.visualViewport,o=Number(r?.width||t?.documentElement?.clientWidth||e?.innerWidth||0);return Number(r?.height||t?.documentElement?.clientHeight||e?.innerHeight||0)>=o?vn.VERTICAL:vn.HORIZONTAL}function Gc(e){return Object.values(qi).includes(e)?e:qi.SPLIT}function Wc(e){let t=Number(e),n=Number.isFinite(t)?t:.5,r=Math.max(.3,Math.min(.7,Math.round(n/.05)*.05));return Number(r.toFixed(2))}function $c(e){return Qi[Zi(e)]}function Wo(e,t,n){return Object.prototype.hasOwnProperty.call(e||{},n)?e[n]:t?.[n]}function Rm(e){let t=typeof e=="function"?e():e;return t&&typeof t=="object"?t:{}}function Uc(e){let t=e&&typeof e=="object"?e:Ki;return Object.freeze({primary:typeof t.primary=="string"?t.primary:Ki.primary,secondary:typeof t.secondary=="string"?t.secondary:Ki.secondary})}function Yc(e={},t={}){let n=t.registry,r=t.source||"live",o=Uc(t.contentDefaults),i=Go(n,e.area1,{slot:"primary",source:r,fallbackId:o.primary,selectedIds:[]}),a=Go(n,e.area2,{slot:"secondary",source:r,fallbackId:o.secondary,selectedIds:[i.id]});return Object.freeze({area1:i.id,area2:a.id})}function xm(e,t,n={}){let r=Zi(t),o=$c(r),i=Rm(n.settingDefaults),a=Yc({area1:Wo(e,i,o.area1Content),area2:Wo(e,i,o.area2Content)},n);return Object.freeze({orientation:r,mode:Gc(Wo(e,i,o.mode)),ratio:Wc(Wo(e,i,o.ratio)),area1Content:a.area1,area2Content:a.area2})}function Em(e){if(!e||typeof e!="object")throw new TypeError("drive layout registry is required");for(let t of["register","get","list","create","has"])if(typeof e[t]!="function")throw new TypeError(`drive layout registry.${t} is required`);return e}function Kc(e={}){let t=Em(e.registry),n=Uc(e.contentDefaults),r=e.settingDefaults||{},o=e.source||"live";function i(s,u={}){return Yc(s,{registry:t,source:u.source||o,contentDefaults:u.contentDefaults||n})}function a(s,u,c={}){return xm(s,u,{registry:t,source:c.source||o,contentDefaults:c.contentDefaults||n,settingDefaults:c.settingDefaults||r})}return Object.freeze({ORIENTATION:vn,MODE:qi,CONTENT:Xi,SETTINGS:Qi,settingKeys:Mm,normalizeOrientation:Zi,orientationForViewport:Am,normalizeMode:Gc,normalizeRatio:Wc,keysFor:$c,normalizeContents:i,read:a})}function qc(e,t=globalThis){if(!e||typeof e!="object"||typeof e.read!="function")throw new TypeError("drive layout spec facade requires a layout spec");if(!t||typeof t!="object"&&typeof t!="function")throw new TypeError("drive layout spec facade target must be an object");return t.CarrotDriveLayoutSpec=e,e}var ce=Object.freeze({PRIMARY:"primary",SECONDARY:"secondary"}),Xe=Object.freeze({HORIZONTAL:"horizontal",VERTICAL:"vertical"}),je=Object.freeze({SPLIT:"split",AREA_1:"area_1",AREA_2:"area_2"}),Xc=Object.freeze({dividerWidth:8,dividerHeight:8,settleMs:240,minRatio:.3,maxRatio:.7,compactPrimaryRatio:.5,compactPrimaryMinWidth:0,compactPrimaryMinHeight:0,ratioStep:.05,initialRatio:.7,verticalRatio:null}),Qc=Object.freeze({active:"is-drive-workspace-active",resizing:"is-drive-workspace-resizing",settling:"is-drive-workspace-settling",primarySplit:"is-drive-workspace-split",primaryCompact:"is-drive-workspace-compact-primary",documentCompact:"is-drive-workspace-compact-primary",horizontal:"is-drive-workspace-horizontal",vertical:"is-drive-workspace-vertical",swapped:"is-drive-workspace-swapped",area1Only:"is-drive-workspace-area-1-only",area2Only:"is-drive-workspace-area-2-only",suspended:"is-drive-workspace-suspended"}),$o=new WeakMap;function Tm(e,t){let n=e.target||globalThis,r=e.document||t?.ownerDocument||n.document,o=e.setTimeout||n.setTimeout?.bind(n)||globalThis.setTimeout.bind(globalThis),i=e.clearTimeout||n.clearTimeout?.bind(n)||globalThis.clearTimeout.bind(globalThis),a=e.requestAnimationFrame||n.requestAnimationFrame?.bind(n)||(u=>o(u,0)),s=e.cancelAnimationFrame||n.cancelAnimationFrame?.bind(n)||i;return{target:n,documentRoot:r,setTimer:o,clearTimer:i,requestFrame:a,cancelFrame:s,ResizeObserver:e.ResizeObserver||n.ResizeObserver}}function Wt(e){return Array.from(e?.childNodes||e?.children||[])}function Zc(e,t){if(e){if(typeof e.replaceChildren=="function"){e.replaceChildren(...t);return}for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of t)e.appendChild(n)}}function Jc(e,t){return Object.prototype.hasOwnProperty.call(e?.dataset||{},t)?e.dataset[t]:void 0}function el(e,t,n){e?.dataset&&(n===void 0?delete e.dataset[t]:e.dataset[t]=n)}function Ji(e={}){let t=e.root,n=e.primary,r=e.secondary,o=e.divider;if(!t||!n||!r||!o)return null;let i=$o.get(t);if(i)return i;let a=Tm(e,t),{target:s,documentRoot:u}=a,c=e.parking||u?.createElement?.("div")||null;if(!c||typeof c.appendChild!="function")throw new Error("DriveWorkspace requires a parking host");c.hidden=!0,c.inert=!0,c.dataset.driveWorkspaceParking="",c.removeAttribute?.("aria-hidden"),c.parentElement!==t&&c.parentNode!==t&&t.appendChild(c);let l=e.contentApi||s.DriveContent||Ho,d=e.registry||s.DriveContentRegistry||null,f={...Xc,...e.geometry||{}},p={...Qc,...e.classNames||{}},m={dividerWidth:"--drive-workspace-divider-width",secondaryWidth:"--drive-workspace-secondary-width",dividerHeight:"--drive-workspace-divider-height",secondaryHeight:"--drive-workspace-secondary-height",...e.styleProperties||{}},b={layout:"drive:workspacelayoutchange",resizeStart:"drive:workspaceresizestart",resizeEnd:"drive:workspaceresizeend",content:"drive:workspacecontentchange",...e.events||{}};t.classList?.add("drive-workspace"),n.dataset.driveWorkspaceSlot=ce.PRIMARY,r.dataset.driveWorkspaceSlot=ce.SECONDARY,o.dataset.driveWorkspaceDivider="";let g=!1,x=!1,E=!1,y=de(e.orientation),O=ye(e.layout?.mode),C=String(e.layout?.area1Slot||ce.PRIMARY),w=null,z=0,M=null,R=null,v=null,h=0,S=0,A="",L=0,P=0,_=!1,T="live",I=new Map([[ce.PRIMARY,null],[ce.SECONDARY,null]]),k=new Map,D=new WeakMap,B=new Map,W=[],V=[];C=U(C);function F(N){if(g)throw new Error(`DriveWorkspace cannot ${N} after destroy`)}function H(N,j,G,Q){typeof N?.addEventListener=="function"&&(N.addEventListener(j,G,Q),W.push([N,j,G,Q]))}function Y(N,j){!N||typeof s.dispatchEvent!="function"||typeof s.CustomEvent!="function"||s.dispatchEvent(new s.CustomEvent(N,{detail:j}))}function $(N){return[...new Set([Qc[N],p[N]].filter(Boolean))]}function K(N,j,G){if(!N?.classList)return;let Q=!!G;for(let se of $(j))N.classList.contains(se)!==Q&&N.classList.toggle(se,Q)}function Z(N,j){return!!(N?.classList&&$(j).some(G=>N.classList.contains(G)))}function ee(N,...j){if(!N?.classList)return;let G=j.flatMap($);G.length&&N.classList.remove(...G)}function ue(N){K(n,"primarySplit",N);for(let j of[n,r])for(let G of Wt(j))K(G,"primarySplit",N)}function de(N){return String(N||"").toLowerCase()===Xe.VERTICAL?Xe.VERTICAL:Xe.HORIZONTAL}function ye(N){let j=String(N||"").trim().toLowerCase();return Object.values(je).includes(j)?j:je.SPLIT}function U(N){let j=String(N||"").trim().toLowerCase();if(!I.has(j))throw new RangeError(`Unknown DriveWorkspace slot: ${N}`);return j}function X(N){return U(N)===ce.PRIMARY?n:r}function pe(N){let j=Number(N),G=Number(f.initialRatio),Q=Number.isFinite(G)?G:Xc.initialRatio;return Math.max(f.minRatio,Math.min(f.maxRatio,Number.isFinite(j)?j:Q))}function xe(N){let j=pe(N),G=Math.round(j/f.ratioStep)*f.ratioStep;return Number(Math.max(f.minRatio,Math.min(f.maxRatio,G)).toFixed(2))}w={[Xe.HORIZONTAL]:xe(f.initialRatio),[Xe.VERTICAL]:xe(f.verticalRatio!=null&&Number.isFinite(Number(f.verticalRatio))?f.verticalRatio:f.initialRatio)};function Je(){return w[y]??xe(f.initialRatio)}function et(N){let j=U(N);if(E)return!1;if(!x)return j===ce.PRIMARY;if(O===je.SPLIT)return!0;let G=O===je.AREA_1?C:C===ce.PRIMARY?ce.SECONDARY:ce.PRIMARY;return j===G}function ft(){let N=x&&!E&&O===je.SPLIT;o.setAttribute?.("aria-disabled",String(!N)),o.setAttribute?.("aria-hidden",String(!N)),o.tabIndex=N?0:-1}function He(){let N=y===Xe.VERTICAL;K(t,"horizontal",!N),K(t,"vertical",N),t.dataset.driveWorkspaceOrientation=y,o.setAttribute?.("aria-orientation",N?"horizontal":"vertical"),ft()}function Ct(){let N=C===ce.SECONDARY;K(t,"swapped",N),K(t,"area1Only",O===je.AREA_1),K(t,"area2Only",O===je.AREA_2),t.dataset.driveWorkspaceMode=O,n.dataset.driveWorkspaceArea=N?je.AREA_2:je.AREA_1,r.dataset.driveWorkspaceArea=N?je.AREA_1:je.AREA_2,ft()}function pt(){for(let N of Object.values(ce)){let j=X(N),G=et(N);j.hidden=!G,j.inert=!G,j.dataset.driveWorkspaceVisible=String(G),G?j.removeAttribute?.("aria-hidden"):j.setAttribute?.("aria-hidden","true")}o.hidden=!x||O!==je.SPLIT,ft()}function rn(N){let j=X(N).getBoundingClientRect?.()||{};return Object.freeze({x:Number(j.x??j.left??0),y:Number(j.y??j.top??0),top:Number(j.top||0),right:Number(j.right||0),bottom:Number(j.bottom||0),left:Number(j.left||0),width:Math.max(0,Number(j.width||0)),height:Math.max(0,Number(j.height||0)),devicePixelRatio:Math.max(1,Number(s.devicePixelRatio||1))})}function jn(N){return[N.left,N.top,N.width,N.height,N.devicePixelRatio].map(j=>Number(j).toFixed(2)).join("|")}function on(N,j=!1){let G=U(N),Q=I.get(G);if(!Q||!et(G))return!1;let se=rn(G),ve=jn(se);return!j&&k.get(G)===ve?!1:(Q.content.resize(se),k.set(G,ve),!0)}function te(N={}){if(F("resize contents"),R!==null||Z(t,"resizing"))return!1;let j=!!N.force,G=!1;for(let Q of Object.values(ce))G=on(Q,j)||G;return G}function Re(N=!1){g||(_=_||!!N,!L&&(L=a.requestFrame(()=>{L=0;let j=_;_=!1,g||te({force:j})})))}function mt(N){return I.get(U(N))?.content?.status?.()||null}function Ce(N="workspace layout"){F("sync content activity");let j=!1;for(let G of Object.values(ce)){let Q=I.get(G);if(!Q)continue;let se=Q.content.status?.()||{},ve=x&&et(G);ve&&!se.active?(Q.content.activate({reason:N,slot:G,source:Q.source}),j=!0):!ve&&se.active&&(Q.content.deactivate({keepWarm:!1,reason:N,slot:G,source:Q.source}),j=!0)}return j}function Ke(N,j,G){return{workspaceId:String(t.id||""),slot:N,action:j,contentId:String(G?.id||""),contentName:String(G?.content?.name||"")}}function Ge(N,j,G){let Q=d?.get?.(j);if(!Q)throw new RangeError(`Unknown drive content id: ${String(j)}`);if(!Q.supportedSlots?.includes(N))throw new RangeError(`Drive content ${j} does not support slot ${N}`);if(!Q.supportedSources?.includes(G))throw new RangeError(`Drive content ${j} does not support source ${G}`);return Q}function tt(N={},j={}){if(!d?.get||!d?.create)throw new Error("DriveWorkspace setContents requires a DriveContent registry");let G=String(j.source||"live"),Q={[ce.PRIMARY]:String(N.primaryId||""),[ce.SECONDARY]:String(N.secondaryId||"")},se={[ce.PRIMARY]:Ge(ce.PRIMARY,Q.primary,G),[ce.SECONDARY]:Ge(ce.SECONDARY,Q.secondary,G)};if(Q.primary===Q.secondary&&se.primary.singleton)throw new Error(`Drive content ${Q.primary} is singleton and cannot occupy both slots`);let ve=new Map,we=[];for(let ke of Object.values(ce)){let qe=Q[ke],yt=d.create(qe,{slot:ke,source:G,fallbackId:qe,selectedIds:[...we]});if(!(l?.isContent?.(yt)||to(yt)))throw new TypeError(`Drive content factory ${qe} must return a DriveContent instance`);if([...ve.values()].some(Gt=>Gt.content===yt))throw new Error(`Drive content instance ${qe} cannot occupy both slots`);ve.set(ke,Object.freeze({id:qe,descriptor:se[ke],content:yt,source:G})),we.push(qe)}return{records:ve,source:G}}function ge(N,j){let G=X(N);if(!j){delete G.dataset.driveContent,delete G.dataset.driveContentName;return}G.dataset.driveContent=j.id,G.dataset.driveContentName=j.content.name}function _n(N){return[...new Set((N||[]).filter(Boolean))]}function wt(N,j,G=[]){let Q=new Set(G),se=D.get(N)||[],ve=Wt(j).filter(ke=>!Q.has(ke)),we=_n([...ve,...se.filter(ke=>ke.parentNode===j||ke.parentElement===j)]);return we.length&&D.set(N,we),we}function nt(N){let j=u?.activeElement;return!j||!(N||[]).some(Q=>Q===j||Q.contains?.(j))?!1:(j.blur?.(),!0)}function Ie(N){if(!N)return[];N.status?.().active&&N.deactivate({keepWarm:!1,reason:"workspace content parking"}),nt(D.get(N)||[]);let j=Wt(c);return N.mount(c),wt(N,c,j)}function fe(N){if(!N||N===c)return[];let j=Wt(N);nt(j);for(let G of j)c.appendChild(G);return j}function We(N,j){if(Wt(j).length)throw new Error(`DriveWorkspace slot ${String(j.dataset?.driveWorkspaceSlot||"")} is not empty`);let G=Wt(j);N.mount(j);let Q=wt(N,j,G);if(!Q.length||Wt(j).some(se=>!Q.includes(se)))throw new Error(`Drive content ${String(N.name||"")} must own every top-level slot node`);return Q}function vr(N){return B.get(N)||null}function Bt(){let N=!0,j={};for(let G of Object.values(ce)){let Q=I.get(G),se=X(G),ve=Wt(se),we=!!(Q&&vr(Q.content)),ke=Q&&!we?D.get(Q.content)||[]:[],qe=ve.filter(an=>!ke.includes(an)).length,yt=ke.filter(an=>an.parentNode!==se&&an.parentElement!==se).length,Gt=qe===0&&yt===0&&ve.length===ke.length&&(!Q||we||ke.length>0);N=N&&Gt,j[G]=Object.freeze({contentId:String(Q?.id||""),presented:we,rootCount:ve.length,orphanCount:qe,missingCount:yt,consistent:Gt})}for(let[G,Q]of B){let se=D.get(G)||[],ve=se.length>0&&se.every(we=>we.parentNode===Q.host||we.parentElement===Q.host);N=N&&ve}return Object.freeze({consistent:N,slots:Object.freeze(j)})}function Rt(){let N=Bt();if(!N.consistent)throw new Error(`DriveWorkspace DOM ownership violation: ${JSON.stringify(N.slots)}`);return N}function Qn(N,j){return T!==j?!1:Object.values(ce).every(G=>I.get(G)?.id===N.get(G)?.id&&I.get(G)?.content===N.get(G)?.content)}function ht(N={},j={}){if(F("set contents"),B.size)throw new Error("DriveWorkspace cannot change slot contents during standalone presentation");let G=String(j.source||"live"),Q=Bt();if(T===G&&I.get(ce.PRIMARY)?.id===String(N.primaryId||"")&&I.get(ce.SECONDARY)?.id===String(N.secondaryId||"")&&Q.consistent)return!1;let{records:se,source:ve}=tt(N,j);if(Qn(se,ve)&&Q.consistent)return!1;let we=new Map(I),ke=T,qe=new Map;for(let $e of we.values())$e&&qe.set($e.content,!!$e.content.status?.().active);let yt=new Map,Gt=new Map;for(let $e of[...we.values(),...se.values()])$e&&!Gt.has($e.content)&&Gt.set($e.content,[...D.get($e.content)||[]]);let an=Wt(c);for(let $e of Object.values(ce)){let st=X($e);yt.set($e,{children:Wt(st),driveContent:Jc(st,"driveContent"),driveContentName:Jc(st,"driveContentName")})}try{let $e=new Set(Object.values(ce).filter(Me=>{let he=we.get(Me),De=se.get(Me);return he?.id===De?.id&&he?.content===De?.content&&ve===ke&&Q.slots[Me].consistent})),st=new Set;for(let Me of Object.values(ce)){if($e.has(Me))continue;let he=we.get(Me),De=se.get(Me);he&&st.add(he.content),De&&st.add(De.content)}for(let Me of st)Ie(Me);for(let Me of Object.values(ce))$e.has(Me)||fe(X(Me));for(let[Me,he]of se)$e.has(Me)||We(he.content,X(Me));for(let Me of Object.values(ce))I.set(Me,se.get(Me)),k.delete(Me),ge(Me,se.get(Me));T=ve,pt(),Ce("workspace content changed"),ue(x&&!E&&O===je.SPLIT),Zt(),Re(!0),Rt();for(let Me of Object.values(ce)){let he=we.get(Me),De=se.get(Me);(he?.id!==De?.id||he?.content!==De?.content)&&Y(b.content,Ke(Me,he?"switch":"register",De))}return!0}catch($e){let st=null;try{let Me=new Set([...we.values()].filter(Boolean).map(he=>he.content));for(let he of se.values())he.content.status?.().active&&!qe.get(he.content)&&he.content.deactivate({keepWarm:!1,reason:"workspace content rollback"}),Me.has(he.content)||Ie(he.content);for(let he of we.values())he?.content?.status?.().active&&he.content.deactivate({keepWarm:!1,reason:"workspace content rollback move"});Zc(c,an);for(let he of Object.values(ce))Zc(X(he),yt.get(he).children);for(let[he,De]of we)De&&De.content.mount(X(he));for(let he of Object.values(ce)){let De=yt.get(he);el(X(he),"driveContent",De.driveContent),el(X(he),"driveContentName",De.driveContentName),I.set(he,we.get(he))}for(let[he,De]of Gt)D.set(he,De);T=ke,k.clear(),pt(),ue(x&&!E&&O===je.SPLIT),Zt();for(let[he,De]of qe)De&&!he.status?.().active&&he.activate({reason:"workspace content rollback"})}catch(Me){st=Me}throw st&&($e.rollbackError=st),$e}}function q(N,j){F("register content");let G=U(N);if(!(l?.isContent?.(j)||to(j)))throw new TypeError(`DriveWorkspace ${G} requires a DriveContent instance`);let Q=I.get(G);if(Q?.content===j)return!1;if(Q)throw new Error(`DriveWorkspace ${G} already contains ${Q.content.name}`);if(B.has(j))throw new Error(`Drive content ${j.name} is in standalone presentation`);Ie(j),fe(X(G)),We(j,X(G));let se=Object.freeze({id:String(j.name||""),descriptor:null,content:j,source:T});return I.set(G,se),ge(G,se),pt(),Ce("workspace content registered"),Re(!0),Rt(),Y(b.content,Ke(G,"register",se)),!0}function oe(N,j=null){F("unregister content");let G=U(N),Q=I.get(G);return!Q||j&&Q.content!==j?!1:(Q.content.status?.().active&&Q.content.deactivate({keepWarm:!1,reason:"workspace content unregistered",slot:G}),Ie(Q.content),fe(X(G)),I.set(G,null),k.delete(G),ge(G,null),pt(),Rt(),Y(b.content,Ke(G,"unregister",Q)),!0)}function be(N,j,G={}){if(F("present content"),!(l?.isContent?.(N)||to(N)))throw new TypeError("DriveWorkspace presentation requires a DriveContent instance");if(!j||typeof j.appendChild!="function")throw new TypeError("DriveWorkspace presentation requires a host element");if(!E)throw new Error("DriveWorkspace must be suspended before standalone presentation");let Q=B.get(N);if(Q?.host===j)return!N.status?.().active&&G.activate!==!1&&N.activate(G),N.resize?.(j.getBoundingClientRect?.()),!1;Q&&Se(N);let se=Object.values(ce).find(ke=>I.get(ke)?.content===N)||null;N.status?.().active&&N.deactivate({keepWarm:!1,reason:"workspace standalone presentation",slot:se}),nt(D.get(N)||[]);let ve=Wt(j);if(N.mount(j),!wt(N,j,ve).length)throw new Error(`Drive content ${N.name} did not mount a presentation root`);return B.set(N,Object.freeze({host:j,slot:se})),Rt(),G.activate!==!1&&N.activate(G),N.resize?.(j.getBoundingClientRect?.()),!0}function Se(N){if(F("restore presented content"),!B.get(N))return!1;N.status?.().active&&N.deactivate({keepWarm:!1,reason:"workspace presentation restore"}),nt(D.get(N)||[]),B.delete(N);let G=Object.values(ce).find(Q=>I.get(Q)?.content===N)||null;return G?(fe(X(G)),We(N,X(G))):Ie(N),Rt(),!0}function Ne(N){return I.get(U(N))?.content||null}function Qt(N){return I.get(U(N))?.id||""}function Hi(){let N={};for(let j of Object.values(ce))N[j]=mt(j);return N}function Zt(N=0){let j=Je(),Q=[...I.entries()].find(([,De])=>De?.id==="vision"||De?.content?.name==="vision")?.[0]||ce.PRIMARY,se=Q===C?j:1-j,ve=y===Xe.VERTICAL,we=Math.max(0,N||(ve?t.clientHeight:t.clientWidth)),ke=x&&!E&&O===je.SPLIT?ve?f.dividerHeight:f.dividerWidth:0,qe=Math.max(0,we-ke)*se,yt=Math.max(0,ve?t.clientWidth:t.clientHeight),Gt=ve?yt:qe,an=ve?qe:yt,$e=Gtke?ke:0,yt=qe?Math.max(0,(ve-ke)*(1-Q)):0,Gt=G?0:qe,an=G?0:yt,$e=G?qe:0,st=G?yt:0,Me=Math.round(Q*100),he=`${Me}%`;o.dataset.ratio=he;let De=`${100-Me}%`;n.dataset.splitRatio=C===ce.PRIMARY?he:De,r.dataset.splitRatio=C===ce.SECONDARY?he:De,o.setAttribute?.("aria-valuenow",String(Me));let eo=[y,O,C,Gt,an.toFixed(2),$e,st.toFixed(2),we?1:0].join("|"),_c=eo!==A;return _c&&(A=eo,t.style?.setProperty(m.dividerWidth,`${Gt}px`),t.style?.setProperty(m.secondaryWidth,`${an}px`),t.style?.setProperty(m.dividerHeight,`${$e}px`),t.style?.setProperty(m.secondaryHeight,`${st}px`),e.onGeometry?.({active:x,ratio:Q,orientation:y,mode:O,area1Slot:C,compactPrimary:we,renderContent:N})),N&&Re(),_c}function bn(){let N=R,j=N!==null||Z(t,"resizing");if(R=null,v=null,h=0,N!==null&&o.hasPointerCapture?.(N)&&o.releasePointerCapture?.(N),z&&a.cancelFrame(z),z=0,a.clearTimer(S),S=0,M!==null&&(w[y]=M),M=null,w[y]=xe(w[y]),Zt(),ee(t,"resizing","settling"),e.onResizeStateChange?.(!1),j&&!g){let G=Nn();Y(b.resizeEnd,G),e.onResizeEnd?.(G)}}function Sr(N){F("set active");let j=!!N;return j===x?!1:(x=j,t.dataset.driveWorkspaceActive=String(x),x?(Ct(),K(t,"active",!0),ue(!E&&O===je.SPLIT),pt(),gt(!1),Ce("workspace activated"),P&&a.cancelFrame(P),P=a.requestFrame(()=>{P=0,!g&&x&&Re(!0)})):(P&&a.cancelFrame(P),P=0,bn(),K(t,"active",!1),ue(!1),pt(),Ce("workspace deactivated"),gt()),Lt(),!0)}function zo(N){F("set suspended");let j=!!N;return j===E?!1:(E=j,t.dataset.driveWorkspaceSuspended=String(E),K(t,"suspended",E),E&&bn(),pt(),ue(x&&!E&&O===je.SPLIT),Ce(E?"workspace suspended":"workspace resumed"),gt(!1),Lt(),!0)}function Mr(){if(z=0,M===null||g)return;w[y]=pe(M),M=null;let N=y===Xe.VERTICAL?v?.height:v?.width;gt(!1,N||0)}function Jr(N){M=xe(N),z||(z=a.requestFrame(Mr))}function Ar(N){if(!v||O!==je.SPLIT)return;let j=N.getCoalescedEvents?.(),G=j?.length?j[j.length-1]:N,Q=y===Xe.VERTICAL,se=Q?f.dividerHeight:f.dividerWidth,ve=Q?v.height:v.width;if(ve<=se)return;let we=Q?G.clientY:G.clientX,ke=Q?v.top:v.left,qe=we-h;Jr((qe-ke-se/2)/(ve-se))}function yn(N){if(R===null||N&&N.pointerId!==R)return;let j=R;R=null,v=null,h=0,o.hasPointerCapture?.(j)&&o.releasePointerCapture?.(j),z&&a.cancelFrame(z),z=0,M!==null&&(w[y]=pe(M)),M=null,K(t,"resizing",!1),K(t,"settling",!0),w[y]=xe(w[y]),e.onResizeStateChange?.(!1),gt(),a.clearTimer(S),S=a.setTimer(()=>{S=0,g||K(t,"settling",!1)},f.settleMs),Vn(),Lt();let G=Nn();Y(b.resizeEnd,G),e.onResizeEnd?.(G)}function bt(N){if(!x||O!==je.SPLIT)return;N.preventDefault?.(),R=N.pointerId,v=t.getBoundingClientRect?.()||{};let j=o.getBoundingClientRect?.()||{};h=y===Xe.VERTICAL?N.clientY-(Number(j.top||0)+Number(j.height||0)/2):N.clientX-(Number(j.left||0)+Number(j.width||0)/2),a.clearTimer(S),S=0,K(t,"settling",!1),K(t,"resizing",!0),e.onResizeStateChange?.(!0);let G=Nn();Y(b.resizeStart,G),e.onResizeStart?.(G),o.setPointerCapture?.(N.pointerId),Ar(N)}function jo(N){N.pointerId!==R||!o.hasPointerCapture?.(N.pointerId)||Ar(N)}function Vo(N){N.pointerId===R&&Ar(N)}function Zn(){yn()}function Jp(N){if(!x||O!==je.SPLIT)return;let j=y===Xe.VERTICAL?"ArrowUp":"ArrowLeft",G=y===Xe.VERTICAL?"ArrowDown":"ArrowRight";[j,G,"Home","End"].includes(N.key)&&(N.preventDefault?.(),N.key==="Home"?w[y]=f.minRatio:N.key==="End"?w[y]=f.maxRatio:w[y]=xe(w[y]+(N.key===j?-f.ratioStep:f.ratioStep)),gt(),Vn(),Lt())}function Bi(){Re(!0)}H(o,"pointerdown",bt),H(o,"pointermove",jo);for(let N of["pointerup","pointercancel","lostpointercapture"])H(o,N,yn);if(H(s,"pointermove",Vo,{passive:!0}),H(s,"pointerup",yn,{capture:!0,passive:!0}),H(s,"pointercancel",yn,{capture:!0,passive:!0}),H(s,"blur",Zn,{passive:!0}),H(o,"keydown",Jp),H(s,"resize",Bi,{passive:!0}),H(s,"orientationchange",Bi,{passive:!0}),H(s.visualViewport,"resize",Bi,{passive:!0}),typeof a.ResizeObserver=="function"){let N=new a.ResizeObserver(()=>{g||(x?gt():Re(!0))});N.observe(t),V.push(N);let j=new a.ResizeObserver(()=>Re());j.observe(n),j.observe(r),V.push(j)}function em(N){F("set orientation");let j=de(N);return j===y?!1:(bn(),y=j,A="",He(),Ct(),gt(),Lt(),!0)}function tm(N,j={}){F("set ratio");let G=typeof j=="boolean"?{persist:j}:j,Q=de(G.orientation||y);if(Q===y&&R!==null)return!1;let se=xe(N);return w[Q]===se?!1:(w[Q]=se,Q===y&>(),G.persist&&Vn(Q),Q===y&&Lt(),!0)}function nm(N={}){F("set layout");let j=ye(N.mode),G=U(N.area1Slot||ce.PRIMARY);return j===O&&G===C?!1:(bn(),O=j,C=G,A="",Ct(),pt(),ue(x&&!E&&O===je.SPLIT),Ce("workspace layout changed"),gt(),Lt(),!0)}function rm(){return Nn()}function om(){if(g)return!1;g=!0;let N=x;x=!1,z&&a.cancelFrame(z),L&&a.cancelFrame(L),P&&a.cancelFrame(P),z=0,L=0,P=0,a.clearTimer(S),S=0,M=null,_=!1,R=null,v=null;for(let[G,Q,se,ve]of W.splice(0))G.removeEventListener?.(Q,se,ve);for(let G of V.splice(0))G.disconnect?.();let j=new Set([...[...I.values()].filter(Boolean).map(G=>G.content),...B.keys()]);for(let G of j)Ie(G);B.clear();for(let[G]of I)fe(X(G)),I.set(G,null),ge(G,null);return k.clear(),ee(t,"active","resizing","settling","swapped","area1Only","area2Only","suspended"),ue(!1),K(n,"primaryCompact",!1),K(u?.documentElement,"documentCompact",!1),t.dataset.driveWorkspaceActive="false",t.dataset.driveWorkspaceSuspended="false",$o.delete(t),e.onDestroy?.({wasActive:N}),!0}t.dataset.driveWorkspaceActive=String(x),t.dataset.driveWorkspaceSuspended=String(E),He(),Ct(),pt();let Ic=Object.freeze({setActive:Sr,setSuspended:zo,setOrientation:em,setRatio:tm,setLayout:nm,setContents:ht,applyGeometry:gt,cancelDrag:bn,snapshot:rm,registerContent:q,unregisterContent:oe,getContent:Ne,contentIdForSlot:Qt,contentForSlot:Qt,contentSnapshot:Hi,domOwnershipStatus:Bt,assertDomOwnership:Rt,presentContent:be,restorePresentedContent:Se,syncContentActivity:Ce,resizeContents:te,destroy:om});return $o.set(t,Ic),Ic}function Om(e){return e&&typeof e=="object"&&$o.get(e)||null}var Uo=Object.freeze({SLOT:ce,ORIENTATION:Xe,LAYOUT_MODE:je,create:Ji,get:Om});function tl(e=globalThis){return e.DriveWorkspace=Uo,Uo}var Hn=Object.freeze({root:"carrotDriveWorkspace",primary:"carrotDrivePrimarySlot",secondary:"carrotDriveSecondarySlot",parking:"carrotDriveParking",divider:"carrotNaviDivider",visionRoot:"carrotStage",navigationRoot:"carrotNaviPane"}),ea=new WeakMap;function rl(e,t,n=null){t.parentElement===e||t.parentNode===e||e.insertBefore(t,n&&(n.parentElement===e||n.parentNode===e)?n:null)}function nl(e,t,n,r,o){let i=e.getElementById(n);return i||(i=e.createElement("div"),i.id=n),i.classList?.add("drive-workspace__slot"),i.dataset.driveWorkspaceSlot=r,rl(t,i,o),i}function Cm(e,t){let n=e.getElementById(Hn.parking);return n||(n=e.createElement("div"),n.id=Hn.parking),n.hidden=!0,n.inert=!0,n.dataset.driveWorkspaceParking="",n.removeAttribute?.("aria-hidden"),rl(t,n),n}function wm(e=document){let t=e.getElementById(Hn.root),n=e.getElementById(Hn.visionRoot),r=e.getElementById(Hn.navigationRoot),o=e.getElementById(Hn.divider);if(!t||!n||!r||!o)return null;let i=Cm(e,t);n.parentElement!==i&&n.parentNode!==i&&i.appendChild(n),r.parentElement!==i&&r.parentNode!==i&&i.appendChild(r);let a=nl(e,t,Hn.primary,ce.PRIMARY,o),s=nl(e,t,Hn.secondary,ce.SECONDARY,i);return delete n.dataset.driveWorkspaceSlot,delete r.dataset.driveWorkspaceSlot,n.removeAttribute?.("aria-hidden"),r.removeAttribute?.("aria-hidden"),Object.freeze({root:t,primary:a,secondary:s,parking:i,divider:o,visionRoot:n,navigationRoot:r})}function Im(e){let t=e.target||globalThis,n=e.document||t.document;return{target:t,documentRoot:n,MutationObserver:e.MutationObserver||t.MutationObserver}}function _m(e={}){let{target:t,documentRoot:n,MutationObserver:r}=Im(e),o=e.elements||wm(n),i=e.workspaceApi||t.DriveWorkspace||Uo,a=e.registry||t.DriveContentRegistry,s=e.layoutSpec||t.CarrotDriveLayoutSpec;if(!o||!i?.create||!a?.create||!s?.read)return null;let{root:u,primary:c,secondary:l,parking:d,divider:f,visionRoot:p,navigationRoot:m}=o,b=ea.get(u);if(b)return b;let g=[],x=[],E=!1,y=p.classList.contains("is-replay"),O=null,C=null;function w($,K,Z,ee){typeof $?.addEventListener=="function"&&($.addEventListener(K,Z,ee),g.push([$,K,Z,ee]))}function z(){if(typeof s.orientationForViewport=="function")return s.orientationForViewport(t,n);let $=t.CarrotLayout?.orientation?.();if($==="portrait")return Xe.VERTICAL;if($==="landscape")return Xe.HORIZONTAL;let K=t.visualViewport,Z=Number(K?.width||n.documentElement?.clientWidth||t.innerWidth||0);return Number(K?.height||n.documentElement?.clientHeight||t.innerHeight||0)>=Z?Xe.VERTICAL:Xe.HORIZONTAL}function M($=z(),K=e.settings||t.CarrotWebSettingsState){return s.read(K,$,{source:e.source||"live"})}let R=M(Xe.HORIZONTAL),v=M(Xe.VERTICAL),h=z()===Xe.VERTICAL?v:R,S=(e.createWorkspace||Ji)({root:u,primary:c,secondary:l,parking:d,divider:f,registry:a,contentApi:e.contentApi||t.DriveContent,target:t,document:n,orientation:h.orientation,layout:{mode:h.mode,area1Slot:ce.PRIMARY},geometry:{dividerWidth:8,dividerHeight:8,settleMs:240,minRatio:.3,maxRatio:.7,compactPrimaryRatio:.5,compactPrimaryMinWidth:360,compactPrimaryMinHeight:300,ratioStep:.05,initialRatio:R.ratio,verticalRatio:v.ratio,...e.geometry||{}},persist($,K){let Z=s.keysFor(K).ratio;typeof t.setWebSettingByKey=="function"&&t.setWebSettingByKey(Z,$.toFixed(2)).catch(()=>{}),e.persist?.($,K,Z)}});if(!S)return null;function A($=M()){if(!$||E)return!1;let K=S.setContents({primaryId:$.area1Content,secondaryId:$.area2Content},{source:e.source||"live"}),Z=S.setOrientation($.orientation),ee=S.setRatio($.ratio,{orientation:$.orientation}),ue=S.setLayout({mode:$.mode,area1Slot:ce.PRIMARY});return S.assertDomOwnership(),C=null,u.dataset.driveWorkspaceLayoutState="applied",Z||ee||K||ue}function L($,K="sync"){if(C=$,u.dataset.driveWorkspaceLayoutState="error",t.console?.error?.(`[drive] workspace layout ${K} failed`,$),typeof t.dispatchEvent=="function"&&typeof t.CustomEvent=="function"){let Z=null;try{Z=M()}catch{}t.dispatchEvent(new t.CustomEvent("drive:workspacelayoutapplyerror",{detail:Object.freeze({reason:K,message:String($?.message||$||"layout apply failed"),requested:Z,actual:S.snapshot()})}))}}function P(){let $=t.DriveContentVision;return $?(S.presentContent($,u,{reason:"recorded replay presentation",slot:"standalone",source:"replay"}),!0):!1}function _(){let $=t.DriveContentVision;return $?S.restorePresentedContent($):!1}function T($){if(E)return!1;let K=!!$;if(K===y){if(K&&(u.classList?.add("is-drive-workspace-replay"),S.setSuspended?.(!0),S.setActive(!1),!P()))throw new Error("Recorded replay presentation is unavailable");return!0}if(K){y=!0,u.classList?.add("is-drive-workspace-replay"),u.dataset.driveWorkspacePresentation="replay";try{if(S.setSuspended?.(!0),S.setActive(!1),!P())throw new Error("Recorded replay presentation is unavailable");return S.applyGeometry(),!0}catch(ee){y=!1,u.classList?.remove("is-drive-workspace-replay"),delete u.dataset.driveWorkspacePresentation;try{_(),S.setSuspended?.(!1),A(M()),S.setActive(I())}catch(ue){ee.restoreError=ue}throw ee}}let Z=null;try{_()}catch(ee){Z=ee}y=!1,u.classList?.remove("is-drive-workspace-replay"),delete u.dataset.driveWorkspacePresentation;try{A(M())}catch(ee){L(ee,"replay restore")}return S.setSuspended?.(!1),S.setActive(I()),S.applyGeometry(),Z&&L(Z,"replay release"),!0}function I(){return n.body?.dataset?.page==="carrot"&&!n.hidden&&!y}function k($={}){if(E)return null;try{if(y){if(u.classList?.add("is-drive-workspace-replay"),S.setSuspended?.(!0),S.setActive(!1),!P())throw new Error("Recorded replay presentation is unavailable")}else _(),A(M()),S.setSuspended?.(!1),S.setActive(I());S.applyGeometry()}catch(K){if(L(K,"sync"),$.throwOnError===!0)throw K}return S.snapshot()}function D($){return S.contentIdForSlot($)}function B($){let K=String($||"");for(let Z of Object.values(ce))if(D(Z)===K)return Z;return null}function W(){return Object.freeze({replayPresentationActive:y,layoutState:String(u.dataset.driveWorkspaceLayoutState||"idle"),layoutError:C?String(C?.message||C):"",workspace:S.snapshot()})}function V($){let K=$?.detail?.key;(Array.isArray($?.detail?.keys)?$.detail.keys:[K]).some(ee=>s.settingKeys.includes(ee))&&k()}function F(){let $=p.classList.contains("is-replay")&&!!t.CarrotVisionReplay?.isActive?.();if($!==y)try{T($)}catch(K){L(K,"replay presentation")}}typeof t.registerWebSettingsGuard=="function"&&(O=t.registerWebSettingsGuard($=>{y||$.keys.some(K=>s.settingKeys.includes(K))&&A(M(z(),$.settings))}));for(let $ of["resize","orientationchange","carrot:viewportlayout","carrot:pagechange"])w(t,$,k,{passive:!0});if(w(t,"carrot:websettingschange",V),w(n,"visibilitychange",k,{passive:!0}),w(t.visualViewport,"resize",k,{passive:!0}),typeof r=="function"){let $=new r(F);$.observe(p,{attributes:!0,attributeFilter:["class"]}),x.push($)}function H(){if(E)return!1;E=!0;for(let[$,K,Z,ee]of g.splice(0))$.removeEventListener?.(K,Z,ee);for(let $ of x.splice(0))$.disconnect?.();return O?.(),O=null,S.destroy(),ea.delete(u),!0}let Y=Object.freeze({root:u,primary:c,secondary:l,parking:d,divider:f,compatibilityRoots:Object.freeze({vision:p,navigation:m}),shell:S,viewportOrientation:z,readLayout:M,applyLayout:A,setReplayPresentation:T,presentationActive:I,sync:k,status:W,slotForContent:B,contentForSlot:D,destroy:H});ea.set(u,Y);try{e.syncOnCreate!==!1&&k({throwOnError:!0})}catch($){throw H(),$}return Y}function ol(e=globalThis,t={}){let n=_m({...t,target:e});return e.DriveWorkspaceRuntime=n,n}var Nm=Object.freeze(["refresh","resize","requestRender","renderText","renderReplayVideoFrame","resetReplayTemporalState","getDisplayModeIndex","setDisplayModeIndex"]),Jn=null,il=null,Dm=null;function Pm(e){if(!e||Nm.some(a=>typeof e[a]!="function"))return null;let t=Object.freeze({refresh(){return e.refresh()},resize(a){return e.resize(a)},renderText(){return e.renderText()}}),n=Object.freeze({requestRender(a={}){return e.requestRender(a)}}),r=Object.freeze({renderVideoFrame(a={}){return e.renderReplayVideoFrame(a)},resetTemporalState(){return e.resetReplayTemporalState()}}),o=Object.freeze({getModeIndex(){return e.getDisplayModeIndex()},setModeIndex(a,s={}){return e.setDisplayModeIndex(a,s)}});function i(){return{ready:!0,implementation:"HomeDrive",boundaries:["lifecycle","live","replay","display"]}}return Object.freeze({lifecycle:t,live:n,replay:r,display:o,status:i})}function Yo(){return Jn}function Lm(e=globalThis,t={}){let n=t.implementation??e?.HomeDrive;if(!n)return null;if(Jn){if(n!==il)throw new Error("DriveVisionFacade is an app-lifetime singleton")}else{if(Jn=Pm(n),!Jn)return null;il=n,Dm=Jn}return e.DriveVisionFacade=Jn,Jn}function xr(e=globalThis,t={}){return Lm(e,t)}var al=new WeakMap;function km(e={}){let t=e.target||globalThis,n=e.document||t.document,r=e.root||n?.getElementById?.("driveHudCard"),o=e.workspace||n?.getElementById?.("carrotDriveWorkspace"),i=e.stage||n?.getElementById?.("carrotStage");if(!r||!o)return null;let a=new Set,s=!1,u=!1,c=!1,l=null;function d(){return t.CarrotHudOverlay||null}function f(){let h=t.visualViewport;return{width:Number(h?.width||n.documentElement.clientWidth||t.innerWidth||0),height:Number(h?.height||n.documentElement.clientHeight||t.innerHeight||0)}}function p(){let{width:h,height:S}=f();return S>=h?"vertical":"horizontal"}function m(){let h=d();if(!h)return!1;for(let S of a)h.setSuppressed?.(S,!0);return u&&!c?h.activate?.():h.deactivate?.(),l&&h.update?.(l),!0}function b(){let h=p(),S=i?.classList.contains("is-drive-workspace-compact-primary")===!0,A=c||!u||h==="vertical"||S||a.size>0;return r.dataset.visionHudOrientation=h,r.dataset.visionHudCompact=String(S),r.classList.toggle("is-vision-hud-suppressed",A),r.hidden=A,r.inert=A,A?r.setAttribute("aria-hidden","true"):r.removeAttribute("aria-hidden"),!A}function g(h=r){if(c)throw new Error("Vision HUD cannot mount after destroy");if(h!==r)throw new Error("Vision HUD must use #driveHudCard");return s?!1:(s=!0,b(),!0)}function x(){if(c)throw new Error("Vision HUD cannot activate after destroy");let h=!u;s=!0,u=!0;let S=d();return m(),b(),S?.relayout?.(f()),h}function E(){let h=u;return u=!1,d()?.deactivate?.(),b(),h}function y(){return c||!u?!1:(b(),d()?.relayout?.(f()),!0)}function O(h){return!h||c?!1:(l=h,d()?.update?.(h),b(),!0)}function C(h){return c?!1:(r.classList.toggle("driveHudCard--loading",!!h),!0)}function w(h,S){if(c)return!1;let A=String(h||"external");return S?a.add(A):a.delete(A),d()?.setSuppressed?.(A,!!S),A==="replay-insights"&&r.classList.toggle("is-replay-suppressed",!!S),b()}function z(){return c?!1:(l&&d()?.update?.(l),!0)}function M(){let h=d()?.status?.()||null;return Object.freeze({mounted:s,active:u,destroyed:c,orientation:p(),visible:!r.hidden&&!r.classList.contains("is-vision-hud-suppressed"),suppressions:Object.freeze(Array.from(a)),presentation:h})}function R(){return c?!1:(u=!1,s=!1,c=!0,l=null,a.clear(),d()?.destroy?.(),r.classList.remove("is-replay-suppressed","driveHudCard--loading"),b(),!0)}function v(){c||y()}for(let h of["resize","orientationchange","carrot:viewportlayout","carrot:pagechange","drive:workspacelayoutchange"])t.addEventListener(h,v,{passive:!0});return e.autoMount!==!1&&g(),Object.freeze({root:r,mount:g,activate:x,deactivate:E,resize:y,update:O,setLoading:C,setSuppressed:w,renderText:z,syncPresentation:m,status:M,destroy:R})}function ro(e=globalThis,t={}){let n=al.get(e);if(n)return n;let r=km({...t,target:e});return r&&al.set(e,r),r}function oo(e=globalThis,t={}){let n=ro(e,t);return e.DriveVisionHudContent=n,n}function Fm(e=globalThis){if(Array.isArray(e?.CarrotWebCapabilitiesSpec))return e.CarrotWebCapabilitiesSpec;let t=e?.__CARROT_BOOTSTRAP__?.webCapabilitiesSpec;return Array.isArray(t)?t:[]}function zm(e=globalThis){if(Array.isArray(e?.CarrotWebSettingsSpec))return e.CarrotWebSettingsSpec;let t=e?.__CARROT_BOOTSTRAP__?.webSettingsSpec;return Array.isArray(t)?t:[]}function jm(e,t=globalThis){let n=String(e||"");return Fm(t).find(r=>r?.id===n)||null}function Vm(e,t=globalThis){let n=String(e||""),r=zm(t).find(o=>o?.key===n);return typeof r?.requiresCapability=="string"&&r.requiresCapability?r.requiresCapability:null}function Hm(e,t=globalThis){let n=String(e||""),r=t?.CarrotWebCapabilitiesState;if(r&&Object.prototype.hasOwnProperty.call(r,n))return!!r[n];let o=t?.__CARROT_BOOTSTRAP__?.webCapabilities;if(o&&Object.prototype.hasOwnProperty.call(o,n))return!!o[n];let a=jm(n,t)?.settingKey,s=t?.CarrotWebSettingsState||t?.__CARROT_BOOTSTRAP__?.webSettings;return!!(a&&s?.[a])}function Ko(e,t=globalThis){let n=Vm(e,t);return!n||Hm(n,t)}var Bn="vision_ar_enabled",sl=!0;function cl(e=globalThis){return!sl||!(typeof e?.isWebSettingUnlocked=="function"?e.isWebSettingUnlocked(Bn):Ko(Bn,e))?!1:typeof e?.getWebSettingByKey=="function"?!!e.getWebSettingByKey(Bn,!1):Object.prototype.hasOwnProperty.call(e?.CarrotWebSettingsState||{},Bn)?!!e.CarrotWebSettingsState[Bn]:!!e?.__CARROT_BOOTSTRAP__?.webSettings?.[Bn]}function ta(e={}){let t=e.target||globalThis,n=e.documentRoot||t?.document||null,r=e.createRuntime;if(typeof r!="function")throw new TypeError("Vision AR activation gate requires createRuntime");let o=!1,i=!1,a=null,s="";function u(){return cl(t)}function c(){if(!a)return!1;let E=a;return a=null,E.destroy?.(),!0}function l(){if(i)return!1;if(!u()||n?.hidden===!0)return s="",c(),!1;if(!o)return c(),!1;try{if(a||=r(),!a)throw new Error("AR runtime을 만들 수 없습니다");return s="",a.activate?.(),!0}catch(E){return s=String(E?.message||E||"AR activation failed"),t?.console?.warn?.("[vision ar] activate failed",E),c(),!1}}function d(E){(E?.detail?.keys||[E?.detail?.key]).includes(Bn)&&l()}function f(){l()}t?.addEventListener?.("carrot:websettingschange",d),t?.addEventListener?.("carrot:webcapabilitieschange",l),n?.addEventListener?.("visibilitychange",f);function p(){return i?!1:(o=!0,l())}function m(){return i?!1:(o=!1,c())}function b(){return o&&u()?a?.resize?.()??!1:!1}function g(){let E=a?.status?.()||{};return Object.freeze({...E,enabled:u(),visionActive:o,documentHidden:n?.hidden===!0,runtimeCreated:!!a,lastError:s})}function x(){return i?!1:(i=!0,o=!1,t?.removeEventListener?.("carrot:websettingschange",d),t?.removeEventListener?.("carrot:webcapabilitieschange",l),n?.removeEventListener?.("visibilitychange",f),c(),!0)}return Object.freeze({activateVision:p,deactivateVision:m,resize:b,sync:l,status:g,destroy:x})}var er=Object.freeze([0,0,1]);function na(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function tr(e,t=null){if(!Array.isArray(e)||e.length<3)return t;let n=[Number(e[0]),Number(e[1]),Number(e[2])];return n.every(Number.isFinite)?n:t}function ra(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function oa(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function io(e,t){let n=tr(e,t),r=n?Math.hypot(n[0],n[1],n[2]):0;return r>1e-9?n.map(o=>o/r):[...t]}function $t(e,t=er){let n=io(e,[1,0,0]),r=io(t,er),o=r.map((s,u)=>s-n[u]*ra(r,n));Math.hypot(...o)<=1e-9&&(r=Math.abs(n[2])<.9?er:[0,1,0],o=r.map((s,u)=>s-n[u]*ra(r,n))),o=io(o,er);let i=io(oa(n,o),[0,-1,0]),a=io(oa(i,n),er);return Object.freeze({forward:Object.freeze(n),right:Object.freeze(i),up:Object.freeze(a)})}function sn(e=0,t=0){let n=na(e),r=na(t),o=Math.cos(r);return $t([Math.cos(n)*o,Math.sin(n)*o,Math.sin(r)])}function Sn(e){if(!e)return sn();let t=tr(e.roadForward),n=tr(e.roadUp,er);return t?$t(t,n):sn(e.headingRad,e.pitchRad)}function ll(e){if(!e)return sn();let t=tr(e.faceForward),n=tr(e.faceUp,er);return t?$t(t,n):Sn(e)}function Ft(e){let t=$t(e?.forward,e?.up);return Object.freeze({roadForward:t.forward,roadRight:t.right,roadUp:t.up,headingRad:Math.atan2(t.forward[1],t.forward[0]),pitchRad:Math.atan2(t.forward[2],Math.hypot(t.forward[0],t.forward[1]))})}function ul(e){let t=$t(e?.forward,e?.up);return Object.freeze({faceForward:t.forward,faceRight:t.right,faceUp:t.up,faceHeadingRad:Math.atan2(t.forward[1],t.forward[0])})}function ao(e,t){let n=tr(e,[0,0,0]),r=tr(t,[0,0,0]),o=Math.hypot(r[0],r[1],r[2]);if(!(o>1e-9))return Object.freeze([...n]);let i=r.map(l=>l/o),a=Math.cos(o),s=Math.sin(o),u=oa(i,n),c=ra(i,n);return Object.freeze(n.map((l,d)=>l*a+u[d]*s+i[d]*c*(1-a)))}function ia(e,t){let n=$t(e?.forward,e?.up);return $t(ao(n.forward,t),ao(n.up,t))}function qo(e,t,n){let r=$t(e?.forward,e?.up),o=$t(t?.forward,t?.up),i=Math.max(0,Math.min(1,na(n))),a=(s,u)=>s.map((c,l)=>c+(u[l]-c)*i);return $t(a(r.forward,o.forward),a(r.up,o.up))}var Ae=Object.freeze({GEODETIC_WGS84:"geodetic-wgs84",LOCAL_WORLD_ENU:"local-world-enu",LOCAL_WORLD_DEVICE:"local-world-device-origin",NED:"ned",DEVICE_FRD:"openpilot-device-frd",CALIBRATED_FRD:"openpilot-calibrated-frd",ROUTE_FLU:"route-local-flu",VIEW_RDF:"openpilot-view-rdf",MARKER_RUB:"marker-local-right-up-backward",STAGE_CSS_PIXEL:"stage-css-pixel"}),aa=Object.freeze({orientationNED:Ae.NED,velocityDevice:Ae.DEVICE_FRD,accelerationDevice:Ae.DEVICE_FRD,angularVelocityDevice:Ae.DEVICE_FRD});function Bm(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function Er(e,t,n="value"){let r=e?.coordinateFrame;if(r!==t)throw new TypeError(`${n} coordinateFrame must be ${t}; received ${String(r)}`);return e}function fl(e){let t=Bm(e);if(!t)return null;let n=r=>r===0?0:-r;return Object.freeze([t[0],n(t[1]),n(t[2])])}var Dn=fl,Mn=fl;function dl(e){return Array.isArray(e)?Object.freeze(e.map(t=>{let n=Number(t);return Number.isFinite(n)?n===0?0:-n:t})):e}function sa(e){if(!e||!Array.isArray(e.x)||!Array.isArray(e.y))return null;if(e.coordinateFrame&&e.coordinateFrame!==Ae.CALIBRATED_FRD)throw new TypeError(`modelV2.position coordinateFrame must be ${Ae.CALIBRATED_FRD}`);return Object.freeze({...e,x:e.x,y:dl(e.y),...Array.isArray(e.z)?{z:dl(e.z)}:{},sourceCoordinateFrame:Ae.CALIBRATED_FRD,coordinateFrame:Ae.ROUTE_FLU})}function ca(e){if(!e)return null;Er(e,Ae.DEVICE_FRD,"cameraOdometry");let t=Dn(e.trans),n=Dn(e.rot);return!t||!n?null:Object.freeze({...e,trans:t,rot:n,sourceCoordinateFrame:Ae.DEVICE_FRD,coordinateFrame:Ae.ROUTE_FLU})}var la=Object.freeze({maxHoldMs:3500,maxDriftM:2.5,maxStepMs:200}),vt=Object.freeze({LIVE:"live",HELD:"held",DROPPED:"dropped"});function at(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function ua(e,t,n){let r=at(n,0);if(!e||!t||!(r>0))return e||null;t.coordinateFrame!==void 0&&Er(t,Ae.ROUTE_FLU,"anchor odometry");let o=Array.isArray(t.trans)?t.trans:[],i=Array.isArray(t.rot)?t.rot:[],a=at(o[0],0),s=at(o[1],0),u=at(o[2],0),c=[-at(i[0],0)*r,-at(i[1],0)*r,-at(i[2],0)*r],l=ao([at(e.x,0)-a*r,at(e.y,0)-s*r,at(e.z,0)-u*r],c),d=ia(Sn(e),c);return Object.freeze({...e,x:l[0],y:l[1],z:l[2],...Ft(d)})}function da(e,t,n){let r=at(n,0);if(!t||!(r>0))return 0;let o=Array.isArray(t.transStd)?t.transStd:[],i=Array.isArray(t.rotStd)?t.rotStd:[],a=Math.hypot(at(o[0],0),at(o[1],0),at(o[2],0)),s=Math.hypot(at(i[0],0),at(i[1],0),at(i[2],0)),u=Math.hypot(at(e?.x,0),at(e?.y,0),at(e?.z,0));return Math.abs(a)*r+Math.abs(s)*r*u}var Xo=Object.freeze({MODEL_PATH:"model-path-bounded",UNKNOWN_FLAT:"unknown-flat"}),so=Object.freeze({fullHeightConfidenceM:70,maxHeightDistanceM:120,maxAbsGrade:.25,maxLateralInnovationM:3,lateralCorrectionGain:.35,maxLateralCorrectionM:.75}),Zo=Object.freeze({z:0,roadGrade:0,heightSource:Xo.UNKNOWN_FLAT,heightConfidence:0,heightLimited:!1});function Tr(e){if(e==null||e===""||typeof e=="boolean")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Qo(e,t,n){return Math.min(n,Math.max(t,e))}function Gm(e,t,n){if(!e.length||e[0].z===null)return null;let r=0,o=Math.abs(e[0].z)>1e-6;for(let i=1;i1e-9&&(o=!0);let d=Math.min(t,s.x)-a.x;if(d>0&&(r+=l*d),t<=s.x)return{z:r,grade:l,limited:o}}return null}function fa(e,t,n={}){let r=n.limits?{...so,...n.limits}:so,o=Array.isArray(e?.x)?e.x:null,i=Array.isArray(e?.y)?e.y:null,a=Array.isArray(e?.z)?e.z:null,s=Tr(t);if(!o||!i||o.length<2||s===null||s<0)return null;let u=Math.min(o.length,i.length),c=[],l=null;for(let C=0;C=2&&w.x>=s){l=[c.at(-2),w];break}}if(!l||s=r.maxHeightDistanceM?0:s<=r.fullHeightConfidenceM?1:(r.maxHeightDistanceM-s)/(r.maxHeightDistanceM-r.fullHeightConfidenceM),O=E&&s=r.maxHeightDistanceM)})}function pa(e,t,n={}){let r=n.limits?{...so,...n.limits}:so,o=Tr(e),i=Tr(t);if(o===null||i===null||n.enabled!==!0)return Object.freeze({y:o??i??0,correctionM:0,accepted:!1});let a=i-o;if(Math.abs(a)>r.maxLateralInnovationM)return Object.freeze({y:o,correctionM:0,accepted:!1});let s=Qo(a*r.lateralCorrectionGain,-r.maxLateralCorrectionM,r.maxLateralCorrectionM);return Object.freeze({y:o+s,correctionM:s,accepted:!0})}function co(e,t){let n=fa(e,t);if(!n)return null;let r=$t(n.tangent),{tangent:o,...i}=n;return Object.freeze({...i,...Ft(r),coordinateFrame:Ae.ROUTE_FLU})}var nr=Object.freeze({minimumRangeM:200,defaultRangeM:300,maximumRangeM:300});function pl(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function Or(e=nr.defaultRangeM){let t=pl(e,nr.defaultRangeM);return Math.min(nr.maximumRangeM,Math.max(nr.minimumRangeM,t))}function ma(e,t){let n=pl(e);return n!==null&&n>=0&&n<=Or(t)}var Ue=Object.freeze({TURN_GATE:"turn_gate",COMMIT_ARROW:"commit_arrow",DESTINATION_PIN:"destination_pin",CAUTION_SIGN:"caution_sign",LANE_BAND:"lane_band",SECTION_GATE:"section_gate",SIGNAL_HEAD:"signal_head",CROSSROAD_CARD:"crossroad_card",SPEED_SIGN:"speed_sign"}),ml=Object.freeze({laneBand:!1}),lo=Object.freeze({BILLBOARD:"billboard",SURFACE:"surface"}),Wm=Object.freeze(new Set([Ue.LANE_BAND]));function ha(e){return Wm.has(e)?lo.SURFACE:lo.BILLBOARD}var aS=Object.freeze({defaultSupportHeightM:1.05,supportHeightMByKind:Object.freeze({[Ue.TURN_GATE]:1.05,[Ue.COMMIT_ARROW]:1.05,[Ue.CAUTION_SIGN]:.95,[Ue.SECTION_GATE]:.95,[Ue.SIGNAL_HEAD]:1.05,[Ue.CROSSROAD_CARD]:1.05,[Ue.SPEED_SIGN]:.95})});var Ut=Object.freeze({PREVIEW:"preview",APPROACH:"approach",PRECISE:"precise",COMMIT:"commit",PASSED:"passed"}),Gn=Object.freeze({baseMps:16.7,previewEnterM:nr.defaultRangeM,approachEnterM:150,preciseEnterM:70,commitEnterM:15,passedExitM:-8,speedScaleMin:.6,speedScaleMax:1.8}),sS=Object.freeze({turn:Object.freeze({edge:[.21,.95,.63],fill:[.09,.45,.3],glow:[.35,1,.7]}),caution:Object.freeze({edge:[1,.78,.25],fill:[.42,.3,.06],glow:[1,.86,.45]}),destination:Object.freeze({edge:[1,.45,.78],fill:[.42,.12,.28],glow:[1,.6,.85]}),lane:Object.freeze({edge:[.35,.82,1],fill:[.08,.3,.44],glow:[.55,.9,1]}),uncertain:Object.freeze({edge:[.72,.76,.78],fill:[.2,.22,.24],glow:[.8,.84,.86]})}),cS=Object.freeze({laneWidthDefaultM:3.5,laneWidthMinM:2.8,laneWidthMaxM:4.2,gate:Object.freeze({heightM:4.2,postWidthM:.26,beamHeightM:.34,depthM:.22,sideMarginM:.15,chevronCount:3}),arrow:Object.freeze({chevronCount:3,chevronWidthM:2.2,chevronDepthM:1.1,chevronThickM:.42,spacingM:2.6,liftM:.06}),pin:Object.freeze({heightM:5,headRadiusM:.85,stemRadiusM:.12,radialSegments:12}),sign:Object.freeze({diameterM:1.7,heightM:3.2,ringThickM:.22,radialSegments:20}),laneBand:Object.freeze({lengthM:26,liftM:.03,fadeStartRatio:.55})}),lS=Object.freeze([Object.freeze({id:"xs",maxMinSidePx:380,maxHeightRatio:.34,maxWidthRatio:.56,minWidthPx:112,safeMarginPx:12,minHeightPx:24,labels:!1,chevronCount:2,lod:"flat",maxMarkers:1}),Object.freeze({id:"sm",maxMinSidePx:560,maxHeightRatio:.38,maxWidthRatio:.54,minWidthPx:136,safeMarginPx:14,minHeightPx:30,labels:!0,chevronCount:2,lod:"flat",maxMarkers:2}),Object.freeze({id:"md",maxMinSidePx:900,maxHeightRatio:.42,maxWidthRatio:.52,minWidthPx:164,safeMarginPx:16,minHeightPx:38,labels:!0,chevronCount:3,lod:"solid",maxMarkers:2}),Object.freeze({id:"lg",maxMinSidePx:1/0,maxHeightRatio:.46,maxWidthRatio:.5,minWidthPx:192,safeMarginPx:18,minHeightPx:44,labels:!0,chevronCount:3,lod:"solid",maxMarkers:3})]),Cr=Object.freeze({backend:"three",failureMode:"hidden",canvas2dFallback:!1,devicePixelRatioMax:2,degradedDevicePixelRatioMax:1.5,targetFps:30,degradedFps:15,performance:Object.freeze({slowBudgetRatio:.9,degradeWindowFrames:12,degradeSlowFrames:9,recoverBudgetRatio:.72,recoverWindowFrames:60,recoverFastFrames:54}),alphaByConfidence:Object.freeze({high:1,medium:.72,low:.42,hidden:0}),fadeInMs:280,fadeOutMs:420,cacheGraceMs:900,selectionHysteresisMs:320,viewportEnterPaddingPx:0,viewportExitPaddingPx:32,farLegibilityScaleMax:3,worldObjectMaxHeightRatio:.62,worldObjectMaxWidthRatio:.78,nearMarkerDepthM:3,nearUprightMarkerDepthM:8,laneBandPresentation:Object.freeze({viewPitchRad:-Math.PI/4,farLengthScaleMax:5,maxScreenHeightRatio:.52,maxScreenWidthRatio:.92}),presentation:Object.freeze({positionHalfLifeMs:160,orientationHalfLifeMs:220,scaleHalfLifeMs:180,maxStepMs:250,snapDistanceM:12,nearWorldScaleMin:.28})}),$m=Object.freeze({maxYawRad:Math.PI*.39}),uo=Object.freeze({maxGpsAgeMs:4e3,maxHorizontalAccuracyM:40,maxPositionSeparationM:60,separationAccuracyMultiplier:3,minBearingCheckSpeedMps:2,maxBearingAccuracyDeg:45,maxHeadingDisagreementDeg:60,routeWorldPositionSigmaM:12,routeWorldHeadingSigmaDeg:18});function hl(e,t,n){return Math.min(n,Math.max(t,e))}function gl(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function bl(e,t={}){let n=Math.max(0,gl(e,Gn.baseMps)),r=hl(n/Gn.baseMps,Gn.speedScaleMin,Gn.speedScaleMax);return Object.freeze({preview:Or(t.discoveryRangeM),approach:Gn.approachEnterM*r,precise:Gn.preciseEnterM*r,commit:Gn.commitEnterM,passed:Gn.passedExitM})}function fo(e,t,n={}){let r=gl(e,NaN);if(!Number.isFinite(r))return Ut.PASSED;let o=bl(t,n);return r>16&255}, ${o>>8&255}, ${o&255}, ${i})`}var ya=Object.freeze({outlineM:.055,outlineOpacity:.95,textStrokePx:10,dropShadowPx:18,shadowPlaneOpacity:.42,shadowPlaneScale:1.35,emissiveIntensity:.28}),Jo=Object.freeze({preview:Object.freeze({scale:.78,opacity:.62,chevrons:0,showSecondary:!1}),approach:Object.freeze({scale:.9,opacity:.85,chevrons:2,showSecondary:!0}),precise:Object.freeze({scale:1,opacity:1,chevrons:3,showSecondary:!0}),commit:Object.freeze({scale:1.12,opacity:1,chevrons:3,showSecondary:!1})});function va(e){return yl[e]||yl[Te.GUIDE]}function Sa(e){return Km[e]||rt.BAR}function An(e={}){let t=Object.values(Te).includes(e.tone)?e.tone:Te.GUIDE,n=e.shape||Sa(t),r=Jo[e.phase]?e.phase:"precise",o=Jo[r],i=Math.sign(Number(e.turnSign)||0),a=cn[n]||cn[rt.BAR],s=Number(e.laneWidthM)||3.5,u,c;n===rt.BAND?(u=s*a.insetRatio,c=a.lengthM):n===rt.CIRCLE?u=c=a.diameterM:n===rt.PIN?(u=a.headDiameterM,c=a.heightM):(u=a.widthM,c=a.heightM);let l=u*o.scale,d=c*o.scale;return Object.freeze({tone:t,shape:n,phase:r,palette:va(t),primary:String(e.primary??""),secondary:o.showSecondary?String(e.secondary??""):"",turnSign:i,chevronCount:i===0?0:o.chevrons,distanceM:Number(e.distanceM)||0,widthM:l,heightM:d,mountHeightM:cn.mountHeightM,depthM:a.depthM??.24,radiusM:a.radiusM??0,opacity:o.opacity,scale:o.scale})}function xl(e,t,n,r,o,i){let a=Math.min(i,r/2,o/2);e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+o,a),e.arcTo(t+r,n+o,t,n+o,a),e.arcTo(t,n+o,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function Wn(e,t,n,r,{px:o,weight:i,color:a,stroke:s,align:u="center",maxWidth:c=0}){if(!t)return;let l=o;if(c>0){e.font=`${i} ${l}px ${ct.family}`;let f=e.measureText(t).width;f>c&&(l=Math.max(12,Math.floor(l*(c/f))))}let d=l;e.font=`${i} ${d}px ${ct.family}`,e.textAlign=u,e.textBaseline="middle",e.lineJoin="round",s&&(e.lineWidth=ya.textStrokePx*(d/o),e.strokeStyle=s,e.strokeText(t,n,r)),e.fillStyle=a,e.fillText(t,n,r)}function Qm(e,t,n){if(!t.chevronCount)return;let r=cn.chevron,o=n.w*r.widthRatio,i=n.w*r.gapRatio,a=n.w*r.insetRatio,s=n.h*.46,u=n.y+n.h/2,c=t.turnSign,l=c>0?n.x+n.w-a-(o*t.chevronCount+i*(t.chevronCount-1)):n.x+a;e.save();for(let d=0;d0?(e.moveTo(f,u-s/2),e.lineTo(f+o*.62,u),e.lineTo(f,u+s/2),e.lineTo(f+o*.28,u)):(e.moveTo(f+o*.62,u-s/2),e.lineTo(f,u),e.lineTo(f+o*.62,u+s/2),e.lineTo(f+o*.34,u)),e.closePath(),e.fill()}e.restore()}function Zm(e,t,n,r){let o=t.palette,i=r*.06,a={x:i,y:i,w:n-i*2,h:r-i*2},s=t.radiusM/t.heightM*a.h,u=e.createLinearGradient(0,a.y,0,a.y+a.h);u.addColorStop(0,xt(o.surfaceTop,ut.surfaceTop)),u.addColorStop(1,xt(o.surface,ut.surface)),xl(e,a.x,a.y,a.w,a.h,s),e.fillStyle=u,e.fill(),e.lineWidth=r*.03,e.strokeStyle=xt(o.edge,ut.edge),e.globalAlpha=ya.outlineOpacity,e.stroke(),e.globalAlpha=1,Qm(e,t,a);let c=t.chevronCount?a.w*(cn.chevron.widthRatio*t.chevronCount+cn.chevron.gapRatio*(t.chevronCount-1)+cn.chevron.insetRatio*1.5):0,l=t.turnSign<0?a.x+c:a.x,d=a.w-c,f=l+d/2,p=!!t.secondary,m=a.y+a.h/2,b=d*.9;Wn(e,t.primary,f,p?m-r*.105:m,{px:ct.primaryPx,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),stroke:"rgba(0,0,0,0.45)",maxWidth:b}),p&&Wn(e,t.secondary,f,m+r*.205,{px:ct.secondaryPx,weight:ct.secondaryWeight,color:o.inkMuted,stroke:"rgba(0,0,0,0.35)",maxWidth:b})}function Jm(e,t,n,r){let o=t.palette,i=n/2,a=r/2,s=cn.badgeFillRatio/2,u=n*s,c=r*s,l=Math.min(u,c)*.13;e.save(),e.translate(i,a),e.rotate(Math.PI/4);let d=Math.min(u,c)*Math.SQRT1_2*2;xl(e,-d/2,-d/2,d,d,l);let f=e.createLinearGradient(0,-d/2,0,d/2);f.addColorStop(0,xt(o.surfaceTop,ut.surfaceTop)),f.addColorStop(1,xt(o.surface,ut.surface)),e.fillStyle=f,e.fill(),e.lineWidth=d*.055,e.strokeStyle=xt(o.accent,ut.edge),e.stroke(),e.restore();let p=!!t.secondary,m=n*.62;Wn(e,t.primary,i,p?a-r*.075:a,{px:ct.primaryPx*.78,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),stroke:"rgba(255,255,255,0.30)",maxWidth:m}),p&&Wn(e,t.secondary,i,a+r*.155,{px:ct.secondaryPx*.86,weight:ct.secondaryWeight,color:o.inkMuted,maxWidth:m})}function eh(e,t,n,r){let o=t.palette,i=n/2,a=r/2,s=Math.min(n,r)*(cn.badgeFillRatio/2),u=s*.17;e.beginPath(),e.arc(i,a,s,0,Math.PI*2),e.fillStyle=xt(o.surface,ut.surface),e.fill(),e.beginPath(),e.arc(i,a,s-u/2,0,Math.PI*2),e.lineWidth=u,e.strokeStyle=xt(o.accent,ut.edge),e.stroke();let c=!!t.secondary,l=(s-u)*1.55;Wn(e,t.primary,i,c?a-r*.055:a,{px:ct.badgePx*1.55,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),maxWidth:l}),c&&Wn(e,t.secondary,i,a+r*.205,{px:ct.secondaryPx*.78,weight:ct.secondaryWeight,color:o.inkMuted,maxWidth:l})}function th(e,t,n,r){let o=t.palette,i=n/2,a=r*.42,s=Math.min(n,r)*(cn.badgeFillRatio/2)*.86;e.beginPath(),e.arc(i,a,s,0,Math.PI*2);let u=e.createRadialGradient(i,a-s*.4,s*.1,i,a,s);u.addColorStop(0,xt(o.surfaceTop,ut.surfaceTop)),u.addColorStop(1,xt(o.surface,ut.surface)),e.fillStyle=u,e.fill(),e.lineWidth=s*.12,e.strokeStyle=xt(o.edge,ut.edge),e.stroke();let c=s*1.45;Wn(e,t.primary,i,t.secondary?a-s*.18:a,{px:ct.primaryPx*.62,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),stroke:"rgba(0,0,0,0.35)",maxWidth:c}),t.secondary&&Wn(e,t.secondary,i,a+s*.44,{px:ct.secondaryPx*.9,weight:ct.secondaryWeight,color:o.inkMuted,maxWidth:c})}var mS=Object.freeze({[rt.BAR]:Zm,[rt.DIAMOND]:Jm,[rt.CIRCLE]:eh,[rt.PIN]:th});function ei(e){let t=Number(e);return!Number.isFinite(t)||t<0?"":t<1e3?`${Math.round(t/10)*10}m`:`${(t/1e3).toFixed(t>=1e4?0:1)}km`}var nh=Object.freeze({left:"좌회전",right:"우회전",slight_left:"좌측",slight_right:"우측",sharp_left:"급좌회전",sharp_right:"급우회전",uturn:"유턴",straight:"직진"});function ti(e={}){let t=ei(e.distanceM),n=e.turn||{},r=nh[n.direction]||"",o={distanceM:e.distanceM,phase:e.phase};if(e.kind===Ue.LANE_BAND){let a=An({...o,tone:Te.LANE,primary:t,secondary:"권장 차선",laneWidthM:Number(e.laneWidthM)||3.5});return Object.freeze({...a,kind:e.kind,laneOffsetM:Number(e.laneOffsetM)||0,surface:!0})}if(ha(e.kind)===lo.SURFACE)return null;let i=a=>a?Object.freeze({...a,kind:e.kind}):null;switch(e.kind){case"turn_gate":return i(An({...o,tone:Te.GUIDE,primary:t||r,secondary:[r,e.label].filter(Boolean).join(" · "),turnSign:n.sign}));case"commit_arrow":return i(An({...o,tone:Te.GUIDE,primary:r||"직진",secondary:"",turnSign:n.sign}));case"destination_pin":return i(An({...o,tone:Te.DESTINATION,primary:"도착",secondary:t}));case"caution_sign":return i(An({...o,tone:Te.CAUTION,primary:t,secondary:e.sdiFamily==="bump"?"과속방지턱":e.sdiFamily==="police"?"경찰":e.sdiFamily==="camera"?"단속카메라":"도로 주의"}));case"section_gate":return i(An({...o,tone:Te.RESTRICT,primary:String(e.limitKph||""),secondary:e.suspended?"구간단속 일시중지":`구간 평균 ${Math.round(e.averageKph||e.overallAverageKph||0)}`}));case"speed_sign":return i(An({...o,tone:Te.RESTRICT,primary:String(e.speedLimitKph||""),secondary:""}));case"signal_head":{let s=(Array.isArray(e.lamps)?e.lamps:[]).find(c=>c.on);if(!s)return null;let u={red:"정지",green:"직진",left:"좌회전",right:"우회전",uturn:"유턴"};return i(An({...o,tone:Te.CAUTION,primary:u[s.id]||"신호",secondary:s.remainSec>0||e.counterRemainSec>0?`${Math.round(s.remainSec||e.counterRemainSec)}초`:t}))}case"crossroad_card":return i(An({...o,tone:Te.GUIDE,primary:t,secondary:"교차로"}));default:return null}}var El="guidance:primary",rh="guidance:next",oh="guidance:commit";var ni=Object.freeze({pointToleranceM:12,pointClusterM:8,forwardResetM:35,promotionDistanceToleranceM:120,missingGraceTicks:4});function ri(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ma(e){return String(e?.source||"unknown")}function Tl(e){return e?.descriptor||e||{}}function oi(e){return String(e?.kind||Tl(e).kind||"unknown")}function Ol(e){let t=ri(e?.latitude),n=ri(e?.longitude);if(e?.pointValid!==!0||t===null||n===null)return null;let r=t*Math.PI/180;return Object.freeze({north:t*111320,east:n*111320*Math.cos(r)})}function ih(e,t=ni.pointClusterM){let n=Ol(e);if(!n)return"";let r=Math.max(1,ri(t)||ni.pointClusterM);return`${Math.round(n.north/r)},${Math.round(n.east/r)}`}function ah(e,t){return!e||!t?null:Math.hypot(e.north-t.north,e.east-t.east)}function Cl(e){let t=Tl(e);return String(e?.turn?.code??t?.turnCode??e?.sdiCode??e?.sdiFamily??t?.sdiFamily??e?.imageCode??t?.imageCode??e?.speedLimitKph??t?.speedLimitKph??e?.limitKph??t?.limitKph??e?.turnCode??"")}function sh(e){for(let t of[e?.stableEventId,e?.navigationEventId,e?.eventId]){let n=String(t??"").trim();if(n)return n}return""}function ch(e){return e==="guidanceCurrent"||e==="guidanceNext"}function lh(e){let t=Ma(e);return Object.freeze({source:t,slot:po(e),kind:oi(e),semantic:Cl(e),providedId:sh(e),point:Ol(e?.point),distanceM:ri(e?.distanceM),guidance:ch(t)})}function po(e={}){let t=Ma(e),n=oi(e);return t==="calibrationProbe"?El:t==="guidanceCurrent"?n==="commit_arrow"?oh:El:t==="guidanceNext"?rh:`${t}:${n}`}function mo(e={}){let t=Ma(e),n=ih(e?.point),r=Cl(e);return n&&(t==="guidanceCurrent"||t==="guidanceNext")?["guidance:event",oi(e),n,String(r)].join("|"):[po(e),t,oi(e),n,String(r)].join("|")}function uh(e,t,n){if(e.kind!==t.kind)return null;if(e.providedId||t.providedId)return e.providedId&&e.providedId===t.providedId?-1e3:null;let r=e.guidance&&t.guidance;if(!r&&e.slot!==t.slot)return null;let o=ah(e.point,t.point);if(o!==null){if(o>n.pointToleranceM)return null;let a=e.semantic===t.semantic?0:4,s=e.source===t.source?0:1;return o+a+s}if(e.semantic!==t.semantic)return null;let i=e.distanceM===null||t.distanceM===null?0:t.distanceM-e.distanceM;return e.slot===t.slot?i>n.forwardResetM?null:100+Math.abs(i):r&&e.source==="guidanceNext"&&t.source==="guidanceCurrent"&&Math.abs(i)<=n.promotionDistanceToleranceM?200+Math.abs(i):null}function Aa(e={}){let t=Object.freeze({...ni,...e.limits||{}}),n=null,r=0,o=0,i=new Map;function a(c=null){n=c===null?null:String(c||"legacy"),r=0,o=0,i=new Map}function s(c=[],l={}){let d=String(l.sessionId||"legacy");n!==d&&a(d),o+=1;let f=new Set,p=[];for(let m of Array.isArray(c)?c:[]){let b=lh(m),g=null,x=1/0;for(let O of i.values()){if(f.has(O.id))continue;let C=uh(O,b,t);C===null||C>=x||(g=O,x=C)}let E=b.providedId?`ar-event|${d}|${b.kind}|provided:${b.providedId}`:"",y=g?.id||E||`ar-event|${d}|${b.kind}|${++r}`;i.set(y,Object.freeze({...b,id:y,seenTick:o})),f.add(y),p.push(y)}for(let[m,b]of i)o-b.seenTick>t.missingGraceTicks&&i.delete(m);return Object.freeze(p)}function u(){return Object.freeze({sessionId:n,occurrenceCount:r,tracked:i.size,tick:o,limits:t})}return Object.freeze({assign:s,reset:a,status:u,limits:t})}var wl=111320,Rn=Object.freeze({maxRangeM:2e3,routeSlackRatio:1.2,routeSlackM:30,maxTangentSnapM:140,maxRouteStartSnapM:160,maneuverLookAheadM:12});function zt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Pn(e,t,n,r){let o=zt(e),i=zt(t),a=zt(n),s=zt(r);if(o===null||i===null||a===null||s===null)return null;let u=(a-o)*wl;return{east:(s-i)*wl*Math.cos(o*Math.PI/180),north:u}}function or(e,t,n){let r=zt(e),o=zt(t),i=zt(n);if(r===null||o===null||i===null)return null;let a=i*Math.PI/180,s=Math.sin(a),u=Math.cos(a);return{x:r*s+o*u,y:o*s-r*u,...Zo,coordinateFrame:Ae.ROUTE_FLU}}function Ra(e,t,n={}){if(!e||e.present===!1||!t||t.pointValid===!1)return null;let r=Pn(e.latitude,e.longitude,t.latitude,t.longitude);if(!r)return null;let o=zt(e.headingDeg);if(o===null)return null;let i=or(r.east,r.north,o);if(!i)return null;let a=Math.hypot(i.x,i.y);if(!(a>0)||a>Rn.maxRangeM)return null;let s=zt(n.routeDistanceM);if(s!==null&&s>0){let u=s*Rn.routeSlackRatio+Rn.routeSlackM;if(a>u)return null}return i.x<=0?null:Object.freeze({...i,rangeM:a})}function xa(e,t,n,r={}){if(!e||e.present===!1||!t||t.pointValid===!1||!Array.isArray(n)||n.length<2)return null;let o=zt(r.maxTangentSnapM)??Rn.maxTangentSnapM,i=Math.max(0,zt(r.lookAheadM)??0),a=[];for(let l of n){let d=Pn(t.latitude,t.longitude,l?.latitude,l?.longitude),f=d&&or(d.east,d.north,e.headingDeg);f&&a.push(f)}if(a.length<2)return null;let s=null;for(let l=1;l.01))continue;let g=Math.max(0,Math.min(1,-(d.x*p+d.y*m)/b)),x=d.x+p*g,E=d.y+m*g,y=Math.hypot(x,E);s&&y>=s.distanceM||(s={distanceM:y,headingRad:Math.atan2(m,p),index:l,x,y:E})}if(!s||s.distanceM>o)return null;if(!(i>0))return s.headingRad;let u=i,c={x:s.x,y:s.y};for(let l=s.index;l.01){if(u<=m){let b=u/m,g=c.x+f*b,x=c.y+p*b;return Math.atan2(x-s.y,g-s.x)}u-=m}c=d}return s.headingRad}function dh(e,t){return e&&e.routePointCount===t&&Number.isInteger(e.index)&&e.index>0&&e.index.01)||i<-Math.sqrt(s)*.25)continue;let u=Math.max(0,Math.min(1,-(r.x*i+r.y*a)/s)),c=r.x+i*u,l=r.y+a*u,d=Math.hypot(c,l);(!t||d.01){if(r<=c){let l=r/c,d=o.x+s*l,f=o.y+u*l,p=Math.hypot(d,f);return!(d>0)||p>Rn.maxRangeM?null:Object.freeze({x:d,y:f,...Zo,rangeM:p,headingRad:Math.atan2(u,s),routeStartIndex:t.index,routeAlongTrackM:zt(t.alongTrackM),routeDerived:!0,coordinateFrame:Ae.ROUTE_FLU})}r-=c}o=a}return null}function Ir(e,t,n,r={}){if(!e||e.present===!1||!Array.isArray(t)||t.length<2)return null;let o=zt(n);if(o===null||!(o>0)||o>Rn.maxRangeM)return null;let i=[];for(let u of t){let c=Pn(e.latitude,e.longitude,u?.latitude,u?.longitude),l=c&&or(c.east,c.north,e.headingDeg);l&&i.push(l)}if(i.length<2)return null;let a=zt(r.maxRouteStartSnapM)??Rn.maxRouteStartSnapM,s=[dh(r.routeMatch,i.length),fh(i)];for(let u of s){if(!u||u.snapDistanceM>a)continue;let c=ph(i,u,o);if(c)return c}return null}var Ll=Object.freeze({maxIntegrationStepMs:250,maxLivePoseAgeMs:180,maxOrientationStdRad:.35,maxOrientationInnovationRad:.45,orientationCorrectionGain:.08,maxVelocityStdMps:5,maxVelocityInnovationMps:8,velocityFusionGain:.35,maxAngularVelocityStdRadps:.5,maxAngularVelocityInnovationRadps:.7,angularVelocityFusionGain:.35,maxAccelerationStdMps2:8,maxAccelerationMps2:20,maxGeoPositionSigmaM:25,maxGeoPositionInnovationM:25,geoPositionCorrectionGain:.25,maxGeoPositionCorrectionM:3,maxGeoPositionStepM:.25,maxGeoHeadingSigmaDeg:25,maxGeoYawInnovationRad:35*Math.PI/180,geoYawCorrectionGain:.2,maxGeoYawCorrectionRad:4*Math.PI/180,maxGeoYawStepRad:.5*Math.PI/180}),Ea=Object.freeze([1,0,0,0]),ho=Object.freeze([0,0,0]),kl=1e6;function Ln(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function jt(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function Ta(e){if(!Array.isArray(e)||e.length<4)return null;let t=e.slice(0,4).map(Number);return t.every(Number.isFinite)?t:null}function dt(e){let t=Ta(e);if(!t)return null;let n=Math.hypot(...t);if(!(n>0))return null;let r=t.map(o=>o/n);return r[0]<0?Object.freeze(r.map(o=>-o)):Object.freeze(r)}function ir(e,t){let n=Ta(e),r=Ta(t);if(!n||!r)return null;let[o,i,a,s]=n,[u,c,l,d]=r;return dt([o*u-i*c-a*l-s*d,o*c+i*u+a*d-s*l,o*l-i*d+a*u+s*c,o*d+i*l-a*c+s*u])}function mh(e){let t=jt(e);if(!t)return null;let[n,r,o]=t,i=Math.cos(n/2),a=Math.sin(n/2),s=Math.cos(r/2),u=Math.sin(r/2),c=Math.cos(o/2),l=Math.sin(o/2);return dt([i*s*c+a*u*l,a*s*c-i*u*l,i*u*c+a*s*l,i*s*l-a*u*c])}function Il(e){let t=dt(e);return t?Object.freeze([t[0],-t[1],-t[2],-t[3]]):null}function hh(e,t,n){let r=dt(e),o=dt(t);if(!r||!o)return null;let i=Math.max(0,Math.min(1,Ln(n,0))),a=r.reduce((d,f,p)=>d+f*o[p],0);if(a<0&&(o=o.map(d=>-d),a=-a),a>.9995)return dt(r.map((d,f)=>d+(o[f]-d)*i));let s=Math.acos(Math.max(-1,Math.min(1,a))),u=Math.sin(s),c=Math.sin((1-i)*s)/u,l=Math.sin(i*s)/u;return dt(r.map((d,f)=>d*c+o[f]*l))}function gh(e,t){let n=dt(e),r=dt(t);if(!n||!r)return null;let o=Math.abs(n.reduce((i,a,s)=>i+a*r[s],0));return 2*Math.acos(Math.max(-1,Math.min(1,o)))}function ii(e,t){if(!e||e.valid!==!0)return null;let n=jt([e.x,e.y,e.z]),r=jt([e.xStd,e.yStd,e.zStd]);return!n||!r||r.some(o=>o<0||o>t)?null:Object.freeze({value:n,std:r,worstStd:Math.max(...r)})}function _l(e,t){return Math.hypot(...e.map((n,r)=>n-t[r]))}function Oa(e,t,n){return Math.min(n,Math.max(t,e))}function Nl(e){return Math.atan2(Math.sin(e),Math.cos(e))}function bh(e){let t=dt(e);if(!t)return null;let[n,r,o,i]=t;return Object.freeze([Math.atan2(2*(n*r+o*i),1-2*(r*r+o*o)),Math.asin(Oa(2*(n*o-i*r),-1,1)),Math.atan2(2*(n*i+r*o),1-2*(o*o+i*i))])}function Dl(e,t,n){return Object.freeze(e.map((r,o)=>r+(t[o]-r)*n))}function Fl(e,t,n){let r=Ln(e?.timestamp,null);return r!==null&&r>0&&Math.abs(t-r)/kl<=n.maxLivePoseAgeMs}function Pl(e,t,n,r){let o=jt(e?.trans),i=jt(e?.rot),a=t?.inputsOK===!0&&t?.posenetOK===!0&&t?.sensorsOK!==!1&&Fl(t,n,r),s=a?ii(t.velocityDevice,r.maxVelocityStdMps):null,u=a?ii(t.angularVelocityDevice,r.maxAngularVelocityStdRadps):null,c=a?ii(t.accelerationDevice,r.maxAccelerationStdMps2):null,l=o&&s?_l(o,s.value):null,d=i&&u?_l(i,u.value):null,f=c?Math.hypot(...c.value):null,p=l!==null&&l<=r.maxVelocityInnovationMps,m=d!==null&&d<=r.maxAngularVelocityInnovationRadps,b=f!==null&&f<=r.maxAccelerationMps2;return Object.freeze({velocity:p?Dl(o,s.value,r.velocityFusionGain):o,angularVelocity:m?Dl(i,u.value,r.angularVelocityFusionGain):i,velocityAccepted:p,angularAccepted:m,accelerationAccepted:b,velocityInnovationMps:l,angularInnovationRadps:d,accelerationMagnitudeMps2:f,livePoseFresh:a})}function ai(e){let t=jt(e);if(!t)return null;let n=Math.hypot(...t);if(n<1e-12)return Ea;let r=n/2,o=Math.sin(r)/n;return dt([Math.cos(r),t[0]*o,t[1]*o,t[2]*o])}function ln(e,t){let n=dt(e),r=jt(t);if(!n||!r)return null;let[o,i,a,s]=n,[u,c,l]=r,d=2*(a*l-s*c),f=2*(s*u-i*l),p=2*(i*c-a*u);return Object.freeze([u+o*d+(a*p-s*f),c+o*f+(s*d-i*p),l+o*p+(i*f-a*d)])}function zl(e){let t=dt(e);if(!t)return null;let[n,r,o,i]=t;return Object.freeze([Object.freeze([1-2*(o*o+i*i),2*(r*o-i*n),2*(r*i+o*n)]),Object.freeze([2*(r*o+i*n),1-2*(r*r+i*i),2*(o*i-r*n)]),Object.freeze([2*(r*i-o*n),2*(o*i+r*n),1-2*(r*r+o*o)])])}function jl(e,t){let n=jt(e),r=zl(t);return!n||!r?null:Object.freeze([r[0][0],r[0][1],r[0][2],n[0],r[1][0],r[1][1],r[1][2],n[1],r[2][0],r[2][1],r[2][2],n[2],0,0,0,1])}function Ca(e,t){let n=jt(t),r=jt(e?.position),o=ln(e?.orientation,n);return!n||!r||!o?null:Object.freeze(o.map((i,a)=>i+r[a]))}function wa(e,t){let n=jt(t),r=jt(e?.position),o=dt(e?.orientation);if(!n||!r||!o)return null;let i=n.map((a,s)=>a-r[s]);return ln([o[0],-o[1],-o[2],-o[3]],i)}function xn(e,t={}){let n=Object.freeze([...e.position]),r=Object.freeze([...e.orientation]);return Object.freeze({epoch:e.epoch,initialized:e.timestampNs!==null,timestampNs:e.timestampNs,position:n,orientation:r,matrixWorldFromDevice:jl(n,r),worldCoordinateFrame:Ae.LOCAL_WORLD_DEVICE,deviceCoordinateFrame:Ae.DEVICE_FRD,samples:e.samples,integrations:e.integrations,skippedGaps:e.skippedGaps,fusion:Object.freeze({...e.fusion}),geoCorrection:Object.freeze({...e.geoCorrection,pendingPosition:Object.freeze([...e.geoPendingPosition])}),...t})}function Ia(e={}){let t=Object.freeze({...Ll,...e.limits||{}}),n={epoch:String(e.epoch||"uninitialized"),timestampNs:null,position:[...ho],orientation:[...Ea],samples:0,integrations:0,skippedGaps:0,worldFromNed:null,lastLivePoseTimestampNs:null,fusion:{orientationReferenceReady:!1,orientationAccepted:0,orientationRejected:0,velocityAccepted:0,angularVelocityAccepted:0,accelerationAccepted:0,lastOrientationInnovationRad:null,lastVelocityInnovationMps:null,lastAngularInnovationRadps:null,lastAccelerationMagnitudeMps2:null,lastLivePoseFresh:!1,lastReason:"not observed"},geoReference:null,geoLastObservationKey:null,geoPendingPosition:[...ho],geoPendingYawRad:0,geoCorrection:{referenceReady:!1,accepted:0,rejected:0,yawAccepted:0,yawRejected:0,appliedFrames:0,lastPositionInnovationM:null,lastYawInnovationRad:null,lastPositionSigmaM:null,lastHeadingSigmaDeg:null,pendingYawRad:0,lastReason:"not observed"}},r=xn(n,{accepted:!1,reason:"not initialized",dtMs:null});function o(l={}){return n.epoch=String(l.epoch||"uninitialized"),n.timestampNs=null,n.position=[...ho],n.orientation=[...Ea],n.samples=0,n.integrations=0,n.skippedGaps=0,n.worldFromNed=null,n.lastLivePoseTimestampNs=null,n.fusion={orientationReferenceReady:!1,orientationAccepted:0,orientationRejected:0,velocityAccepted:0,angularVelocityAccepted:0,accelerationAccepted:0,lastOrientationInnovationRad:null,lastVelocityInnovationMps:null,lastAngularInnovationRadps:null,lastAccelerationMagnitudeMps2:null,lastLivePoseFresh:!1,lastReason:"reset"},n.geoReference=null,n.geoLastObservationKey=null,n.geoPendingPosition=[...ho],n.geoPendingYawRad=0,n.geoCorrection={referenceReady:!1,accepted:0,rejected:0,yawAccepted:0,yawRejected:0,appliedFrames:0,lastPositionInnovationM:null,lastYawInnovationRad:null,lastPositionSigmaM:null,lastHeadingSigmaDeg:null,pendingYawRad:0,lastReason:"reset"},r=xn(n,{accepted:!1,reason:String(l.reason||"reset"),dtMs:null}),r}function i(l,d){let f=Ln(l?.timestamp,null),p=l?.inputsOK===!0&&l?.posenetOK===!0&&l?.sensorsOK!==!1&&Fl(l,d,t),m=p?ii(l.orientationNED,t.maxOrientationStdRad):null;if(!m)return n.fusion.lastReason=p?"orientation invalid/std rejected":"livePose stale/state rejected",!1;if(f===n.lastLivePoseTimestampNs)return n.fusion.lastReason="livePose sample already fused",!1;n.lastLivePoseTimestampNs=f;let b=mh(m.value);if(!b)return n.fusion.orientationRejected+=1,n.fusion.lastReason="orientation conversion failed",!1;if(!n.worldFromNed)return n.worldFromNed=ir(n.orientation,Il(b)),n.fusion.orientationReferenceReady=!0,n.fusion.lastReason="livePose NED reference initialized",!1;let g=ir(n.worldFromNed,b),x=gh(n.orientation,g);if(n.fusion.lastOrientationInnovationRad=x,x===null||x>t.maxOrientationInnovationRad)return n.fusion.orientationRejected+=1,n.fusion.lastReason="orientation innovation rejected",!1;let E=t.orientationCorrectionGain/(1+m.worstStd*8),y=hh(n.orientation,g,E);return y?(n.orientation=[...y],n.fusion.orientationAccepted+=1,n.fusion.lastReason="livePose orientation corrected",!0):(n.fusion.orientationRejected+=1,n.fusion.lastReason="orientation correction failed",!1)}function a(){let l=Math.hypot(...n.geoPendingPosition),d=!1;if(l>1e-6){let p=Math.min(l,t.maxGeoPositionStepM)/l,m=n.geoPendingPosition.map(b=>b*p);n.position=n.position.map((b,g)=>b+m[g]),n.geoPendingPosition=n.geoPendingPosition.map((b,g)=>b-m[g]),d=!0}if(Math.abs(n.geoPendingYawRad)>1e-8){let f=Oa(n.geoPendingYawRad,-t.maxGeoYawStepRad,t.maxGeoYawStepRad),p=ir(n.orientation,ai([0,0,f]));p&&(n.orientation=[...p]),n.geoPendingYawRad-=f,d=!0}n.geoCorrection.pendingYawRad=n.geoPendingYawRad,d&&(n.geoCorrection.appliedFrames+=1)}function s(l){let d=String(l?.key||"");if(!(d&&d!==n.geoLastObservationKey))return a(),!1;n.geoLastObservationKey=d;let p=Ln(l?.latitude,null),m=Ln(l?.longitude,null),b=Ln(l?.headingDeg,null),g=Ln(l?.positionSigmaM,null),x=Ln(l?.headingSigmaDeg,null);if(n.geoCorrection.lastPositionSigmaM=g,n.geoCorrection.lastHeadingSigmaDeg=x,l?.valid!==!0||p===null||m===null||b===null||g===null||g<0||g>t.maxGeoPositionSigmaM)return n.geoCorrection.rejected+=1,n.geoCorrection.lastReason=l?.valid===!0?"geographic covariance rejected":"geographic quality gate rejected",a(),!1;if(!n.geoReference)return n.geoReference=Object.freeze({latitude:p,longitude:m,headingDeg:b,position:Object.freeze([...n.position]),orientation:Object.freeze([...n.orientation])}),n.geoCorrection.referenceReady=!0,n.geoCorrection.lastReason="geographic reference initialized",a(),!1;let E=Pn(n.geoReference.latitude,n.geoReference.longitude,p,m),y=E&&or(E.east,E.north,n.geoReference.headingDeg),O=y?Mn([y.x,y.y,y.z]):null,C=O?ln(n.geoReference.orientation,O):null;if(!C)return n.geoCorrection.rejected+=1,n.geoCorrection.lastReason="geographic frame conversion failed",a(),!1;let z=n.geoReference.position.map((R,v)=>R+C[v]).map((R,v)=>R-n.position[v]),M=Math.hypot(...z);if(n.geoCorrection.lastPositionInnovationM=M,M>t.maxGeoPositionInnovationM)n.geoCorrection.rejected+=1,n.geoPendingPosition=[...ho],n.geoCorrection.lastReason="geographic position innovation rejected";else{let R=1/(1+g/5),v=Math.min(t.maxGeoPositionCorrectionM,M*t.geoPositionCorrectionGain*R),h=M>1e-9?v/M:0;n.geoPendingPosition=z.map(S=>S*h),n.geoCorrection.accepted+=1,n.geoCorrection.lastReason="geographic position correction accepted"}if(l?.yawUsable===!0&&x!==null&&x>=0&&x<=t.maxGeoHeadingSigmaDeg){let R=Il(n.geoReference.orientation),v=ir(R,n.orientation),h=bh(v),S=Nl((b-n.geoReference.headingDeg)*Math.PI/180),A=h?Nl(S-h[2]):null;if(n.geoCorrection.lastYawInnovationRad=A,A!==null&&Math.abs(A)<=t.maxGeoYawInnovationRad){let L=1/(1+x/10);n.geoPendingYawRad=Oa(A*t.geoYawCorrectionGain*L,-t.maxGeoYawCorrectionRad,t.maxGeoYawCorrectionRad),n.geoCorrection.yawAccepted+=1}else n.geoPendingYawRad=0,n.geoCorrection.yawRejected+=1,n.geoCorrection.lastReason="geographic yaw innovation rejected"}else n.geoPendingYawRad=0,n.geoCorrection.lastYawInnovationRad=null;return a(),!0}function u(l={}){let d=l.odometry;if(!d)return r=xn(n,{accepted:!1,reason:"odometry missing",dtMs:null}),r;Er(d,Ae.DEVICE_FRD,"world pose odometry");let f=Ln(l.timestampNs??d.targetTimestampNs,null),p=jt(d.trans),m=jt(d.rot);if(!p||!m||f===null||f<=0)return r=xn(n,{accepted:!1,reason:"invalid pose sample",dtMs:null}),r;if(n.timestampNs===null){n.timestampNs=f,n.samples+=1;let R=Pl(d,l.livePose,f,t);return n.fusion.lastLivePoseFresh=R.livePoseFresh,n.fusion.lastVelocityInnovationMps=R.velocityInnovationMps,n.fusion.lastAngularInnovationRadps=R.angularInnovationRadps,n.fusion.lastAccelerationMagnitudeMps2=R.accelerationMagnitudeMps2,i(l.livePose,f),s(l.geographicObservation),r=xn(n,{accepted:!0,reason:"origin initialized",dtMs:0}),r}let b=(f-n.timestampNs)/kl;if(b<0)return r=xn(n,{accepted:!1,reason:"timestamp regression",dtMs:b}),r;if(b===0)return r=xn(n,{accepted:!0,reason:"same presented frame",dtMs:0}),r;if(n.timestampNs=f,n.samples+=1,b>t.maxIntegrationStepMs||l.trackingState==="lost")return n.skippedGaps+=1,r=xn(n,{accepted:!1,reason:l.trackingState==="lost"?"tracking lost — integration skipped":`integration gap ${Math.round(b)}ms`,dtMs:b}),r;let g=Pl(d,l.livePose,f,t),x=g.velocity||p,E=g.angularVelocity||m;n.fusion.lastLivePoseFresh=g.livePoseFresh,n.fusion.lastVelocityInnovationMps=g.velocityInnovationMps,n.fusion.lastAngularInnovationRadps=g.angularInnovationRadps,n.fusion.lastAccelerationMagnitudeMps2=g.accelerationMagnitudeMps2,g.velocityAccepted&&(n.fusion.velocityAccepted+=1),g.angularAccepted&&(n.fusion.angularVelocityAccepted+=1),g.accelerationAccepted&&(n.fusion.accelerationAccepted+=1);let y=b/1e3,O=ai(E.map(R=>R*y)),C=ai(E.map(R=>R*y*.5)),w=ir(n.orientation,C),z=ln(w,x.map(R=>R*y)),M=ir(n.orientation,O);return!z||!M?(r=xn(n,{accepted:!1,reason:"SE(3) integration failed",dtMs:b}),r):(n.position=n.position.map((R,v)=>R+z[v]),n.orientation=[...M],i(l.livePose,f),s(l.geographicObservation),n.integrations+=1,r=xn(n,{accepted:!0,reason:"integrated",dtMs:b}),r)}function c(){return r}return Object.freeze({update:u,reset:o,status:c,limits:t})}function si(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function go(e){return Object.freeze([...e])}function ci(e,t){let n=dt(e?.orientation);return n?ln([n[0],-n[1],-n[2],-n[3]],t):null}function _r(e){return e?.initialized===!0&&e.worldCoordinateFrame===Ae.LOCAL_WORLD_DEVICE&&e.deviceCoordinateFrame===Ae.DEVICE_FRD&&Array.isArray(e.position)&&Array.isArray(e.orientation)&&!!dt(e.orientation)}function _a(e,t){if(!e||!_r(t))return null;let n=[si(e.x),si(e.y),si(e.z)];if(n.some(f=>f===null))return null;let r=Mn(n),o=Ca(t,r),i=Sn(e),a=ll(e),s=ln(t.orientation,Mn(i.forward)),u=ln(t.orientation,Mn(i.up)),c=Array.isArray(e.faceForward)||Array.isArray(e.faceUp),l=c?ln(t.orientation,Mn(a.forward)):null,d=c?ln(t.orientation,Mn(a.up)):null;return!o||!s||!u?null:Object.freeze({coordinateFrame:Ae.LOCAL_WORLD_DEVICE,epoch:String(t.epoch||"uninitialized"),position:go(o),roadForward:go(s),roadUp:go(u),...l&&d?{faceForward:go(l),faceUp:go(d)}:{},createdAtTimestampNs:si(t.timestampNs)})}function Na(e,t,n={}){if(!e||!_r(t)||e.coordinateFrame!==Ae.LOCAL_WORLD_DEVICE||String(e.epoch)!==String(t.epoch))return null;let r=wa(t,e.position),o=ci(t,e.roadForward),i=ci(t,e.roadUp);if(!r||!o||!i)return null;let a=Dn(r),s=Dn(o),u=Dn(i),c=Ft({forward:s,up:u}),l={};if(e.faceForward&&e.faceUp){let d=ci(t,e.faceForward),f=ci(t,e.faceUp);d&&f&&(l=ul({forward:Dn(d),up:Dn(f)}))}return Object.freeze({...n,x:a[0],y:a[1],z:a[2],...c,...l,coordinateFrame:Ae.ROUTE_FLU})}var Nr=Object.freeze({durationMs:1200,maxPositionInnovationM:10,maxOrientationInnovationRad:Math.PI/3});function ar(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function Hl(e,t,n){return Math.min(n,Math.max(t,e))}function yo(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function Vl(e){let t=yo(e),n=t?Math.hypot(...t):0;return n>1e-9?t.map(r=>r/n):null}function yh(e,t){let n=Vl(e),r=Vl(t);if(!n||!r)return 1/0;let o=Hl(n.reduce((i,a,s)=>i+a*r[s],0),-1,1);return Math.acos(o)}function vh(e,t){let n=yo(e),r=yo(t);return n&&r?Math.hypot(...n.map((o,i)=>r[i]-o)):1/0}function bo(e){return Object.freeze([...e])}function vo(e,t){if(!e)return 1;let n=Math.max(1,ar(e.durationMs,Nr.durationMs));return Hl((ar(t,e.startedAtMs)-e.startedAtMs)/n,0,1)}function Da(e,t,n,r={}){let o=Object.freeze({...Nr,...r.policy||{}}),i=vh(e?.position,t?.position),a=yh(e?.roadForward,t?.roadForward),s=e?.coordinateFrame&&e.coordinateFrame===t?.coordinateFrame,u=e?.epoch!==void 0&&String(e.epoch)===String(t?.epoch),c="";s?u?i>o.maxPositionInnovationM?c="position-innovation-rejected":a>o.maxOrientationInnovationRad&&(c="orientation-innovation-rejected"):c="world-epoch-mismatch":c="coordinate-frame-mismatch";let l=Object.freeze({positionInnovationM:i,orientationInnovationRad:a,lateralInnovationM:ar(r.lateralInnovationM,0),heightInnovationM:ar(r.heightInnovationM,0)});return Object.freeze(c?{accepted:!1,reason:c,...l}:{accepted:!0,reason:"",...l,transition:Object.freeze({from:e,to:t,startedAtMs:ar(n,0),durationMs:Math.max(1,ar(o.durationMs,Nr.durationMs)),...l})})}function Pa(e,t){if(!e?.from||!e?.to)return null;let n=vo(e,t);if(n<=0)return e.from;if(n>=1)return e.to;let r=n*n*(3-2*n),o=(u,c)=>{let l=yo(u),d=yo(c);return l&&d?l.map((f,p)=>f+(d[p]-f)*r):null},i=qo({forward:e.from.roadForward,up:e.from.roadUp},{forward:e.to.roadForward,up:e.to.roadUp},r),s=e.from.faceForward&&e.from.faceUp&&e.to.faceForward&&e.to.faceUp?qo({forward:e.from.faceForward,up:e.from.faceUp},{forward:e.to.faceForward,up:e.to.faceUp},r):null;return Object.freeze({coordinateFrame:e.from.coordinateFrame,epoch:e.from.epoch,position:bo(o(e.from.position,e.to.position)),roadForward:bo(i.forward),roadUp:bo(i.up),...s?{faceForward:bo(s.forward),faceUp:bo(s.up)}:{},createdAtTimestampNs:ar(e.to.createdAtTimestampNs,e.from.createdAtTimestampNs)})}function li(e,t,n="blending"){return e?Object.freeze({state:n,progress:n==="complete"?1:vo(e,t),durationMs:e.durationMs,positionInnovationM:e.positionInnovationM,orientationInnovationRad:e.orientationInnovationRad,lateralInnovationM:e.lateralInnovationM,heightInnovationM:e.heightInnovationM}):null}var _e=Object.freeze({GEO_PATH:"geo+path",GEO_ONLY:"geo-only",PATH_ONLY:"path-only",HELD:"held",SURFACE:"surface",WORLD:"world-anchor"}),Fa=Object.freeze({...la,maxUntrackedHoldMs:1e3,eventForwardJumpM:35,unresolvedGraceMs:3500,unresolvedGraceFixes:8,maxCreationPositionInnovationM:15,maxCreationYawInnovationRad:12*Math.PI/180}),ui=Object.freeze({ACTIVE:"active",ACTIVE_UNRESOLVED:"active-unresolved"});function me(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function La(e,t){let n=me(e);return n===null?"":n.toFixed(t)}function Sh(e,t=Fa,n={}){if(n.trackingState==="lost"||n.trackingState==="initializing")return Object.freeze({accepted:!1,reason:"pose-propagation-settling"});if(!_r(e))return Object.freeze({accepted:!0,reason:"not-applicable"});let r=e.geoCorrection;if(!r)return Object.freeze({accepted:!0,reason:"not-required"});if(r.referenceReady!==!0)return Object.freeze({accepted:!1,reason:"geo-reference-unavailable"});if(me(r.accepted,0)<1)return Object.freeze({accepted:!1,reason:"geo-reference-settling"});let o=me(r.lastPositionInnovationM);if(o!==null&&o>t.maxCreationPositionInnovationM)return Object.freeze({accepted:!1,reason:"geo-position-settling",positionInnovationM:o});let i=me(r.lastYawInnovationRad);return i!==null&&Math.abs(i)>t.maxCreationYawInnovationRad?Object.freeze({accepted:!1,reason:"geo-yaw-settling",yawInnovationRad:i}):Object.freeze({accepted:!0,reason:"stable",positionInnovationM:o,yawInnovationRad:i})}function Bl(e){if(!e)return null;let t=String(e.sessionId||""),n=me(e.generation,0),r=String(n),o=me(e.publishMonoTimeNanos,0);if(t||n>0||o>0)return`${t}|${r}|${o}`;let i=e.vehicle||{},a=e.guidanceCurrent||{},s=e.guidanceNext||{},u=e.speed||{};return[La(i.latitude,7),La(i.longitude,7),La(i.headingDeg,2),a.present===!1?0:1,me(a.turnType,0),me(a.distanceM,0),s.present===!1?0:1,me(s.turnType,0),me(s.distanceM,0),me(u.sdiType,-1),me(u.sdiDistanceM,0)].join("|")}function Gl(e){if(!e)return null;let t=String(e.sessionId||"");return t?`session:${t}`:"legacy"}function ka(e){return e?.markerId?String(e.markerId):e?.eventKey?String(e.eventKey):mo(e)}function Dr(e){return e?.descriptor?.surface===!0}function Mh(e,t){return Dr(e)?_e.SURFACE:t?e.placedBy==="geo"?_e.GEO_PATH:_e.PATH_ONLY:_e.HELD}function Wl(e,t,n={}){if(!e?.anchor)return null;let r=Dr(e)?me(e.distanceM,me(e.anchor.x)):me(e.anchor.x);if(r===null||r<0)return null;let o=co(t,r);if(!o)return null;let i=me(e.roadOffsetM),a=me(e.lateralCorrectionM,0);if(i===null||n.captureOffset===!0){let c=pa(e.anchor.y,o.y,{enabled:e.placedBy==="geo"&&e.anchor.routeDerived===!0});a=c.correctionM,i=Dr(e)?0:c.y-me(o.y,0)}let s=Sn(o),u=e.placedBy==="geo"?sn(me(e.anchor.headingRad,o.headingRad),Math.atan2(s.forward[2],Math.hypot(s.forward[0],s.forward[1]))):s;return{...e,roadOffsetM:i,lateralCorrectionM:a,sourceMode:Mh(e,!0),anchor:Object.freeze({...e.anchor,...o,y:me(o.y,0)+i,z:me(o.z,0),lateralCorrectionM:a,...Ft(u)}),driftM:0}}function Ah(e,t,n){if(!e?.anchor)return null;let r={...e,anchorKey:ka(e),lifecycleState:ui.ACTIVE,unresolvedSinceMs:null,unresolvedFixes:0,roadOffsetM:null,sourceMode:e.placedBy==="geo"?_e.GEO_ONLY:_e.PATH_ONLY,driftM:0},o=Wl(r,t,{captureOffset:!0})||r,i=_a(o.anchor,n);return i?{...o,worldAnchor:i}:o}function Rh(e,t,n,r,o){if(e?.placedBy!=="geo"||e.sourceMode!==_e.GEO_ONLY||t?.sourceMode!==_e.GEO_PATH||!e.worldAnchor||!t.worldAnchor||!_r(r))return null;let i=Na(e.worldAnchor,r,e.anchor);if(!i)return null;let a=e.anchor?.routeDerived!==!0&&t.anchor?.routeDerived!==!0,s=Sn(t.anchor),u=sn(me(i.headingRad,me(e.anchor?.headingRad,0)),Math.atan2(s.forward[2],Math.hypot(s.forward[0],s.forward[1]))),c=a?Object.freeze({...t.anchor,x:me(i.x,me(e.anchor?.x,0)),y:me(i.y,me(e.anchor?.y,0)),z:me(t.anchor.z,me(i.z,0)),...Ft(u)}):t.anchor,l=a?_a(c,r):t.worldAnchor;if(!l)return null;let d=Da(e.worldAnchor,l,n,{policy:o,lateralInnovationM:me(t.anchor.y,0)-me(i?.y,0),heightInnovationM:me(t.anchor.z,0)-me(i?.z,0)});return d.accepted?Object.freeze({accepted:!0,transition:Object.freeze({...d.transition,targetAnchor:c,targetSourceMode:t.sourceMode})}):Object.freeze({accepted:!1,diagnostic:Object.freeze({state:"rejected",reason:d.reason,positionInnovationM:d.positionInnovationM,orientationInnovationRad:d.orientationInnovationRad,lateralInnovationM:d.lateralInnovationM,heightInnovationM:d.heightInnovationM})})}function xh(e,t,n,r,o,i){if(!e?.anchor||!t?.anchor)return t;let a=me(e.anchor.x,e.distanceM),s=me(t.anchor.x,t.distanceM);if((a===null||s===null?0:s-a)>n.eventForwardJumpM)return t;if(!e.handoff){let c=Rh(e,t,r,o,i);if(c?.accepted)return{...t,placedBy:e.placedBy,sourceMode:e.sourceMode,anchor:Object.freeze({...e.anchor}),worldAnchor:e.worldAnchor,handoff:c.transition,handoffDiagnostic:null,driftM:e.driftM};c&&(t={...t,handoffDiagnostic:c.diagnostic})}return{...t,placedBy:e.placedBy,roadOffsetM:e.roadOffsetM,lateralCorrectionM:e.lateralCorrectionM,sourceMode:e.sourceMode,anchor:Object.freeze({...e.anchor}),...e.worldAnchor?{worldAnchor:e.worldAnchor}:{},...e.handoff?{handoff:e.handoff}:{},handoffDiagnostic:e.handoffDiagnostic||t.handoffDiagnostic||null,driftM:e.driftM}}function Eh(e,t){return e.map(n=>{let r=n.handoff;return!r||vo(r,t)<1?n:{...n,anchor:r.targetAnchor,worldAnchor:r.to,sourceMode:r.targetSourceMode,handoff:null,handoffDiagnostic:li(r,t,"complete")}})}function Th(e,t,n,r,o=!1){let i=n===null?0:Math.max(0,t-n);return e.map(a=>{let s=a.handoff?Pa(a.handoff,t):a.worldAnchor,u=a.handoff?.targetAnchor||a.anchor,l=(!o&&s?Na(s,r,u):null)||a.anchor,d=Dr(a)?me(a.distanceM,0):Math.max(0,me(l?.x,a.distanceM)||0),f=a.source==="calibrationProbe"?Object.freeze({...a.descriptor,primary:ei(d)}):a.descriptor;return Object.freeze({...a,worldAnchor:s,handoff:a.handoff?li(a.handoff,t):a.handoffDiagnostic||null,anchor:l,descriptor:f,distanceM:d,anchorAgeMs:Math.round(i)})})}function za(e={}){let t=Object.freeze({...Fa,...e.limits||{}}),n=Object.freeze({...Nr,...e.handoffPolicy||{}}),r=typeof e.bypassWorldAnchor=="function"?()=>e.bypassWorldAnchor()===!0:(()=>{let M=e.bypassWorldAnchor===!0;return()=>M})(),o=[],i=null,a=null,s=null,u=null,c=0,l=0,d=vt.DROPPED,f=null,p=!1,m=null,b=null,g=0,x=null,E="아직 유효한 앵커 없음";function y(M="초기화됨"){o=[],i=null,a=null,s=null,u=null,c=0,l=0,d=vt.DROPPED,f=null,p=!1,m=null,b=null,g=0,x=null,E=M}function O(M){return{state:d,anchors:o.length?Th(o,M,u,m,r()):null,holdMs:c,driftM:l,sourceMode:f,fixId:i,sourceId:a,fixAgeMs:u===null?null:Math.max(0,M-u),reason:E}}function C(M,R,v,h,S,A,L,P){let _=L?new Map(o.map(D=>[D.anchorKey,D])):new Map,T=new Map((Array.isArray(R)?R:[]).map(D=>[ka(D),D]).filter(([D])=>!!D)),I=[],k=new Set;g=0,x=null;for(let D=0;Dt.eventForwardJumpM)&&B?.placedBy==="geo"&&!Dr(B)){let K=Sh(m,t,P);if(!K.accepted){k.add(W),g+=1,x=K.reason;continue}}let $=Ah(B,A,m);$&&(k.add($.anchorKey),I.push(xh(V,$,t,S,m,n)))}for(let[D,B]of T){if(k.has(D))continue;let W=_.get(D);if(!W)continue;let V=W.unresolvedSinceMs===null||W.unresolvedSinceMs===void 0?S:me(W.unresolvedSinceMs,S),F=Math.max(0,me(W.unresolvedFixes,0))+1;S-V>t.unresolvedGraceMs||F>t.unresolvedGraceFixes||I.push({...W,source:B.source||W.source,markerId:B.markerId||W.markerId,eventKey:B.eventKey||W.eventKey,lifecycleSlot:B.lifecycleSlot||W.lifecycleSlot,descriptor:B.descriptor||W.descriptor,distanceM:me(B.distanceM,W.distanceM),confidence:B.confidence||W.confidence,lifecycleState:ui.ACTIVE_UNRESOLVED,unresolvedSinceMs:V,unresolvedFixes:F})}o=I,i=v,a=h,u=S,c=0,l=0,d=o.length?vt.LIVE:vt.DROPPED,p=!1,f=o.length&&o.every(D=>!!D.worldAnchor)?_e.WORLD:o.length&&o.every(D=>D.sourceMode===_e.SURFACE)?_e.SURFACE:o.some(D=>D.sourceMode===_e.GEO_ONLY)?_e.GEO_ONLY:o.some(D=>D.sourceMode===_e.GEO_PATH)?_e.GEO_PATH:_e.PATH_ONLY,E=o.length?"":g?`world anchor creation deferred: ${x}`:"새 fix에 배치 가능한 앵커 없음"}function w(M={}){let R=me(M.nowMs,0),v=s===null?0:R-s;if(v<0&&(y("시간 역행/replay seek"),v=0),s=R,_r(M.worldPose)){let V=String(M.worldPose.epoch||"uninitialized");b!==null&&V!==b&&(y("world pose epoch changed - anchors reset"),s=R),m=M.worldPose,b=V}o=Eh(o,R);let h=M.valid!==!1,S=Array.isArray(M.candidates)?M.candidates:[],A=Array.isArray(M.activeMarkers)?M.activeMarkers:[],L=M.lifecycleAuthoritative===!0,P=M.trackingRecovered===!0,_=M.probe===!0||S.length>0&&S.every(V=>V?.source==="calibrationProbe");if(h){let V=_?"calibrationProbe":Bl(M.navi),F=_?"calibrationProbe":Gl(M.navi),H=!_&&a!==null&&F!==a;if(S.length>0?P||V!==i||!o.length:L&&V!==i)return C(S,A,V,F,R,M.modelPosition,!H&&(!_||!p&&!P),{trackingState:M.trackingState,canHold:M.canHold}),H?E=o.length?"session 변경 — 이전 앵커 reset":E:P&&(E=o.length?"tracking 복구 — fresh fix 재정합":E),O(R)}if(!o.length)return h||(E=M.reason||"source 무효 — 유지할 앵커 없음"),O(R);if(M.trackingState==="lost"&&!h)return y(M.reason||"tracking lost — anchor fade-out"),O(R);if(o.every(V=>!!V.worldAnchor)&&m)return c=M.trackingState==="tracking"?0:c+Math.max(0,v),l=Math.max(0,me(M.trackingUncertaintyM,0)),d=M.trackingState==="tracking"?vt.LIVE:vt.HELD,f=_e.WORLD,E=d===vt.LIVE?"immutable world anchor":`${M.trackingState||"tracking"} world pose hold ${Math.round(c)}ms`,p=d!==vt.LIVE,O(R);let I=!!M.odometry&&M.canHold===!0;if(v>t.maxStepMs&&I)return d=vt.HELD,f=_e.HELD,E=`프레임 간격 ${Math.round(v)}ms — 앵커 유지, 적분 생략`,O(R);if(!I||p){if(p=!0,c+=Math.max(0,v),M.retainAnchor===!0)return d=vt.HELD,f=_e.HELD,E=`${M.trackingState||"tracking"} freeze ${Math.round(c)}ms`,O(R);if(c>t.maxUntrackedHoldMs){let V=M.trackingState==="lost"&&M.reason?String(M.reason):"";return y(V?`${V} — ${Math.round(c)}ms 후 앵커 해제`:`odometry untracked ${Math.round(c)}ms - anchor dropped`),O(R)}return d=vt.HELD,f=_e.HELD,E=`odometry untracked hold ${Math.round(c)}ms`,O(R)}let k=Math.max(0,v)/1e3,D=M.precise!==!0||!h,B=0,W=[];for(let V of o){if(Dr(V)){W.push(M.precise===!0&&Wl(V,M.modelPosition)||V);continue}let F=ua(V.anchor,M.odometry,k),H={...V,anchor:F};if(M.precise===!0&&h){W.push(H);continue}D=!0;let Y=me(V.driftM,0)+da(V.anchor,M.odometry,k);B=Math.max(B,Y),W.push({...H,sourceMode:_e.HELD,driftM:Y})}if(o=W,D){if(c+=Math.max(0,v),l=B,c>t.maxHoldMs||l>t.maxDriftM){let V=c>t.maxHoldMs?`유지 시간 초과 (${t.maxHoldMs}ms)`:`누적 드리프트 ${l.toFixed(2)}m > ${t.maxDriftM}m`;return y(V),O(R)}d=vt.HELD,f=_e.HELD,E=`유지 중 ${Math.round(c)}ms / 드리프트 ${l.toFixed(2)}m`}else c=0,l=0,d=vt.LIVE,f=o.some(V=>V.sourceMode===_e.GEO_PATH)?_e.GEO_PATH:o.some(V=>V.sourceMode===_e.GEO_ONLY)?_e.GEO_ONLY:o.every(V=>V.sourceMode===_e.SURFACE)?_e.SURFACE:_e.PATH_ONLY,E="odometry world lock";return O(R)}function z(M=s??0){let R=O(M);return Object.freeze({state:R.state,sourceMode:R.sourceMode,anchorCount:o.length,fixId:R.fixId,sourceId:R.sourceId,fixAgeMs:R.fixAgeMs===null?null:Math.round(R.fixAgeMs),holdMs:Math.round(R.holdMs),driftM:+R.driftM.toFixed(3),reason:R.reason,worldEpoch:b,worldLockedCount:o.filter(v=>!!v.worldAnchor).length,unresolvedCount:o.filter(v=>v.lifecycleState===ui.ACTIVE_UNRESOLVED).length,creationDeferredCount:g,creationGateReason:x,handoffCount:o.filter(v=>!!v.handoff).length,handoff:R.anchors?.find(v=>v.handoff)?.handoff||null,sample:R.anchors?.[0]?.anchor?Object.freeze({x:+Number(R.anchors[0].anchor.x).toFixed(1),y:+Number(R.anchors[0].anchor.y).toFixed(1),z:+Number(R.anchors[0].anchor.z??0).toFixed(1),markerId:R.anchors[0].markerId||R.anchors[0].eventKey||null,lifecycleSlot:R.anchors[0].lifecycleSlot||null,source:R.anchors[0].source||null,heightSource:R.anchors[0].anchor.heightSource||null,heightConfidence:+Number(R.anchors[0].anchor.heightConfidence??0).toFixed(2),lateralCorrectionM:+Number(R.anchors[0].lateralCorrectionM??0).toFixed(2)}):null})}return Object.freeze({update:w,reset:y,status:z,limits:t})}var $n=Object.freeze({EXACT_FRAME:"exact-frame",ESTIMATED_FRAME:"estimated-frame",MEDIA_FRAME:"media-frame",UNMAPPED:"unmapped"}),sr=1e6,ja=1e9,Oh=250*sr;function cr(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function So(e){let t=cr(e);return t!==null&&t>0?t:null}function pi(e,t=100){let n=So(e?.timestampEof),r=Math.max(0,cr(t,100));return n===null?null:n-r*sr}function Ha(){let e=null,t=null;function n(i=null,a=null,s=null){let u=i?.source==="replay"?a?.domain==="replay-media":i?.source==="live"?a?.domain!=="replay-media":!1,c=So(i?.cameraTimestampEof),l=cr(i?.mediaTime),d=l===null?null:l*1e3,f=cr(i?.frameId),p=String(i?.clockMappingConfidence||"");if(u&&c!==null){let b=p===$n.ESTIMATED_FRAME?$n.ESTIMATED_FRAME:$n.EXACT_FRAME;return e=Object.freeze({domain:"cereal-monotonic",targetTimeMs:c/sr,targetTimestampNs:c,mediaTimeMs:d,mediaToCerealOffsetNs:d===null?null:c-l*ja,sourceFrameId:f,sequence:i?.sequence??null,confidence:b,mapped:!0}),e.mediaToCerealOffsetNs!==null&&(t=e.mediaToCerealOffsetNs),e}if(u&&a?.domain==="replay-media"&&d!==null){let b=So(s?.cameraTimestampEof);if(b!==null){let g=b-l*ja;(t===null||Math.abs(g-t)>Oh)&&(t=g)}if(t!==null){let g=l*ja+t;return e=Object.freeze({domain:"cereal-monotonic",targetTimeMs:g/sr,targetTimestampNs:g,mediaTimeMs:d,mediaToCerealOffsetNs:t,sourceFrameId:f,sequence:i?.sequence??null,confidence:$n.ESTIMATED_FRAME,mapped:!0}),e}return e=Object.freeze({domain:"replay-media",targetTimeMs:d,targetTimestampNs:null,mediaTimeMs:d,mediaToCerealOffsetNs:null,sourceFrameId:f,sequence:i?.sequence??null,confidence:$n.MEDIA_FRAME,mapped:!0}),e}let m=So(s?.cameraTimestampEof);return u&&m!==null?(e=Object.freeze({domain:"cereal-monotonic",targetTimeMs:m/sr,targetTimestampNs:m,mediaTimeMs:d,mediaToCerealOffsetNs:t,sourceFrameId:f,sequence:i?.sequence??null,confidence:$n.ESTIMATED_FRAME,mapped:!0}),e):(e=Object.freeze({domain:a?.domain||null,targetTimeMs:null,targetTimestampNs:null,mediaTimeMs:d,mediaToCerealOffsetNs:null,sourceFrameId:f,sequence:i?.sequence??null,confidence:$n.UNMAPPED,mapped:!1}),e)}function r(){e=null,t=null}function o(){return e}return Object.freeze({map:n,reset:r,status:o})}function fi(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function di(e,t,n){let r=fi(e),o=fi(t);return!r||!o?null:Object.freeze(r.map((i,a)=>i+(o[a]-i)*n))}function Va(e,t){return Object.freeze({...e,...t,temporalAlignment:Object.freeze(t.temporalAlignment)})}function Ba(e={}){let t=Math.max(0,cr(e.poseDelayMs,100)),n=Math.max(2,Math.round(cr(e.capacity,64))),r=Math.max(0,cr(e.maxExtrapolationMs,150)),o=[];function i(c){let l=pi(c,t);if(l===null||!fi(c?.trans)||!fi(c?.rot))return!1;let d=Object.freeze({odometry:c,observationTimestampNs:l});return o[o.length-1]?.observationTimestampNs===l?o[o.length-1]=d:(o.push(d),o.sort((p,m)=>p.observationTimestampNs-m.observationTimestampNs),o.length>n&&(o=o.slice(-n))),!0}function a(c){let l=So(c);if(l===null||!o.length)return null;let d=o.findIndex(O=>O.observationTimestampNs>=l);if(d===-1){let O=o[o.length-1],C=(l-O.observationTimestampNs)/sr;return C>r?null:Va(O.odometry,{observationTimestampNs:O.observationTimestampNs,targetTimestampNs:l,temporalAlignment:{mode:C===0?"exact":"bounded-extrapolation",poseDelayMs:t,targetDeltaMs:C}})}let f=o[d];if(f.observationTimestampNs===l||d===0){let O=(f.observationTimestampNs-l)/sr;return O>r?null:Va(f.odometry,{observationTimestampNs:f.observationTimestampNs,targetTimestampNs:l,temporalAlignment:{mode:O===0?"exact":"bounded-lookahead",poseDelayMs:t,targetDeltaMs:-O}})}let p=o[d-1],m=f.observationTimestampNs-p.observationTimestampNs,b=m>0?(l-p.observationTimestampNs)/m:0,g=di(p.odometry.trans,f.odometry.trans,b),x=di(p.odometry.rot,f.odometry.rot,b),E=di(p.odometry.transStd,f.odometry.transStd,b),y=di(p.odometry.rotStd,f.odometry.rotStd,b);return Va(p.odometry,{...g?{trans:g}:{},...x?{rot:x}:{},...E?{transStd:E}:{},...y?{rotStd:y}:{},observationTimestampNs:l,targetTimestampNs:l,temporalAlignment:{mode:"interpolated",poseDelayMs:t,targetDeltaMs:0,alpha:b}})}function s(){o=[]}function u(){return Object.freeze({samples:o.length,poseDelayMs:t,maxExtrapolationMs:r,firstObservationTimestampNs:o[0]?.observationTimestampNs??null,lastObservationTimestampNs:o.at(-1)?.observationTimestampNs??null})}return Object.freeze({push:i,sampleAt:a,reset:s,status:u})}var St=Object.freeze({OK:"ok",STALE:"stale",FRAME_GAP:"frame_gap",MISSING:"missing"}),$l=Object.freeze({maxFrameIdGap:8,maxModelAgeMs:350,maxOdometryAgeMs:350,maxOdometryFrameGap:8,maxPoseAgeMs:700,maxCalibrationAgeMs:2e4,maxNaviAgeMs:8e3,maxVelAngleStd:.8*Math.PI/180,maxRotStd:.12}),Ch=1e6,$a=Object.freeze({maxTransMps:120,maxRotRadps:6,maxStd:50,maxOrientationRad:Math.PI*2+.1,maxCalibrationRad:Math.PI});function mi(e,t){return!Array.isArray(e)||e.length===0?!1:e.every(n=>{let r=Number(n);return Number.isFinite(r)&&Math.abs(r)<=t})}function wh(e){if(!e)return!1;let t=$a;return mi(e.trans,t.maxTransMps)&&mi(e.rot,t.maxRotRadps)&&(e.transStd===void 0||mi(e.transStd,t.maxStd))&&(e.rotStd===void 0||mi(e.rotStd,t.maxStd))}function Ih(e){if(!e)return!1;let t=e.orientationNED;if(!t)return!1;let n=$a;for(let r of["x","y","z"]){let o=Number(t[r]);if(!Number.isFinite(o)||Math.abs(o)>n.maxOrientationRad)return!1}return typeof e.inputsOK=="boolean"&&typeof e.posenetOK=="boolean"}function un(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ga(e,t){let n=un(e),r=un(t);return n===null||r===null||n<=0||r<=0?null:(n-r)/Ch}function _h(e){let t=e?.rpyCalib;return Array.isArray(t)&&t.length>=3&&t.slice(0,3).every(n=>{let r=Number(n);return Number.isFinite(r)&&Math.abs(r)<=$a.maxCalibrationRad})}function Mo(e,t,n){let r=un(e),o=un(t?.[n]);return r===null||o===null||r0?d:null,p=f??un(n?.timestampEof),m=[];if(!n||!r)return Object.freeze({state:St.MISSING,reasons:Object.freeze(["camera/model 없음"]),frameIdGap:null,modelAgeMs:null,odometryAgeMs:null,odometryUsable:!1,poseAgeMs:null,calibrationAgeMs:null,naviAgeMs:null,poseOk:!1,calibrated:!1,calibrationPlausible:!1,naviUsable:!1,presentedClockConfidence:e.presentedClock?.confidence||"unmapped",presentedTargetTimestampNs:f,odometryPoseDelayMs:100,clockDomain:e.clockDomain==="replay-media"?"replay-media":"live-monotonic",canDrawPrecise:!1,canHoldAnchor:!1});let g=un(e.presentedClock?.sourceFrameId)??un(n.frameId),x=un(r.frameId),E=g!==null&&x!==null?Math.abs(g-x):null,y=St.OK;E===null?(y=St.MISSING,m.push("frameId 없음")):E>t.maxFrameIdGap&&(y=St.FRAME_GAP,m.push(`frame gap ${E} > ${t.maxFrameIdGap}`));let O=un(r.frameAge),C=O===null?null:O*50,w=l?null:Mo(c,u,"modelV2"),z=l?C??0:w===null?C:Math.max(w,C??0),M=St.OK;!l&&w===null?(M=St.MISSING,m.push("model 수신시각 없음")):z>t.maxModelAgeMs&&(M=St.STALE,m.push(`model age ${z.toFixed(0)}ms`));let R=null,v=!1;if(o){let V=pi(o),F=Ga(p,V),H=l?null:Mo(c,u,"cameraOdometry");R=l?Math.abs(F??0):H===null?null:Math.max(H,Math.abs(F??0));let Y=un(o.frameId),$=Y!==null&&g!==null?Math.abs(g-Y):null,K=Array.isArray(o.trans)?Math.abs(Number(o.trans[0])||0):null,Z=Array.isArray(o.transStd)?Math.abs(Number(o.transStd[1])||0):null,ee=K!==null&&Z!==null&&K>1?Math.atan2(Z,K):null,ue=Array.isArray(o.rotStd)?Math.max(...o.rotStd.map(pe=>Math.abs(Number(pe)||0))):null,de=R!==null&&R<=t.maxOdometryAgeMs,ye=$===null||$<=t.maxOdometryFrameGap,U=(ee===null||ee<=t.maxVelAngleStd)&&(ue===null||ue<=t.maxRotStd),X=wh(o);if(X||m.push("odometry 값이 비정상 — 디코드 오프셋 의심"),v=de&&ye&&U&&X,!l&&H===null?m.push("odometry 수신시각 없음"):de||m.push(`odometry age ${R.toFixed(0)}ms`),ye||m.push(`odometry frame gap ${$}`),!U){let pe=ee===null?"n/a":`${(ee*180/Math.PI).toFixed(3)}°`;m.push(`odometry 불확실 velAngleStd=${pe} rotStd=${ue?.toFixed(4)}`)}}let h=l?null:Mo(c,u,"livePose"),S=Ga(p,i?.timestamp),A=l?Math.abs(S??0):h===null?null:Math.max(h,Math.abs(S??0)),L=!!i&&Ih(i);i&&!L&&m.push("livePose 값이 비정상 — 디코드 오프셋 의심"),i||m.push("livePose 없음"),!l&&h===null?m.push("livePose 수신시각 없음"):A>t.maxPoseAgeMs&&m.push(`livePose age ${A.toFixed(0)}ms`);let P=L&&i.inputsOK===!0&&i.posenetOK===!0&&i.sensorsOK!==!1&&A!==null&&A<=t.maxPoseAgeMs;i&&L&&!P&&m.push("livePose 품질/상태 not OK");let _=Dh(a?.calStatus);_||m.push(`calStatus=${a?.calStatus??"없음"}`);let T=_h(a);T||m.push("calibration rpy 비정상/누락");let I=l?a?0:null:Mo(c,u,"liveCalibration"),k=St.OK;I===null?(k=St.MISSING,m.push("calibration 수신시각 없음")):I>t.maxCalibrationAgeMs&&(k=St.STALE,m.push(`calibration age ${I.toFixed(0)}ms`));let D=!1,B=null;if(s){let V=s.navigationStatus?.offRoute===!0,F=s.navigationStatus?.guidanceActive===!0,H=s.navigationStatus?.routePresent===!0,Y=l?null:Mo(c,u,"carrotNavi"),$=Ga(p,s.publishMonoTimeNanos);B=l?Math.abs($??0):Y===null?null:Math.max(Y,Math.abs($??0));let K=B!==null&&B<=t.maxNaviAgeMs;D=(F||H)&&!V&&K,!l&&Y===null?m.push("navi 수신시각 없음"):K||m.push(`navi age ${B.toFixed(0)}ms`),(!F&&!H||V)&&m.push("navi off-route/안내없음")}let W=Ph(y,M,k);return Object.freeze({state:W,reasons:Object.freeze(m),frameIdGap:E,modelAgeMs:z,odometryAgeMs:R,poseAgeMs:A,calibrationAgeMs:I,naviAgeMs:B,odometryUsable:v,poseOk:P,calibrated:_,calibrationPlausible:T,naviUsable:D,presentedClockConfidence:e.presentedClock?.confidence||"unmapped",presentedTargetTimestampNs:f,odometryPoseDelayMs:100,clockDomain:l?"replay-media":"live-monotonic",canDrawPrecise:W===St.OK&&_&&T,canHoldAnchor:_&&T&&v&&P})}var Lh=Object.freeze({TURN:"turn",FORK:"fork",RAMP:"ramp",ROTARY:"rotary",UTURN:"uturn",ARRIVE:"arrive",NOTIFICATION:"notification",UNKNOWN:"unknown"}),kh=Object.freeze({LEFT:"left",RIGHT:"right",SLIGHT_LEFT:"slight_left",SLIGHT_RIGHT:"slight_right",SHARP_LEFT:"sharp_left",SHARP_RIGHT:"sharp_right",STRAIGHT:"straight",UTURN:"uturn"}),ne=kh,le=Lh,Fh=new Map([[12,[le.TURN,ne.LEFT]],[13,[le.TURN,ne.RIGHT]],[16,[le.TURN,ne.SHARP_LEFT]],[19,[le.TURN,ne.SHARP_RIGHT]],[1e3,[le.TURN,ne.SLIGHT_LEFT]],[1001,[le.TURN,ne.SLIGHT_RIGHT]],[14,[le.UTURN,ne.UTURN]],[1002,[le.FORK,ne.SLIGHT_LEFT]],[1003,[le.FORK,ne.SLIGHT_RIGHT]],[7,[le.FORK,ne.LEFT]],[17,[le.FORK,ne.LEFT]],[44,[le.FORK,ne.LEFT]],[75,[le.FORK,ne.LEFT]],[76,[le.FORK,ne.LEFT]],[118,[le.FORK,ne.LEFT]],[6,[le.FORK,ne.RIGHT]],[43,[le.FORK,ne.RIGHT]],[73,[le.FORK,ne.RIGHT]],[74,[le.FORK,ne.RIGHT]],[117,[le.FORK,ne.RIGHT]],[123,[le.FORK,ne.RIGHT]],[124,[le.FORK,ne.RIGHT]],[1006,[le.RAMP,ne.LEFT]],[1007,[le.RAMP,ne.RIGHT]],[102,[le.RAMP,ne.SLIGHT_LEFT]],[105,[le.RAMP,ne.SLIGHT_LEFT]],[112,[le.RAMP,ne.SLIGHT_LEFT]],[115,[le.RAMP,ne.SLIGHT_LEFT]],[101,[le.RAMP,ne.SLIGHT_RIGHT]],[104,[le.RAMP,ne.SLIGHT_RIGHT]],[111,[le.RAMP,ne.SLIGHT_RIGHT]],[114,[le.RAMP,ne.SLIGHT_RIGHT]],[131,[le.ROTARY,ne.SLIGHT_RIGHT]],[132,[le.ROTARY,ne.SLIGHT_RIGHT]],[133,[le.ROTARY,ne.RIGHT]],[134,[le.ROTARY,ne.SHARP_RIGHT]],[135,[le.ROTARY,ne.SHARP_RIGHT]],[136,[le.ROTARY,ne.SHARP_LEFT]],[137,[le.ROTARY,ne.SHARP_LEFT]],[138,[le.ROTARY,ne.SHARP_LEFT]],[139,[le.ROTARY,ne.LEFT]],[140,[le.ROTARY,ne.SLIGHT_LEFT]],[141,[le.ROTARY,ne.SLIGHT_LEFT]],[142,[le.ROTARY,ne.STRAIGHT]],[201,[le.ARRIVE,ne.STRAIGHT]],[51,[le.NOTIFICATION,ne.STRAIGHT]]]),Ul=Object.freeze({[ne.LEFT]:{sign:-1,curvature:-.045,yawDeg:-80},[ne.RIGHT]:{sign:1,curvature:.045,yawDeg:80},[ne.SHARP_LEFT]:{sign:-1,curvature:-.075,yawDeg:-120},[ne.SHARP_RIGHT]:{sign:1,curvature:.075,yawDeg:120},[ne.SLIGHT_LEFT]:{sign:-1,curvature:-.02,yawDeg:-35},[ne.SLIGHT_RIGHT]:{sign:1,curvature:.02,yawDeg:35},[ne.STRAIGHT]:{sign:0,curvature:0,yawDeg:0},[ne.UTURN]:{sign:-1,curvature:-.11,yawDeg:-175}});function Yl(e){let t=Number(e),n=Number.isFinite(t)?Fh.get(t):null,[r,o]=n||[le.UNKNOWN,ne.STRAIGHT],i=Ul[o]||Ul[ne.STRAIGHT];return Object.freeze({code:t,family:r,direction:o,...i})}var Pr=Object.freeze({CAMERA:"camera",SECTION:"section",BUMP:"bump",POLICE:"police",OTHER:"other"}),zh=new Set([0,1,7,8,75,76]),jh=new Set([2,3,4]),Vh=new Set([100,101]);function Kl(e){let t=Number(e);return!Number.isFinite(t)||t<0?Object.freeze({code:t,family:null}):t===22?Object.freeze({code:t,family:Pr.BUMP}):Vh.has(t)?Object.freeze({code:t,family:Pr.POLICE}):jh.has(t)?Object.freeze({code:t,family:Pr.SECTION}):zh.has(t)?Object.freeze({code:t,family:Pr.CAMERA}):Object.freeze({code:t,family:Pr.OTHER})}function Hh(e){if(!e||e.visible!==!0)return null;let t=Number(e.distanceM);if(!Number.isFinite(t)||t<=0)return null;let n=[],r=(o,i,a,s)=>{i===!0&&n.push(Object.freeze({id:o,on:a===!0,remainSec:Number(s)||0}))};return r("red",e.redValid,e.redOn,e.redRemainSec),r("left",e.leftValid,e.leftOn,e.leftRemainSec),r("green",e.greenValid,e.greenOn,e.greenRemainSec),r("right",e.rightValid,e.rightOn,e.rightRemainSec),r("uturn",e.uturnValid,e.uturnOn,e.uturnRemainSec),n.length?Object.freeze({lamps:Object.freeze(n),distanceM:t,counterRemainSec:e.uiCounterValid===!0&&Number(e.uiCounterRemainSec)||0}):null}function Bh(e,t=3.5){let n=Array.isArray(e?.available)?e.available:[],r=Number(e?.count)||n.length;if(!r||!n.length)return null;let o=[];for(let c=0;cc+l,0)/o.length,a=(r-1)/2,s=-(i-a)*t,u=Math.max(...o)-Math.min(...o)+1;return Object.freeze({offsetM:s===0?0:s,widthM:Math.max(1,u)*t,selectedCount:o.length})}var En=Object.freeze({GUIDANCE_CURRENT:"guidanceCurrent",GUIDANCE_NEXT:"guidanceNext",LANE:"lane",SDI:"sdi",SDI_SECONDARY:"sdiSecondary",SECTION:"section",TRAFFIC_SIGNAL:"trafficSignal",CROSSROAD:"crossroad",DESTINATION:"destination"}),WS=Object.freeze({CARROT_NAVI:"world-anchor",CARROT_MAN:"hud-only",STOCK_NAVI:"hud-only"});function Ya(e,t={}){let n=Number(t.laneWidthM)||3.5,r=[],o=f=>{f&&r.push(Object.freeze(f))},i=(f,p)=>{if(!f||f.present===!1)return null;let m=Number(f.distanceM);if(!Number.isFinite(m)||m<=0)return null;let b=Yl(f.turnType),g=f.pointValid===!0?{pointValid:!0,latitude:f.latitude,longitude:f.longitude}:null;return b.family===le.ARRIVE?{source:p,kind:Ue.DESTINATION_PIN,distanceM:m,point:g,tone:Te.DESTINATION,label:f.mainText||f.roadName||"",turn:b}:b.direction===ne.STRAIGHT||b.family===le.NOTIFICATION||b.family===le.UNKNOWN?null:{source:p,kind:Ue.TURN_GATE,distanceM:m,point:g,tone:Te.GUIDE,label:f.roadName||f.mainText||"",turn:b,variant:b.family,laneWidthM:n}};o(i(e?.guidanceCurrent,En.GUIDANCE_CURRENT)),o(i(e?.guidanceNext,En.GUIDANCE_NEXT));let a=r.find(f=>f.source===En.GUIDANCE_CURRENT);if(a&&a.kind===Ue.TURN_GATE&&a.turn.sign!==0&&o({source:En.GUIDANCE_CURRENT,kind:Ue.COMMIT_ARROW,distanceM:Math.max(0,a.distanceM-6),tone:Te.GUIDE,eventDistanceM:a.distanceM,turn:a.turn,curvature:a.turn.curvature,label:""}),ml.laneBand){let f=m=>m&&m.present!==!1&&m.visible===!0&&Number.isFinite(Number(m.distanceM))&&Number(m.distanceM)>0,p=f(e?.laneCurrent)?e.laneCurrent:(Array.isArray(e?.laneAhead)?e.laneAhead:[]).filter(f).sort((m,b)=>Number(m.distanceM)-Number(b.distanceM))[0];if(p){let m=Bh(p,n);m&&o({source:En.LANE,kind:Ue.LANE_BAND,distanceM:Number(p.distanceM),tone:Te.LANE,laneOffsetM:m.offsetM,laneWidthM:m.widthM,selectedLaneCount:m.selectedCount,label:""})}}let s=e?.speed,u=(f,p)=>{if(s?.[`${f}Present`]!==!0)return;let m=Number(s[`${f}DistanceM`]),b=Kl(s[`${f}Type`]);if(!b.family||b.family===Pr.SECTION||!Number.isFinite(m)||m<=0)return;let g=Number(s[`${f}SpeedLimitKph`])||0;o({source:p,kind:Ue.CAUTION_SIGN,distanceM:m,tone:Te.CAUTION,sdiFamily:b.family,speedLimitKph:g,blockType:Number(s[`${f}BlockType`])||0,blockDistanceM:Number(s[`${f}BlockDistanceM`])||0,label:String(g||"")})};u("sdi",En.SDI),u("secondarySdi",En.SDI_SECONDARY);let c=Number(s?.sectionRemainingDistanceM);s?.sectionPresent===!0&&s.sectionOffRoute!==!0&&Number.isFinite(c)&&c>0&&o({source:En.SECTION,kind:Ue.SECTION_GATE,distanceM:c,tone:Te.RESTRICT,active:s.sectionActive===!0,averageKph:Number(s.sectionAverageKph)||0,overallAverageKph:Number(s.sectionOverallAverageKph)||0,remainingTimeSec:Number(s.sectionRemainingTimeSec)||0,suspended:s.sectionSuspended===!0,limitKph:Number(s.sectionSpeedLimitKph)||0,progress:Number(s.sectionProgress)||0,laneWidthM:n});let l=Hh(e?.trafficSignal);l&&o({source:En.TRAFFIC_SIGNAL,kind:Ue.SIGNAL_HEAD,distanceM:l.distanceM,tone:Te.CAUTION,lamps:l.lamps,counterRemainSec:l.counterRemainSec,label:""});let d=e?.crossroad;return d?.visible===!0&&Number(d.distanceM)>0&&o({source:En.CROSSROAD,kind:Ue.CROSSROAD_CARD,distanceM:Number(d.distanceM)||0,tone:Te.GUIDE,imageCode:Number(d.imageCode)||0,label:""}),Object.freeze(r)}var Ka=Object.freeze({maxHeadingErrorRad:75*Math.PI/180,defaultStartSnapM:45,minDynamicStartSnapM:18,maxDynamicStartSnapM:60,positionSigmaSnapGain:2,minProgressWindowM:220,progressWindowRatio:.35,maxBackwardM:12,progressResetM:50,headingPenaltyM:14,progressPenaltyM:12,continuityPenaltyRatio:.08,branchSwitchHysteresisM:8,adjacentSegmentGrace:1});function Ao(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function qa(e,t,n){return Math.min(n,Math.max(t,e))}function Gh(e){return Math.atan2(Math.sin(e),Math.cos(e))}function Wh(e,t){if(!e||e.present===!1||!Array.isArray(t))return[];let n=[];for(let r of t){let o=Pn(e.latitude,e.longitude,r?.latitude,r?.longitude),i=o&&or(o.east,o.north,e.headingDeg);i&&n.push(i)}return n}function $h(e){let t=[0];for(let n=1;n0)||!(t>0))return null;let a=i;if(a===null&&o>0&&(a=r-o),a===null||a<0)return null;let s=qa(a/r,0,1);return Object.freeze({movedDistanceM:a,expectedAlongTrackM:t*s,windowM:Math.max(n.minProgressWindowM,t*n.progressWindowRatio)})}function Yh(e,t,n){let r=e?.polyline?.[0]||{},o=e?.polyline?.[Math.floor((e?.polyline?.length||1)/2)]||{},i=e?.polyline?.at?.(-1)||{},a=u=>{let c=Ao(u);return c===null?"?":c.toFixed(4)},s=[t.length,`${a(r.latitude)},${a(r.longitude)}`,`${a(o.latitude)},${a(o.longitude)}`,`${a(i.latitude)},${a(i.longitude)}`].join(":");return n?`session:${n}:${s}`:`legacy:${s}`}function Kh(e,t){let n=Ao(e);return n===null||n<0?t.defaultStartSnapM:qa(t.minDynamicStartSnapM+n*t.positionSigmaSnapGain,t.minDynamicStartSnapM,t.maxDynamicStartSnapM)}function Lr(e,t,n={}){let r=Object.freeze({...Ka,...n.limits||{}}),o=t?.polyline,i=Wh(e,o);if(i.length<2)return null;let a=$h(i),s=a.at(-1);if(!(s>.01))return null;let u=Uh(t,s,r),c=n.previous||null,l=Kh(n.positionSigmaM,r),d=[];for(let p=1;p.01))continue;let y=Math.sqrt(E),O=Math.atan2(x,g),C=Math.abs(Gh(O));if(C>r.maxHeadingErrorRad)continue;let w=qa(-(m.x*g+m.y*x)/E,0,1),z=m.x+g*w,M=m.y+x*w,R=Math.hypot(z,M);if(R>l)continue;let v=a[p-1]+y*w;if(c&&vu.windowM)continue;let S=c?c.alongTrackM+Math.max(0,(u?.expectedAlongTrackM??c.progressExpectedAlongTrackM??c.alongTrackM)-(c.progressExpectedAlongTrackM??c.alongTrackM)):null,A=S===null?0:Math.abs(v-S),L=R+C/r.maxHeadingErrorRad*r.headingPenaltyM+(u?h/u.windowM*r.progressPenaltyM:0)+A*r.continuityPenaltyRatio;d.push({index:p,t:w,x:z,y:M,snapDistanceM:R,alongTrackM:v,headingRad:O,headingErrorRad:C,progressErrorM:h,score:L})}if(!d.length)return null;d.sort((p,m)=>p.score-m.score||p.index-m.index);let f=d[0];if(c&&Math.abs(f.index-c.index)>r.adjacentSegmentGrace){let p=d.filter(m=>Math.abs(m.index-c.index)<=r.adjacentSegmentGrace).sort((m,b)=>m.score-b.score)[0];p&&p.score<=f.score+r.branchSwitchHysteresisM&&(f=p)}return Object.freeze({...f,routeLengthM:s,routePointCount:i.length,maxStartSnapM:l,progressExpectedAlongTrackM:u?.expectedAlongTrackM??null,progressMovedDistanceM:u?.movedDistanceM??null,routeSignature:Yh(t,i,n.sessionId)})}function Xa(e={}){let t=Object.freeze({...Ka,...e.limits||{}}),n=null,r=null,o=0,i=0;function a(c=null){n=null,r=c===null?null:String(c||"legacy")}function s(c,l,d={}){let f=String(d.sessionId||"legacy");r!==f&&a(f);let p=Lr(c,l,{limits:t,positionSigmaM:d.positionSigmaM,previous:n,sessionId:f});if(n&&(!p||p.routeSignature!==n.routeSignature)){let m=Lr(c,l,{limits:t,positionSigmaM:d.positionSigmaM,sessionId:f});m?.routeSignature!==n.routeSignature&&(p=m)}return p?(n&&p.progressExpectedAlongTrackM!==null&&n.progressExpectedAlongTrackM!==null&&p.progressExpectedAlongTrackMi.identityInput),o=n?.assign?.(r,{sessionId:t?.sessionId||(e.every(i=>i.source==="calibrationProbe")?"calibration-probe":"legacy")});return e.map((i,a)=>{let s=o?.[a]||mo(i.identityInput);return Object.freeze({descriptor:i.descriptor,distanceM:i.distanceM,point:i.point||null,source:i.source,markerId:s,eventKey:s,lifecycleSlot:po(i.identityInput),confidence:i.confidence||"high",discovery:i.discovery||null})})}function Xh(e,{vehicle:t,routePolyline:n,routeMatch:r,modelPosition:o,geoAllowed:i=!1,routeAllowed:a=i,failures:s=null}={}){if(o?.coordinateFrame&&o.coordinateFrame!==Ae.ROUTE_FLU)throw new TypeError("anchorSigns modelPosition must use route-local FLU");let u=[];for(let c of Array.isArray(e)?e:[]){let l=c.descriptor?.kind,d=l==="turn_gate"||l==="commit_arrow"||l==="destination_pin",f=d||c.source==="guidanceCurrent"||c.source==="guidanceNext"||c.source==="crossroad",p=(i||a)&&c.point?Ra(t,c.point,{routeDistanceM:c.distanceM}):null;if(p){let x=d&&r?Ir(t,n,c.distanceM+Rn.maneuverLookAheadM,{routeMatch:r}):null,E=d&&Array.isArray(n)?null:xa(t,c.point,n),y=x?.headingRad??E,O=sn(y??0);p=Object.freeze({...p,routeStartIndex:x?.routeStartIndex??r?.index??null,routeAlongTrackM:x?.routeAlongTrackM??r?.alongTrackM??null,...Ft(O)})}let m=null;if(!p&&a&&f&&(m=Ir(t,n,c.distanceM,{routeMatch:r}),m)){let x=m.headingRad??0;if(d){let y=Ir(t,n,c.distanceM+Rn.maneuverLookAheadM,{routeMatch:r});y&&Math.hypot(y.x-m.x,y.y-m.y)>.5&&(x=Math.atan2(y.y-m.y,y.x-m.x))}let E=sn(x);m=Object.freeze({...m,headingRad:x,...Ft(E)})}let b=p||m?null:co(o,c.distanceM);if(!p&&!m&&!b&&a&&(m=Ir(t,n,c.distanceM,{routeMatch:r}),m)){let x=sn(m.headingRad??0);m=Object.freeze({...m,...Ft(x)})}let g=p||b||m;g?u.push({...c,anchor:g,placedBy:p||m?"geo":"path"}):s&&s.push({src:c.source,dist:Math.round(Number(c.distanceM)||0),pt:c.point?1:0,sem:f?1:0})}return u}function Xl(e={},t={}){let n=qh(e,t),r=e.navi?.route,o={sessionId:e.navi?.sessionId,positionSigmaM:e.routePositionSigmaM},i=e.canDrawPrecise&&(e.routeAllowed===!0||e.geoAllowed===!0)?t.routeMatcher?.match?t.routeMatcher.match(e.navi?.vehicle,r,o):Lr(e.navi?.vehicle,r,o):null,a=[],s=e.canDrawPrecise?Xh(n,{vehicle:e.navi?.vehicle,routePolyline:r?.polyline,routeMatch:i,modelPosition:e.modelPosition,geoAllowed:e.geoAllowed===!0,routeAllowed:e.routeAllowed===!0||e.geoAllowed===!0,failures:a}):null,u=e.navi?.vehicle,c=Object.freeze({precise:e.canDrawPrecise===!0,geo:e.geoAllowed===!0,route:e.routeAllowed===!0||e.geoAllowed===!0,routePts:Array.isArray(r?.polyline)?r.polyline.length:-1,veh:u?.present!==!1&&Number.isFinite(Number(u?.latitude))?1:0,head:Number.isFinite(Number(u?.headingDeg))?1:0,matchIdx:i?i.index:null,pathM:Array.isArray(e.modelPosition?.x)?Math.round(Number(e.modelPosition.x.at(-1))||0):null,fails:Object.freeze(a.slice(0,4))});return{signs:n,fresh:s&&s.length?s:null,diag:c}}function Tn(e){let t=Number(e);return Number.isFinite(t)?t:null}function Qa(e,t){let n=Tn(e),r=Tn(t);return n!==null&&r!==null&&n>=-90&&n<=90&&r>=-180&&r<=180}function Qh(e){if(!Array.isArray(e))return!1;let t=0;for(let n of e)if(Qa(n?.latitude,n?.longitude)&&(t+=1),t>=2)return!0;return!1}function Zh(e,t,n){let r=Tn(e),o=Tn(t?.[n]);return r===null||o===null||rt.maxGpsAgeMs&&o.push(`Comma GPS age ${l.toFixed(0)}ms`);let d=r?.hasFix===!0&&Qa(r?.latitude,r?.longitude);d||o.push("Comma GPS fix/좌표 없음");let f=Tn(r?.horizontalAccuracy);f===null||f<0?o.push("Comma GPS 수평 정확도 없음"):f>t.maxHorizontalAccuracyM&&o.push(`Comma GPS 수평 오차 ${f.toFixed(1)}m`);let p=null;if(a&&d){let O=Pn(n.latitude,n.longitude,r.latitude,r.longitude);p=O?Math.hypot(O.east,O.north):null;let C=Math.max(t.maxPositionSeparationM,Math.max(0,f??0)*t.separationAccuracyMultiplier);(p===null||p>C)&&o.push(`TMap/Comma 위치 불일치 ${p?.toFixed(1)??"n/a"}m`)}let m=Tn(r?.speed),b=m!==null&&m>=t.minBearingCheckSpeedMps,g=Tn(r?.bearingAccuracyDeg),x=null;b&&(g===null||g<0||g>t.maxBearingAccuracyDeg?o.push("Comma GPS 진행방향 정확도 부족"):(x=Jh(n?.headingDeg,r?.bearingDeg),(x===null||x>t.maxHeadingDisagreementDeg)&&o.push(`TMap/Comma 방향 불일치 ${x?.toFixed(1)??"n/a"}°`)));let E=f===null||p===null?null:Math.hypot(f,p*.5),y=b&&g!==null&&x!==null?Math.hypot(g,x*.5):null;return Object.freeze({canUseGeo:o.length===0,canUseRoute:u,fallback:o.length?u?"navi-route":"model-path":null,gpsAgeMs:l,horizontalAccuracyM:f,separationM:p,bearingAccuracyDeg:g,headingDisagreementDeg:x,positionSigmaM:E,headingSigmaDeg:y,reasons:Object.freeze(o),routeReasons:Object.freeze(i)})}function Za(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function eu(e){let t=Za(e);if(!t)return null;let[n,r,o]=t,i=Math.cos(n),a=Math.sin(n),s=Math.cos(r),u=Math.sin(r),c=Math.cos(o),l=Math.sin(o);return Object.freeze([Object.freeze([c*s,c*u*a-l*i,c*u*i+l*a]),Object.freeze([l*s,l*u*a+c*i,l*u*i-c*a]),Object.freeze([-u,s*a,s*i])])}function Zl(e,t){let n=Za(t);return!e||!n?null:Object.freeze(e.map(r=>r[0]*n[0]+r[1]*n[1]+r[2]*n[2]))}function Jl(e,t){let n=Za(t);return!e||!n?null:Object.freeze(e.map(r=>Math.sqrt((r[0]*n[0])**2+(r[1]*n[1])**2+(r[2]*n[2])**2)))}function Ja(e,t){if(!e)return null;let n=eu(t),r=Zl(n,e.trans),o=Zl(n,e.rot);if(!n||!r||!o)return null;let i=Jl(n,e.transStd),a=Jl(n,e.rotStd);return Object.freeze({...e,trans:r,rot:o,...i?{transStd:i}:{},...a?{rotStd:a}:{},sourceCoordinateFrame:Ae.CALIBRATED_FRD,coordinateFrame:Ae.DEVICE_FRD})}function tu(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function eg(e){let t=Math.floor(tu(e,240));return Math.max(1,Math.min(1200,t))}function es(e,t=0){if(e==null)return e??null;if(["string","number","boolean"].includes(typeof e))return e;if(t>=6)return"[depth-limit]";if(Array.isArray(e))return Object.freeze(e.slice(0,64).map(n=>es(n,t+1)));if(typeof e=="object"){let n={};for(let r of Object.keys(e).slice(0,64))n[r]=es(e[r],t+1);return Object.freeze(n)}return String(e)}function ts(e={}){let t=eg(e.capacity),n=typeof e.now=="function"?e.now:()=>globalThis.performance?.now?.()??Date.now(),r=e.enabled===!0,o=1,i=0,a=[];function s(f,p={},m=n()){if(!r)return null;let b=Object.freeze({sequence:o++,kind:String(f||"unknown"),atMs:tu(m,null),payload:es(p)});return a.length>=t&&(a.shift(),i+=1),a.push(b),b}function u(){let f=a.length>0||i>0;return a=[],i=0,o=1,f}function c(f,p={}){return p.clear===!0&&u(),r=f===!0,r}function l(){return Object.freeze({enabled:r,capacity:t,size:a.length,dropped:i})}function d(){return Object.freeze({...l(),entries:Object.freeze([...a])})}return Object.freeze({record:s,clear:u,setEnabled:c,isEnabled:()=>r,status:l,snapshot:d})}var tg=Object.freeze({defaultCapacity:240,maxCapacity:1200});var Un=Object.freeze({LIVE_MONOTONIC:"live-monotonic",REPLAY_MEDIA:"replay-media"}),xo=Object.freeze({CLOCK_DOMAIN_CHANGE:"clock-domain-change",SESSION_EPOCH_CHANGE:"session-epoch-change",TIME_REVERSAL:"time-reversal",REPLAY_SEEK:"replay-seek"});function ng(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function rg(e){return e==null||e===""?null:String(e)}function ns(){let e=null;function t(o={}){let i=o.domain===Un.REPLAY_MEDIA?Un.REPLAY_MEDIA:Un.LIVE_MONOTONIC,a=Math.max(0,ng(o.nowMs,0)),s=rg(o.epoch),u=e?.domain===i?a-e.nowMs:null,c=null;return e&&(o.explicitDiscontinuity===!0?c=String(o.discontinuityReason||xo.REPLAY_SEEK):e.domain!==i?c=xo.CLOCK_DOMAIN_CHANGE:e.epoch!==s?c=xo.SESSION_EPOCH_CHANGE:u<0&&(c=xo.TIME_REVERSAL)),e=Object.freeze({domain:i,nowMs:a,epoch:s}),Object.freeze({domain:i,nowMs:a,epoch:s,deltaMs:u,discontinuity:c!==null,discontinuityReason:c})}function n(){e=null}function r(){return e}return Object.freeze({update:t,reset:n,status:r})}var Be=Object.freeze({INITIALIZING:"initializing",TRACKING:"tracking",COASTING:"coasting",DEGRADED:"degraded",LOST:"lost"}),ou=Object.freeze({minHealthySamples:1,expectedFrameHoldMs:90,maxCoastingMs:1200,maxDegradedMs:4e3,initializingTimeoutMs:2e3,minLateralBudgetM:2.5,maxLateralBudgetM:12,lateralBudgetDistanceRatio:.015,coastingBudgetRatio:.55,noOdometryTranslationStdMps:.12,noOdometrySpeedStdRatio:.01,noOdometryRotationStdRadps:.002});function lr(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function kr(e,t,n){return Math.min(n,Math.max(t,e))}function nu(e){if(!Array.isArray(e)||e.length===0)return null;let t=e.map(n=>lr(n,0));return Math.hypot(...t)}function og(e){if(e.sampleId!==null&&e.sampleId!==void 0&&e.sampleId!=="")return String(e.sampleId);let t=lr(e.presentedTimestampNs);return t!==null&&t>0?`time:${t}`:null}function ig(e,t,n){return e===Be.TRACKING?1:e===Be.COASTING?1-kr((t-n.expectedFrameHoldMs)/Math.max(1,n.maxCoastingMs-n.expectedFrameHoldMs),0,1)*.22:e===Be.DEGRADED?.72-kr((t-n.maxCoastingMs)/Math.max(1,n.maxDegradedMs-n.maxCoastingMs),0,1)*.3:0}function ru(e){return Object.freeze({...e,uncertainty:Object.freeze({...e.uncertainty}),reasons:Object.freeze([...e.reasons])})}function rs(e={}){let t=Object.freeze({...ou,...e.limits||{}}),n=Be.INITIALIZING,r=null,o=null,i=null,a=null,s=0,u=0,c=0,l=null;function d(m="reset"){return n=Be.INITIALIZING,r=null,o=null,i=null,a=null,s=0,u=0,c=0,l=ru({state:n,previousState:n,transition:null,recovered:!1,canCreateAnchor:!1,canPropagateAnchor:!1,retainAnchor:!1,alpha:0,predictionAgeMs:null,uncertainty:{translationSigmaM:0,rotationSigmaRad:0,lateralM:0,budgetM:t.minLateralBudgetM,utilization:0},reasons:[String(m||"reset")]}),l}function f(m={}){let b=Math.max(0,lr(m.nowMs,0));r===null&&(r=b);let g=o===null?0:b-o;g<0&&(g=0),g=Math.min(g,t.maxDegradedMs),o=b;let x=n,E=lr(m.presentedTimestampNs,null),y=m.spatialClockReady===!0&&E!==null&&E>0,O=m.odometry||null,C=m.sync?.canDrawPrecise===!0,w=m.sync?.canHoldAnchor===!0&&!!O,z=y&&C&&w,M=og(m),R=M!==null&&M!==a;R&&(a=M);let v=[];if(m.discontinuity===!0)n=Be.LOST,s=0,r=b,i=null,a=null,u=0,c=0,v.push(String(m.discontinuityReason||"timeline discontinuity"));else if(z&&R)s+=1,i=b,u=0,c=0,n=s>=t.minHealthySamples?Be.TRACKING:Be.INITIALIZING;else{z&&!R&&v.push("presented sample not advanced"),y||v.push("presented frame clock unmapped"),C||v.push(...m.sync?.reasons||["precise sync unavailable"]),w||v.push("odometry/pose propagation unavailable");let T=g/1e3,I=nu(O?.transStd),k=nu(O?.rotStd),D=Math.abs(lr(m.egoSpeedMps,0));u+=(I===null?t.noOdometryTranslationStdMps+D*t.noOdometrySpeedStdRatio:I)*T,c+=(k===null?t.noOdometryRotationStdRadps:k)*T;let B=i===null?Math.max(0,b-r):Math.max(0,b-i),W=kr(Math.abs(lr(m.anchorDistanceM,40)),0,300),V=kr(t.minLateralBudgetM+W*t.lateralBudgetDistanceRatio,t.minLateralBudgetM,t.maxLateralBudgetM),F=u+W*c;i===null?n=B<=t.initializingTimeoutMs?Be.INITIALIZING:Be.LOST:x===Be.TRACKING&&B<=t.expectedFrameHoldMs?n=Be.TRACKING:B<=t.maxCoastingMs&&F<=V*t.coastingBudgetRatio?n=Be.COASTING:B<=t.maxDegradedMs&&F<=V?n=Be.DEGRADED:n=Be.LOST}let h=i===null?Math.max(0,b-r):Math.max(0,b-i),S=kr(Math.abs(lr(m.anchorDistanceM,40)),0,300),A=kr(t.minLateralBudgetM+S*t.lateralBudgetDistanceRatio,t.minLateralBudgetM,t.maxLateralBudgetM),L=u+S*c;n===Be.DEGRADED?v.push(`tracking degraded age=${Math.round(h)}ms uncertainty=${L.toFixed(2)}/${A.toFixed(2)}m`):n===Be.LOST&&m.discontinuity!==!0&&v.push(`tracking budget exceeded age=${Math.round(h)}ms uncertainty=${L.toFixed(2)}/${A.toFixed(2)}m`);let P=n===Be.TRACKING&&x!==Be.TRACKING&&x!==Be.INITIALIZING,_=n===Be.TRACKING||n===Be.COASTING||n===Be.DEGRADED;return l=ru({state:n,previousState:x,transition:n===x?null:`${x}->${n}`,recovered:P,canCreateAnchor:C,canPropagateAnchor:_&&w,retainAnchor:_,alpha:C?1:+ig(n,h,t).toFixed(3),predictionAgeMs:Math.round(h),uncertainty:{translationSigmaM:+u.toFixed(4),rotationSigmaRad:+c.toFixed(6),lateralM:+L.toFixed(4),budgetM:+A.toFixed(3),utilization:+(A>0?L/A:1).toFixed(3)},reasons:v}),l}function p(){return l}return d("not started"),Object.freeze({update:f,reset:d,status:p,limits:t})}var os=new WeakMap,ag="drive.vision.ar.worker";function sg({host:e,documentRoot:t,target:n,options:r,onBroken:o,onDrawn:i}){if(typeof n.Worker!="function"||typeof t.createElement!="function")return null;let a=t.createElement("canvas");if(typeof a.transferControlToOffscreen!="function")return null;a.className="carrot-ar__canvas",a.style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:6;display:none",e.appendChild(a);let s;try{let v=r.resolveAssetUrl||(S=>n.CarrotAssetUrl?.resolve?.(S)),h=String(v(ag)||"");if(!h)throw new Error("AR worker asset URL 없음");s=new n.Worker(h)}catch(v){return a.remove?.(),n.console?.warn?.("[carrot] AR 워커 시작 실패 — AR 숨김:",v?.message||v),null}let u=!1,c="",l=!1,d=null,f=null,p="",m={pixelWidth:0,pixelHeight:0},b={left:0,top:0,width:0,height:0},g={posted:0,completed:0,deferred:0,replaced:0,discarded:0},x={navi:0,modelPosition:0,reusedNavi:0,reusedModelPosition:0},E={navi:{initialized:!1,reference:null,revision:null},modelPosition:{initialized:!1,reference:null,revision:null}};function y(v,h){a.dataset&&(h==null||h===""?delete a.dataset[v]:a.dataset[v]=String(h))}y("arReady",!1),y("arBackend","pending");function O(v){c||(c=String(v||"Three AR worker failed"),u=!1,l=!1,d=null,a.style.display="none",y("arReady",!1),y("arBackend","failed"),y("arReason",c),s.terminate?.(),o?.(c))}s.onmessage=v=>{let h=v.data||{};if(h.type==="ready"){if(h.backend!=="three"){O("unexpected AR renderer backend");return}u=!0,a.style.display="",y("arReady",!0),y("arBackend",h.backend);return}if(h.type==="error"){O(h.error||"worker error");return}if(h.type==="drawn"){if(c)return;l=!1,g.completed+=1,f=h,i?.(h),y("arOk",h.ok===!0),y("arDrawn",h.renderer?.drawn??0),y("arSkipped",h.renderer?.skipped??0);let S=String(h.renderer?.lastReason||""),A=String(h.hold?.reason||"");if(y("arRenderReason",S||null),y("arHoldState",h.hold?.state||null),y("arHoldReason",A||null),y("arAnchorMode",h.hold?.sourceMode||null),y("arAnchorCount",h.hold?.anchorCount??null),y("arHoldMs",h.hold?.holdMs??null),y("arDriftM",h.hold?.driftM??null),y("arTracking",h.tracking?.state||null),y("arTrackingAlpha",h.tracking?.alpha??null),y("arTrackingUncertaintyM",h.tracking?.uncertainty?.lateralM??null),y("arWorldPoseInitialized",h.worldPose?.initialized===!0),y("arWorldPoseIntegrations",h.worldPose?.integrations??null),y("arWorldPoseEpoch",h.worldPose?.epoch||null),y("arReason",S||p||A||null),y("arSignCount",h.composition?.signCount??0),y("arComposedAnchorCount",h.composition?.anchoredCount??0),y("arQueuePending",d?1:0),y("arQueueReplaced",g.replaced),d){let L=d;d=null,z(L)}}},s.onerror=v=>{O(v?.message||"worker failed")};function C(v,h,S){let A=E[v],L=S!=null&&S!=="",P=L?String(S):null;return!A.initialized||(L?A.revision!==P:A.reference!==h)?(A.initialized=!0,A.reference=h,A.revision=P,!0):!1}function w(v={}){let h=v.composeInput||{},S=v.sourceRevisions||{},A=h.navi??null,L=h.modelPosition??null,P={};C("navi",A,S.navi)?(P.navi=A,x.navi+=1):x.reusedNavi+=1,C("modelPosition",L,S.modelPosition)?(P.modelPosition=L,x.modelPosition+=1):x.reusedModelPosition+=1;let _={...h};delete _.navi,delete _.modelPosition;let{sourceRevisions:T,...I}=v;return{...I,composeInput:_,...Object.keys(P).length?{sourceUpdate:P}:{}}}function z(v){return!u||c?!1:l?(g.deferred+=1,d&&(g.replaced+=1),d=v,y("arQueuePending",1),y("arQueueReplaced",g.replaced),!0):(l=!0,g.posted+=1,s.postMessage({type:"frame",payload:w(v)}),!0)}try{let v=a.transferControlToOffscreen();s.postMessage({type:"init",canvas:v,performance:{targetFps:r.targetFps,degradedFps:r.degradedFps}},[v])}catch(v){return a.remove?.(),s.terminate?.(),n.console?.warn?.("[carrot] OffscreenCanvas 이전 실패 — AR 숨김:",v?.message||v),null}function M(v){let h=Math.max(1,ie(v?.stageWidth,0)),S=Math.max(1,ie(v?.stageHeight,0));if(!(h>1&&S>1))return!1;let A=ie(v?.viewportLeft,0),L=ie(v?.viewportTop,0),P={left:A,top:L,width:h,height:S};return P.left===b.left&&P.top===b.top&&P.width===b.width&&P.height===b.height?!1:(b=P,a.style.left=`${A}px`,a.style.top=`${L}px`,a.style.width=`${h}px`,a.style.height=`${S}px`,y("arViewport",`${A},${L},${h}x${S}`),!0)}function R(v){let h=a.getBoundingClientRect?.()||{},S=Math.max(1,ie(n.devicePixelRatio,1)),L=f?.performance?.level==="degraded"?Cr.degradedDevicePixelRatioMax:Cr.devicePixelRatioMax,P=Math.min(S,Math.max(1,ie(L,1))),_=ie(v?.stageWidth,h.width||1),T=ie(v?.stageHeight,h.height||1),I=Math.max(1,Math.round(_*P)),k=Math.max(1,Math.round(T*P));return(I!==m.pixelWidth||k!==m.pixelHeight)&&(m={pixelWidth:I,pixelHeight:k,dpr:P},s.postMessage({type:"resize",pixelWidth:I,pixelHeight:k})),m}return Object.freeze({canvas:a,render(v){M(v?.stage);let h=R(v?.stage);p=String(v?.sync?.reasons?.[0]||""),y("arSync",v?.sync?.state||"missing"),y("arCanDraw",v?.sync?.canDrawPrecise===!0),y("arClockDomain",v?.clockDomain||null),y("arPresentedClock",v?.presentedClock?.domain||null),y("arClockConfidence",v?.presentedClock?.confidence||"unmapped"),y("arTracking",v?.tracking?.state||null),y("arTrackingAlpha",v?.tracking?.alpha??null),y("arWorldPoseEpoch",v?.worldPoseEpoch||null),y("arSyncReason",p||null),y("arReason",p||null);let S=v?.stage?{...v,stage:{...v.stage,devicePixelRatio:h.dpr}}:v;return z(S)},reset(){d&&(g.discarded+=1),d=null;for(let v of Object.values(E))v.initialized=!1,v.reference=null,v.revision=null;s.postMessage({type:"reset"})},status(){return Object.freeze({mode:"worker",ready:u,broken:c||null,composition:f?.composition||null,hold:f?.hold||null,renderer:f?.renderer||null,performance:f?.performance||null,canvas:`${m.pixelWidth}x${m.pixelHeight}`,dpr:m.dpr||1,queue:Object.freeze({...g,inFlight:l,pending:!!d,maxPending:1}),sourceTransfers:Object.freeze({...x}),viewport:Object.freeze({...b})})},destroy(){try{s.postMessage({type:"destroy"})}catch{}s.terminate?.(),a.remove?.()}})}function ie(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function iu(e){return e?Object.freeze({present:e.present!==!1,distanceM:ie(e.distanceM),turnType:ie(e.turnType),roadName:String(e.roadName||""),latitude:ie(e.latitude),longitude:ie(e.longitude),pointValid:e.pointValid===!0}):null}function cg(e){let t=e?.navigationStatus||null,n=e?.vehicle||null,r=e?.route||null,o=Array.isArray(r?.polyline)?r.polyline:[];return Object.freeze({present:!!e,sessionId:String(e?.sessionId||""),connected:e?.connected===!0,guidanceActive:t?.guidanceActive===!0,offRoute:t?.offRoute===!0,routePresent:t?.routePresent===!0||r?.present===!0,vehicle:Object.freeze({present:n?.present!==!1&&!!n,latitude:ie(n?.latitude),longitude:ie(n?.longitude),headingDeg:ie(n?.headingDeg),speedKph:ie(n?.speedKph)}),route:Object.freeze({present:r?.present===!0,pointCount:o.length,totalDistanceM:ie(r?.totalDistanceM),remainingDistanceM:ie(r?.remainingDistanceM),movedDistanceM:ie(r?.movedDistanceM)}),guidanceCurrent:iu(e?.guidanceCurrent),guidanceNext:iu(e?.guidanceNext),publishMonoTimeNanos:ie(e?.publishMonoTimeNanos)})}function lg(e){return e?Object.freeze({state:e.state,canDrawPrecise:e.canDrawPrecise===!0,canHoldAnchor:e.canHoldAnchor===!0,frameIdGap:ie(e.frameIdGap),modelAgeMs:ie(e.modelAgeMs),odometryAgeMs:ie(e.odometryAgeMs),poseAgeMs:ie(e.poseAgeMs),calibrationAgeMs:ie(e.calibrationAgeMs),naviAgeMs:ie(e.naviAgeMs),naviUsable:e.naviUsable===!0,presentedClockConfidence:String(e.presentedClockConfidence||"unmapped"),presentedTargetTimestampNs:ie(e.presentedTargetTimestampNs),reasons:Object.freeze([...e.reasons||[]].map(String))}):null}function ug(e){return e?Object.freeze({canUseGeo:e.canUseGeo===!0,canUseRoute:e.canUseRoute===!0,fallback:String(e.fallback||""),positionSigmaM:ie(e.positionSigmaM),headingSigmaDeg:ie(e.headingSigmaDeg),separationM:ie(e.separationM),reasons:Object.freeze([...e.reasons||[]].map(String)),routeReasons:Object.freeze([...e.routeReasons||[]].map(String))}):null}function dg(e,t,n){let r=[];t&&r.push(ie(n,40));for(let i of[e?.guidanceCurrent,e?.guidanceNext]){if(i?.present===!1)continue;let a=ie(i?.distanceM,null);a!==null&&a>=0&&r.push(a)}let o=ie(e?.speed?.sdiDistanceM,null);return o!==null&&o>=0&&r.push(o),r.length?Math.min(300,Math.max(...r)):40}function fg(e,t,n){let r=e?.vehicle,o=ie(r?.latitude),i=ie(r?.longitude),a=ie(r?.headingDeg),s=ie(e?.publishMonoTimeNanos,0),u=ie(t?.unixTimestampMillis,0),c=s>0?`navi:${s}`:`legacy:${o}|${i}|${a}|${u}`,l=n?.canUseGeo===!0,d=!l&&n?.canUseRoute===!0,f=l?ie(n?.positionSigmaM):d?uo.routeWorldPositionSigmaM:null,p=l?ie(n?.headingSigmaDeg):d?uo.routeWorldHeadingSigmaDeg:null;return Object.freeze({key:c,valid:l||d,latitude:o,longitude:i,headingDeg:a,positionSigmaM:f,headingSigmaDeg:p,yawUsable:a!==null&&p!==null,source:l?"tmap-comma-verified":d?"tmap-route":"unavailable",sourceTimestampNs:s>0?s:null,reasons:l?[]:n?.routeReasons||n?.reasons||[]})}function pg(e=globalThis,t=0){let n=e?.CarrotVisionReplay,r=n?.status?.()||null,o=typeof n?.isActive=="function"?n.isActive():r?.active===!0,i=ie(r?.currentTime,null);if(o&&i!==null&&i>=0){let a=String(n?.videoSourceKey?.()||r?.segment||r?.route||"replay");return Object.freeze({domain:Un.REPLAY_MEDIA,nowMs:i*1e3,epoch:a})}return Object.freeze({domain:Un.LIVE_MONOTONIC,nowMs:Math.max(0,ie(t,0)),epoch:"live"})}function au(e={}){let t=e.target||globalThis,n=e.document||t.document;if(!n?.createElement)return null;let r=e.host||n.getElementById?.("carrotVisionStage")||n.querySelector?.(".carrot-stage");if(!r)return null;let o=ts({enabled:e.traceEnabled===!0,capacity:e.traceCapacity,now:()=>t.performance?.now?.()??Date.now()}),i=e.diagnosticProbe===!0,a=e.bypassWorldAnchor??!1,s=()=>{},u=()=>{},c=new Set,l=e.renderer?null:sg({host:r,documentRoot:n,target:t,options:e,onBroken:te=>s(te),onDrawn:te=>u(te)}),d=e.renderer||null;if(!d&&!l)return null;let f=!1,p=!1,m=null,b=null,g=null,x=null,E=0,y=null,O=0,C=0,w="none",z=0,M=null,R=null,v=0,h=null,S=Math.max(1,ie(e.targetFps,Cr.targetFps)),A=Math.min(S,Math.max(1,ie(e.degradedFps,Cr.degradedFps))),L=ie(e.probeDistanceM,40),P=null,_=null,T="",I=null,k=null,D=null,B=null,W=null,V=null,F=null,H=null,Y=null,$=e.timelineTracker||ns(),K=e.presentedClockMapper||Ha(),Z=e.odometryTimeline||Ba(),ee=e.trackingTracker||rs({limits:e.trackingLimits}),ue=e.worldPoseTracker||Ia({limits:e.worldPoseLimits}),de=e.anchorStore||za({limits:e.holdLimits,bypassWorldAnchor:a}),ye=e.identityTracker||Aa(),U=e.routeMatcher||Xa();function X(te){for(let Re of[...c])try{Re(te)}catch(mt){t.console?.error?.("[carrot AR debug] frame listener failed",mt)}}function pe(te){if(typeof te!="function")throw new TypeError("AR diagnostic listener must be a function");c.add(te);let Re=!0;return()=>Re?(Re=!1,c.delete(te)):!1}u=te=>{te?.worldPose&&(B=te.worldPose);let Re=l?.status?.()||null,mt=Object.freeze({dpr:Re?.dpr??null,queue:Re?.queue||null,sourceTransfers:Re?.sourceTransfers||null}),Ce=te&&Object.freeze({...te,transport:mt});X(Ce),o.isEnabled()&&o.record("worker-drawn",{traceFrameId:te?.traceFrameId??null,ok:te?.ok===!0,composition:te?.composition||null,hold:te?.hold||null,worldPose:te?.worldPose||null,renderer:te?.renderer||null,performance:te?.performance||null,transport:mt})},s=te=>{!f||p||(o.record("worker-failure",{reason:String(te||"worker failed")}),f=!1,b?.(),b=null,w="none",de.reset(),ye.reset(),U.reset(),m?.release?.(),m=null)};function xe(te=!1){if(!f||p)return!1;let Re=t.performance?.now?.()??Date.now(),Ce=1e3/(l?Math.max(1,ie(l.status().performance?.fps,S)):S);if(!te&&y!==null&&Re-y0;Qn&&(V=We.targetTimeMs);let ht=Ua({roadCameraState:ge.roadCameraState,modelV2:nt,cameraOdometry:ge.cameraOdometry,livePose:ge.livePose,liveCalibration:ge.liveCalibration,carrotNavi:ge.carrotNavi,nowMs:fe.nowMs,clockDomain:fe.domain,presentedClock:We,receivedAtMonotonic:tt?.receivedAtMonotonic}),q=Ql({nowMs:fe.nowMs,clockDomain:fe.domain,receivedAtMonotonic:tt?.receivedAtMonotonic,naviUsable:ht.naviUsable,naviVehicle:ge.carrotNavi?.vehicle,naviRoutePolyline:ge.carrotNavi?.route?.polyline,gpsLocationExternal:_n.gpsLocationExternal});x=q;let oe=fg(ge.carrotNavi,_n.gpsLocationExternal,q),be=ht;g=be;let Se=ie(_n.carState?.vEgo,0),Ne=ee.update({nowMs:fe.nowMs,sampleId:We.targetTimestampNs??We.sourceFrameId??R?.sequence,presentedTimestampNs:We.targetTimestampNs,spatialClockReady:Qn,sync:be,odometry:Rt,egoSpeedMps:Se,anchorDistanceM:dg(ge.carrotNavi,i,L),discontinuity:fe.discontinuity,discontinuityReason:fe.discontinuityReason});D=Ne;let Qt=String(ge.carrotNavi?.sessionId||"");Qt&&(T=Qt);let Hi=T||"no-navigation-session",Zt=`${fe.domain}|${fe.epoch}|${Hi}`,Nn=nt?.position||null;Nn!==F&&(F=Nn,H=sa(Nn));let Lt=H,Vn=Lt?.x,gt=Lt?.y;P=Array.isArray(Vn)&&Array.isArray(gt)?Object.freeze({pathLengthM:Vn.at(-1)??null,lateralAtProbeM:(()=>{for(let bt=1;bt=L)return+Number(gt[bt]).toFixed(2);return null})(),lateralSpread:+(Math.max(...gt.map(Number))-Math.min(...gt.map(Number))).toFixed(2)}):null;let bn=V??fe.nowMs,Sr={navi:ge.carrotNavi||null,naviUsable:be.naviUsable,laneWidthM:ie(ge.lateralPlan?.laneWidth,3.5),egoSpeedMps:Se,calibrationProbe:i,probeDistanceM:L,canDrawPrecise:Ne.canCreateAnchor,geoAllowed:q.canUseGeo,routeAllowed:q.canUseRoute,routePositionSigmaM:q.positionSigmaM,modelPosition:Lt},zo=Ne.canPropagateAnchor&&Qn&&!!Rt,Mr=O+1,Jr=c.size>0,Ar=Jr?Object.freeze({replayTimeMs:fe.domain===Un.REPLAY_MEDIA?fe.nowMs:null,timeline:Object.freeze({domain:fe.domain,nowMs:fe.nowMs,epoch:fe.epoch,deltaMs:fe.deltaMs,discontinuity:fe.discontinuity,discontinuityReason:fe.discontinuityReason}),presented:R,presentedClock:We,sync:lg(be),positionQuality:ug(q),navi:cg(ge.carrotNavi),sources:Object.freeze({cameraFrameId:ie(ge.roadCameraState?.frameId),modelFrameId:ie(nt?.frameId),odometryFrameId:ie(ge.cameraOdometry?.frameId),livePoseTimestamp:ie(ge.livePose?.timestamp)}),worldEpoch:Zt}):null;o.isEnabled()&&o.record("frame-submit",{traceFrameId:Mr,force:te===!0,presented:R,timeline:{domain:fe.domain,nowMs:fe.nowMs,epoch:fe.epoch,deltaMs:fe.deltaMs,discontinuity:fe.discontinuity,discontinuityReason:fe.discontinuityReason},presentedClock:We,stage:Ge?{width:Ge.stageWidth??null,height:Ge.stageHeight??null,viewportLeft:Ge.viewportLeft??null,viewportTop:Ge.viewportTop??null}:null,sources:{cameraFrameId:ge.roadCameraState?.frameId??null,cameraTimestampEof:ge.roadCameraState?.timestampEof??null,modelFrameId:nt?.frameId??null,modelFrameAge:nt?.frameAge??null,odometryFrameId:ge.cameraOdometry?.frameId??null,odometryTimestampEof:ge.cameraOdometry?.timestampEof??null,odometryObservationTimestampNs:Rt?.observationTimestampNs??null,odometryAlignment:Rt?.temporalAlignment||null,livePoseTimestamp:ge.livePose?.timestamp??null,naviPublishMonoTimeNanos:ge.carrotNavi?.publishMonoTimeNanos??null,geographicPositionSigmaM:q.positionSigmaM,geographicHeadingSigmaDeg:q.headingSigmaDeg,coordinateFrames:{modelPosition:Lt?.coordinateFrame??null,cameraOdometry:Rt?.coordinateFrame??null,cameraOdometryDevice:Bt?.coordinateFrame??null,worldPose:B?.worldCoordinateFrame??Ae.LOCAL_WORLD_DEVICE,livePose:aa,tmapRoute:Ae.ROUTE_FLU}},sync:{state:be.state,canDrawPrecise:be.canDrawPrecise,canHoldAnchor:be.canHoldAnchor,naviUsable:be.naviUsable,reasons:be.reasons},tracking:Ne,worldPoseEpoch:Zt,probe:i},Re);let yn;if(l)yn=l.render({nowMs:bn,presentationNowMs:fe.nowMs,stage:Ge?{...Ge,devicePixelRatio:t.devicePixelRatio||1}:null,sync:be,tracking:Ne,deviceOdometry:Bt,livePose:ge.livePose,geographicObservation:oe,worldPoseEpoch:Zt,worldPoseTargetTimestampNs:We.targetTimestampNs,clockDomain:fe.domain,presentedClock:We,timelineDiscontinuity:fe.discontinuity,timelineDiscontinuityReason:fe.discontinuityReason,canHoldAnchor:zo,routeOdometry:Rt,traceFrameId:Mr,debugFrame:Ar,diagnosticsEnabled:Jr,composeInput:Sr,sourceRevisions:{navi:ge.carrotNavi?.publishMonoTimeNanos??null,modelPosition:nt?.frameId??null}});else{(fe.discontinuity||W!==Zt)&&(ue.reset({epoch:Zt,reason:fe.discontinuity?fe.discontinuityReason||"timeline discontinuity":"navigation/session epoch initialized"}),W=Zt),B=Bt?ue.update({timestampNs:We.targetTimestampNs,odometry:Bt,livePose:ge.livePose,geographicObservation:oe,trackingState:Ne.state}):ue.status(),fe.discontinuity&&(de.reset(),ye.reset(),U.reset(),d.reset?.());let bt=Xl(Sr,{identityTracker:ye,routeMatcher:U});_=Object.freeze({signCount:bt.signs.length,anchoredCount:bt.fresh?.length||0,sources:Object.freeze(bt.signs.map(Zn=>Zn.source||"unknown")),diag:bt.diag||null});let jo=bt.signs.length>0&&bt.signs.every(Zn=>Zn?.source==="calibrationProbe"),Vo=de.update({nowMs:bn,navi:Sr.navi,probe:jo,candidates:bt.fresh,modelPosition:Lt,valid:jo||!Sr.navi||be.naviUsable,canHold:zo,precise:Ne.canCreateAnchor,trackingState:Ne.state,trackingRecovered:Ne.recovered,retainAnchor:Ne.retainAnchor,trackingUncertaintyM:Ne.uncertainty?.lateralM,reason:Ne.reasons[0]||"",odometry:Rt,worldPose:B});yn=d.render({stage:Ge,sync:be,tracking:Ne,nowMs:fe.nowMs,clockDomain:fe.domain,held:Vo.state===vt.HELD,modelPosition:Lt,egoSpeedMps:Se,signs:Vo.anchors||[],diagnosticsEnabled:Jr}),X(Object.freeze({type:"drawn",traceFrameId:Mr,ok:yn===!0,debugFrame:Ar,composition:_,hold:de.status(bn),tracking:Ne,worldPose:B,renderer:d.status?.()||null,performance:null})),o.isEnabled()&&o.record("main-drawn",{traceFrameId:Mr,ok:yn===!0,composition:{signCount:bt.signs.length,anchoredCount:bt.fresh?.length||0,sources:bt.signs.map(Zn=>Zn.source||"unknown")},hold:de.status(bn),renderer:d.status?.()||null})}return O+=1,E=t.performance?.now?.()??Date.now(),yn}function Je(){let te=e.frameSync||t.CarrotVisionFrameSync,Re=(Ce={})=>{z+=1,M=Ce?.source||null;let Ke=Ce?.metadata||{};M==="replay"&&Ke.discontinuity===!0&&(Y=Object.freeze({sequence:Ce?.sequence??null,reason:String(Ke.discontinuityReason||"replay-seek")})),R=Object.freeze({source:M,sequence:Ce?.sequence??null,reason:Ce?.reason||null,mediaTime:Ke.mediaTime??null,expectedDisplayTime:Ke.expectedDisplayTime??null,presentedFrames:Ke.presentedFrames??null,rtpTimestamp:Ke.rtpTimestamp??null,captureTime:Ke.captureTime??null,receiveTime:Ke.receiveTime??null,frameId:Ce?.frameId??null,cameraTimestampEof:Ce?.cameraTimestampEof??null,clockMappingConfidence:Ce?.clockMappingConfidence||"unmapped",discontinuity:Ke.discontinuity===!0,discontinuityReason:Ke.discontinuityReason||null}),o.record("presented-frame",R),xe(!1)&&(v+=1,h=R.sequence)};if(typeof te?.subscribePresented=="function")return w="presented-channel",te.subscribePresented(Re);w="render-request-fallback";let mt=()=>Re({source:"render-request"});return t.addEventListener?.("carrot:render-request",mt),()=>t.removeEventListener?.("carrot:render-request",mt)}function et(){if(p||f||l?.status().broken)return!1;let te=e.activity||t.CarrotDriveDataActivity;return te?.acquire&&(m=te.acquire({owner:"vision_ar",ar:!0})),f=!0,C=t.performance?.now?.()??Date.now(),z=0,M=null,R=null,v=0,h=null,y=null,I=null,k=null,V=null,F=null,H=null,Y=null,$.reset(),K.reset(),Z.reset(),ee.reset("activate"),U.reset(),D=null,ue.reset({epoch:"uninitialized",reason:"activate"}),T="",B=null,W=null,b=Je(),o.record("activate",{frameSignalMode:w,diagnosticProbeEnabled:i}),xe(!0),y=null,!0}function ft(){return p||!f?!1:(o.record("deactivate",{frames:O,presentedSignals:z}),f=!1,b?.(),b=null,w="none",de.reset(),ye.reset(),U.reset(),l?.reset(),I=null,k=null,V=null,F=null,H=null,Y=null,$.reset(),K.reset(),Z.reset(),ee.reset("deactivate"),D=null,ue.reset({epoch:"uninitialized",reason:"deactivate"}),T="",B=null,W=null,m?.release?.(),m=null,l?l.render({sync:null,signs:[]}):d.render({}),!0)}function He(){return f?xe(!0):!1}function Ct(te){if(!i)return!1;let Re=ie(te,null);return Re===null||Re<=0?!1:(L=Re,de.reset(),ye.reset(),U.reset(),l?.reset(),xe(!0),!0)}function pt(){let te=e.provider||t.CarrotDriveLiveStateProvider,Re=e.stage||t.CarrotVisionStageTransform,Ce=te?.snapshot?.()?.overlayState||{},Ge=(e.frameSync||t.CarrotVisionFrameSync)?.selectModel?.()||Ce.modelV2,tt=Ce.carrotNavi||null,ge=tt?.navigationStatus||null,_n=t.CarrotVisionReplay?.status?.()||null,wt=l?.status()||null,nt=(l?wt?.composition:_)||null,Ie=[],fe=t.performance?.now?.()??Date.now();f||Ie.push("AR 런타임 비활성 (주행화면이 활성인지 확인)"),f&&fe-C>=1e3&&z===0&&Ie.push("presented-frame 신호가 들어오지 않음"),te||Ie.push("CarrotDriveLiveStateProvider 없음"),Re||Ie.push("CarrotVisionStageTransform 없음 (영상이 렌더 중인지 확인)"),Ge?Array.isArray(Ge?.position?.x)||Ie.push("modelV2.position.x 없음"):Ie.push("modelV2 없음"),Ce.roadCameraState||Ie.push("roadCameraState 없음"),Ce.liveCalibration||Ie.push("liveCalibration 없음"),g&&!g.canDrawPrecise&&Ie.push("AR gate 차단: "+g.reasons.join(", "));let We=l?wt?.renderer?.drawn??null:d.status().drawn;return l&&wt?.broken&&Ie.push("AR 워커 오류: "+wt.broken),l&&!wt?.ready&&Ie.push("AR 워커 준비 중"),We===0&&Ie.length===0&&(nt?.signCount===0?Ie.push("AR 마커 후보 없음"):nt?.anchoredCount===0?Ie.push("AR 마커는 있으나 model/geo 앵커를 만들지 못함"):wt?.renderer?.lastReason?Ie.push("AR 렌더러가 프레임을 건너뜀: "+wt.renderer.lastReason):Ie.push("AR 마커와 앵커는 있으나 렌더러가 그리지 못함")),Object.freeze({ok:Ie.length===0,problems:Object.freeze(Ie),calStatusRaw:Ce.liveCalibration?.calStatus??null,camFrameId:Ce.roadCameraState?.frameId??null,modelFrameId:Ge?.frameId??null,pathLengthM:Array.isArray(Ge?.position?.x)?Ge.position.x.at(-1):null,drawn:We,composition:nt,frameSignal:Object.freeze({mode:w,received:z,lastSource:M}),replay:_n,navi:Object.freeze({present:!!tt,connected:tt?.connected===!0,guidanceActive:ge?.guidanceActive===!0,offRoute:ge?.offRoute===!0,routePresent:ge?.routePresent===!0,usable:g?.naviUsable??null,ageMs:g?.naviAgeMs??null})})}function rn(){let te=l?.status()||null;return Object.freeze({active:f,destroyed:p,frames:O,lastFrameAt:E,frameSignalMode:w,presentedSignals:z,presentedSubmissions:v,lastSubmittedPresentedSequence:h,lastPresentedSource:M,targetFps:S,degradedFps:A,currentFps:l?Math.max(1,ie(te?.performance?.fps,S)):S,presentationClock:"presented-frame",presentationLoopActive:!1,leaseActive:!!m?.active,positionQuality:x,timeline:I,presentedClock:k,odometryTimeline:Z.status(),tracking:D||ee.status(),worldPose:B||ue.status(),sync:g?Object.freeze({state:g.state,canDrawPrecise:g.canDrawPrecise,canHoldAnchor:g.canHoldAnchor,calibrated:g.calibrated,calibrationPlausible:g.calibrationPlausible,frameIdGap:g.frameIdGap,modelAgeMs:g.modelAgeMs,odometryAgeMs:g.odometryAgeMs,poseAgeMs:g.poseAgeMs,calibrationAgeMs:g.calibrationAgeMs,naviAgeMs:g.naviAgeMs,naviUsable:g.naviUsable,presentedClockConfidence:g.presentedClockConfidence,presentedTargetTimestampNs:g.presentedTargetTimestampNs,odometryPoseDelayMs:g.odometryPoseDelayMs,reasons:g.reasons}):null,mode:l?"worker":"main",renderer:l?te?.renderer:d.status(),worker:te,composition:(l?te?.composition:_)||null,probeEnabled:i,probeDistanceM:L,trace:o.status(),anchor:P,hold:l?te?.hold:de.status()})}function jn(){return p?!1:(ft(),p=!0,l?.destroy(),d?.destroy(),c.clear(),os.delete(t),!0)}let on=Object.freeze({enable(te={}){return o.setEnabled(!0,te)},disable(te={}){return o.setEnabled(!1,te)},clear:o.clear,status:o.status,snapshot:o.snapshot});return Object.freeze({activate:et,deactivate:ft,resize:He,status:rn,diagnose:pt,setProbeDistance:Ct,subscribeDiagnostics:pe,destroy:jn,render:xe,trace:on})}function su(e={}){let t=e.target||globalThis,n=os.get(t);if(n)return n;let r=au({...e,target:t});return r&&os.set(t,r),r}function is(e=globalThis,t={}){let n=su({...t,target:e});return n&&(e.CarrotVisionAr=n),n}var dn=Object.freeze({ACTIVE_CANDIDATE:"active-candidate",ACTIVE_VISIBLE:"active-visible",ACTIVE_OFFSCREEN:"active-offscreen",ACTIVE_SUPPRESSED:"active-suppressed",PASSING:"passing",BEHIND_CAMERA:"behind-camera",NEAR_PLANE:"near-plane",PLAN_REJECTED:"plan-rejected",PROJECTION_UNAVAILABLE:"projection-unavailable",INACTIVE_FADING:"inactive-fading"}),wM=Object.freeze({[dn.ACTIVE_CANDIDATE]:"active marker candidate",[dn.ACTIVE_VISIBLE]:"visible",[dn.ACTIVE_OFFSCREEN]:"outside camera viewport",[dn.ACTIVE_SUPPRESSED]:"overlap selection suppressed",[dn.PASSING]:"marker passing camera",[dn.BEHIND_CAMERA]:"behind camera",[dn.NEAR_PLANE]:"inside near-plane passing zone",[dn.PLAN_REJECTED]:"visibility plan rejected",[dn.PROJECTION_UNAVAILABLE]:"projection unavailable",[dn.INACTIVE_FADING]:"inactive marker fading"});var Ye=Object.freeze({OK:"ok",WARN:"warn",IDLE:"idle",OFF:"off"});function Le(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function ur(e){let t=Le(e?.worker?.renderer?.drawn);return t===null?Le(e?.renderer?.drawn,0)??0:t}function as(e){return Object.entries(e).map(([t,n])=>n?t:"-").join("")}function ss(e){return e===!0?"ON":"off"}function cs(e){if(!e||e.active!==!0)return{tone:Ye.OFF,label:"AR 꺼짐",hint:"주행화면 비활성"};let t=Le(e.composition?.signCount,0)??0,n=Le(e.composition?.anchoredCount,0)??0,r=ur(e);return r>0?{tone:Ye.OK,label:"표시중",hint:`그림 ${r}`}:n>0?{tone:Ye.WARN,label:"앵커O·렌더X",hint:"렌더러가 못 그림"}:t>0?{tone:Ye.WARN,label:"표지O·앵커X",hint:"앵커 생성 실패"}:{tone:Ye.IDLE,label:"표지 없음",hint:"안내/후보 없음"}}function gi(e){if(!e)return"—";let t=[`gate:${as({G:e.geo,R:e.route,P:e.precise})}`,`pts:${e.routePts}`,`veh:${e.veh}${e.head}`,`match:${e.matchIdx??"-"}`,`path:${e.pathM===null||e.pathM===void 0?"-":`${e.pathM}m`}`];return Array.isArray(e.fails)&&e.fails.length&&t.push(`fail:${e.fails.map(n=>`${n.src}@${n.dist}m`).join(",")}`),t.join(" ")}function cu(e){return e?`x${e.x} y${e.y} z${e.z}`:"—"}function lu(e){let t=e?.worker?.renderer||e?.renderer||null;if(!t)return"—";let n=[`draw ${Le(t.drawn,0)}`,`skip ${Le(t.skipped,0)}`];return t.lastReason&&n.push(String(t.lastReason)),Array.isArray(t.skips)&&t.skips.length&&n.push(`[${t.skips.join(" | ")}]`),n.join(" · ")}function bi(e){let t=e?.worker;if(!t)return"—";let n=t.viewport||{};return`${t.canvas||"—"} @ ${Le(n.left,0)},${Le(n.top,0)}`}function yi(e,t){let n=t?.calStatusRaw,r=e?.sync?.calibrationPlausible,o=e?.sync?.calibrated;return`cal:${n??"—"} ${as({C:o===!0,P:r===!0})}`}function uu(e,t){let n=ur(e);return e?.tracking?.reasons?.[0]||(Array.isArray(t?.problems)&&t.problems.length?t.problems[0]:null)||e?.sync?.reasons?.[0]||(n>0?"":cs(e).hint)}function du(e,t){let n=t?.camFrameId??"—",r=t?.modelFrameId??"—";return`cam ${n} · model ${r}`}function fu(e){let t=e?.sync;return t?["model","odometry","pose","navi"].map(n=>`${n[0]}${Le(t[`${n}AgeMs`],"—")}`).join(" "):"—"}function pu(e){let t=e?.navi;return t?`${as({P:t.present,C:t.connected,G:t.guidanceActive,R:t.routePresent})}${t.offRoute?" offRoute":""} age${Le(t.ageMs,"—")}`:"—"}function mu(e){let t=e?.positionQuality;if(!t)return"—";let n=[`geo:${t.canUseGeo?"ON":"off"}`,`route:${t.canUseRoute?"ON":"off"}`];return t.horizontalAccuracyM!==null&&t.horizontalAccuracyM!==void 0&&n.push(`acc${Number(t.horizontalAccuracyM).toFixed(1)}m`),t.separationM!==null&&t.separationM!==void 0&&n.push(`sep${Number(t.separationM).toFixed(1)}m`),t.positionSigmaM!==null&&t.positionSigmaM!==void 0&&n.push(`σ${Number(t.positionSigmaM).toFixed(1)}m`),n.join(" ")}function hu(e){let t=e?.positionQuality,n=t?.reasons?.[0],r=t?.routeReasons?.[0];return[r&&`route:${r}`,n&&`geo:${n}`].filter(Boolean).join(" | ")||"—"}function gu(e){let t=e?.timeline;return t?`${t.domain||"—"} ${t.discontinuity?`끊김(${t.discontinuityReason||"?"})`:"연속"}`:"—"}function bu(e){let t=e?.odometryTimeline;if(!t)return"—";let n=Le(e?.presentedClock?.targetTimestampNs),r=Le(t.lastObservationTimestampNs),o=n===null||r===null?null:Math.round((n-r)/1e6),i=Le(t.maxExtrapolationMs,150);return`samples ${Le(t.samples,0)} · lag ${o===null?"—":`${o}ms`}/${i}ms`}function yu(e){let t=e?.worldPose;return t?t.initialized?`init · ${Le(t.integrations,0)}회`:"미초기화":"—"}function vu(e){let t=e?.replay;if(!t)return"라이브";let n=t.currentTime===void 0?"":` ${Number(t.currentTime).toFixed(1)}s`;return`${t.active?"재생":"정지"}${t.loading?"·로딩":""}${n} ${t.segment||""}`.trim()}function Su(e){let t=e?.frameSignal;return t?`${t.mode||"—"} rx${Le(t.received,0)} ${t.lastSource||""}`.trim():"—"}function Mu(e){let t=[e?.mode||"—",`fps ${Le(e?.currentFps,"—")}`,`frames ${Le(e?.frames,0)}`],n=e?.worker;return n&&t.push(`worker ${n.ready?"ok":"대기"}${n.broken?`·${n.broken}`:""}`),t.join(" · ")}function ls(e){let t=Math.max(0,Math.round(e/100)/10);return`${String(Math.floor(t/60)).padStart(2,"0")}:${(t%60).toFixed(1).padStart(4,"0")}`}var Au=".carrot-ar__canvas";function hg(e){let t=e.getBoundingClientRect?.();return t?{x:Math.round(t.left),y:Math.round(t.top),w:Math.round(t.width),h:Math.round(t.height)}:null}function gg(e){if(!e)return"없음";let t=String(e.tagName||"?").toLowerCase();if(e.id)return`${t}#${e.id}`;let n=typeof e.className=="string"&&e.className.trim()?e.className.trim().split(/\s+/)[0]:"";return n?`${t}.${n}`:t}function Fr(e=globalThis,t={}){let n=t.document||e?.document,r=t.canvas||n?.querySelector?.(t.selector||Au);if(!r)return null;let o=hg(r),a=(r.ownerDocument?.defaultView||e)?.getComputedStyle?.(r)||{},s={display:a.display||"",visibility:a.visibility||"",opacity:a.opacity||"",zIndex:a.zIndex||""},u=null;if(o&&o.w>0&&o.h>0&&n?.elementFromPoint){let c=n.elementFromPoint(o.x+o.w/2,o.y+o.h/2);u=c===r?null:c}return{rect:o,style:s,coveredBy:gg(u),ready:r.dataset?.arReady??null,backend:r.dataset?.arBackend??null,drawn:r.dataset?.arDrawn??null}}function Eo(e){if(!e)return"캔버스 없음";let{rect:t,style:n}=e;if(!t)return"rect 없음";let r=`${t.w}x${t.h}@${t.x},${t.y}`,o=n.display==="none"||n.visibility==="hidden"||Number(n.opacity)===0,i=[r,`z${n.zIndex||"auto"}`];return o&&i.push(`숨김(${n.display}/${n.visibility}/${n.opacity})`),t.w>0&&t.h>0||i.push("크기0"),e.coveredBy&&e.coveredBy!=="없음"&&i.push(`위:${e.coveredBy}`),i.join(" ")}var us=Object.freeze([Object.freeze({id:"pipeline",label:"파이프라인",fields:Object.freeze([Object.freeze({id:"counts",label:"표지·앵커·그림",value:e=>[Le(e?.composition?.signCount,0)??0,Le(e?.composition?.anchoredCount,0)??0,ur(e)].join(" · "),tone:e=>ur(e)>0?Ye.OK:Ye.WARN}),Object.freeze({id:"tracking",label:"track·hold",value:e=>{let t=e?.tracking,n=`${t?.canCreateAnchor?"C":"-"}${t?.canPropagateAnchor?"P":"-"}`;return`${t?.state||"—"}[${n}] · ${e?.hold?.state||"—"}(${Le(e?.hold?.anchorCount,0)??0})`},tone:e=>e?.tracking?.canCreateAnchor?Ye.OK:Ye.WARN}),Object.freeze({id:"sources",label:"navi·route",value:e=>`${ss(e?.sync?.naviUsable)} · ${ss(e?.positionQuality?.canUseRoute)}`,tone:e=>e?.sync?.naviUsable&&e?.positionQuality?.canUseRoute?Ye.OK:Ye.WARN})])}),Object.freeze({id:"compose",label:"앵커 입력",fields:Object.freeze([Object.freeze({id:"gate",label:"gate",value:e=>gi(e?.composition?.diag),wide:!0}),Object.freeze({id:"anchor",label:"첫 앵커",value:e=>cu(e?.hold?.sample)})])}),Object.freeze({id:"render",label:"렌더 경로",fields:Object.freeze([Object.freeze({id:"renderer",label:"renderer",value:e=>lu(e),wide:!0}),Object.freeze({id:"canvas",label:"canvas",value:e=>bi(e)}),Object.freeze({id:"alpha",label:"alpha",value:e=>{let t=e?.worker?.renderer||e?.renderer||null,n=Le(e?.tracking?.alpha,null),r=Le(t?.minimumVisibilityAlpha,null);return`track ${n??"—"} · vis ${r??"—"}`},tone:e=>{let t=Le(e?.tracking?.alpha,1);return t!==null&&t>.05?Ye.OK:Ye.WARN}}),Object.freeze({id:"surface",label:"표면",value:()=>Eo(Fr()),tone:()=>{let e=Fr();if(!e?.rect)return Ye.WARN;let t=e.style.display==="none"||e.style.visibility==="hidden"||Number(e.style.opacity)===0,n=e.coveredBy&&e.coveredBy!=="없음";return!t&&e.rect.w>0&&e.rect.h>0&&!n?Ye.OK:Ye.WARN},wide:!0}),Object.freeze({id:"calibration",label:"보정",value:(e,t)=>yi(e,t),tone:e=>e?.sync?.calibrationPlausible===!0?Ye.OK:Ye.WARN})])}),Object.freeze({id:"clock",label:"시계",fields:Object.freeze([Object.freeze({id:"presented",label:"presented·gap",value:e=>`${e?.sync?.presentedClockConfidence||"—"} · ${e?.sync?.frameIdGap??"—"}`,tone:e=>e?.sync?.presentedClockConfidence==="unmapped"?Ye.WARN:Ye.OK}),Object.freeze({id:"timeline",label:"timeline",value:e=>gu(e)}),Object.freeze({id:"world",label:"worldPose",value:e=>yu(e)}),Object.freeze({id:"odoTimeline",label:"odometry",value:e=>bu(e)}),Object.freeze({id:"frameSignal",label:"frame신호",value:(e,t)=>Su(t),wide:!0})])}),Object.freeze({id:"sources",label:"소스",fields:Object.freeze([Object.freeze({id:"frames",label:"frameId",value:(e,t)=>du(e,t)}),Object.freeze({id:"ages",label:"age(ms)",value:e=>fu(e)}),Object.freeze({id:"navi",label:"navi",value:(e,t)=>pu(t),wide:!0}),Object.freeze({id:"syncState",label:"sync",value:e=>`${e?.sync?.state||"—"} ${e?.sync?.canDrawPrecise?"precise":"—"}/${e?.sync?.canHoldAnchor?"hold":"—"}`,tone:e=>e?.sync?.canDrawPrecise?Ye.OK:Ye.WARN})])}),Object.freeze({id:"quality",label:"위치 품질",fields:Object.freeze([Object.freeze({id:"pq",label:"판정",value:e=>mu(e),wide:!0}),Object.freeze({id:"pqReason",label:"사유",value:e=>hu(e),wide:!0})])}),Object.freeze({id:"runtime",label:"런타임",fields:Object.freeze([Object.freeze({id:"perf",label:"성능",value:e=>Mu(e),wide:!0}),Object.freeze({id:"replay",label:"리플레이",value:(e,t)=>vu(t),wide:!0})])})]);function vi(e,t){let n=e?.document,r=()=>{if(!n?.createElement)return!1;try{let i=n.createElement("textarea");i.value=t,i.setAttribute("readonly",""),i.style.cssText="position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;",(n.body||n.documentElement).appendChild(i),i.select(),i.setSelectionRange(0,t.length);let a=n.execCommand?.("copy")===!0;return i.remove(),a}catch{return!1}};return typeof e?.navigator?.clipboard?.writeText!="function"?Promise.resolve(r()):e.navigator.clipboard.writeText(t).then(()=>!0).catch(()=>r())}function zr(e,t){t&&e.set(t,(e.get(t)||0)+1)}function Ru(e,t){let n=Number(t);Number.isFinite(n)&&(e.min=e.min===null?n:Math.min(e.min,n),e.max=e.max===null?n:Math.max(e.max,n))}function xu(e,t=""){return e.min===null?"—":e.min===e.max?`${e.min}${t}`:`${e.min}${t} ~ ${e.max}${t}`}function bg(e,t=6){return[...e.entries()].sort((n,r)=>r[1]-n[1]).slice(0,t).map(([n,r])=>` ${n} x${r}`)}function ds(e={}){let t=typeof e.now=="function"?e.now:()=>Date.now(),n=t(),r=new Map,o=new Map,i=new Map,a=new Map,s=new Map,u=new Map,c={min:null,max:null},l={min:null,max:null},d={sign:0,anchored:0,drawn:0,frames:0,withAnchor:0,withDraw:0},f=null,p=null;function m(g){d.frames+=1,zr(r,g.badge),zr(o,g.reason),zr(a,g.gate),zr(s,g.hold),zr(u,g.track);for(let x of g.skips||[])zr(i,x);g.anchor&&(Ru(c,g.anchor.x),Ru(l,g.anchor.y)),Number(g.anchored)>0&&(d.withAnchor+=1),Number(g.drawn)>0&&(d.withDraw+=1),d.sign=Math.max(d.sign,Number(g.sign)||0),d.anchored=Math.max(d.anchored,Number(g.anchored)||0),d.drawn=Math.max(d.drawn,Number(g.drawn)||0),f=g.fixed||f,p=g}function b(){let g=t()-n,x=[`AR 진단 요약 ${ls(g)} 동안 ${d.frames}프레임`,`현재 ${p?`${p.badge} ${p.sign}·${p.anchored}·${p.drawn} ${p.track} ${p.hold}`:"—"}`,`도달 앵커생성 ${d.withAnchor}프레임 / 렌더 ${d.withDraw}프레임 / 최대 ${d.sign}·${d.anchored}·${d.drawn}`,`앵커 x ${xu(c,"m")} · y ${xu(l,"m")}`];f&&x.push(`환경 ${f}`);let E=[["상태",r],["track",u],["hold",s],["gate",a],["렌더 스킵",i],["차단 사유",o]];for(let[y,O]of E)O.size&&(x.push(`─ ${y} (${O.size}종)`),x.push(...bg(O)));return x.join(` -`)}return Object.freeze({observe:m,report:b,get frames(){return d.frames},reset(){r.clear(),o.clear(),i.clear(),a.clear(),s.clear(),u.clear(),c.min=c.max=l.min=l.max=null,d.frames=d.withAnchor=d.withDraw=0,d.sign=d.anchored=d.drawn=0,p=null}})}function J(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function re(e,t=3){let n=J(e);if(n===null)return null;let r=10**t;return Math.round(n*r)/r}function Co(e){return Array.isArray(e)?e.map(String).filter(Boolean):[]}function Mi(e){return e?{x:re(e.x),y:re(e.y),z:re(e.z),markerId:e.markerId?String(e.markerId):void 0,lifecycleSlot:e.lifecycleSlot?String(e.lifecycleSlot):void 0,headingRad:re(e.headingRad,5),billboardYawRad:re(e.billboardYawRad,5),source:e.source?String(e.source):void 0,roadGrade:re(e.roadGrade,5),heightSource:e.heightSource?String(e.heightSource):void 0,heightConfidence:re(e.heightConfidence,3),heightLimited:e.heightLimited===!0,routeDerived:e.routeDerived===!0}:null}function yg(e){return{markerId:String(e?.markerId||""),lifecycleSlot:String(e?.lifecycleSlot||""),source:String(e?.source||"unknown"),kind:String(e?.kind||""),distanceM:re(e?.distanceM,2),visible:e?.visible===!0,visibilityState:String(e?.visibilityState||""),reason:String(e?.reason||""),phase:String(e?.phase||""),confidence:String(e?.confidence||""),alpha:re(e?.alpha,4),worldScale:re(e?.worldScale,4),anchor:Mi(e?.anchor),screen:e?.screen?{centerX:re(e.screen.centerX,2),centerY:re(e.screen.centerY,2),widthPx:re(e.screen.widthPx,2),heightPx:re(e.screen.heightPx,2),depth:re(e.screen.depth,4)}:null}}function vg(e){return e?{state:String(e.state||""),reason:e.reason?String(e.reason):void 0,progress:re(e.progress,4),durationMs:re(e.durationMs,1),positionInnovationM:re(e.positionInnovationM),orientationInnovationRad:re(e.orientationInnovationRad,5),lateralInnovationM:re(e.lateralInnovationM),heightInnovationM:re(e.heightInnovationM)}:null}function Tu(e={},t={}){let n=e.debugFrame||{},r=n.presentedClock||{},o=n.sync||{},i=e.tracking||{},a=e.hold||{},s=e.composition||{},u=e.renderer||{},c=e.worldPose||{},l=J(n.replayTimeMs,J(t.currentTime,0)*1e3);return{mediaTimeMs:re(l,1),traceFrameId:J(e.traceFrameId),ok:e.ok===!0,presented:{sequence:J(n.presented?.sequence),sourceFrameId:J(r.sourceFrameId??n.presented?.frameId),confidence:String(r.confidence||"unmapped"),mapped:r.mapped===!0,targetTimestampNs:r.targetTimestampNs===null||r.targetTimestampNs===void 0?null:J(r.targetTimestampNs)},sources:{cameraFrameId:J(n.sources?.cameraFrameId),modelFrameId:J(n.sources?.modelFrameId),odometryFrameId:J(n.sources?.odometryFrameId),livePoseTimestamp:J(n.sources?.livePoseTimestamp)},sync:{state:String(o.state||""),precise:o.canDrawPrecise===!0,hold:o.canHoldAnchor===!0,frameIdGap:J(o.frameIdGap),modelAgeMs:re(o.modelAgeMs,1),odometryAgeMs:re(o.odometryAgeMs,1),poseAgeMs:re(o.poseAgeMs,1),naviAgeMs:re(o.naviAgeMs,1),naviUsable:o.naviUsable===!0,reasons:Co(o.reasons)},navi:n.navi||null,positionQuality:n.positionQuality||null,tracking:{state:String(i.state||""),canCreateAnchor:i.canCreateAnchor===!0,canPropagateAnchor:i.canPropagateAnchor===!0,retainAnchor:i.retainAnchor===!0,alpha:re(i.alpha,4),predictionAgeMs:re(i.predictionAgeMs,1),lateralUncertaintyM:re(i.uncertainty?.lateralM),budgetM:re(i.uncertainty?.budgetM),reasons:Co(i.reasons)},composition:{signs:J(s.signCount,0),anchors:J(s.anchoredCount,0),sources:Co(s.sources),gate:s.diag||null},hold:{state:String(a.state||""),sourceMode:a.sourceMode?String(a.sourceMode):null,anchorCount:J(a.anchorCount,0),unresolvedCount:J(a.unresolvedCount,0),creationDeferredCount:J(a.creationDeferredCount,0),creationGateReason:a.creationGateReason?String(a.creationGateReason):null,handoffCount:J(a.handoffCount,0),fixId:a.fixId?String(a.fixId):null,sourceId:a.sourceId?String(a.sourceId):null,worldEpoch:a.worldEpoch?String(a.worldEpoch):null,holdMs:re(a.holdMs,1),driftM:re(a.driftM),reason:String(a.reason||""),sample:Mi(a.sample),handoff:vg(a.handoff)},worldPose:{initialized:c.initialized===!0,epoch:String(c.epoch||n.worldEpoch||""),integrations:J(c.integrations,0),position:Array.isArray(c.position)?c.position.slice(0,3).map(d=>re(d,4)):null,orientation:Array.isArray(c.orientation)?c.orientation.slice(0,4).map(d=>re(d,6)):null,reason:String(c.reason||""),dtMs:re(c.dtMs,2),geoCorrection:c.geoCorrection?{referenceReady:c.geoCorrection.referenceReady===!0,accepted:J(c.geoCorrection.accepted,0),rejected:J(c.geoCorrection.rejected,0),yawAccepted:J(c.geoCorrection.yawAccepted,0),yawRejected:J(c.geoCorrection.yawRejected,0),appliedFrames:J(c.geoCorrection.appliedFrames,0),positionInnovationM:re(c.geoCorrection.lastPositionInnovationM),yawInnovationRad:re(c.geoCorrection.lastYawInnovationRad,5),positionSigmaM:re(c.geoCorrection.lastPositionSigmaM),headingSigmaDeg:re(c.geoCorrection.lastHeadingSigmaDeg),reason:String(c.geoCorrection.lastReason||"")}:null},renderer:{drawn:J(u.drawn,0),skipped:J(u.skipped,0),selectionSuppressed:J(u.selectionSuppressed,0),trackingAlpha:re(u.trackingAlpha,4),minimumVisibilityAlpha:re(u.minimumVisibilityAlpha,4),reason:String(u.lastReason||""),visibilityStates:u.visibilityStates&&typeof u.visibilityStates=="object"?{...u.visibilityStates}:{},markers:Array.isArray(u.markers)?u.markers.map(yg):[]},performance:e.performance?{fps:re(e.performance.fps,1),averageWorkMs:re(e.performance.averageWorkMs,3),lastWorkMs:re(e.performance.lastWorkMs,3),slowFrames:J(e.performance.slowFrames,0),level:String(e.performance.level||"")}:null,transport:e.transport?{dpr:re(e.transport.dpr,2),queue:e.transport.queue?{posted:J(e.transport.queue.posted,0),completed:J(e.transport.queue.completed,0),deferred:J(e.transport.queue.deferred,0),replaced:J(e.transport.queue.replaced,0),discarded:J(e.transport.queue.discarded,0),inFlight:e.transport.queue.inFlight===!0,pending:e.transport.queue.pending===!0,maxPending:J(e.transport.queue.maxPending,1)}:null,sourceTransfers:e.transport.sourceTransfers?{navi:J(e.transport.sourceTransfers.navi,0),modelPosition:J(e.transport.sourceTransfers.modelPosition,0),reusedNavi:J(e.transport.sourceTransfers.reusedNavi,0),reusedModelPosition:J(e.transport.sourceTransfers.reusedModelPosition,0)}:null}:null}}function kn(e,t){let n=String(t||"unknown");e[n]=(e[n]||0)+1}function Jt(e,t,n,r={}){e.length>=1200||e.push({type:t,mediaTimeMs:n.mediaTimeMs,traceFrameId:n.traceFrameId,...r})}function fs(e,t,n,r){let o=J(e.lastEventAt?.get(t),Number.NEGATIVE_INFINITY);return n-o0&&n!==null&&n>0&&Math.abs(t-n)>5e9}function Sg(e,t){let n=e.frames.at(-1)||null;if(!t.presented.mapped&&fs(e,"clock-unmapped",t.mediaTimeMs,500)&&Jt(e.events,"clock-unmapped",t),(t.sync.frameIdGap??0)>8&&Jt(e.events,"frame-gap",t,{gap:t.sync.frameIdGap}),t.hold.sample&&Math.abs(t.hold.sample.y??0)>8&&fs(e,"anchor-lateral-outlier",t.mediaTimeMs,500)&&Jt(e.events,"anchor-lateral-outlier",t,{x:t.hold.sample.x,y:t.hold.sample.y,fixId:t.hold.fixId}),t.hold.anchorCount>0&&t.renderer.drawn===0&&fs(e,"anchor-not-rendered",t.mediaTimeMs,500)&&Jt(e.events,"anchor-not-rendered",t,{reason:t.renderer.reason,visibilityStates:t.renderer.visibilityStates,markers:t.renderer.markers.map(u=>({markerId:u.markerId,state:u.visibilityState,reason:u.reason}))}),!n)return;if(n.hold.sample?.markerId&&n.hold.sample.markerId===t.hold.sample?.markerId){let u=Math.hypot(J(t.hold.sample.x,0)-J(n.hold.sample.x,0),J(t.hold.sample.y,0)-J(n.hold.sample.y,0));u>=8&&Jt(e.events,"anchor-position-jump",t,{meters:re(u,1),from:Mi(n.hold.sample),to:Mi(t.hold.sample),fromFixId:n.hold.fixId,toFixId:t.hold.fixId})}n.tracking.state!==t.tracking.state&&Jt(e.events,"tracking-transition",t,{from:n.tracking.state,to:t.tracking.state}),n.renderer.drawn>0!=t.renderer.drawn>0&&Jt(e.events,t.renderer.drawn>0?"marker-visible":"marker-hidden",t),n.hold.state!==t.hold.state&&Jt(e.events,"hold-transition",t,{from:n.hold.state,to:t.hold.state,reason:t.hold.reason});let r=n.composition.gate?.matchIdx??null,o=t.composition.gate?.matchIdx??null;r!==o&&Jt(e.events,"route-match-changed",t,{from:r,to:o}),n.worldPose.integrations>t.worldPose.integrations&&Jt(e.events,"world-pose-reset",t,{from:n.worldPose.integrations,to:t.worldPose.integrations});let i=n.navi||{},a=t.navi||{},s=u=>[u.present,u.guidanceActive,u.routePresent,u.vehicle?.present,u.route?.pointCount].join(":");s(i)!==s(a)&&Jt(e.events,"navi-snapshot-changed",t,{from:s(i),to:s(a)}),Oo(n)!==Oo(t)&&Jt(e.events,"navi-clock-domain-transition",t,{from:Oo(n)?"mismatch":"aligned",to:Oo(t)?"mismatch":"aligned",naviPublishMonoTimeNanos:J(t.navi?.publishMonoTimeNanos),presentedTargetTimestampNs:J(t.presented?.targetTimestampNs)})}function Mg(e){let t=null;try{t=e.CarrotDriveLiveStateProvider?.snapshot?.()?.overlayState?.carrotNavi}catch{}let n=Array.isArray(t?.route?.polyline)?t.route.polyline:[];if(n.length<2)return null;let r=n.map(a=>({latitude:re(a?.latitude,7),longitude:re(a?.longitude,7)})),o=r[Math.floor(r.length/2)];return{signature:[String(t?.sessionId||"legacy"),r.length,r[0]?.latitude,r[0]?.longitude,o?.latitude,o?.longitude,r.at(-1)?.latitude,r.at(-1)?.longitude].join(":"),points:r}}function Ag(e){let t=new Map,n=350,r=2e3;for(let s=0;s=3&&(u=!0)}u&&a.push(s.markerId)}return Object.freeze({markerCount:t.size,transitions:o,maxRapidTransitions:i,blinkingIds:Object.freeze(a.sort())})}function Eu(e){let t=e.frames,n=J(t[0]?.mediaTimeMs),r=J(t.at(-1)?.mediaTimeMs),o=e.durationSeconds*1e3,i=n!==null&&r!==null?Math.max(0,r-n):0,a={frames:t.length,events:e.events.length,tracking:{},hold:{},clock:{},visibility:{},markerStates:{},eventTypes:{},anchorRange:{x:[null,null],y:[null,null]},coverage:{requestedStartMs:0,requestedEndMs:re(o,1),firstMediaTimeMs:re(n,1),lastMediaTimeMs:re(r,1),capturedSpanMs:re(i,1),missingTailMs:re(Math.max(0,o-(r??0)),1),ratio:re(o>0?Math.min(1,(r??0)/o):0,4),complete:n!==null&&n<=250&&r>=o-250,effectiveFps:re(i>0?(t.length-1)*1e3/i:0,2)},transitions:{tracking:0,hold:0,visibility:0,naviUsable:0},navi:{usableFrames:0,unusableFrames:0,clockMismatchFrames:0},worldPose:{integratedFrames:0,maxIntegrations:0,geoAccepted:0,geoRejected:0,geoAppliedFrames:0,yawAccepted:0,yawRejected:0,anchorCreationDeferredFrames:0,anchorCreationGateReasons:{}},markerContinuity:null,transport:{maxDpr:0,queue:{deferred:0,replaced:0,discarded:0,maxPending:0},sourceTransfers:{navi:0,modelPosition:0,reusedNavi:0,reusedModelPosition:0}},reasons:{sync:{},tracking:{},hold:{}},flags:[]},s=(l,d)=>{let f=J(d);f!==null&&(l[0]=l[0]===null?f:Math.min(l[0],f),l[1]=l[1]===null?f:Math.max(l[1],f))},u={tracking:null,hold:null,visibility:null,naviUsable:null};for(let l of t){kn(a.tracking,l.tracking.state),kn(a.hold,l.hold.state),kn(a.clock,l.presented.confidence);let d=l.renderer.drawn>0?"visible":"hidden",f=l.sync.naviUsable===!0;kn(a.visibility,d);for(let[m,b]of Object.entries(l.renderer.visibilityStates||{}))a.markerStates[m]=(a.markerStates[m]||0)+Number(b||0);a.navi[f?"usableFrames":"unusableFrames"]+=1,Oo(l)&&(a.navi.clockMismatchFrames+=1);let p=J(l.worldPose?.integrations,0);p>0&&(a.worldPose.integratedFrames+=1),a.worldPose.maxIntegrations=Math.max(a.worldPose.maxIntegrations,p),a.worldPose.geoAccepted=Math.max(a.worldPose.geoAccepted,J(l.worldPose?.geoCorrection?.accepted,0)),a.worldPose.geoRejected=Math.max(a.worldPose.geoRejected,J(l.worldPose?.geoCorrection?.rejected,0)),a.worldPose.geoAppliedFrames=Math.max(a.worldPose.geoAppliedFrames,J(l.worldPose?.geoCorrection?.appliedFrames,0)),a.worldPose.yawAccepted=Math.max(a.worldPose.yawAccepted,J(l.worldPose?.geoCorrection?.yawAccepted,0)),a.worldPose.yawRejected=Math.max(a.worldPose.yawRejected,J(l.worldPose?.geoCorrection?.yawRejected,0)),J(l.hold?.creationDeferredCount,0)>0&&(a.worldPose.anchorCreationDeferredFrames+=1,kn(a.worldPose.anchorCreationGateReasons,l.hold.creationGateReason)),a.transport.maxDpr=Math.max(a.transport.maxDpr,J(l.transport?.dpr,0));for(let m of["deferred","replaced","discarded","maxPending"])a.transport.queue[m]=Math.max(a.transport.queue[m],J(l.transport?.queue?.[m],0));for(let m of["navi","modelPosition","reusedNavi","reusedModelPosition"])a.transport.sourceTransfers[m]=Math.max(a.transport.sourceTransfers[m],J(l.transport?.sourceTransfers?.[m],0));for(let m of Co(l.sync?.reasons))kn(a.reasons.sync,m);for(let m of Co(l.tracking?.reasons))kn(a.reasons.tracking,m);l.hold?.reason&&kn(a.reasons.hold,l.hold.reason);for(let[m,b]of Object.entries({tracking:l.tracking.state,hold:l.hold.state,visibility:d,naviUsable:f}))u[m]!==null&&u[m]!==b&&(a.transitions[m]+=1),u[m]=b;s(a.anchorRange.x,l.hold.sample?.x),s(a.anchorRange.y,l.hold.sample?.y)}for(let l of e.events)kn(a.eventTypes,l.type);a.anchorRange.x=a.anchorRange.x.map(l=>re(l)),a.anchorRange.y=a.anchorRange.y.map(l=>re(l));let c=(l,d=8)=>Object.fromEntries(Object.entries(l).sort((f,p)=>p[1]-f[1]).slice(0,d));return a.reasons.sync=c(a.reasons.sync),a.reasons.tracking=c(a.reasons.tracking),a.reasons.hold=c(a.reasons.hold),a.worldPose.anchorCreationGateReasons=c(a.worldPose.anchorCreationGateReasons),a.markerContinuity=Ag(t),a.coverage.complete||a.flags.push("capture-incomplete"),a.navi.clockMismatchFrames>0&&a.flags.push("mixed-clock-domain"),a.transitions.naviUsable>4&&a.flags.push("navi-flapping"),a.markerContinuity.blinkingIds.length>0&&a.flags.push("marker-blinking"),a.worldPose.integratedFrames===0&&a.flags.push("world-pose-not-integrated"),(a.tracking.lost||0)>t.length*.2&&a.flags.push("tracking-mostly-lost"),a}function Si(e){let t=J(e);return t===null?"—":`${(t/1e3).toFixed(2)}초`}function To(e,t,n=5){let r=Object.entries(t||{}).sort((o,i)=>i[1]-o[1]).slice(0,n);return r.length?[`${e}:`,...r.map(([o,i])=>`- ${o} ×${i}`)]:[]}function Rg(e={}){let t=e.summary||{},n=t.coverage||{},o=["AR 리플레이 진단 요약",`구간: ${(e.replay||{}).segment||"—"}`,`판정: ${n.complete?"수집 완료":"수집 불완전"} · 종료 ${e.stopReason||"—"}`,`범위: ${Si(n.firstMediaTimeMs)} ~ ${Si(n.lastMediaTimeMs)} / 요청 ${Si(n.requestedEndMs)}`,`프레임: ${t.frames||0} · 실효 ${J(n.effectiveFps,0).toFixed(2)}fps · 이벤트 ${t.events||0}`,`상태전환: Navi ${t.transitions?.naviUsable||0} · 표시 ${t.transitions?.visibility||0} · tracking ${t.transitions?.tracking||0} · hold ${t.transitions?.hold||0}`,`Navi: 유효 ${t.navi?.usableFrames||0} · 무효 ${t.navi?.unusableFrames||0} · 시계불일치 ${t.navi?.clockMismatchFrames||0}`,`worldPose: 적분 프레임 ${t.worldPose?.integratedFrames||0} · 최대 ${t.worldPose?.maxIntegrations||0}`,`새 앵커 보류: ${t.worldPose?.anchorCreationDeferredFrames||0}프레임`,`Worker: DPR 최대 ${J(t.transport?.maxDpr,0).toFixed(2)} · 대기 ${t.transport?.queue?.deferred||0} · 교체 ${t.transport?.queue?.replaced||0} · 폐기 ${t.transport?.queue?.discarded||0}`,`앵커: x ${t.anchorRange?.x?.join(" ~ ")||"—"}m · y ${t.anchorRange?.y?.join(" ~ ")||"—"}m`,`플래그: ${t.flags?.length?t.flags.join(", "):"없음"}`,...To("마커 상태",t.markerStates,10),...To("주요 tracking 차단",t.reasons?.tracking),...To("주요 sync 차단",t.reasons?.sync),...To("새 앵커 보류 사유",t.worldPose?.anchorCreationGateReasons),...To("이벤트",t.eventTypes,10)],i=[],a=new Map;for(let s of Array.isArray(e.events)?e.events:[]){let u=a.get(s.type)||0;u>=2||i.length>=18||(a.set(s.type,u+1),i.push(`- ${Si(s.mediaTimeMs)} ${s.type}`))}return i.length&&o.push("대표 이상 시각:",...i),o.join(` -`)}function xg(e){return String(e||"replay").replace(/[^a-zA-Z0-9._-]+/g,"_").slice(0,96)}function Eg(e,t,n){let r=e.Blob||globalThis.Blob,o=e.URL||globalThis.URL,i=e.document;if(!r||!o?.createObjectURL||!i?.createElement)return!1;let a=new r([JSON.stringify(n,null,2)],{type:"application/json"}),s=o.createObjectURL(a),u=i.createElement("a");return u.href=s,u.download=t,u.hidden=!0,(i.body||i.documentElement)?.appendChild?.(u),u.click?.(),u.remove?.(),e.setTimeout?.(()=>o.revokeObjectURL?.(s),1e3),!0}function ps(e={}){let t=e.target||globalThis,n=e.setInterval||t.setInterval?.bind(t),r=e.clearInterval||t.clearInterval?.bind(t),o=e.download||((M,R)=>Eg(t,M,R)),i=e.now||(()=>t.performance?.now?.()??Date.now()),a=new Set,s="idle",u=0,c="",l=null,d=null,f=null,p=null,m=0;function b(){return Object.freeze({phase:s,running:s==="preparing"||s==="running"||s==="saving",progress:u,error:c||null,frames:l?.frames.length||0,durationSeconds:l?.durationSeconds||60,lastResult:p})}function g(){let M=b();for(let R of[...a])R(M)}function x(M,R=""){s=M,c=String(R||""),g()}function E(){d?.(),d=null,f!==null&&r?.(f),f=null}async function y(M="complete",R=!0){if(!l||l.finishing)return p;l.finishing=!0,x("saving"),E();let v=l,h=v.control;h.pause?.();let S=new Date().toISOString(),A=Eu(v),L=M==="complete"&&!A.coverage.complete?"incomplete-render-tail":M,P={schemaVersion:3,kind:"carrot-ar-replay-diagnostic",createdAt:v.createdAt,endedAt:S,stopReason:L,replay:{route:v.initial.route,segment:v.initial.segment,duration:v.initial.duration,requestedStart:0,requestedEnd:v.durationSeconds,captureStart:J(A.coverage.firstMediaTimeMs,0)/1e3,captureEnd:J(A.coverage.lastMediaTimeMs,0)/1e3,playbackRate:1},environment:{userAgent:String(t.navigator?.userAgent||""),devicePixelRatio:J(t.devicePixelRatio,1),viewport:{width:J(t.innerWidth),height:J(t.innerHeight)}},summary:A,routeGeometries:[...v.routeGeometries.values()],events:v.events,frames:v.frames},_=Rg(P),T={...P,report:_},I=`carrot-ar-${xg(v.initial.segment)}-${S.replace(/[:.]/g,"-")}.json`,k=!1;return R&&(k=o(I,T)!==!1),await h.restore?.(v.initial),p=Object.freeze({filename:I,downloaded:k,frames:v.frames.length,reason:L,complete:A.coverage.complete,summary:A,report:_}),l=null,u=A.coverage.ratio,x(A.coverage.complete?"complete":"warning"),p}function O(M){if(!l||l.finishing||!M?.debugFrame)return;let R=t.CarrotVisionReplay?.status?.()||{},v=Tu(M,R),h=J(v.mediaTimeMs);if(h===null)return;if(!l.armed){if(h>1500)return;l.armed=!0}if(h<-1||h>l.durationSeconds*1e3+250)return;if(l.frames.length>=3600){y("frame-limit").catch(()=>{});return}Sg(l,v),l.frames.push(v);let S=[v.navi?.sessionId||"",v.navi?.route?.pointCount||0,v.navi?.publishMonoTimeNanos||0].join(":");if(S!==l.lastRouteProbeKey){l.lastRouteProbeKey=S;let A=Mg(t);A&&!l.routeGeometries.has(A.signature)&&l.routeGeometries.set(A.signature,A)}u=Math.max(u,Math.min(1,h/(l.durationSeconds*1e3))),g(),h>=l.durationSeconds*1e3-20&&y("complete").catch(()=>{})}async function C(M={}){if(b().running)return!1;m+=1;let R=m;c="",u=0;let h=t.CarrotVisionReplay?.diagnosticPlayback,S=t.CarrotVisionAr,A=h?.snapshot?.();if(!A?.active||!A?.ready||A.loading)return x("error","준비된 리플레이가 없습니다"),!1;if(typeof S?.subscribeDiagnostics!="function")return x("error","AR 프레임 진단 채널이 없습니다"),!1;let L=Math.max(1,J(M.durationSeconds,60)),P=Math.min(L,Math.max(.1,J(A.duration,L)));if(l={token:R,control:h,initial:A,durationSeconds:P,createdAt:new Date().toISOString(),frames:[],events:[],routeGeometries:new Map,lastRouteProbeKey:"",armed:!1,finishing:!1,playbackEndedAtMs:null,lastEventAt:new Map},x("preparing"),d=S.subscribeDiagnostics(O),h.pause?.(),h.setRate?.(1),h.seek?.(0)!==!0)return E(),l=null,x("error","리플레이 0초 이동에 실패했습니다"),!1;f=n?.(()=>{if(!l||l.token!==R||l.finishing)return;let _=h.snapshot?.()||{};u=Math.max(u,Math.min(1,J(_.currentTime,0)/P)),g(),_.active?(_.ended||J(_.currentTime,0)>=P)&&(l.playbackEndedAtMs===null&&(l.playbackEndedAtMs=i(),h.pause?.()),Eu(l).coverage.complete?y("complete").catch(()=>{}):i()-l.playbackEndedAtMs>=2500&&y("incomplete-render-tail").catch(()=>{})):y("replay-closed").catch(()=>{})},100)??null;try{return await h.play?.(),!l||l.token!==R?!1:(x("running"),!0)}catch(_){return E(),await h.restore?.(A),l=null,x("error",_?.message||"리플레이 재생에 실패했습니다"),!1}}async function w(){return b().running?(await y("user-stopped"),!0):!1}async function z(){m+=1,l&&await y("debug-panel-closed",!1),E(),a.clear()}return Object.freeze({start:C,stop:w,snapshot:b,subscribe(M){if(typeof M!="function")throw new TypeError("capture listener must be a function");return a.add(M),M(b()),()=>a.delete(M)},destroy:z})}var Tg=Object.freeze([Object.freeze({id:"copy",label:"복사",payload:e=>e.report()}),Object.freeze({id:"json",label:"JSON",payload:e=>e.json()})]);function Mt(e,t,n,r){let o=e.createElement(t);return n&&(o.className=n),r!==void 0&&(o.textContent=r),o}function Og(e,t,n,r){let o=e?.worker?.renderer||e?.renderer||null,i=Fr();return{badge:n.label,reason:r,gate:gi(e?.composition?.diag),hold:`hold:${e?.hold?.state||"—"}`,track:`trk:${e?.tracking?.state||"—"}[${e?.tracking?.canCreateAnchor?"C":"-"}${e?.tracking?.canPropagateAnchor?"P":"-"}]`,skips:Array.isArray(o?.skips)?o.skips:[],anchor:e?.hold?.sample||null,sign:Le(e?.composition?.signCount,0),anchored:Le(e?.composition?.anchoredCount,0),drawn:ur(e),fixed:`surface ${Eo(i)} · canvas ${bi(e)} · ${yi(e,t)} · worker ${e?.worker?.ready?"ok":"대기"}`}}function ms(e={}){let t=e.target||globalThis,n=e.document||t?.document,r=e.mountRoot;if(!n?.createElement||!r?.appendChild)return null;let o=e.sections||us,i=e.aggregate||ds({now:()=>t.performance?.now?.()??Date.now()}),a=e.capture||ps({target:t}),s=Mt(n,"div","ar-debug");s.id="carrotArDebugPanel";let u=Mt(n,"div","ar-debug__head"),c=Mt(n,"span","ar-debug__badge"),l=Mt(n,"span","ar-debug__badgeDot"),d=Mt(n,"span",null,"AR");c.append(l,d),u.append(c);let f=Mt(n,"button","ar-debug__action ar-debug__action--capture","60초 진단");f.type="button",f.disabled=!0,f.title="리플레이 0~60초 AR 상태를 자동 수집해 JSON 파일로 저장",f.addEventListener("click",()=>{let h=a.snapshot().running?a.stop():a.start();Promise.resolve(h).catch(S=>t.console?.error?.("[carrot AR debug] capture failed",S))}),u.append(f);let p=Mt(n,"button","ar-debug__action","진단요약");p.type="button",p.disabled=!0,p.title="마지막 60초 진단의 핵심 원인과 대표 시각만 복사",p.addEventListener("click",()=>{let v=a.snapshot().lastResult?.report||"";v&&vi(t,v).then(h=>{h||t.console?.log?.(v),p.textContent=h?"복사됨":"콘솔출력",t.setTimeout?.(()=>{p.textContent="진단요약"},1200)})}),u.append(p);let m={report:()=>i.report(),json:()=>M()};for(let v of Tg){let h=Mt(n,"button","ar-debug__action",v.label);h.type="button",h.addEventListener("click",()=>{let S=v.payload(m);vi(t,S).then(A=>{A||t.console?.log?.(S),h.textContent=A?"복사됨":"콘솔출력",t.setTimeout?.(()=>{h.textContent=v.label},1200)})}),u.append(h)}let b=new Map,g=Mt(n,"div","ar-debug__body");for(let v of o){g.append(Mt(n,"div","ar-debug__sectionLabel",v.label));for(let h of v.fields){let S=Mt(n,"div",`ar-debug__row${h.wide?" ar-debug__row--wide":""}`);S.append(Mt(n,"span","ar-debug__key",h.label));let A=Mt(n,"span","ar-debug__value");S.append(A),g.append(S),b.set(h.id,{node:A,field:h})}}let x=Mt(n,"div","ar-debug__reason"),E=Mt(n,"div","ar-debug__foot");E.append(Mt(n,"span",null,"수집중"));let y=Mt(n,"span","ar-debug__footCount","0");E.append(y),s.append(u,g,x,E),r.appendChild(s);let O=null,C=null,w=!1,z=a.subscribe(v=>{let h=Math.round((v.progress||0)*(v.durationSeconds||60));f.dataset.captureState=v.phase,f.disabled=!v.running&&!w,p.disabled=!v.lastResult?.report,v.running?f.textContent=`중지 ${h}/${Math.round(v.durationSeconds)}초`:v.phase==="complete"?f.textContent="다시 진단":v.phase==="warning"?f.textContent="불완전·재시도":v.phase==="error"?f.textContent="진단 재시도":f.textContent="60초 진단",v.error&&(f.title=v.error)});function M(){return JSON.stringify({report:i.report(),status:O,diagnose:C},null,2)}function R(v,h){if(O=v||null,C=h||null,w=h?.replay?.active===!0&&h?.replay?.ready===!0,f.disabled=!a.snapshot().running&&!w,s.hidden)return;let S=cs(v);c.className=`ar-debug__badge ar-debug__value--${S.tone}`,d.textContent=S.label;for(let{node:L,field:P}of b.values()){let _=P.value(v,h);L.textContent=_,L.title=_;let T=P.tone?.(v,h);L.className=`ar-debug__value${T?` ar-debug__value--${T}`:""}`}let A=uu(v,h);x.textContent=A||"",x.hidden=!A,i.observe(Og(v,h,S,A)),y.textContent=`${i.frames}프레임`}return Object.freeze({element:s,update:R,setVisible(v){return s.hidden=v===!1,!s.hidden},report:()=>i.report(),logText:()=>i.report(),json:M,snapshot:()=>({status:O,diagnose:C}),captureStart:v=>a.start(v),captureStop:()=>a.stop(),captureStatus:()=>a.snapshot(),destroy(){z?.(),a.destroy().catch?.(()=>{}),s.remove?.()}})}var jr="vision_ar_debug",Cg=250;function wg(e=globalThis){if(!(typeof e?.isWebSettingUnlocked=="function"?e.isWebSettingUnlocked(jr):Ko(jr,e)))return!1;if(typeof e?.getWebSettingByKey=="function")return!!e.getWebSettingByKey(jr,!1);let n=e?.CarrotWebSettingsState||{};return Object.prototype.hasOwnProperty.call(n,jr)?!!n[jr]:!!e?.__CARROT_BOOTSTRAP__?.webSettings?.[jr]}function Ou(e={}){let t=e.target||globalThis,n=e.document||t?.document||null,r=e.mountRoot||null,o=Number(e.pollMs)>0?Number(e.pollMs):Cg,i=typeof e.isEnabled=="function"?e.isEnabled:()=>wg(t),a=typeof e.readRuntime=="function"?e.readRuntime:()=>t.CarrotVisionAr,s=null,u=null,c=!1;function l(){if(!s)return;let p=a(),m=null,b=null;try{m=p?.status?.()||null}catch{}try{b=p?.diagnose?.()||null}catch{}s.update(m,b)}function d(){u!==null&&(t.clearInterval?.(u),u=null),s?.destroy(),s=null}function f(){if(!(c&&i()))return s&&d(),!1;if(!s){if(s=ms({target:t,document:n,mountRoot:r}),!s)return!1;l()}return u===null&&(u=t.setInterval?.(()=>{f(),l()},o)??null),!0}return Object.freeze({activate(){return c=!0,f()},deactivate(){return c=!1,d(),!1},refresh:f,isVisible:()=>!!s,logText:()=>s?.logText()||"",json:()=>s?.json()||"",snapshot:()=>s?.snapshot()||null,captureStart:p=>s?.captureStart(p)||Promise.resolve(!1),captureStop:()=>s?.captureStop()||Promise.resolve(!1),captureStatus:()=>s?.captureStatus()||null,destroy(){c=!1,d()}})}var Vr="vision",Ig="carrotStage";var wo=null,Ai=null,_g=new WeakMap,Ng=null;function Dg(e){return e.target||globalThis}function Pg(e,t){return t.documentRoot||e?.document||null}function Lg(e,t){return t.compatibilityRoot?t.compatibilityRoot:Pg(e,t)?.getElementById?.(Ig)||null}function kg(e,t,n){return t.hostRoot||t.host?.root||t.context?.hostRoot||n||null}function Fg(e={}){let t=Dg(e),n=Lg(t,e),r=kg(t,e,n),o=e.driveContentApi||t?.DriveContent,i=e.runtime||t?.CarrotVisionContentRuntime,a=e.renderer||Yo()||t?.DriveVisionFacade,s=e.hud||ro(t)||t?.DriveVisionHudContent;if(!r||typeof o?.create!="function"||typeof i?.setActive!="function"||typeof a?.lifecycle?.resize!="function"||typeof s?.activate!="function")return null;let u=(()=>{try{return new URLSearchParams(t?.location?.search||"").get("ar_bypass_world")==="1"?!0:t?.localStorage?.getItem?.("ar_bypass_world")==="1"}catch{return!1}})();typeof t.__carrotArBypassWorld!="boolean"&&(t.__carrotArBypassWorld=u),typeof t.carrotArBypassWorld!="function"&&(t.carrotArBypassWorld=g=>{if(g===void 0)return t.__carrotArBypassWorld===!0;t.__carrotArBypassWorld=g===!0;try{t.localStorage?.setItem?.("ar_bypass_world",g===!0?"1":"0")}catch{}return t.__carrotArBypassWorld});let c=()=>t.__carrotArBypassWorld===!0,l=ta({target:t,createRuntime:()=>is(t,{document:t?.document,host:n,diagnosticProbe:!1,bypassWorldAnchor:c,probeDistanceM:40})}),d=Ou({target:t,document:t?.document,mountRoot:n||r});(typeof t.CarrotArLog!="object"||t.CarrotArLog===null)&&(t.CarrotArLog=Object.freeze({text:()=>d.logText(),json:()=>d.json(),snapshot:()=>d.snapshot(),capture:g=>d.captureStart(g),stopCapture:()=>d.captureStop(),captureStatus:()=>d.captureStatus()}));let f=null,p=Object.freeze({slot:String(e.context?.slot||e.slot||"primary"),source:String(e.context?.source||"live"),compatibilityRoot:n});function m(g={}){return p=Object.freeze({slot:String(g.slot||g.host?.slot||p.slot),source:String(g.source||g.host?.source||p.source),compatibilityRoot:n}),p}let b=o.create(Vr,{mount(g){if(!g||typeof g!="object")throw new TypeError("Vision content requires a host root");if(n&&g!==n&&n.parentElement!==g){if(typeof g.appendChild!="function")throw new TypeError("Vision content host must support appendChild");g.appendChild(n)}f=g},activate(g={}){let x=m(g);s.activate({...g,host:x,renderRoot:n});let E=i.setActive(!0,g);return a.lifecycle.resize(),l.activateVision(),d.activate(),E},deactivate(g={}){return d.deactivate(),l.deactivateVision(),s.deactivate(g),i.setActive(!1,g)},resize(g){return i.isActive?.()?(a.lifecycle.resize(),s.resize(),l.resize(),!0):!1},status(){let g=t?.CarrotVisionState||{};return{runtime:i.status?.()||{},userActive:!!g.active,available:!!g.available,controlState:String(g.controlState||""),replayActive:!!t?.CarrotVisionReplay?.isActive?.(),hud:s.status(),renderer:a.status(),ar:l.status()}},destroy(){Ai?.content===b&&(Ai.workspace.unregisterContent(Ai.slot,b),Ai=null),d.destroy(),l.destroy(),s.destroy(),i.setActive(!1,{keepWarm:!1,reason:"content destroyed"}),f=null}});return _g.set(b,{hostContext:()=>p,renderRoot:n,mountedHostRoot:()=>f}),b}function hs(e={}){if(!wo){if(wo=Fg(e),!wo)return null;Ng=wo}return wo}function Cu(e=globalThis,t={}){let n=t.content||hs({...t,target:e});return n?(e.DriveContentVision=n,n):null}var zg=Object.freeze(["primary","secondary"]),jg=Object.freeze(["live","replay"]);function gs(e={}){return Object.freeze({id:Vr,labelKey:"web_drive_layout_content_vision",factory(t={}){let n=e.target||globalThis,r=e.renderer||Yo()||xr(n,e.facadeOptions||{}),o=e.hud||ro(n)||oo(n,e.hudOptions||{});return!r||!o?null:hs({...e,target:n,context:t,slot:t.slot,renderer:r,hud:o})},supportedSlots:zg,supportedSources:jg,singleton:!0})}var fR=gs();var Ri=new WeakMap;function Vg(e={}){let t=e.target||globalThis,n=e.document||t.document,r=e.compatibilityRoot||n?.getElementById("carrotNaviPane")||null,o=e.workspaceRoot||n?.getElementById("carrotDriveWorkspace")||null,i=e.workspace||t.DriveWorkspace?.get?.(o)||null,a=e.runtime||t.DriveCarrotNaviFacade?.content||null,s=e.driveContentApi||t.DriveContent;return{target:t,documentRoot:n,compatibilityRoot:r,workspace:i,slot:e.slot||null,runtime:a,driveContentApi:s,manageWorkspaceRegistration:e.manageWorkspaceRegistration===!0}}function Hg(e={}){let t=Vg(e),{compatibilityRoot:n,workspace:r,slot:o,runtime:i,driveContentApi:a,manageWorkspaceRegistration:s}=t;if(!n||!a?.create||!i?.activate)return null;let u,c=null;return u=a.create("carrot-navi",{mount(l){if(!l||typeof l.appendChild!="function")throw new TypeError("Carrot Navi content mount requires a slot host");c=l,l!==n&&n.parentNode!==l&&l.appendChild(n)},activate(l={}){return i.activate(l)},deactivate(l={}){return i.deactivate(l)},resize(l){return i.resize(l)},status(){return{...i.status?.()||{},contentHostId:String(c?.id||"")}},destroy(){s&&r?.unregisterContent?.(o,u),i.deactivate({keepWarm:!1,reason:"content destroyed"}),c=null,Ri.get(t.target)===u&&Ri.delete(t.target)}}),u}function wu(e={}){let t=e.target||globalThis,n=Ri.get(t);if(n)return n;let r=Hg(e);return r&&Ri.set(t,r),r}function Hr(e=globalThis,t=null){return e.DriveContentCarrotNavi=t,t}function Iu(e=globalThis,t={}){let n=t.document||e.document,r=t.workspaceRoot||n?.getElementById("carrotDriveWorkspace")||null,o=t.workspaceApi||e.DriveWorkspace,i=t.workspace||o?.get?.(r),a=t.slot||o?.SLOT?.SECONDARY,s=t.compatibilityRoot||n?.getElementById("carrotNaviPane")||null,u=wu({...t,target:e,document:n,compatibilityRoot:s,workspace:i,slot:a,manageWorkspaceRegistration:!0});return u?(u.mount(t.root||s),u.activate({reason:t.reason||"initial TMAP content"}),i?.getContent?.(a)!==u&&i?.registerContent?.(a,u),Hr(e,u)):Hr(e,null)}function _u(e={}){return function(n={}){return wu({...e,...n})}}var xi=new WeakMap;function Io(e,t){return typeof e?.getAttribute=="function"?e.getAttribute(t):null}function Ei(e){return e?.disabled===!0||typeof e?.hasAttribute=="function"&&e.hasAttribute("disabled")?!0:String(Io(e,"aria-disabled")||"").toLowerCase()==="true"}function Bg(e,t){let n=Io(e,t);return n!==null&&String(n).toLowerCase()!=="false"}function Gg(e){if(e?.dataset&&Object.prototype.hasOwnProperty.call(e.dataset,"value"))return String(e.dataset.value);let t=Io(e,"data-value");if(t!==null)return t;let n=Io(e,"value");return n!==null?n:e?.value!==void 0&&e.value!==null?String(e.value):null}function Wg(e,t){return e===t?!0:typeof e?.contains=="function"&&e.contains(t)}function $g(e){let t=String(e?.itemSelector||"").trim();if(!t)throw new TypeError("A segmented control itemSelector is required");return Object.freeze({itemSelector:t,selectedAttribute:String(e?.selectedAttribute||"aria-selected"),orientation:e?.orientation==="vertical"?"vertical":"horizontal",activation:e?.activation==="manual"?"manual":"automatic",onActivate:typeof e?.onActivate=="function"?e.onActivate:null})}function Ug(e){if(!e||typeof e!="object"||typeof e.querySelectorAll!="function"||typeof e.addEventListener!="function"||typeof e.removeEventListener!="function")throw new TypeError("A segmented control root element is required")}function Nu(e,t={}){Ug(e);let n=xi.get(e);if(n)return n.sync(),n;let r=$g(t),o=new Map,i=[],a=null,s=!1,u=null;function c(){return Array.from(e.querySelectorAll(r.itemSelector))}function l(M){o.has(M)||o.set(M,Io(M,"tabindex"))}function d(M,R){l(M),M.setAttribute("tabindex",String(R))}function f(M=i){return M.find(R=>Bg(R,r.selectedAttribute))||null}function p({preferSelected:M=!0}={}){i=c();let R=i.filter(S=>!Ei(S)),v=f(i),h=v&&R.includes(v)?v:null;M&&h?a=h:R.includes(a)||(a=h||R[0]||null);for(let S of i)d(S,S===a?0:-1);return i}function m(){let M=c(),R=f(M),v=R?M.indexOf(R):-1;return Object.freeze({itemCount:M.length,selectedIndex:v,selectedValue:R?Gg(R):null,destroyed:s})}function b(){return s||p({preferSelected:!0}),m()}function g(M){return i.find(R=>Wg(R,M?.target))||null}function x(M){a=M;for(let R of i)d(R,R===M?0:-1)}function E(M,R,v){if(!r.onActivate)return;let h=i.indexOf(M);try{r.onActivate(M,h,Object.freeze({source:v,event:R,controller:u}))}finally{s||p({preferSelected:!1})}}function y(M,R){M&&(R?.preventDefault?.(),x(M),typeof M.focus=="function"&&M.focus(),r.activation==="automatic"&&E(M,R,"keyboard"))}function O(M,R){p({preferSelected:!1});let v=i.filter(P=>!Ei(P));if(!v.length)return null;let h=g(M),S=v.includes(h)?h:v.includes(a)?a:v[0],A=v.indexOf(S);return R==="first"?v[0]:R==="last"?v[v.length-1]:v[(A+(R==="previous"?-1:1)+v.length)%v.length]}function C(M){if(s||M?.isComposing||M?.altKey||M?.ctrlKey||M?.metaKey)return;let R=null;if(M.key==="Home"?R="first":M.key==="End"?R="last":r.orientation==="horizontal"&&M.key==="ArrowLeft"?R="previous":r.orientation==="horizontal"&&M.key==="ArrowRight"?R="next":r.orientation==="vertical"&&M.key==="ArrowUp"?R="previous":r.orientation==="vertical"&&M.key==="ArrowDown"&&(R="next"),R){y(O(M,R),M);return}if(r.activation!=="manual"||M.key!=="Enter"&&M.key!==" "&&M.key!=="Spacebar")return;p({preferSelected:!1});let v=g(M);!v||Ei(v)||(M.preventDefault?.(),x(v),E(v,M,"keyboard"))}function w(M){if(s)return;p({preferSelected:!1});let R=g(M);R&&!Ei(R)&&x(R)}function z(){if(s)return!1;s=!0,e.removeEventListener("keydown",C),e.removeEventListener("focusin",w);for(let[M,R]of o)R===null?M.removeAttribute("tabindex"):M.setAttribute("tabindex",R);return o.clear(),i=[],a=null,xi.get(e)===u&&xi.delete(e),!0}return u=Object.freeze({sync:b,destroy:z,snapshot:m}),xi.set(e,u),e.addEventListener("keydown",C),e.addEventListener("focusin",w),b(),u}var Yg=new Set(["primary","secondary","danger"]);function en(e){return String(e??"").trim()}function Kg(e){if(typeof e!="function")return en(e);try{return en(e())}catch{return""}}function qg(e,t){let n=t?.document??e.environment?.document??e.document??globalThis.document;if(!n||typeof n.createElement!="function")throw new TypeError("createActionGroup requires a document environment");return n}function Xg(e){let t=en(e);return Yg.has(t)?t:"secondary"}function bs(e){if(!Array.isArray(e))return Object.freeze([]);if(e.length>2)throw new RangeError("State surface action groups support at most 2 actions");let t=new Set,n=[];for(let r of e){let o=r&&typeof r=="object"?r:{},i=en(o.id),a=Kg(o.label),s=o.onActivate??o.invoke;!i||t.has(i)||!a||typeof s!="function"||(t.add(i),n.push(Object.freeze({id:i,label:a,tone:Xg(o.tone??o.kind),disabled:!!o.disabled,onActivate:s})))}return Object.freeze(n)}function Du(e){return Array.from(new Set(e.flatMap(t=>en(t).split(/\s+/)).filter(Boolean))).join(" ")}function Pu(e={},t={}){let n=e.host;if(!n||typeof n.append!="function")return null;let r=qg(e,t),o=r.createElement("div");o.setAttribute("role","group"),o.setAttribute("aria-busy","false"),o.dataset.layout="single",o.dataset.sizing="full",o.dataset.pending="false",o.hidden=!0,n.append(o);let i=new Map,a=Object.freeze([]),s=new Map,u=null,c=0,l=!1,d=en(e.ariaLabel)||"Status actions",f=en(e.className),p=en(e.actionClassName),m=en(e.actionToneClassPrefix),b=typeof e.onPendingChange=="function"?e.onPendingChange:null;function g(){return u?.id||""}function x(v){return Du(["btn",v.tone==="primary"?"btn--filled":"",v.tone==="danger"?"btn--danger":"","c-action-group__action",`c-action-group__action--${v.tone}`,p,m?`${m}${v.tone}`:""])}function E(){let v=a.length<=1;return Du(["c-action-group","c-action-group--nowrap",v?"c-action-group--single":"c-action-group--split",v?"c-action-group--full":"c-action-group--equal",f])}function y(){if(l)return;let v=!!u,h=a.length<=1;o.className=E(),o.hidden=a.length===0,o.dataset.layout=h?"single":"split",o.dataset.sizing=h?"full":"equal",o.dataset.pending=String(v),o.setAttribute("aria-label",d),o.setAttribute("aria-busy",String(v));for(let S of a){let A=i.get(S.id).button,L=v||S.disabled;A.className=x(S),A.dataset.actionId=S.id,A.dataset.tone=S.tone,A.textContent=S.label,A.disabled=L,A.tabIndex=L?-1:0,A.setAttribute("aria-disabled",String(L)),A.setAttribute("tabindex",String(A.tabIndex)),L?A.setAttribute("disabled",""):A.removeAttribute("disabled")}b?.(g())}async function O(v){let h=s.get(en(v));if(l||!h||h.disabled||u)return!1;let S=Object.freeze({id:h.id,generation:++c});u=S,y();try{await h.onActivate()}catch{}finally{if(l||u!==S)return!0;u=null,y()}return!0}function C(v){let h=i.get(v);h&&(h.button.removeEventListener("click",h.listener),h.button.remove(),i.delete(v))}function w(v,h={}){if(l)return!1;let S=bs(v),A=new Set(S.map(_=>_.id));u&&!A.has(u.id)&&(u=null,c+=1);for(let _ of i.keys())A.has(_)||C(_);for(let _ of S){if(i.has(_.id))continue;let T=r.createElement("button");T.type="button";let I=()=>{O(_.id)};T.addEventListener("click",I),i.set(_.id,{button:T,listener:I})}a=S,s=new Map(a.map(_=>[_.id,_])),h.ariaLabel!=null&&(d=en(h.ariaLabel)||"Status actions");let L=Array.from(o.children).map(_=>_.dataset.actionId),P=a.map(_=>_.id);if(L.join("\0")!==P.join("\0"))for(let _ of a)o.append(i.get(_.id).button);return y(),!0}function z(v){return l?!1:(d=en(v)||"Status actions",y(),!0)}function M(){let v=a.map(h=>Object.freeze({id:h.id,label:h.label,tone:h.tone,disabled:h.disabled}));return Object.freeze({actions:Object.freeze(v),pendingActionId:g(),layout:a.length<=1?"single":"split",sizing:a.length<=1?"full":"equal"})}function R(){if(l)return!1;l=!0,u=null,c+=1;for(let v of Array.from(i.keys()))C(v);return a=Object.freeze([]),s=new Map,o.remove(),!0}return Object.freeze({element:o,setActions:w,setAriaLabel:z,activate:O,snapshot:M,destroy:R})}var Kt=Object.freeze({EMPTY:"empty",LOADING:"loading",DEGRADED:"degraded",ERROR:"error",OWNERSHIP:"ownership"}),fn=Object.freeze({NEUTRAL:"neutral",INFO:"info",WARNING:"warning",ERROR:"error"}),yR=Object.freeze({PRIMARY:"primary",SECONDARY:"secondary",DANGER:"danger"}),Ti=Object.freeze({COVER:"cover",COMPACT:"compact"}),Qg=new Set(Object.values(Kt)),Zg=new Set(Object.values(fn)),Jg=new Set(Object.values(Ti)),eb=Object.freeze({[Kt.EMPTY]:fn.NEUTRAL,[Kt.LOADING]:fn.INFO,[Kt.DEGRADED]:fn.WARNING,[Kt.ERROR]:fn.ERROR,[Kt.OWNERSHIP]:fn.WARNING}),ys=new WeakMap,Lu=new WeakSet,tb=0;function dr(e){return String(e??"").trim()}function vs(e){if(typeof e!="function")return dr(e);try{return dr(e())}catch{return""}}function Ss(e){return Array.from(new Set(e.flatMap(t=>dr(t).split(/\s+/)).filter(Boolean))).join(" ")}function ku(e){let t=dr(e);return Qg.has(t)?t:Kt.EMPTY}function nb(e,t){let n=dr(e);return Zg.has(n)?n:eb[t]}function Fu(e){let t=dr(e);return Jg.has(t)?t:Ti.COVER}function zu(e){return e&&typeof e=="object"?e.featureLabel??e.label??e.name:e}function rb(e,t){let n=t?.document??e.environment?.document??e.document??globalThis.document;if(!n||typeof n.createElement!="function")throw new TypeError("createStateSurface requires a document environment");return n}function ob(e,t){if(typeof e=="string")return{state:ku(e),descriptor:t&&typeof t=="object"?t:{}};let n=e&&typeof e=="object"?e:{};return{state:ku(n.state),descriptor:n}}function ju(e={},t={}){let n=e.host;if(!n||typeof n.append!="function")return null;let r=ys.get(n);if(r){let _=e.featureLabel??e.feature;return _!=null&&r.setFeature(_),r}let o=rb(e,t),i=`c-state-surface-${++tb}`,a=dr(e.className),s=Fu(e.variant),u=zu(e.featureLabel??e.feature),c=null,l=null,d=Kt.EMPTY,f=fn.NEUTRAL,p=s,m="",b=!1,g=o.createElement("section");g.className=Ss(["c-state-surface",`c-state-surface--${f}`,`c-state-surface--state-${d}`,`c-state-surface--${p}`,a]),g.hidden=!0,g.setAttribute("aria-hidden","true"),g.setAttribute("aria-busy","false"),g.dataset.state=d,g.dataset.tone=f,g.dataset.variant=p,g.dataset.pending="false";let x=o.createElement("div");x.className="c-state-surface__body";let E=o.createElement("div");E.className="c-state-surface__copy",E.setAttribute("role","status"),E.setAttribute("aria-live","polite"),E.setAttribute("aria-atomic","true");let y=o.createElement("h2");y.id=`${i}-feature`,y.className="c-state-surface__feature";let O=o.createElement("p");O.id=`${i}-title`,O.className="c-state-surface__title";let C=o.createElement("p");C.id=`${i}-description`,C.className="c-state-surface__description",E.append(y,O,C),x.append(E),g.append(x),n.append(g);function w(){let _=d===Kt.LOADING||!!m;g.dataset.pending=String(!!m),g.setAttribute("aria-busy",String(_))}let z=Pu({host:x,className:"c-state-surface__actions",actionClassName:"c-state-surface__action",actionToneClassPrefix:"c-state-surface__action--",onPendingChange(_){m=_,w()}},{document:o});function M(_,T){let I=T.featureLabel!=null?T.featureLabel:u;return Object.freeze({state:_,featureLabel:vs(I),title:vs(T.title),description:vs(T.description),tone:nb(T.tone,_),variant:Fu(T.variant??s),actions:bs(T.actions)})}function R(_){d=_.state,f=_.tone,p=_.variant,g.className=Ss(["c-state-surface",`c-state-surface--${f}`,`c-state-surface--state-${d}`,`c-state-surface--${p}`,a]),g.dataset.state=d,g.dataset.tone=f,g.dataset.variant=p,y.textContent=_.featureLabel,y.hidden=!_.featureLabel,O.textContent=_.title,O.hidden=!_.title,C.textContent=_.description,C.hidden=!_.description,_.title||_.featureLabel?(g.setAttribute("aria-labelledby",_.title?O.id:y.id),g.removeAttribute("aria-label")):(g.removeAttribute("aria-labelledby"),g.setAttribute("aria-label","Status")),_.description?g.setAttribute("aria-describedby",C.id):g.removeAttribute("aria-describedby")}function v(_={},T){if(b)return!1;let{state:I,descriptor:k}=ob(_,T),D=M(I,k);return c={...k},l=D,R(D),z.setActions(D.actions,{ariaLabel:`${D.featureLabel||D.title||"Status"} actions`}),g.hidden=!1,g.setAttribute("aria-hidden","false"),w(),!0}function h(){return b||g.hidden?!1:(c=null,l=null,d=Kt.EMPTY,f=fn.NEUTRAL,p=s,z.setActions([]),m="",g.hidden=!0,g.setAttribute("aria-hidden","true"),g.dataset.state=d,g.dataset.tone=f,g.dataset.variant=p,g.className=Ss(["c-state-surface",`c-state-surface--${f}`,`c-state-surface--state-${d}`,`c-state-surface--${p}`,a]),w(),!0)}function S(_){return b?!1:(u=zu(_),g.hidden||!c?!0:v(d,c))}function A(){let _=z.snapshot();return Object.freeze({visible:!b&&!g.hidden,state:l?.state||Kt.EMPTY,featureLabel:l?.featureLabel||"",title:l?.title||"",description:l?.description||"",tone:l?.tone||fn.NEUTRAL,variant:l?.variant||s,actions:_.actions,pendingActionId:_.pendingActionId})}function L(){return b?!1:(b=!0,c=null,l=null,m="",z.destroy(),ys.delete(n),Lu.delete(P),g.remove(),!0)}let P=Object.freeze({show:v,hide:h,setFeature:S,snapshot:A,destroy:L});return ys.set(n,P),Lu.add(P),P}var ib="http://www.w3.org/2000/svg";function ab(e,t,n){let r=Object.freeze({anchor:()=>!1,isAnchored:()=>!1,observe:()=>!1,destroy:()=>!1});if(!n||!e||typeof e.addEventListener!="function")return r;let o=t||e.ownerDocument?.defaultView||globalThis,i=()=>Number(o.performance?.now?.()??Date.now()),a=!0,s=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,c=null,l=!1;function d(){return Math.max(0,(e.scrollHeight||0)-(e.clientHeight||0))}function f(){return d()-(e.scrollTop||0)}function p(){l||i()m());let y=!1;for(let O of x)O&&(c.observe(O),y=!0);return y}function g(){return l?!1:(l=!0,e.removeEventListener?.("scroll",p),c?.disconnect?.(),c=null,!0)}return Object.freeze({anchor:m,isAnchored:()=>a,observe:b,destroy:g})}function _o(e,...t){if(typeof e?.append=="function")e.append(...t);else for(let n of t)e?.appendChild?.(n)}function Et(e,t){return e?.classList?.add(t),e}function sb(e){let t=e.createElementNS(ib,"svg");return t.setAttribute("viewBox","0 0 24 40"),t.setAttribute("aria-hidden","true"),t.setAttribute("focusable","false"),t.classList.add("telemetry-forward__ego"),t.innerHTML=['','','','',''].join(""),t}function cb(e){let t=e.createElement("div");t.className="telemetry-forward__tooltip",t.hidden=!0;let n=e.createElement("span");n.className="telemetry-forward__tooltip-icon",n.setAttribute("aria-hidden","true");let r=e.createElement("strong");r.className="telemetry-forward__tooltip-title";let o=e.createElement("span");o.className="telemetry-forward__tooltip-state";let i=e.createElement("dl");return i.className="telemetry-forward__tooltip-rows",_o(t,n,r,o,i),Object.freeze({tooltip:t,icon:n,title:r,state:o,rows:i})}function lb(e){Et(e.root,"telemetry-forward"),Et(e.head,"telemetry-forward__head"),Et(e.legend,"telemetry-forward__legend"),Et(e.viewport,"telemetry-forward__viewport"),Et(e.plot,"telemetry-forward__plot"),Et(e.canvas,"telemetry-forward__canvas"),Et(e.ego,"telemetry-forward__ego"),Et(e.message,"telemetry-forward__message"),Et(e.tooltip,"telemetry-forward__tooltip"),Et(e.tooltipIcon,"telemetry-forward__tooltip-icon"),Et(e.tooltipTitle,"telemetry-forward__tooltip-title"),Et(e.tooltipState,"telemetry-forward__tooltip-state"),Et(e.tooltipRows,"telemetry-forward__tooltip-rows"),Et(e.ego?.querySelector?.(".carrot-replay-sensor__egoMirror"),"telemetry-forward__ego-mirror");for(let t of e.ego?.querySelectorAll?.(".carrot-replay-sensor__egoMirror")||[])Et(t,"telemetry-forward__ego-mirror");for(let t of e.ego?.querySelectorAll?.(".carrot-replay-sensor__egoGlass")||[])Et(t,"telemetry-forward__ego-glass");return e}function ub(e){let t=e.root,n=e.tooltip||t?.querySelector?.(".carrot-replay-sensor__tooltip");return{root:t,head:e.head||t?.querySelector?.(".carrot-replay-sensor__head"),title:e.title||t?.querySelector?.(".carrot-replay-sensor__head strong"),status:e.status||t?.querySelector?.(".carrot-replay-sensor__head span"),legend:e.legend||t?.querySelector?.(".carrot-replay-sensor__legend"),viewport:e.viewport||t?.querySelector?.(".carrot-replay-sensor__viewport"),plot:e.plot||t?.querySelector?.(".carrot-replay-sensor__plot"),canvas:e.canvas||t?.querySelector?.("canvas"),ego:e.ego||t?.querySelector?.(".carrot-replay-sensor__ego"),message:e.message||t?.querySelector?.(".carrot-replay-sensor__message"),tooltip:n,tooltipIcon:e.tooltipIcon||n?.querySelector?.(".carrot-replay-sensor__tooltipIcon"),tooltipTitle:e.tooltipTitle||n?.querySelector?.(".carrot-replay-sensor__tooltipTitle"),tooltipState:e.tooltipState||n?.querySelector?.(".carrot-replay-sensor__tooltipState"),tooltipRows:e.tooltipRows||n?.querySelector?.(".carrot-replay-sensor__tooltipRows")}}function db(e,t){let n=t.document||e?.ownerDocument||globalThis.document;if(!e||!n?.createElement)return null;let r=n.createElement("div"),o=n.createElement("strong"),i=n.createElement("span");_o(r,o,i);let a=n.createElement("div"),s=n.createElement("div");s.setAttribute("role","region"),s.tabIndex=0;let u=n.createElement("div"),c=n.createElement("canvas"),l=sb(n),d=cb(n);_o(u,c,l,d.tooltip),s.append(u);let f=n.createElement("div");return f.setAttribute("role","status"),f.hidden=!0,_o(e,r,a,s,f),{root:e,head:r,title:o,status:i,legend:a,viewport:s,plot:u,canvas:c,ego:l,message:f,tooltip:d.tooltip,tooltipIcon:d.icon,tooltipTitle:d.title,tooltipState:d.state,tooltipRows:d.rows}}function Vu(e={}){let t=lb(e.adopt?ub(e):db(e.root,e));if(!t?.root||!t.canvas)return null;let n=e.target||e.document?.defaultView||t.root.ownerDocument?.defaultView||globalThis,r=ab(t.viewport,n,e.anchorBottom===!0);r.observe(t.viewport,t.plot);function o(c,l="",d=!1){t.title&&(t.title.textContent=c),t.status&&(t.status.textContent=l,t.status.classList?.toggle("is-warn",d))}function i(c=""){t.message&&(t.message.textContent=c,t.message.hidden=!c)}function a(c=[],l=""){if(!t.legend)return;let d=t.legend.ownerDocument||globalThis.document,f=c.map(p=>{let m=d.createElement("span");m.className="telemetry-forward__legend-item";let b=d.createElement("i");return b.className=`telemetry-forward__glyph telemetry-forward__glyph--${p.shape||"circle"}`,b.style.setProperty("--glyph-color",p.color||"currentColor"),b.setAttribute("aria-hidden","true"),_o(m,b,d.createTextNode(String(p.label||""))),m});t.legend.replaceChildren(...f),l&&t.legend.setAttribute("aria-label",l),r.anchor()}function s(){t.tooltip&&(t.tooltip.hidden=!0)}function u(c={}){if(!t.tooltip||!t.tooltipIcon||!t.tooltipRows)return!1;let l=String(c.shape||"circle");t.tooltip.style.setProperty("--glyph-color",c.color||"currentColor"),t.tooltipIcon.className=`telemetry-forward__tooltip-icon telemetry-forward__glyph telemetry-forward__glyph--${l}`,t.tooltipTitle&&(t.tooltipTitle.textContent=String(c.title||"")),t.tooltipState&&(t.tooltipState.textContent=String(c.state||""),t.tooltipState.classList.toggle("is-lead",c.lead===!0));let d=t.tooltipRows.ownerDocument||globalThis.document,f=[];for(let E of Array.isArray(c.rows)?c.rows:[]){let y=d.createElement("dt");y.textContent=String(E?.label||"");let O=d.createElement("dd");O.textContent=String(E?.value||""),f.push(y,O)}t.tooltipRows.replaceChildren(...f);let p=Math.max(1,Number(c.width)||t.plot?.clientWidth||1),m=Math.max(1,Number(c.height)||t.plot?.clientHeight||1),b=Number(c.x)||0,g=Number(c.y)||0,x=Math.min(110,Math.max(8,p/2));return t.tooltip.style.left=`${Math.max(x,Math.min(p-x,b))}px`,t.tooltip.style.top=`${Math.max(8,Math.min(m-8,g))}px`,t.tooltip.classList.toggle("is-below",c.below??g<128),t.tooltip.hidden=!1,!0}return Object.freeze({elements:Object.freeze(t),setHeader:o,setMessage:i,setLegend:a,showTooltip:u,hideTooltip:s,anchorBottom:r.anchor,isAnchoredToBottom:r.isAnchored,destroy:r.destroy})}var Hu=Object.freeze(["lead","vision","front","scc","corner"]),No=Object.freeze({vision:Object.freeze({shape:"circle",tone:"vision",labelKey:"replay_sensor_source_vision",label:"Camera"}),front:Object.freeze({shape:"diamond",tone:"track",labelKey:"replay_sensor_source_front",label:"Front radar"}),scc:Object.freeze({shape:"square",tone:"track",labelKey:"replay_sensor_source_scc",label:"SCC radar"}),corner:Object.freeze({shape:"triangle",tone:"track",labelKey:"replay_sensor_source_corner",label:"Corner radar"}),fusion:Object.freeze({shape:"circle",tone:"lead",labelKey:"replay_sensor_source_fusion",label:"Combined sensors"}),lead:Object.freeze({shape:"circle",tone:"lead",labelKey:"replay_sensor_source_lead",label:"Lead"}),unknown:Object.freeze({shape:"circle",tone:"track",labelKey:"replay_sensor_source_unknown",label:"Unidentified"})}),fb=Object.freeze(["front","scc","corner","corner"]);function Ms(e,t="unknown"){if(e!=null&&String(e).trim()!==""&&Number.isFinite(Number(e)))return fb[Math.max(0,Math.min(3,Number(e)))]||t;let n=String(e||"").trim().toLowerCase();return["vision","model","camera"].includes(n)?"vision":["front","frontradar","front_radar","radar","live_tracks"].includes(n)?"front":n==="scc"?"scc":["corner","corner235","corner180","corner430"].includes(n)?"corner":n==="fusion"?"fusion":n==="lead"?"lead":Object.prototype.hasOwnProperty.call(No,t)?t:"unknown"}function As(e,t="unknown"){return No[Ms(e,t)]||No.unknown}function Rs(e,t,n="unknown"){let r=As(e,n);return typeof t=="function"?t(r.labelKey,r.label):r.label}var Ts=100,pb=Object.freeze(["circle","square","diamond","triangle"]),mb=Object.freeze(["lead","accent","neutral"]),Es=12,hb=1.3,gb=.45,xs=20,Bu=10,Gu=4;function It(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Wu(e,t,n,r){let o=It(e);return o===null?t:Math.max(n,Math.min(r,o))}function $u(e){return typeof e!="string"?null:e.trim()||null}function bb(e={},t=1){let n=Math.max(1,Math.round(It(e.width)??1)),r=Math.max(1,Math.round(It(e.height)??1)),o=Math.max(1,Math.min(3,It(t)??1));return Object.freeze({width:n,height:r,dpr:o,pixelWidth:Math.max(1,Math.round(n*o)),pixelHeight:Math.max(1,Math.round(r*o))})}function Br(e,t={}){let n=It(e?.xM),r=It(e?.yM),o=Math.max(1,It(t.width)??1),i=Math.max(1,It(t.height)??1),a=Math.max(1,It(t.maxDistanceM)??Ts);if(n===null||r===null||n<0||n>a||Math.abs(r)>Es*hb)return null;let s=i*.16,u=Math.max(i*.5,i-46),c=(u-s)/a,l=Math.max(1,o*gb/Es);return Object.freeze({x:o/2-r*l,y:u-n*c,xM:n,yM:r})}function yb(e){let t=[],n=(r,o)=>{for(let[i,a]of(Array.isArray(r)?r:[]).entries()){let s=It(a?.xM),u=It(a?.yM);s===null||u===null||t.push(Object.freeze({id:String(a?.id||`${o}:${i}`),kind:o,source:String(a?.source||"unknown"),xM:s,yM:u,relativeSpeedMps:It(a?.relativeSpeedMps),measured:o==="radar"?a?.measured===!0:null,selected:o==="lead"||a?.selected===!0}))}};return n(e?.leads,"lead"),n(e?.radar,"radar"),Object.freeze(t)}function Uu(e,t){let n=e?.entities??e;return n instanceof Map?n.get(t)??null:!n||typeof n!="object"?null:Object.prototype.hasOwnProperty.call(n,t)?n[t]:null}function vb(e,t){let n=Uu(t,e.id),r=Uu(t,`${e.kind}:${e.id}`),o={...n&&typeof n=="object"?n:{},...r&&typeof r=="object"?r:{},meta:{...n?.meta&&typeof n.meta=="object"?n.meta:{},...r?.meta&&typeof r.meta=="object"?r.meta:{}}},i=o.selected===void 0?e.selected===!0:o.selected===!0,a=e.kind==="lead"?6:4,s=Wu(o.radiusPx,i?Math.max(7,a):a,2,14),u=mb.includes(o.tone)?o.tone:i||e.kind==="lead"?"lead":"neutral",c=As(e.source).shape,l=pb.includes(o.shape)?o.shape:c,d=$u(o.label);return Object.freeze({shape:l,tone:u,selected:i,visible:o.visible!==!1,filled:o.filled!==!1,showLabel:o.showLabel??e.kind==="lead",label:d,sourceLabel:$u(o.sourceLabel),radiusPx:s,hitRadiusPx:Wu(o.hitRadiusPx,Math.max(20,s+8),s,48),meta:Object.freeze({...o.meta})})}function Yu(e,t={},n=null){let r=Math.max(1,It(t.width)??1),o=Math.max(1,It(t.height)??1),i=Math.max(1,It(t.maxDistanceM)??Ts),a=yb(e).flatMap(l=>{let d=Br(l,{width:r,height:o,maxDistanceM:i});if(!d)return[];let f=vb(l,n);return f.visible?[Object.freeze({...l,point:d,screenX:d.x,screenY:d.y,selected:f.selected,hitRadiusPx:f.hitRadiusPx,presentation:f})]:[]}),s=["lanes","leads","radar"].map(l=>String(e?.freshness?.[l]?.state||"missing")),u=s.includes("fresh")?"valid":s.includes("stale")?"stale":"empty",c=Object.freeze(a);return Object.freeze({state:u,width:r,height:o,maxDistanceM:i,ego:Object.freeze({x:r/2,y:Math.max(o*.5,o-46)}),laneOffsetsM:Object.freeze([-1.8,1.8]),entities:c,hitTargets:c})}function Ku(e,t){let n=e.getComputedStyle?.(t)||t?.ownerDocument?.defaultView?.getComputedStyle?.(t)||globalThis.getComputedStyle?.(t),r=o=>String(n?.getPropertyValue?.(o)||"").trim();return Object.freeze({grid:r("--drive-insights-forward-grid"),gridMinor:r("--drive-insights-forward-grid-minor"),gridLabel:r("--drive-insights-forward-grid-label"),gridFont:r("--drive-insights-forward-grid-font"),lane:r("--drive-insights-forward-lane"),lead:r("--drive-insights-forward-lead"),radar:r("--drive-insights-forward-radar"),neutral:r("--drive-insights-forward-neutral"),text:r("--drive-insights-forward-text"),plate:r("--drive-insights-panel")||r("--md-surface")})}function qu(e,t){return e==="lead"?t.lead:e==="neutral"?t.neutral:t.radar}function Sb(e,t,n,r,o){e.beginPath?.(),r==="square"?e.rect?.(t-o,n-o,o*2,o*2):r==="diamond"?(e.moveTo?.(t,n-o*1.3),e.lineTo?.(t+o*1.15,n),e.lineTo?.(t,n+o*1.3),e.lineTo?.(t-o*1.15,n)):r==="triangle"?(e.moveTo?.(t,n-o*1.35),e.lineTo?.(t+o*1.25,n+o*.9),e.lineTo?.(t-o*1.25,n+o*.9)):e.arc?.(t,n,o,0,Math.PI*2),e.closePath?.()}function Mb(e){return e.presentation.label?e.presentation.label:`${e.xM.toFixed(0)} m`}function Ab(e,t,n,r){let{presentation:o,point:i}=t,a=qu(o.tone,n);if(!a||(Sb(e,i.x,i.y,o.shape,o.radiusPx),e.lineJoin="round",n.plate&&(e.lineWidth=3.5,e.strokeStyle=n.plate,e.stroke?.()),o.filled&&(e.fillStyle=a,e.fill?.()),e.lineWidth=2,e.strokeStyle=a,e.stroke?.(),!o.showLabel||!n.text))return;let s=Mb(t);e.font=o.selected?"800 12px system-ui":"600 11px system-ui",e.textBaseline="middle";let u=e.measureText?.(s)?.width??0,c=o.radiusPx+10,l=i.x+c+u+4<=r.width;e.textAlign=l?"left":"right";let d=l?i.x+c:i.x-c,f=Math.max(8,Math.min(r.height-8,i.y));n.plate&&(e.lineWidth=3,e.strokeStyle=n.plate,e.strokeText?.(s,d,f)),e.fillStyle=n.text,e.fillText?.(s,d,f)}function Rb(e,t,n){let{width:r,height:o,maxDistanceM:i}=t;if(n.gridMinor){e.strokeStyle=n.gridMinor,e.lineWidth=1,e.beginPath?.();for(let a=Gu;a<=Es;a+=Gu)for(let s of[-a,a]){let u=Br({xM:0,yM:s},t);if(!u)continue;let c=Math.round(u.x)+.5;e.moveTo?.(c,0),e.lineTo?.(c,o)}for(let a=Bu;a<=i;a+=Bu){if(a%xs===0)continue;let s=Br({xM:a,yM:0},t);if(!s)continue;let u=Math.round(s.y)+.5;e.moveTo?.(0,u),e.lineTo?.(r,u)}e.stroke?.()}if(n.grid){e.strokeStyle=n.grid,e.lineWidth=1,e.beginPath?.();for(let a=0;a<=i;a+=xs){let s=Br({xM:a,yM:0},t);if(!s)continue;let u=Math.round(s.y)+.5;e.moveTo?.(0,u),e.lineTo?.(r,u)}e.stroke?.()}if(n.gridLabel&&n.gridFont){e.fillStyle=n.gridLabel,e.font=n.gridFont,e.textAlign="left",e.textBaseline="bottom";for(let a=0;a<=i;a+=xs){let s=Br({xM:a,yM:0},t);s&&e.fillText?.(`${a} m`,6,s.y-3)}}}function Xu(e,t,n){if(!e)return;let{height:r}=t;if(Rb(e,t,n),!!n.lane){e.strokeStyle=n.lane,e.lineWidth=1.5;for(let o of t.laneOffsetsM){let i=Br({xM:0,yM:o},t);i&&(e.beginPath?.(),e.moveTo?.(i.x,0),e.lineTo?.(i.x,r),e.stroke?.())}}}function xb(e,t,n,r=null){if(!e)return;let{width:o,height:i}=t;e.clearRect?.(0,0,o,i),r&&typeof e.drawImage=="function"?e.drawImage(r,0,0,r.width,r.height,0,0,o,i):Xu(e,t,n);for(let a of[!1,!0])for(let s of t.entities)s.selected===a&&Ab(e,s,n,t)}function Qu(e={}){let t=e.root,n=e.document||t?.ownerDocument||globalThis.document;if(!t||!n?.createElement||typeof t.append!="function")return null;let r=e.target||n.defaultView||globalThis;t.classList?.add("drive-insights__forward");let o=Vu({root:t,document:n,target:r,anchorBottom:!0});if(!o)return null;let{canvas:i,ego:a}=o.elements,s=i.getContext?.("2d")||null,u=null,c=null,l=null,d=Yu(null,{width:1,height:1}),f=Ku(e,t),p=Number.NEGATIVE_INFINITY,m=n.createElement("canvas"),b=m.getContext?.("2d")||null,g="",x="",E=[],y={x:0,y:0,active:!1},O=null,C=!1;function w(F,H){return typeof e.text=="function"?e.text(F,H):H}function z(F=!1){let H=Number(r.performance?.now?.()??Date.now());return!F&&H-p<1e3||(p=H,f=Ku(e,t)),f}function M(){if(C)return!1;z(!0),g="",x="";let F=w("drive_insights_forward_title","Forward perception");return o.setHeader(F,`${Ts} m`),o.setLegend(Hu.map(H=>{let Y=No[H],$=Y.tone==="lead"?"var(--md-primary)":Y.tone==="vision"?"var(--md-info)":"var(--md-outline-var)";return{shape:Y.shape,color:$,label:Rs(H,w)}}),w("replay_sensor_sources","Sensor sources")),i.setAttribute?.("aria-label",w("drive_insights_forward_canvas","Forward driving data")),!0}function R(F,H){let Y=i.getBoundingClientRect?.();if(!Y?.width||!Y?.height)return null;let $=(F-Y.left)*d.width/Y.width,K=(H-Y.top)*d.height/Y.height,Z=null,ee=20;for(let ue of d.hitTargets){let de=Math.hypot($-ue.screenX,K-ue.screenY);de>=Math.min(ee,ue.hitRadiusPx)||(ee=de,Z=ue)}return Z}function v(F){return Rs(F.source,w)}function h(F,H=!1){if(!F)return o.hideTooltip(),!1;O!==null&&r.clearTimeout?.(O),O=null;let Y=F.yM,$=Math.abs(Y),K=[{label:w("replay_sensor_row_distance","Distance"),value:`${F.xM.toFixed(1)} m`},{label:w("replay_sensor_row_lateral","Side"),value:$<.2?w("replay_sensor_side_ahead","dead ahead"):`${Y>0?w("replay_sensor_side_left","left"):w("replay_sensor_side_right","right")} ${$.toFixed(1)} m`}];F.relativeSpeedMps!==null&&K.splice(1,0,{label:w("replay_sensor_row_speed","Rel. speed"),value:`${F.relativeSpeedMps>=0?"+":""}${F.relativeSpeedMps.toFixed(1)} m/s`});let Z=F.kind==="lead"||F.selected;return o.showTooltip({shape:F.presentation.shape,color:qu(F.presentation.tone,f),title:v(F),state:Z?w("replay_sensor_source_lead","Lead"):F.measured?w("replay_sensor_measured","measured"):w("replay_sensor_unmeasured","estimated"),lead:Z,rows:K,x:F.point.x,y:F.point.y,width:d.width,height:d.height}),H&&typeof r.setTimeout=="function"&&(O=r.setTimeout(()=>{O=null,o.hideTooltip()},2200)),!0}function S(){y.active&&h(R(y.x,y.y))}function A(F,H){if(!b)return null;let Y=[H.pixelWidth,H.pixelHeight,F.maxDistanceM,f.grid,f.gridMinor,f.gridLabel,f.gridFont,f.lane].join("|");return Y===g||(g=Y,m.width!==H.pixelWidth&&(m.width=H.pixelWidth),m.height!==H.pixelHeight&&(m.height=H.pixelHeight),b.setTransform?.(H.dpr,0,0,H.dpr,0,0),b.clearRect?.(0,0,H.width,H.height),Xu(b,F,f)),m}function L(){if(C)return!1;z();let F=i.getBoundingClientRect?.()||{},H=Number(F.width)>1&&Number(F.height)>1?F:l||t.getBoundingClientRect?.()||{},Y=bb(H,r.devicePixelRatio||1);i.width!==Y.pixelWidth&&(i.width=Y.pixelWidth),i.height!==Y.pixelHeight&&(i.height=Y.pixelHeight),s?.setTransform?.(Y.dpr,0,0,Y.dpr,0,0),d=Yu(u,Y,c),t.dataset.state=d.state;let $=`${d.ego.y}px`;a.style.top!==$&&(a.style.top=$);let K=w("drive_insights_forward_title","Forward perception"),Z=`${K}|${d.maxDistanceM}|${d.state}`;return Z!==x&&(x=Z,o.setHeader(K,`${d.maxDistanceM} m`,d.state==="stale")),xb(s,d,f,A(d,Y)),S(),!0}function P(F,H=null){return C?!1:(u=F&&typeof F=="object"?F:null,c=H&&typeof H=="object"?H:null,L())}function _(F){if(C)return!1;l=F&&typeof F=="object"?F:null;let H=L();return o.anchorBottom(),H}function T(){return d}function I(){return Object.freeze({destroyed:C,state:d.state,entityCount:d.entities.length,selectedCount:d.entities.filter(({selected:F})=>F).length})}function k(){if(C)return!1;C=!0,u=null,c=null,O!==null&&r.clearTimeout?.(O),O=null;for(let[F,H,Y]of E.splice(0))F.removeEventListener?.(H,Y);return o.destroy?.(),t.replaceChildren?.(),!0}let D=o.elements.viewport||i,B=F=>{F.pointerType!=="touch"&&(y.x=F.clientX,y.y=F.clientY,y.active=!0,S())},W=F=>{F.pointerType!=="touch"&&(y.active=!1,o.hideTooltip())},V=F=>{let H=R(F.clientX,F.clientY);if(!H){o.hideTooltip();return}F.pointerType==="touch"&&F.preventDefault?.(),h(H,F.pointerType==="touch")};return D.addEventListener?.("pointermove",B,{passive:!0}),D.addEventListener?.("pointerleave",W,{passive:!0}),D.addEventListener?.("pointerdown",V,{passive:!1}),E.push([D,"pointermove",B],[D,"pointerleave",W],[D,"pointerdown",V]),M(),Object.freeze({render:P,resize:_,syncLabels:M,scene:T,status:I,destroy:k})}var Eb=Object.freeze({speed:"info",steering:"primary",acceleration:"success",lead_distance:"warning"});function Tb(e,t){return t?.document||e?.ownerDocument||globalThis.document}function Ob(e){return Eb[e?.id]||"info"}function Zu(e,t,n={}){let r=Tb(e,n);if(!e||!r?.createElement||!Array.isArray(t))return null;e.classList?.add("telemetry-graphs");let o=new Map;for(let i of t){let a=r.createElement("article");a.className="telemetry-graph",a.dataset.telemetryMetric=i.id,a.dataset.telemetryTone=Ob(i);let s=r.createElement("header");s.className="telemetry-graph__head";let u=r.createElement("strong");u.textContent=i.label;let c=r.createElement("output"),l=r.createTextNode("--"),d=r.createElement("small");d.textContent=i.unit,c.append(l,d),s.append(u,c);let f=r.createElement("canvas");f.className="telemetry-graph__plot",f.setAttribute("aria-hidden","true");let p=r.createElement("i");p.className="telemetry-graph__cursor telemetry-graph__cursor--live",p.setAttribute("aria-hidden","true"),a.append(s,f,p),e.append(a),o.set(i.id,Object.freeze({card:a,head:s,label:u,value:c,number:l,unit:d,canvas:f,cursor:p}))}return Object.freeze({root:e,cards:o})}var Cb=Object.freeze([Object.freeze({id:"speed",label:"Speed",unit:"km/h",digits:1,minimumSpan:20,value(e){let t=qt(e?.ego?.speedMps);return t===null?null:t*3.6}}),Object.freeze({id:"steering",label:"Steering",unit:"°",digits:2,minimumSpan:20,value(e){return e?.ego?.steeringAngleDeg}}),Object.freeze({id:"acceleration",label:"Acceleration",unit:"m/s²",digits:2,minimumSpan:2,value(e){return e?.ego?.accelMps2}}),Object.freeze({id:"lead_distance",label:"Lead distance",unit:"m",digits:1,minimumSpan:20,value(e){let t=Array.isArray(e?.leads)?e.leads:[],n=null;for(let r of t){let o=qt(r?.xM);o!==null&&o>=0&&(n===null||oObject.freeze(t)))}function Ib(e,t){let n="fresh";for(let r of t){let o=String(e?.freshness?.[r]?.state||"missing"),i=Object.hasOwn(Os,o)?o:"missing";Os[i]>Os[n]&&(n=i)}return n}function nd(e){let t=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=Cb.map(o=>{let i=t[o.id],a=i&&typeof i=="object"&&!Array.isArray(i)?i:{},s=Number.isSafeInteger(a.digits)&&a.digits>=0&&a.digits<=6?a.digits:o.digits;return Object.freeze({...o,label:typeof a.label=="string"&&a.label?a.label:o.label,labelKey:typeof a.labelKey=="string"&&a.labelKey?a.labelKey:`drive_insights_graph_${o.id}`,unit:typeof a.unit=="string"?a.unit:o.unit,digits:s,minimumSpan:qt(a.minimumSpan)??o.minimumSpan??0,value:typeof a.value=="function"?a.value:o.value})});if(!Array.isArray(t.metricOrder))return n;let r=new Map(t.metricOrder.map((o,i)=>[String(o),i]));return n.sort((o,i)=>(r.get(o.id)??Number.MAX_SAFE_INTEGER)-(r.get(i.id)??Number.MAX_SAFE_INTEGER))}function Ju(e,t={}){let n=Array.isArray(e?.samples)?e.samples:[],r=nd(t.presentation).map(p=>{let m=[];for(let E of n){let y=Cs(E),O=ws(E,y),C=qt(p.value(y));O===null||O<0||C===null||m.push({timestampMs:O,value:C})}m.sort((E,y)=>E.timestampMs-y.timestampMs);let b=m.map(({value:E})=>E),g=b.length?Math.min(...b):null,x=b.length?Math.max(...b):null;if(g!==null&&x!==null){let E=x-g,y=qt(p.minimumSpan)??0,O=Math.max(y,1e-6);if(Ep.length>0),a=o?Ib(o,["ego"]):"missing",s=i?a==="fresh"?"valid":"stale":"empty",u=n.length?ws(n[0],Cs(n[0])):null,c=n.length?ws(n.at(-1),o):null,l=qt(e?.startTimestampMs)??u??0,d=qt(e?.endTimestampMs)??c??l,f=Math.max(0,l);return Object.freeze({state:s,freshness:a,startTimestampMs:f,endTimestampMs:Math.max(f,d),cadenceMs:Math.max(0,qt(e?.cadenceMs)??0),metrics:Object.freeze(r)})}function _b(e,t){return e.document||t?.ownerDocument||globalThis.document}function ed(e,t,n){return typeof e.text=="function"?e.text(t,n):n}function Nb(e,t,n){let r=e.getComputedStyle?.(t)||t?.ownerDocument?.defaultView?.getComputedStyle?.(t)||globalThis.getComputedStyle?.(t);return String(r?.getPropertyValue?.(n)||"").trim()}function Db(e,t){let n=e.getBoundingClientRect?.()||{},r=Math.max(1,Math.round(Number(n.width||e.clientWidth||1))),o=Math.max(1,Math.round(Number(n.height||e.clientHeight||1))),i=Math.max(1,Math.min(3,Number(t?.devicePixelRatio||1))),a=Math.max(1,Math.round(r*i)),s=Math.max(1,Math.round(o*i));return e.width!==a&&(e.width=a),e.height!==s&&(e.height=s),{width:r,height:o,dpr:i}}var Pb=.6,td=.12;function Lb(e,t,n){if(t===null||n===null)return null;if(!e)return{minimum:t,maximum:n};let r=Math.min(e.minimum,t),o=Math.max(e.maximum,n),i=n-t,a=o-r;return i>0&&a>i/Pb&&(r+=(t-r)*td,o+=(n-o)*td),{minimum:r,maximum:o}}function kb(e,t,n,r,o,i,a){if(!e)return;let{width:s,height:u,dpr:c}=Db(t,i);if(e.setTransform?.(c,0,0,c,0,0),e.clearRect?.(0,0,s,u),!o||n.values.length<2||n.minimum===null||n.maximum===null){n.values.length||a?.delete(n.id);return}let l=Lb(a?.get(n.id),n.minimum,n.maximum);a?.set(n.id,l);let d=qt(r?.startTimestampMs)??n.values[0].timestampMs,f=qt(r?.endTimestampMs)??n.values.at(-1).timestampMs,p=Math.max(1,f-d),m=Math.max(1e-9,l.maximum-l.minimum);e.strokeStyle=o,e.lineWidth=n.id==="speed"?1.8:1.6,e.lineJoin="round",e.lineCap="round",e.beginPath?.(),n.values.forEach((b,g)=>{let x=Math.max(0,Math.min(s,(b.timestampMs-d)/p*s)),E=u-(b.value-l.minimum)/m*Math.max(1,u-4)-2;g===0?e.moveTo?.(x,E):e.lineTo?.(x,E)}),e.stroke?.()}function rd(e={}){let t=e.root,n=_b(e,t);if(!t||!n?.createElement||typeof t.append!="function")return null;let r=e.target||n.defaultView||globalThis,o=nd(e.presentation),i=Zu(t,o.map(E=>({...E,label:ed(e,E.labelKey,E.label)})),{document:n});if(!i)return null;let a=new Map(Array.from(i.cards,([E,y])=>[E,{...y,output:y.number,context:y.canvas.getContext?.("2d")||null}])),s=Ju(null,{presentation:e.presentation}),u=new Map,c=!1,l=Number.NEGATIVE_INFINITY;t.classList?.add("drive-insights__graph");function d(E=!1){let y=Number(r.performance?.now?.()??Date.now());if(!E&&y-l<1e3)return!1;l=y;for(let O of a.values())O.lineColor=Nb(e,O.card,"--graph-color");return!0}for(let E of o){let y=a.get(E.id);y&&y.card.setAttribute?.("aria-label",y.label.textContent)}d(!0);function f(){if(c)return!1;d(),t.dataset.state=s.state;for(let E of s.metrics){let y=a.get(E.id);if(!y)continue;let O=E.current===null?"--":E.current.toFixed(E.digits);y.output.textContent!==O&&(y.output.textContent=O),kb(y.context,y.canvas,E,s,y.lineColor,r,u)}return!0}function p(E){return c?!1:(s=Ju(E,{presentation:e.presentation}),f())}function m(){return f()}function b(){if(c)return!1;for(let E of o){let y=a.get(E.id);y&&(y.label.textContent=ed(e,E.labelKey,E.label),y.card.setAttribute?.("aria-label",y.label.textContent),y.unit.textContent=E.unit)}return d(!0),!0}function g(){return Object.freeze({destroyed:c,state:s.state,freshness:s.freshness})}function x(){return c?!1:(c=!0,u.clear(),a.clear(),t.replaceChildren?.(),!0)}return Object.freeze({render:p,resize:m,syncLabels:b,status:g,destroy:x})}var ot=Object.freeze({LIVE:"live",REPLAY:"replay"}),Kn=Object.freeze({FRESH:"fresh",STALE:"stale",MISSING:"missing"}),Gr=Object.freeze({cadenceMs:100,windowMs:1e4,maxSamples:200,liveStaleAfterMs:2e3,replaySeekResetThresholdMs:500}),Fb=new Set(["connected","online","open","ready"]),zb=new Set(Object.values(ot)),_s=class extends Error{constructor(t,n){super(n),this.name="DriveInsightsHistoryError",this.code=t}};function tn(e,t){throw new _s(e,t)}function Yn(e,t){return Object.prototype.hasOwnProperty.call(e||{},t)}function On(e,t){let n=Number(e);return(!Number.isFinite(n)||n<0)&&tn("INVALID_TIMESTAMP",`${t} must be a finite, non-negative number`),n}function Oi(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&tn("INVALID_HISTORY_OPTIONS",`${t} must be a finite number greater than zero`),n}function jb(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&tn("INVALID_HISTORY_OPTIONS",`${t} must be a positive safe integer`),n}function ad(e={}){let t=Oi(e.cadenceMs??Gr.cadenceMs,"cadenceMs"),n=Oi(e.windowMs??Gr.windowMs,"windowMs"),r=jb(e.maxSamples??Gr.maxSamples,"maxSamples"),o=Oi(e.liveStaleAfterMs??Gr.liveStaleAfterMs,"liveStaleAfterMs"),i=Oi(e.replaySeekResetThresholdMs??Gr.replaySeekResetThresholdMs,"replaySeekResetThresholdMs");return Object.freeze({cadenceMs:t,windowMs:n,maxSamples:r,liveStaleAfterMs:o,replaySeekResetThresholdMs:i})}function Vb(e){let t=String(e||"").trim().toLowerCase();return zb.has(t)||tn("INVALID_SOURCE",`unsupported Drive Insights history source: ${String(e)}`),t}function od(e){return e==null||e===""?null:String(e)}function Ci(e){return typeof e=="boolean"?e:Fb.has(String(e||"").trim().toLowerCase())}function id(e,t="sample"){return(!e||typeof e!="object"||Array.isArray(e))&&tn("INVALID_SAMPLE",`${t} must be a normalized Drive Insights snapshot`),On(e.timestampMs,`${t}.timestampMs`),e}function Is(e,t){return Math.floor(e/t)}function Hb(){return typeof globalThis.performance?.now!="function"&&tn("MONOTONIC_CLOCK_UNAVAILABLE","performance.now() is required for live history status"),globalThis.performance.now()}function sd(e,t={}){let n=ad(t),r=On(e,"currentTimestampMs"),o=Math.max(0,r-n.windowMs),i=Math.floor((r-o)/n.cadenceMs)+1,a=Math.min(n.maxSamples,i),s=[];for(let u=a-1;u>=0;u-=1)s.push(r-u*n.cadenceMs);return Object.freeze(s)}function Ns(e={}){let t=ad(e),n=typeof e.nowMs=="function"?e.nowMs:Hb,r=null,o=null,i=!1,a=null,s=!1,u=null,c=!1,l=!1,d=[],f=null,p=null,m=null,b=null,g=0,x="initial";function E(h){d=[],f=null,p=null,m=null,b=null,g+=1,x=String(h||"manual")}function y(h){o=null,i=!1,a=null,s=!1,u=null,c=!1,l=!1,r=h}function O(h={}){(!h||typeof h!="object"||Array.isArray(h))&&tn("INVALID_CONTEXT","Drive Insights history context must be an object");let S=Yn(h,"source")?Vb(h.source):r;S===null&&tn("INVALID_SOURCE","Drive Insights history source is required");let A=null;r!==null&&r!==S&&(A="source-change"),A?(E(A),y(S)):r===null&&y(S);let L=Yn(h,"routeId"),P=L?od(h.routeId):o;!A&&r===ot.REPLAY&&i&&L&&o!==P&&(A="replay-route-change",E(A));let _=Yn(h,"connectionState"),T=_?h.connectionState:a,I=Yn(h,"connectionId"),k=I?od(h.connectionId):u;if(!A&&r===ot.LIVE){let D=s&&_&&!Ci(a)&&Ci(T)&&l,B=c&&I&&u!==k;(h.reconnected===!0||D||B)&&(A="live-reconnect",E(A))}if(r===ot.REPLAY&&Yn(h,"currentTimestampMs")){let D=On(h.currentTimestampMs,"currentTimestampMs");!A&&b!==null&&Math.abs(D-b)>t.replaySeekResetThresholdMs&&(A="replay-seek",E(A)),b=D}return L&&(o=P,i=!0),_&&(a=T,s=!0,Ci(T)&&(l=!0)),I&&(u=k,c=!0),Object.freeze({reset:A!==null,reason:A})}function C(){if(f===null)return;let h=Math.max(0,f-t.windowMs);d=d.filter(S=>S.timestampMs>=h),d.length>t.maxSamples&&(d=d.slice(-t.maxSamples))}function w(h,S={}){let A=id(h),L=O({...S,source:ot.LIVE}),P=On(A.timestampMs,"sample.timestampMs"),_=Yn(S,"receivedAtMonotonicMs")?On(S.receivedAtMonotonicMs,"receivedAtMonotonicMs"):On(n(),"nowMs()");if(p!==null){let T=Is(p,t.cadenceMs),I=Is(P,t.cadenceMs);I{let k=id(T,`samples[${I}]`),D=On(k.timestampMs,`samples[${I}].timestampMs`);DA||_.set(Is(D,t.cadenceMs),k)}),d=[..._.entries()].sort(([T],[I])=>T-I).map(([,T])=>T).slice(-t.maxSamples),f=A,g+=1,Object.freeze({...L,window:M()})}function M(){let h=f,S=h===null?null:Math.max(0,h-t.windowMs);return Object.freeze({startTimestampMs:S,endTimestampMs:h,cadenceMs:t.cadenceMs,samples:Object.freeze([...d])})}function R(h={}){(!h||typeof h!="object"||Array.isArray(h))&&tn("INVALID_CONTEXT","Drive Insights history status options must be an object");let S=d.length?Kn.FRESH:Kn.MISSING,A=null;if(r===ot.LIVE&&d.length){let L=Yn(h,"nowMonotonicMs")?On(h.nowMonotonicMs,"nowMonotonicMs"):On(n(),"nowMs()"),P=m===null?Number.NaN:L-m;Number.isFinite(P)&&P>=0&&(A=P),(s&&!Ci(a)||A===null||A>=t.liveStaleAfterMs)&&(S=Kn.STALE)}return Object.freeze({source:r,routeId:o,connectionState:a,state:S,stale:S===Kn.STALE,ageMs:A,sampleCount:d.length,generation:g,lastResetReason:x})}function v(h="manual"){return E(h),M()}return Object.freeze({config:t,setContext:O,pushLive:w,rebuildReplay:z,replayTimestamps(h){return sd(h,t)},window:M,status:R,reset:v})}var CR=Object.freeze({SOURCE:ot,STATE:Kn,DEFAULTS:Gr,create:Ns,replayTimestamps:sd});function fr(e,t=0){let n=Number(e);return Number.isFinite(n)&&n>=0?n:t}function cd(e={}){let t=e.target||globalThis,n=e.nowMs||(()=>t.performance?.now?.()??Date.now()),r=e.setTimeout||t.setTimeout?.bind(t),o=e.clearTimeout||t.clearTimeout?.bind(t),i=e.requestIdleCallback||t.requestIdleCallback?.bind(t),a=e.cancelIdleCallback||t.cancelIdleCallback?.bind(t),s=e.onFlush;if(typeof r!="function"||typeof o!="function"||typeof s!="function")return null;let u=null,c=null,l=null,d=null,f=!1,p=!1,m=Math.max(1,fr(e.cadenceMs,100)),b=Math.max(1,fr(e.idleTimeoutMs,12)),g=Math.max(1,fr(e.slowFlushThresholdMs,8)),x=0,E=0,y=0,O=0,C=0;function w(){return u===null?!1:(o(u),u=null,l=null,!0)}function z(){return c===null?!1:(a?.(c),c=null,l=null,!0)}function M(){if(u=null,c=null,l=null,p||!f)return!1;f=!1;let P=fr(n());d=P,E+=1;try{s()}finally{y=Math.max(0,fr(n())-P),O=Math.max(O,y),y>g&&(C+=1)}return!0}function R(){return u=null,p||!f?(l=null,!1):typeof i=="function"&&typeof a=="function"?(c=i(M,{timeout:Math.min(m,b)}),!0):M()}function v(P=m,_={}){if(p)return!1;x+=1,f=!0,m=Math.max(1,fr(P,m));let T=fr(n()),I=_.immediate===!0||d===null?T:Math.max(T,d+m);return c!==null||u!==null&&l!==null&&l<=I||(w(),l=I,u=r(R,Math.max(0,I-T))),!0}function h(){f=!1;let P=w(),_=z();return P||_}function S(){return p||!f?!1:(w(),z(),M())}function A(){return Object.freeze({pending:f,scheduled:u!==null||c!==null,cadenceMs:m,requests:x,flushes:E,lastFlushAtMs:d,lastFlushDurationMs:y,maxFlushDurationMs:O,slowFlushes:C})}function L(){return p?!1:(p=!0,h(),!0)}return Object.freeze({request:v,cancel:h,flush:S,status:A,destroy:L})}var wi=Object.freeze({graph:100,forward:67});function ld(e={}){return cd({cadenceMs:wi.graph,...e})}var Bb=1.52,Gb=.5,Wb=Object.freeze(["vision","front","scc","corner","fusion","unknown"]),$b=Object.freeze(["ego","path","lanes","leads","radar","navigation","camera"]),Ub=Object.freeze({ego:Object.freeze({freshMs:500,staleMs:2e3}),path:Object.freeze({freshMs:750,staleMs:3e3}),lanes:Object.freeze({freshMs:750,staleMs:3e3}),leads:Object.freeze({freshMs:750,staleMs:3e3}),radar:Object.freeze({freshMs:750,staleMs:3e3}),navigation:Object.freeze({freshMs:5e3,staleMs:15e3}),camera:Object.freeze({freshMs:1e3,staleMs:3e3})});function fd(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))fd(t);return Object.freeze(e)}function Pe(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function pd(e){let t=Pe(e);return t!==null&&t>=0&&t<=1?t:null}function Wr(e,t="timestampMs"){let n=Pe(e);if(n===null||n<0)throw new TypeError(`${t} must be a finite non-negative number`);return n}function Yb(e,t,n=!0){let r=Ub[e];if(!r)throw new RangeError(`Unknown Drive Insights freshness domain: ${e}`);let o=Pe(t);return!n||o===null||o<0||o>r.staleMs?Object.freeze({state:"missing",ageMs:null}):Object.freeze({state:o<=r.freshMs?"fresh":"stale",ageMs:o})}function Ds(...e){for(let t of e){let n=Pe(t);if(n!==null)return n}return null}function ud(...e){for(let t of e){if(typeof t!="string")continue;let n=t.trim();if(n)return n}return null}function Ii(e,t=0){return Array.isArray(e)?e[t]:e}function Ps(e,{invertY:t=!0}={}){let n=Array.isArray(e?.x)?e.x:[],r=Array.isArray(e?.y)?e.y:[],o=Array.isArray(e?.z)?e.z:[],i=[],a=Math.min(n.length,r.length);for(let s=0;s=4?t{let i=Ps(r);return i.length?[Object.freeze({side:Kb(r,o,t.length),probability:pd(n[o]??r?.probability??r?.prob),points:i})]:[]}))}function Xb(e,t){let n=Array.isArray(e?.leadsV3)?e.leadsV3:[],r=Ds(Ii(e?.velocity?.x),t);return Object.freeze(n.flatMap((o,i)=>{let a=Pe(Ii(o?.x)),s=Pe(Ii(o?.y));if(a===null||s===null)return[];let u=pd(o?.confidence??o?.probability??o?.prob);if(u!==null&&u=0?String(t):null}function ey(e){let t=e?.radarState||{},n=[],r=c=>{if(!c||c.status===!1)return;let l=Pe(c?.xM??c?.dRel),d=Pe(c?.yM??c?.yRel);l===null||d===null||n.push({value:c,xM:l,yM:d,trackKey:dd(c?.radarTrackId)})};for(let c of Qb)r(t?.[c]);for(let c of Zb)for(let l of Array.isArray(t?.[c])?t[c]:[])r(l);let o=new Set(n.map(({trackKey:c})=>c).filter(Boolean)),i=new Set,a=new Set,s=[],u=c=>{a.has(c.dedupeKey)||(a.add(c.dedupeKey),s.push(Object.freeze({id:c.id,source:c.source,xM:c.xM,yM:c.yM,relativeSpeedMps:c.relativeSpeedMps,measured:c.measured,selected:c.selected})))};for(let c of Jb(e?.liveTracks)){let l=Pe(c?.xM??c?.dRel),d=Pe(c?.yM??c?.yRel);if(l===null||d===null)continue;let f=dd(c?.trackId),p=f!==null&&o.has(f);p&&i.add(f);let m=ks(c?.entitySource??c?.radarSource,"front"),b=s.length;u({id:Ls(c?.id??c?.trackId,m,b),source:m,xM:l,yM:d,relativeSpeedMps:Pe(c?.relativeSpeedMps??c?.vRel),measured:typeof c?.measured=="boolean"?c.measured:!!c?.radar,selected:p,dedupeKey:f!==null?`track:${f}`:`liveTracks:${b}`})}for(let c of n){if(c.trackKey!==null&&i.has(c.trackKey))continue;let l=c.value,d=ks(l?.entitySource??l?.radarSource,"fusion"),f=s.length;u({id:Ls(l?.id??l?.radarTrackId,d,f),source:d,xM:c.xM,yM:c.yM,relativeSpeedMps:Pe(l?.relativeSpeedMps??l?.vRel),measured:typeof l?.measured=="boolean"?l.measured:!!l?.radar,selected:!0,dedupeKey:c.trackKey!==null?`lead:${c.trackKey}`:`lead:${c.xM.toFixed(1)}:${c.yM.toFixed(1)}`})}return Object.freeze(s)}function Fs(e){let t=Pe(e);return t!==null&&t>=0?t:null}function ty(e,t){let n=e?.navigation||t?.navigation||e?.navInstructionCarrot,r=e?.carrotMan||t?.carrotMan||{},o=Fs(n?.distanceM),i=Ds(r?.xDistToTurn,r?.xSpdDist),a=o??(i!==null&&i>=0?i:null),s=Fs(n?.speedLimitMps),u=Ds(r?.xSpdLimit,r?.nRoadLimitSpeed),c=s??(u!==null&&u>0?u/3.6:null),l=ud(n?.maneuverType,n?.turnType,r?.atcType,r?.szTBTMainText),d=Pe(r?.xTurnInfo),f=l||(d!==null&&d!==0?String(d):null);return a!==null&&a>0||c!==null||f!==null||ud(n?.mainText,r?.naviPaths)!==null?Object.freeze({distanceM:a,speedLimitMps:c,maneuverType:f}):null}function ny(e,t){let n=t?.modelV2||{},r=t?.lateralPlan||{},o=!!e?.controlsState?.activeLaneLine||(Pe(e?.carState?.useLaneLineSpeed)??0)>0,i=Ps(r?.position);return o&&i.length>2?{points:i,service:"lateralPlan"}:{points:Ps(n?.position),service:"modelV2"}}function pr(e,...t){let n=t.map(r=>Pe(e?.[r])).filter(r=>r!==null&&r>=0);return n.length?Math.max(...n):null}function pn(e){return!!(e&&typeof e=="object")}function _i({timestampMs:e,hudState:t={},overlayState:n={},serviceAges:r={},cameraFrameTimestampMs:o=null,forceMissing:i=!1}={}){let a=Wr(e),s=t?.carState||{},u=Object.freeze({speedMps:Pe(s?.vEgo),accelMps2:Pe(s?.aEgo),steeringAngleDeg:Pe(s?.steeringAngleDeg)}),c=ny(t,n),l=c.points,d=qb(n?.modelV2),f=Xb(n?.modelV2,u.speedMps),p=ey(n),m=ty(t,n),b=Fs(o),g=!!n?.roadCameraState&&b!==null,x=Object.freeze({available:g,frameTimestampMs:g?b:null}),E={ego:pn(t?.carState),path:pn(n?.[c.service]),lanes:pn(n?.modelV2),leads:pn(n?.modelV2),radar:pn(n?.radarState)||pn(n?.liveTracks),navigation:pn(t?.navigation)||pn(n?.navigation)||pn(t?.navInstructionCarrot)||pn(t?.carrotMan)||pn(n?.carrotMan),camera:x.available},y={ego:pr(r,"carState"),path:pr(r,c.service),lanes:pr(r,"modelV2"),leads:pr(r,"modelV2"),radar:pr(r,...n?.liveTracks?["radarState","liveTracks"]:["radarState"]),navigation:pr(r,"carrotMan","navInstructionCarrot"),camera:pr(r,"roadCameraState")},O={};for(let C of $b)O[C]=Yb(C,y[C],E[C]&&!i);return fd({timestampMs:a,ego:u,path:l,lanes:d,leads:f,radar:p,navigation:m,camera:x,freshness:O})}var ry=Object.freeze(["idle","connecting","connected","disconnected"]);function oy(e){if(!e||typeof e.snapshot!="function"||typeof e.subscribe!="function")throw new TypeError("Drive Insights live source requires a provider with snapshot/subscribe");return e}function hd(e,t){let n=Pe(e?.[t]);return n!==null?n:Pe(e?.liveRuntime)}function iy(e){let t=Pe(e?.timestampMs),n=e?.receivedAtMonotonic||{},r={};for(let o of["carState","modelV2","lateralPlan","radarState","liveTracks","carrotMan","navInstructionCarrot","roadCameraState"]){let i=hd(n,o);r[o]=t!==null&&i!==null&&t>=i?t-i:null}return r}function zs(e){let t=ry.includes(e?.connectionState)?e.connectionState:"idle",n=typeof e?.routeId=="string"&&e.routeId.trim()?e.routeId.trim():null;return Object.freeze({routeId:n,connectionState:t})}function md(e){if(!e||typeof e!="object")throw new TypeError("Drive Insights live provider snapshot must be an object");let t=zs(e),n=e.receivedAtMonotonic||{};return _i({timestampMs:e.timestampMs,hudState:e.hudState,overlayState:e.overlayState,serviceAges:iy(e),cameraFrameTimestampMs:hd(n,"roadCameraState"),forceMissing:t.connectionState!=="connected"})}function gd({provider:e}={}){let t=oy(e),n=t.snapshot(),r=md(n),o=n,i=zs(n),a=!1,s=new Set,u=new Set,c=t.subscribe(b=>{if(!a){n=b&&typeof b=="object"?b:t.snapshot(),i=zs(n);for(let g of[...u])g();if(s.size){let g=l();for(let x of[...s])x(g)}}});function l(){return o!==n&&(r=md(n),o=n),r}function d(b){if(a)throw new Error("Drive Insights live source is destroyed");if(typeof b!="function")throw new TypeError("Drive Insights live listener must be a function");s.add(b);let g=!0;return()=>g?(g=!1,s.delete(b)):!1}function f(b){if(a)throw new Error("Drive Insights live source is destroyed");if(typeof b!="function")throw new TypeError("Drive Insights live update listener must be a function");u.add(b);let g=!0;return()=>g?(g=!1,u.delete(b)):!1}function p(){return i}function m(){return a?!1:(a=!0,s.clear(),u.clear(),typeof c=="function"&&c(),!0)}return Object.freeze({snapshot:l,subscribe:d,subscribeUpdates:f,context:p,destroy:m})}var js=Object.freeze(["currentTimestampMs","decodeRecord","records","routeId"]),ay=new Set(["carState","controlsState","deviceState","peripheralState","carrotMan","selfdriveState","gpsLocationExternal","longitudinalPlan","navInstructionCarrot"]),sy=new Set(["modelV2","liveCalibration","roadCameraState","lateralPlan","radarState","carControl","liveDelay","liveTorqueParameters","liveParameters","liveTracks"]);function cy(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("Drive Insights replay source input must be an object");let t=Object.keys(e).sort();if(t.length!==js.length||t.some((n,r)=>n!==js[r]))throw new TypeError(`Drive Insights replay source input must contain exactly: ${js.join(", ")}`);if(!Array.isArray(e.records))throw new TypeError("Drive Insights replay records must be an array");if(typeof e.decodeRecord!="function")throw new TypeError("Drive Insights replay decodeRecord must be a function");if(Wr(e.currentTimestampMs,"currentTimestampMs"),e.routeId!==null&&typeof e.routeId!="string")throw new TypeError("Drive Insights replay routeId must be a string or null");return e}function ly(e){let t=-1;for(let n=0;n>1;e[a].timeMs<=t?n=a+1:r=a}let o=n>0?e[n-1]:null,i=na(d)))}function c(){return n}return Object.freeze({snapshot:s,snapshotAt:a,snapshotsAt:u,context:c})}var Vt=Object.freeze({GRAPH:"graph",FORWARD:"forward"}),Vs=new WeakMap,py=new Set(Object.values(Vt));function yd(e){let t=String(e||"").trim().toLowerCase();return py.has(t)?t:Vt.GRAPH}function vd(e){return String(e||"").trim().toLowerCase()===ot.REPLAY?ot.REPLAY:ot.LIVE}function mr(e,t,n){return typeof e.getUIText=="function"?e.getUIText(t,n):n}function Sd(e,...t){if(typeof e?.append=="function")e.append(...t);else for(let n of t)e?.appendChild?.(n)}function my(e,t){let n=e.createElement("section");n.className="drive-insights",n.dataset.source=ot.LIVE,n.dataset.view=Vt.GRAPH;let r=e.createElement("div");r.className="c-segmented-control drive-insights__tabs",r.setAttribute("role","tablist"),r.setAttribute("aria-label",mr(t,"web_drive_layout_content_drive_insights","Drive Insights"));let o=e.createElement("div");o.className="drive-insights__views";let i=e.createElement("div");i.className="drive-insights__view drive-insights__view--graph",i.dataset.driveInsightsPanel=Vt.GRAPH,i.setAttribute("role","tabpanel");let a=e.createElement("div");a.className="drive-insights__view drive-insights__view--forward",a.dataset.driveInsightsPanel=Vt.FORWARD,a.setAttribute("role","tabpanel"),a.hidden=!0;let s=e.createElement("div");s.className="drive-insights__state";let u=new Map;for(let[c,l,d]of[[Vt.GRAPH,"drive_insights_graph","Graphs"],[Vt.FORWARD,"drive_insights_forward","Forward"]]){let f=e.createElement("button");f.type="button",f.className="c-segmented-control__item",f.dataset.driveInsightsView=c,f.dataset.value=c,f.setAttribute("role","tab"),f.setAttribute("aria-selected",String(c===Vt.GRAPH)),f.textContent=mr(t,l,d),r.appendChild(f),u.set(c,f)}return Sd(o,i,a,s),Sd(n,r,o),Object.freeze({root:n,tabs:r,views:o,graph:i,forward:a,state:s,buttons:u})}function hy(e,t){if(t===Vt.GRAPH)return String(e?.freshness?.ego?.state||"missing");let n=["lanes","leads","radar"].map(r=>String(e?.freshness?.[r]?.state||"missing"));return n.includes("fresh")?"fresh":n.includes("stale")?"stale":"missing"}function gy(e={}){let t=e.target||globalThis,n=e.document||t.document;if(!n?.createElement)return null;let r=e.dom||my(n,t),o=e.history||Ns({nowMs:()=>Number(t.CarrotDriveLiveStateProvider?.nowMs?.()??t.performance?.now?.()??0)}),i=e.graphRenderer||rd({root:r.graph,target:t,document:n,text:(U,X)=>mr(t,U,X)}),a=e.forwardRenderer||Qu({root:r.forward,target:t,document:n,text:(U,X)=>mr(t,U,X)}),s=e.stateSurface||ju({host:r.state,className:"drive-insights__status",featureLabel:()=>mr(t,"web_drive_layout_content_drive_insights","Drive Insights")},{document:n});if(!o||!i||!a||!s)return null;let u=e.setInterval||t.setInterval?.bind(t),c=e.clearInterval||t.clearInterval?.bind(t),l=[],d=!1,f=!1,p=yd(e.initialView),m=vd(e.source),b=null,g=null,x=null,E=null,y=null,O=null,C=e.replayInput||null,w=null,z=0,M=null;function R(){return p===Vt.FORWARD?wi.forward:wi.graph}let v=e.renderScheduler||ld({target:t,onFlush:()=>_()});if(!v)return null;function h(){s.show(Kt.LOADING,{tone:fn.INFO,variant:Ti.COVER,title:()=>mr(t,"drive_insights_waiting_title","Waiting for driving data"),description:()=>mr(t,"drive_insights_waiting_detail","Live driving information will appear here when it is available."),actions:[]})}function S(){let U=o.status({nowMonotonicMs:Math.max(0,Number(t.CarrotDriveLiveStateProvider?.nowMs?.()??0))}),X=O?hy(O,p):"missing";!O||U.state===Kn.MISSING?h():s.hide(),r.root.dataset.dataState=U.state===Kn.STALE?"stale":X}function A(){return f?!1:(p===Vt.GRAPH?i.render(o.window()):a.render(O),S(),!0)}function L(U=b){let X=U?.context?.();return X&&typeof X=="object"?X:{}}function P(U=b?.snapshot?.()){if(!d||m!==ot.LIVE||!U)return!1;let X=L();return O=U,o.pushLive(U,{receivedAtMonotonicMs:Number.isFinite(Number(X.receivedAtMonotonicMs))?Number(X.receivedAtMonotonicMs):Number(U.timestampMs),connectionState:X.connectionState||"connected",connectionId:X.connectionId??null,routeId:X.routeId??null,reconnected:X.reconnected===!0}),z+=1,A()}function _(){if(!d||m!==ot.LIVE)return!1;let U=M||b?.snapshot?.();return M=null,U?P(U):!1}function T(U=null,X={}){return!d||m!==ot.LIVE?!1:(U&&typeof U=="object"&&(M=U),v.request(R(),X))}function I(){if(!b||m!==ot.REPLAY)return!1;let U=L(),X=Number(U.currentTimestampMs??C?.currentTimestampMs??b.snapshot?.()?.timestampMs);if(!Number.isFinite(X)||X<0)return O=null,o.reset("replay-position-missing"),A();let pe=o.replayTimestamps(X),xe=typeof b.snapshotsAt=="function"?b.snapshotsAt(pe):pe.map(Je=>b.snapshotAt?.(Je)).filter(Boolean);return o.rebuildReplay(xe,{currentTimestampMs:X,routeId:U.routeId??C?.routeId??null}),O=b.snapshotAt?.(X)||b.snapshot?.()||null,z+=1,A()}function k(){let U=d&&m===ot.LIVE&&p===Vt.FORWARD;if(U===!!E?.active)return!1;if(!U)return E?.release?.(),E=null,!0;let X=e.activity||t.CarrotDriveDataActivity;return X?.acquire?(E=X.acquire({owner:"drive_insights_forward",tracks:!0}),!0):!1}function D(){v.cancel(),M=null,g?.(),g=null,b?.destroy?.(),b=null,x?.release?.(),x=null,E?.release?.(),E=null,y!==null&&c&&c(y),y=null}function B(){let U=e.activity||t.CarrotDriveDataActivity,X=e.provider||t.CarrotDriveLiveStateProvider;if(!U?.acquire||!X?.snapshot||!X?.subscribe)return h(),!1;if(x=U.acquire({owner:"drive_insights",hud:!0,overlay:!0}),b=(e.createLiveSource||gd)({provider:X}),!b)return x.release(),x=null,h(),!1;k(),g=typeof b.subscribeUpdates=="function"?b.subscribeUpdates(()=>T()):b.subscribe?.(xe=>T(xe))||null;let pe=b.snapshot?.();return pe?T(pe,{immediate:!0}):h(),u&&(y=u(S,250)),!0}function W(){return!C||(b=(e.createReplaySource||bd)(C),!b)?(h(),!1):I()}function V(){return D(),o.setContext({source:m}),m===ot.LIVE?B():W()}function F(U){if(f)return!1;let X=yd(U),pe=X!==p;p=X,r.root.dataset.view=p;for(let[xe,Je]of r.buttons){let et=xe===p;Je.setAttribute("aria-selected",String(et)),Je.classList?.toggle("is-selected",et);let ft=xe===Vt.GRAPH?r.graph:r.forward;ft.hidden=!et}return Y.sync(),k(),d&&m===ot.LIVE?T(null,{immediate:!0}):A(),pe}function H(U){let X=U.target?.closest?.("[data-drive-insights-view]");X&&r.tabs.contains?.(X)&&F(X.dataset.driveInsightsView)}let Y=e.segmented||Nu(r.tabs,{itemSelector:"[data-drive-insights-view]",selectedAttribute:"aria-selected",activation:"automatic",onActivate(U){F(U?.dataset?.driveInsightsView)}});if(!Y)return null;r.tabs.addEventListener("click",H),l.push([r.tabs,"click",H]),F(p);function $(U={}){if(f)return!1;let X=vd(U.source||m),pe=X!==m;return m=X,r.root.dataset.source=m,d&&!pe?!1:(d=!0,r.root.dataset.active="true",V(),!0)}function K(){return f||!d?!1:(d=!1,r.root.dataset.active="false",D(),!0)}function Z(U){return f?!1:p===Vt.GRAPH?i.resize(U):a.resize(U)}function ee(U){return f?!1:(C=U&&typeof U=="object"?U:null,d&&m===ot.REPLAY&&V(),!!C)}function ue(){let U=Number(t.CarrotDriveLiveStateProvider?.nowMs?.()??0);return Object.freeze({active:d,destroyed:f,source:m,view:p,generation:z,lastError:w?String(w.message||w):"",history:o.status({nowMonotonicMs:Math.max(0,U)}),graph:i.status(),forward:a.status(),stateSurface:s.snapshot(),renderScheduler:v.status(),leaseActive:!!x?.active,trackLeaseActive:!!E?.active})}function de(){if(f)return!1;K(),f=!0;for(let[U,X,pe]of l.splice(0))U.removeEventListener?.(X,pe);return Y.destroy(),s.destroy(),v.destroy(),i.destroy(),a.destroy(),o.reset("runtime-destroyed"),r.root.remove?.(),Vs.delete(t),!0}return Object.freeze({root:r.root,activate:$,deactivate:K,resize:Z,setView:F,setReplayInput:ee,render:A,status:ue,destroy:de})}function Hs(e={}){let t=e.target||globalThis,n=Vs.get(t);if(n)return n;let r=gy({...e,target:t});return r&&Vs.set(t,r),r}function Md(e=globalThis,t={}){let n=Hs({...t,target:e});return e.DriveInsightsRuntime=n,n}var Do="drive_insights",qR=Object.freeze(["primary","secondary"]),XR=Object.freeze(["live","replay"]),Ni=new WeakMap;function Ad(e){return e.target||globalThis}function by(e={}){let t=Ad(e),n=e.driveContentApi||t.DriveContent,r=e.runtime||Hs({...e,target:t});if(typeof n?.create!="function"||!r?.root)return null;let o=null,i=String(e.context?.source||e.source||"live"),a=n.create(Do,{mount(s){if(!s||typeof s.appendChild!="function")throw new TypeError("Drive Insights content requires a slot host");r.root.parentNode!==s&&s.appendChild(r.root),o=s},activate(s={}){return i=String(s.source||i||"live"),r.activate({...s,source:i})},deactivate(s={}){return r.deactivate(s)},resize(s){return r.resize(s)},status(){return{source:i,mountedHostId:String(o?.id||""),runtime:r.status()}},destroy(){r.destroy(),o=null,Ni.get(t)===a&&Ni.delete(t)}});return a}function yy(e={}){let t=Ad(e),n=Ni.get(t);if(n)return n;let r=by({...e,target:t});return r&&Ni.set(t,r),r}function Rd(e={}){return function(n={}){let r=e.target||globalThis;return yy({...e,target:r,context:n,source:n.source})}}function Bs(e=globalThis,t=null){return e.DriveContentInsights=t,t}var xd=Object.freeze({driveInsights:!0,replayGraphs:!0,replayForward:!0});var Ed="navigation",ax=Object.freeze([Vr,Ed,Do]);function vy(e){let t=e.DriveContent;return typeof t?.create!="function"?null:t.create(Do,{mount(){},activate(){return!0},deactivate(){return!0},resize(){return!1},status(){return{temporarilyDisabled:!0}},destroy(){}})}function Sy(e=globalThis,t={}){let n=gs({...t.vision||{},target:e}),r=_u({...t.navigation||{},target:e}),o={...t.driveInsights||{},target:e},i=Rd(o);return Object.freeze({[Vr](a={}){let s=n.factory(a);return s?Cu(e,{content:s}):null},[Ed](a={}){let s=r(a);return s?Hr(e,s):null},[Do](a={}){if(!xd.driveInsights)return Bs(e,vy(e));let s=o.runtime||Md(e,o);if(!s)return null;o.runtime&&(e.DriveInsightsRuntime=s);let u=i(a);return u?Bs(e,u):null}})}function Td(e,t=globalThis,n={}){let r=Sy(t,n),o=Hc(e,r);return Bc(o,t),o}var My="carrot:drivestatechange",Od="liveRuntime",qn=class extends Error{constructor(t,n){super(n),this.name="LiveStateProviderError",this.code=t}};function Di(e){if(!e||typeof e!="object")return!1;for(let t in e)return!0;return!1}function Fn(e,t){let n=e&&typeof e=="object"?e:{},r=t&&typeof t=="object"?t:{};return n===r||!Di(r)?n:Di(n)?{...r,...n}:r}function $r(e,t){let n=e&&typeof e=="object"?e:{};if(!t||typeof t!="object")return n;let r=null;for(let[o,i]of Object.entries(t))i!=null&&(r||(r={...n}),r[o]=i);return r||n}function Ay(e,t){let n=e&&typeof e=="object"?e:{},r=t&&typeof t=="object"?t:{};return n===r||!Di(r)?n:Di(n)?{...r,...n,leadOne:$r(r.leadOne,n.leadOne),leadTwo:$r(r.leadTwo,n.leadTwo),leadLeft:$r(r.leadLeft,n.leadLeft),leadRight:$r(r.leadRight,n.leadRight),leadsLeft:Array.isArray(n.leadsLeft)&&n.leadsLeft.length?n.leadsLeft:r.leadsLeft,leadsCenter:Array.isArray(n.leadsCenter)&&n.leadsCenter.length?n.leadsCenter:r.leadsCenter,leadsRight:Array.isArray(n.leadsRight)&&n.leadsRight.length?n.leadsRight:r.leadsRight}:r}function Ry(e,t,n,r){let o=e?.refs;return!!(o&&o.rawHudState===t&&o.rawOverlayState===n&&o.liveServices===r&&o.rawCarState===t?.carState&&o.rawControlsState===t?.controlsState&&o.rawDeviceState===t?.deviceState&&o.rawPeripheralState===t?.peripheralState&&o.rawSelfdriveState===t?.selfdriveState&&o.rawGpsLocationExternal===t?.gpsLocationExternal&&o.rawLongitudinalPlan===t?.longitudinalPlan&&o.rawCarrotMan===t?.carrotMan&&o.rawNavInstructionCarrot===t?.navInstructionCarrot&&o.rawNavRoute===t?.navRoute&&o.rawModelV2===n?.modelV2&&o.rawLiveCalibration===n?.liveCalibration&&o.rawRoadCameraState===n?.roadCameraState&&o.rawRadarState===n?.radarState&&o.rawLateralPlan===n?.lateralPlan&&o.rawCarControl===n?.carControl&&o.rawLiveDelay===n?.liveDelay&&o.rawLiveTorqueParameters===n?.liveTorqueParameters&&o.rawLiveParameters===n?.liveParameters&&o.rawLiveTracks===n?.liveTracks&&o.rawCameraOdometry===n?.cameraOdometry&&o.rawLivePose===n?.livePose&&o.rawCarrotNavi===n?.carrotNavi&&o.liveCarState===r?.carState&&o.liveControlsState===r?.controlsState&&o.liveDeviceState===r?.deviceState&&o.liveSelfdriveState===r?.selfdriveState&&o.liveLongitudinalPlan===r?.longitudinalPlan&&o.liveCarrotMan===r?.carrotMan&&o.liveNavInstructionCarrot===r?.navInstructionCarrot&&o.liveNavRoute===r?.navRoute&&o.liveLateralPlan===r?.lateralPlan&&o.liveRadarState===r?.radarState&&o.liveLiveCalibration===r?.liveCalibration&&o.liveRoadCameraState===r?.roadCameraState)}function xy(e,t,n){return{rawHudState:e,rawOverlayState:t,liveServices:n,rawCarState:e?.carState,rawControlsState:e?.controlsState,rawDeviceState:e?.deviceState,rawPeripheralState:e?.peripheralState,rawSelfdriveState:e?.selfdriveState,rawGpsLocationExternal:e?.gpsLocationExternal,rawLongitudinalPlan:e?.longitudinalPlan,rawCarrotMan:e?.carrotMan,rawNavInstructionCarrot:e?.navInstructionCarrot,rawNavRoute:e?.navRoute,rawModelV2:t?.modelV2,rawLiveCalibration:t?.liveCalibration,rawRoadCameraState:t?.roadCameraState,rawRadarState:t?.radarState,rawLateralPlan:t?.lateralPlan,rawCarControl:t?.carControl,rawLiveDelay:t?.liveDelay,rawLiveTorqueParameters:t?.liveTorqueParameters,rawLiveParameters:t?.liveParameters,rawLiveTracks:t?.liveTracks,rawCameraOdometry:t?.cameraOdometry,rawLivePose:t?.livePose,rawCarrotNavi:t?.carrotNavi,liveCarState:n?.carState,liveControlsState:n?.controlsState,liveDeviceState:n?.deviceState,liveSelfdriveState:n?.selfdriveState,liveLongitudinalPlan:n?.longitudinalPlan,liveCarrotMan:n?.carrotMan,liveNavInstructionCarrot:n?.navInstructionCarrot,liveNavRoute:n?.navRoute,liveLateralPlan:n?.lateralPlan,liveRadarState:n?.radarState,liveLiveCalibration:n?.liveCalibration,liveRoadCameraState:n?.roadCameraState}}function Ey(e,t,n,r=null){if(Ry(r,e,t,n))return r.result;let o=Ay(t?.radarState,n?.radarState),i=$r(n?.liveCalibration,t?.liveCalibration),a=$r(n?.roadCameraState,t?.roadCameraState),s={...e,carState:Fn(e?.carState,n?.carState),controlsState:Fn(e?.controlsState,n?.controlsState),deviceState:Fn(e?.deviceState,n?.deviceState),selfdriveState:Fn(e?.selfdriveState,n?.selfdriveState),longitudinalPlan:Fn(e?.longitudinalPlan,n?.longitudinalPlan),carrotMan:Fn(e?.carrotMan,n?.carrotMan),navInstructionCarrot:Fn(e?.navInstructionCarrot,n?.navInstructionCarrot),navRoute:Fn(e?.navRoute,n?.navRoute),lateralPlan:Fn(t?.lateralPlan,n?.lateralPlan),radarState:o},u={...t,liveCalibration:i,roadCameraState:a,radarState:s.radarState,lateralPlan:s.lateralPlan,carrotMan:s.carrotMan},c={brokerServices:n,hudState:s,overlayState:u};return r&&(r.refs=xy(e,t,n),r.result=c),c}function Ty(e){let t=e?.performance||globalThis.performance;if(!t||typeof t.now!="function")throw new qn("CLOCK_UNAVAILABLE","performance.now is required for live state");return t.now.bind(t)}function Oy(e){let t=[e?.routeId,e?.meta?.routeId,e?.runtime?.routeId,e?.services?.navRoute?.routeId];for(let n of t){let r=String(n??"").trim();if(r)return r}return null}function Cy(e={}){let t=e.target||globalThis,n=typeof e.nowMs=="function"?e.nowMs:Ty(t),r=e.getHudState||(()=>t.CarrotHudState||{}),o=e.getOverlayState||(()=>t.CarrotOverlayState||{}),i=e.getLiveRuntimeState||(()=>t.CarrotLiveRuntimeState||{}),a=e.isReplayActive||(()=>!!t.CarrotVisionReplay?.isActive?.()),s=e.getActivity||(()=>t.CarrotDriveDataActivity||null),u=e.getCompactActive||(()=>!!t.CarrotVisionCompactStateActive),c=new Set,l=Object.create(null),d={refs:null,result:null},f=!1,p=!1,m=Number.NEGATIVE_INFINITY;function b(){let A=Number(n());if(!Number.isFinite(A)||A<0)throw new qn("INVALID_CLOCK","live state clock must return a finite non-negative number");if(ANumber.isFinite(T)).some(T=>T===A);return u()||L?.ok===!0||_?"connected":s()?.isActive?.()?"connecting":p?"disconnected":"idle"}function E(A){let L=r()||{},P=o()||{},_=i()||{},T=a()?{}:_.services&&typeof _.services=="object"?_.services:{},I=Ey(L,P,T,d),k={timestampMs:A,hudState:I.hudState,overlayState:I.overlayState,receivedAtMonotonic:Object.freeze({...l}),connectionState:x(A,_),routeId:Oy(_)};return Object.defineProperty(k,"brokerServices",{value:I.brokerServices,enumerable:!1,configurable:!1,writable:!1}),Object.freeze(k)}let y=E(b());m=y.timestampMs;function O(A){if(f)throw new qn("PROVIDER_DESTROYED",`live state provider cannot ${A} after destroy`)}function C(A){let L=E(A);m=A,y=L;for(let P of Array.from(c))try{P(y)}catch(_){t?.console?.error?.("[drive live state] listener failed",_)}return typeof t?.dispatchEvent=="function"&&typeof t?.CustomEvent=="function"&&t.dispatchEvent(new t.CustomEvent(My,{detail:y})),y}function w(A,L={}){return z([A],L)}function z(A,L={}){O("note service receipt");let P=Array.from(new Set((Array.isArray(A)?A:[A]).map(T=>String(T||"").trim()).filter(Boolean)));if(!P.length)throw new qn("INVALID_SERVICE","live state service name is required");let _=b();if(L?.clear===!0){if(P.includes("*"))for(let T of Object.keys(l))T!==Od&&delete l[T];else for(let T of P)delete l[T];d.refs=null,d.result=null}else{for(let T of P)l[T]=_;p=!0}return C(_)}function M(A={}){O("note live runtime receipt");let L=b(),P=i()||{};return A?.received!==!1&&P.ok===!0&&(l[Od]=L,p=!0),C(L)}function R(){return y}function v(A){if(O("subscribe"),typeof A!="function")throw new qn("INVALID_LISTENER","live state listener must be a function");c.add(A);let L=!0;return()=>L?(L=!1,c.delete(A)):!1}function h(){return f?!1:(f=!0,c.clear(),S?.(),S=null,d.refs=null,d.result=null,!0)}let S=s()?.subscribe?.(()=>{f||C(b())})||null;return Object.freeze({nowMs:g,noteServiceReceived:w,noteServicesReceived:z,noteLiveRuntimeReceived:M,snapshot:R,subscribe:v,destroy:h})}function Cd(e=globalThis,t={}){let n=e?.CarrotDriveLiveStateProvider;if(n&&typeof n.snapshot=="function"&&typeof n.subscribe=="function")return n;let r=Cy({...t,target:e});return e.CarrotDriveLiveStateProvider=r,r}var Po=Object.freeze(["hud","overlay","tracks","ar"]),wd=Object.freeze(["hud","overlay"]),Gs="carrot:drivedataactivitychange",Ur=class extends Error{constructor(t,n){super(n),this.name="DriveDataActivityError",this.code=t}};function wy(e={}){if(e==="hud+overlay")return wd;if(typeof e=="string"&&(e={[e]:!0}),Array.isArray(e)&&(e=Object.fromEntries(e.map(r=>[r,!0]))),!e||typeof e!="object")throw new Ur("INVALID_LEASE","drive data lease options must be an object");let n=Po.some(r=>Object.prototype.hasOwnProperty.call(e,r))?Po.filter(r=>e[r]===!0):wd;if(!n.length)throw new Ur("EMPTY_LEASE","drive data lease must request at least one channel");return Object.freeze(n)}function Iy(e,t){typeof e?.dispatchEvent!="function"||typeof e?.CustomEvent!="function"||e.dispatchEvent(new e.CustomEvent(Gs,{detail:t}))}function _y(e={}){let t=e.target||globalThis,n=String(e.eventName||Gs),r=new Map,o=new Set,i=Object.fromEntries(Po.map(O=>[O,0])),a=0,s=0,u=!1,c=Object.freeze({revision:s,active:!1,leaseCount:0,counts:Object.freeze({...i})});function l(O){if(u)throw new Ur("ACTIVITY_DESTROYED",`drive data activity cannot ${O} after destroy`)}function d(){s+=1,c=Object.freeze({revision:s,active:r.size>0,leaseCount:r.size,counts:Object.freeze({...i})});for(let O of Array.from(o))try{O(c)}catch(C){t?.console?.error?.("[drive data activity] listener failed",C)}return n===Gs?Iy(t,c):typeof t?.dispatchEvent=="function"&&typeof t?.CustomEvent=="function"&&t.dispatchEvent(new t.CustomEvent(n,{detail:c})),c}function f(O){let C=r.get(O);if(!C)return!1;r.delete(O);for(let w of C.channels)i[w]-=1;return d(),!0}function p(O={}){l("acquire");let C=wy(O),w=`drive-data-${++a}`,z=String(O?.owner||"anonymous"),M=Object.freeze({id:w,owner:z,channels:C});r.set(w,M);for(let v of C)i[v]+=1;d();let R=!1;return Object.freeze({id:w,owner:z,channels:C,get active(){return!R&&r.has(w)},release(){return R?!1:(R=!0,f(w))}})}function m(O){let C=typeof O=="string"?O:O?.id;return C?f(C):!1}function b(O=null){return O==null?r.size>0:Po.includes(O)?i[O]>0:!1}function g(){return Object.freeze({...i})}function x(){return c}function E(O){if(l("subscribe"),typeof O!="function")throw new Ur("INVALID_LISTENER","drive data activity listener must be a function");o.add(O);let C=!0;return()=>C?(C=!1,o.delete(O)):!1}function y(){if(u)return!1;u=!0;let O=r.size>0;r.clear();for(let C of Po)i[C]=0;return O&&d(),o.clear(),!0}return Object.freeze({acquire:p,release:m,isActive:b,counts:g,snapshot:x,subscribe:E,destroy:y})}function Id(e=globalThis,t={}){let n=e?.CarrotDriveDataActivity;if(n&&typeof n.acquire=="function"&&typeof n.isActive=="function")return n;let r=_y({...t,target:e});return e.CarrotDriveDataActivity=r,r}function Qe(e,t,n){return Math.max(t,Math.min(n,e))}function it(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Ht(e){return!!e?.meta?.present}function Pi(e,t,n,r=12){let o=Math.max(0,Math.floor(it(t))),i=Math.max(0,Math.floor(it(n))),a=Qe(Math.floor(it(r,12)),0,255);if(!e||o<1||i<1||e.length=s?{top:s,bottom:u+1}:null}function Cn(e){let t=Math.max(0,it(e));if(t>=1e3){let n=t/1e3;return`${n>=10?n.toFixed(0):n.toFixed(1)}km`}return`${Math.round(t)}m`}function Ws(e){let t=Math.max(0,it(e));return t?new Date(Date.now()+t*1e3).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}):""}function _t(e,t,n,r,o,i){let a=Math.min(Math.max(0,i),r*.5,o*.5);e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+o,a),e.arcTo(t+r,n+o,t,n+o,a),e.arcTo(t,n+o,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}var _d=Object.freeze({DPR_LIMIT:2,TBT_CURRENT_BOTTOM_TRANSPARENT_PX:24,TBT_STACK_OVERLAP_PX:6,clamp:Qe,finite:it,recordPresent:Ht,findAlphaRowBounds:Pi,formatDistance:Cn,formatClock:Ws,roundedRect:_t});function Nd(e=globalThis){return e.CarrotNaviOverlayPrimitives=_d,_d}function Dd(e){let t=`${e?.nearDirection||""} ${e?.mainText||""}`.toLowerCase();return/유턴|u-?turn/.test(t)?"↶":/왼|left/.test(t)?"↰":/오른|우회|right/.test(t)?"↱":"↑"}var $s=class{constructor(t){this.canvas=t,this.context=t?.getContext("2d",{alpha:!0})||null,this.images=new Map,this.measureCanvas=null,this.measureContext=null,this.visibleRowCache=new Map,this.nativeImageSession=!1,this.state=null,this.footerState=null,this.displayStatus=null,this.renderRequest=0,this.renderSuspended=!1}setState(t){this.state=t&&typeof t=="object"?t:null,this.requestRender()}setFooterState(t){this.footerState=t&&typeof t=="object"?t:null,this.requestRender()}setStatus(t){this.displayStatus=t&&typeof t=="object"?t:null,this.requestRender()}setImage(t,n,r=0){if(!t||!n)return;this.nativeImageSession=!0;let o=this.images.get(t);if(o&&Number(r){this.renderRequest=0,this.render()}))}renderNow(){return!this.context||this.renderSuspended?!1:(this.renderRequest&&cancelAnimationFrame(this.renderRequest),this.renderRequest=0,this.render(),!0)}image(t){return this.images.get(t)?.source||null}measureVisibleRows(t,n){if(t!=="tbt_current_full"&&t!=="tbt_current_compact"&&t!=="tbt_next")return null;let r=Math.round(it(n?.width||n?.videoWidth)),o=Math.round(it(n?.height||n?.videoHeight));if(r<1||o<1||typeof document>"u"||typeof document.createElement!="function")return null;let i=`${t}:${r}x${o}`,a=this.visibleRowCache.get(i);if(a)return a;try{if(this.measureCanvas||(this.measureCanvas=document.createElement("canvas"),this.measureContext=this.measureCanvas.getContext("2d",{alpha:!0,willReadFrequently:!0})),!this.measureContext)return null;this.measureCanvas.width=r,this.measureCanvas.height=o,this.measureContext.clearRect(0,0,r,o),this.measureContext.drawImage(n,0,0,r,o);let s=this.measureContext.getImageData(0,0,r,o).data,u=Pi(s,r,o);return u&&this.visibleRowCache.set(i,u),u}catch{return null}}snapshot(){return{activeImages:Array.from(this.images.keys()).sort(),nativeImageSession:this.nativeImageSession,hasState:!!this.state,hasFooterRoute:Ht(this.footerState?.route),hasFooterVehicle:Ht(this.footerState?.vehicle),displayStatus:this.displayStatus?.mode||""}}imageGeometry(t,n,r={}){let o=this.images.get(t),i=o?.source;if(!i)return null;let a=it(i.width||i.videoWidth),s=it(i.height||i.videoHeight);if(a<1||s<1||n.width<1||n.height<1)return null;let u=Math.min(n.width/a,n.height/s),c=a*u,l=s*u,d=Qe(it(r.alignX,.5),0,1),f=Qe(it(r.alignY,.5),0,1),p=n.x+(n.width-c)*d,m=n.y+(n.height-l)*f;return{source:i,x:p,y:m,width:c,height:l,visibleRows:o?.visibleRows||null}}drawImage(t,n,r={}){if(!this.context)return null;let o=this.imageGeometry(t,n,r);if(!o)return null;try{return this.context.drawImage(o.source,o.x,o.y,o.width,o.height),o}catch{return null}}drawOutlinedText(t,n,r,o,i={}){if(!this.context||!t)return;let a=this.context;a.save(),a.font=`${i.weight||800} ${Math.max(10,o)}px system-ui, -apple-system, sans-serif`,a.textAlign=i.align||"left",a.textBaseline=i.baseline||"alphabetic",a.lineJoin="round",a.strokeStyle=i.stroke||"rgba(0, 0, 0, 0.88)",a.lineWidth=Math.max(2,o*.13),a.fillStyle=i.color||"#fff";let s=Number(i.maxWidth);Number.isFinite(s)&&s>0?(a.strokeText(String(t),n,r,s),a.fillText(String(t),n,r,s)):(a.strokeText(String(t),n,r),a.fillText(String(t),n,r)),a.restore()}drawGuidanceFallback(t,n,r){let o=this.state?.guidanceCurrent;if(!Ht(o))return null;let i=this.context,a=Math.min(t*.62,330),s=Math.min(n*.22,118);i.save(),_t(i,r,r,a,s,14),i.fillStyle="rgba(4, 33, 27, 0.88)",i.fill(),i.strokeStyle="rgba(116, 255, 210, 0.28)",i.lineWidth=1,i.stroke(),i.restore(),this.drawOutlinedText(Dd(o),r+18,r+s*.52,Qe(s*.42,30,48)),this.drawOutlinedText(Cn(o.distanceM),r+70,r+s*.46,Qe(s*.32,24,38));let u=o.mainText||o.roadName||o.nearDirection;return this.drawOutlinedText(u,r+70,r+s*.78,Qe(s*.16,13,19),{color:"rgba(255,255,255,0.9)",maxWidth:a-84}),{x:r,y:r,width:a,height:s}}drawNextGuidanceFallback(t,n,r,o){let i=this.state?.guidanceNext;if(!Ht(i))return!1;let a=this.context;return a.save(),_t(a,t,n,r,o,12),a.fillStyle="rgba(8, 14, 20, 0.84)",a.fill(),a.strokeStyle="rgba(255, 255, 255, 0.16)",a.stroke(),a.restore(),this.drawOutlinedText(Dd(i),t+15,n+o*.68,o*.5),this.drawOutlinedText(Cn(i.distanceM),t+54,n+o*.43,Qe(o*.28,15,22)),this.drawOutlinedText(i.mainText||i.roadName||i.nearDirection,t+54,n+o*.75,Qe(o*.2,12,16),{color:"rgba(255,255,255,0.8)",maxWidth:r-65}),!0}drawGuidanceStack(t,n,r,o,i=!0){let a=o&&this.image("tbt_current_compact")?"tbt_current_compact":this.image("tbt_current_full")?"tbt_current_full":"tbt_current_compact",s={x:r,y:r,width:Math.min(t*(o?.72:.58),o?350:500),height:Math.min(n*(o?.29:.2),o?160:112)},u=this.drawImage(a,s,{alignX:0,alignY:0})||(i?this.drawGuidanceFallback(t,n,r):null),c=it(u?.source?.height||u?.source?.videoHeight),l=c>0?u.height/c:0,d=Math.min(u?u.width*.58:t*.38,t*.42,230),f={x:u?.x??r,y:0,width:d,height:Math.min(n*.15,82)},p=u?u.y+(u.visibleRows?u.visibleRows.bottom*l:Math.max(0,u.height-24*l)):r,m=this.imageGeometry("tbt_next",f,{alignX:0,alignY:0}),b=it(m?.source?.height||m?.source?.videoHeight),g=b>0?m.height/b:0,x=m?.visibleRows?m.visibleRows.top*g:0;f.y=u?p-x-6:r;let E=this.drawImage("tbt_next",f,{alignX:0,alignY:0});return!E&&i&&this.drawNextGuidanceFallback(f.x,f.y,f.width,f.height),{current:u,next:E}}drawSafetyFallback(t,n,r){let o=this.state?.speed;if(!Ht(o)||!o.roadLimitValid&&!o.sectionActive&&!o.sdiPresent)return;let i=this.context,a=Qe(Math.min(t,n)*.055,24,38),s=r+a,u=n*.66;if(o.sectionActive){let l=Math.min(t*.36,230),d=Math.min(n*.2,104),f=u-a-9;i.save(),_t(i,r,f,l,d,14),i.fillStyle="rgba(7, 12, 18, 0.88)",i.fill(),i.strokeStyle=o.sectionOffRoute?"#ff9b45":"rgba(255,255,255,0.18)",i.stroke(),_t(i,r+10,f+d-14,l-20,5,3),i.fillStyle="rgba(255,255,255,0.16)",i.fill();let p=Qe(it(o.sectionProgress),0,1);p>0&&(_t(i,r+10,f+d-14,(l-20)*p,5,3),i.fillStyle=o.sectionSuspended?"#ffb54a":"#47d79a",i.fill()),i.restore();let m=o.sectionSuspended?"구간단속 일시정지":o.sectionOffRoute?"구간 이탈":"구간단속",b=r+a*2+12;this.drawOutlinedText(m,b,f+31,13,{color:"rgba(255,255,255,.82)",maxWidth:l-a*2-22}),this.drawOutlinedText(`평균 ${Math.round(it(o.sectionAverageKph))} · ${Cn(o.sectionRemainingDistanceM)}`,b,f+58,14,{maxWidth:l-a*2-22})}let c=o.roadLimitKph||o.sdiSpeedLimitKph||o.sectionSpeedLimitKph;c&&(i.save(),i.beginPath(),i.arc(s,u,a,0,Math.PI*2),i.fillStyle="#fff",i.fill(),i.lineWidth=Math.max(5,a*.18),i.strokeStyle="#ef3340",i.stroke(),i.restore(),this.drawOutlinedText(String(c),s,u+a*.25,a*.8,{align:"center",color:"#12151a",stroke:"rgba(255,255,255,0)"}),o.sdiPresent&&o.sdiDistanceM>0&&this.drawOutlinedText(Cn(o.sdiDistanceM),s,u+a+23,15,{align:"center"}))}drawTrafficFallback(t,n){let r=this.state?.trafficSignal;if(!Ht(r)||!r.visible)return;let o=[[r.redValid,r.redOn,r.redRemainSec,"#ff4b55","●"],[r.leftValid,r.leftOn,r.leftRemainSec,"#43df83","←"],[r.greenValid,r.greenOn,r.greenRemainSec,"#43df83","↑"],[r.rightValid,r.rightOn,r.rightRemainSec,"#43df83","→"],[r.uturnValid,r.uturnOn,r.uturnRemainSec,"#43df83","↶"]].filter(d=>d[0]);if(!o.length)return;let i=this.context,a=o.length*38+18,s=t-n-a,u=n;i.save(),_t(i,s,u,a,50,14),i.fillStyle="rgba(7, 12, 18, 0.86)",i.fill(),o.forEach((d,f)=>{let p=s+28+f*38;i.beginPath(),i.arc(p,u+18,10,0,Math.PI*2),i.fillStyle=d[1]?d[3]:"rgba(255,255,255,0.16)",i.fill(),this.drawOutlinedText(d[4],p,u+23,13,{align:"center",color:"#fff",stroke:"rgba(0,0,0,.55)"}),d[2]>0&&this.drawOutlinedText(String(d[2]),p,u+43,12,{align:"center"})}),i.restore();let c=r.uiCounterValid?r.uiCounterRemainSec:0,l=[r.distanceM>0?Cn(r.distanceM):"",c>0?`${c}초`:""].filter(Boolean).join(" · ");l&&this.drawOutlinedText(l,t-n,u+68,13,{align:"right",color:"rgba(255,255,255,.82)"})}drawLaneFallback(t,n){let r=Ht(this.state?.laneCurrent)?this.state.laneCurrent:Array.isArray(this.state?.laneAhead)?this.state.laneAhead.find(Ht):null;if(!r||!r.visible||r.count<1)return!1;let o=this.context,i=Qe(Math.round(it(r.count)),1,8),a=Math.min(t*.48,300),s=Math.min(n*.17,92),u=(t-a)*.5,c=n-s-8,l=4,d=(a-20-l*(i-1))/i;o.save(),_t(o,u,c,a,s,13),o.fillStyle="rgba(5, 9, 14, 0.78)",o.fill();for(let f=0;f0,m=u+10+f*(d+l);_t(o,m,c+12,d,s-30,7),o.fillStyle=p?"rgba(73, 218, 157, 0.82)":"rgba(255,255,255,0.13)",o.fill(),this.drawOutlinedText("↑",m+d*.5,c+s*.57,Qe(d*.72,15,28),{align:"center"})}return o.restore(),r.distanceM>0&&this.drawOutlinedText(Cn(r.distanceM),t*.5,c+s-5,12,{align:"center"}),!0}drawCrossroadFallback(t,n,r){let o=this.state?.crossroad;if(!Ht(o)||!o.visible)return!1;let i=Math.min(t*.28,160),a=50,s=t-r-i,u=n*.2,c=this.context;return c.save(),_t(c,s,u,i,a,13),c.fillStyle="rgba(13, 19, 27, .88)",c.fill(),c.strokeStyle="rgba(103, 190, 255, .45)",c.stroke(),c.restore(),this.drawOutlinedText("교차로",s+12,u+21,14,{color:"rgba(255,255,255,.72)"}),this.drawOutlinedText(Cn(o.distanceM),s+12,u+42,18,{maxWidth:i-24}),!0}drawCrossroadOverlay(t,n,r,o,i=!0){let a=["crossroad_expanded","crossroad_minimized"];for(let s of a){if(!this.image(s))continue;let c=s==="crossroad_expanded"?{x:t*(o?.46:.42),y:Math.max(r,n*(o?.2:.16)),width:Math.max(1,t*(o?.54:.58)-r),height:n*(o?.58:.62)}:{x:t*.7,y:Math.max(r,n*.16),width:Math.max(1,t*.3-r),height:n*.48},l=this.drawImage(s,c,{alignX:1,alignY:.5});if(l)return{name:s,bounds:l}}return i&&this.drawCrossroadFallback(t,n,r),null}drawNavigationStatus(t,n,r,o=!0){if(o&&this.state?.navigationStatus?.offRoute){let m=Math.min(t*.38,220),b=(t-m)*.5,g=this.context;g.save(),_t(g,b,r,m,38,19),g.fillStyle="rgba(151, 72, 14, .9)",g.fill(),g.restore(),this.drawOutlinedText("경로 이탈 · 재탐색 중",t*.5,r+25,14,{align:"center"})}let i=this.displayStatus;if(!i?.mode||i.mode==="live")return;let a={disconnected:["내비 연결 끊김","TMAP 수신을 기다리는 중"],stalled:["지도 영상 멈춤","수신 복구를 시도하는 중"],waiting:["지도 영상 대기 중","첫 화면을 기다리는 중"]},[s,u]=a[i.mode]||[String(i.title||"내비 상태 확인"),String(i.detail||"")],c=Math.min(t*.56,330),l=92,d=(t-c)*.5,f=(n-l)*.5,p=this.context;p.save(),_t(p,d,f,c,l,16),p.fillStyle="rgba(5, 9, 14, .9)",p.fill(),p.strokeStyle=i.mode==="stalled"?"#ffb34d":"rgba(255,255,255,.24)",p.stroke(),p.restore(),this.drawOutlinedText(s,t*.5,f+38,20,{align:"center",color:i.mode==="stalled"?"#ffbd68":"#fff"}),this.drawOutlinedText(u,t*.5,f+66,13,{align:"center",color:"rgba(255,255,255,.68)"})}drawRouteProgress(t,n,r){let o=this.state?.route;if(!Ht(o)||it(o.totalDistanceM)<=0)return;let i=Math.min(t*.42,260),a=Qe(it(o.movedDistanceM)/it(o.totalDistanceM),0,1),s=this.context;s.save(),_t(s,r,n-7,i,3,2),s.fillStyle="rgba(255,255,255,.2)",s.fill(),a>0&&(_t(s,r,n-7,i*a,3,2),s.fillStyle="#4ad89c",s.fill()),s.restore()}render(){let t=this.context,n=this.canvas;if(!t||!n)return;let r=n.getBoundingClientRect(),o=Math.max(1,Math.round(r.width)),i=Math.max(1,Math.round(r.height)),a=Qe(window.devicePixelRatio||1,1,2),s=Math.max(1,Math.round(o*a)),u=Math.max(1,Math.round(i*a));(n.width!==s||n.height!==u)&&(n.width=s,n.height=u),t.setTransform(a,0,0,a,0,0),t.clearRect(0,0,o,i);let c=Qe(o*.022,9,16),l=Qe(o*.015,8,14),d=Qe(i*.015,6,10),f=this.nativeImageSession,p=o<520;if(this.drawGuidanceStack(o,i,0,p,!f),!this.drawImage("traffic_signal",{x:o-l-Math.min(o*.32,230),y:l,width:Math.min(o*.32,230),height:Math.min(i*.17,98)},{alignX:1,alignY:0})&&!f&&this.drawTrafficFallback(o,c),this.drawCrossroadOverlay(o,i,l,p,!f),!p){let A=o*.5;this.drawImage("center_tbt_icon",{x:A-112,y:i*.16,width:92,height:92},{alignX:1}),this.drawImage("center_tbt_text",{x:A-12,y:i*.17,width:Math.min(o*.3,220),height:78},{alignX:0}),this.drawImage("center_tbt_fee",{x:A-90,y:i*.33,width:180,height:58})}let b=this.drawImage("lane_top",{x:o*.23,y:i*.3,width:o*.54,height:Math.min(i*.15,86)}),g=["safety_primary","safety_secondary","safety_section"].find(A=>this.image(A));!(g&&this.drawImage(g,{x:l,y:i*.55,width:Math.min(o*.25,130),height:Math.min(i*.23,112)},{alignX:0}))&&!f&&this.drawSafetyFallback(o,i,c);let E=Math.min(o*(p?.54:.46),270),y=Math.min(i*.18,96),O={x:(o-E)*.5,y:i-y-d,width:E,height:y},C=this.drawImage("lane_bottom",O);!b&&!C&&!f&&this.drawLaneFallback(o,i);let w=this.footerState?.route,z=C?.x??O.x,M=C?C.x+C.width:O.x+O.width;if(Ht(w)){let A=w.remainingTimeSec>0?Math.max(1,Math.round(w.remainingTimeSec/60)):0,L=Ws(w.remainingTimeSec),P=l,_=Math.max(0,z-P-l);if(_>=70){let T=[L,A?`${A}분`:""].filter(Boolean).join(" · ");this.drawOutlinedText(Cn(w.remainingDistanceM),P,i-d-25,Qe(o*.032,16,25),{maxWidth:_}),T&&this.drawOutlinedText(T,P,i-d,Qe(o*.027,14,21),{maxWidth:_})}}f||this.drawRouteProgress(o,i,c);let R=this.footerState?.vehicle,v=R?.roadName,h=o-l,S=Math.max(0,h-M-l);Ht(R)&&v&&S>=70&&this.drawOutlinedText(v,h,i-d,Qe(o*.028,13,20),{align:"right",maxWidth:S}),this.drawNavigationStatus(o,i,c,!f)}};function Us(e){return new $s(e)}var Pd=Object.freeze({findAlphaRowBounds:Pi,create:Us});function Ld(e=globalThis){return e.CarrotNaviOverlay=Pd,Pd}function Ys(e){return!!e?.meta?.present}function kd(e,t){if(!e||typeof e!="object")return"";let n=e.meta||{},r=Math.max(0,Number(n.sequence)||0),o=Math.max(0,Number(n.sourceTimestampMillis)||0);return[r,o,...t.map(i=>String(e[i]??""))].join(":")}function Ks(){let e=null,t="",n=null,r="";function o(l){let d=l?.navigationStatus;return Ys(d)&&!d.guidanceActive&&!d.routePresent}function i(l){let d=l?.route,f=kd(d,["remainingDistanceM","remainingTimeSec"]);o(l)?(e=null,t=""):Ys(d)&&(!e||f!==t)&&(e={meta:{...d.meta||{}},remainingDistanceM:Math.max(0,Number(d.remainingDistanceM)||0),remainingTimeSec:Math.max(0,Number(d.remainingTimeSec)||0)},t=f)}function a(l){let d=l?.vehicle,f=String(d?.roadName||"").trim(),p=kd(d,["roadName"]);o(l)?(n=null,r=""):Ys(d)&&f&&(!n||p!==r)&&(n={meta:{...d.meta||{}},roadName:f},r=p)}function s(){return{route:e,vehicle:n}}function u(l){return i(l),a(l),s()}function c(){e=null,t="",n=null,r=""}return Object.freeze({update:u,reset:c,snapshot:s})}var Fd=Object.freeze({create:Ks});function zd(e=globalThis){return e.CarrotNaviFooterState=Fd,Fd}var Ly=220;function qs(e,t={}){if(!e)return null;let n=Math.max(0,Number(t.clearGraceMs)||Ly),r=Ks(t)||null,o=new Map,i=new Map,a=new Map,s=null,u=!1,c=null,l=!1,d=0;function f(h,S){return{name:String(h||""),sequence:Math.max(0,Number(S)||0)}}function p(h,S,A=d){return A===d&&o.get(h)===S}function m(h,S){if(!h)return!1;let A=o.get(h);return A!==void 0&&S{i.delete(L),p(L,P,_)&&(x(L),a.set(L,{name:L,clear:!0,sequence:P,sourceTimestampMillis:Math.max(0,Number(A)||0)}))},n);return i.set(L,T),!0}async function O(h){if(!(h?.buffer instanceof ArrayBuffer))return!1;let{name:S,sequence:A}=f(h.name,h.sequence);if(!m(S,A))return!1;let L=d,P=new Blob([h.buffer],{type:String(h.mime||"image/png")});try{if(typeof globalThis.createImageBitmap=="function"){let T=await globalThis.createImageBitmap(P);return p(S,A,L)?E(S,T,A,h.sourceTimestampMillis):(T.close?.(),!1)}if(typeof globalThis.Image!="function"||!globalThis.URL?.createObjectURL)return!1;let _=globalThis.URL.createObjectURL(P);return await new Promise(T=>{let I=new globalThis.Image;I.onload=()=>{if(globalThis.URL.revokeObjectURL(_),!p(S,A,L)){T(!1);return}T(E(S,I,A,h.sourceTimestampMillis))},I.onerror=()=>{globalThis.URL.revokeObjectURL(_),T(!1)},I.src=_})}catch{return!1}}function C(h){s=h&&typeof h=="object"?h:null,u=!0,c=r?.update(s)||{route:null,vehicle:null},l=!0}function w(){if(!a.size&&!u&&!l)return!1;let h=Array.from(a.values());return a.clear(),h.length&&e.applyBatch(h),u&&(e.setState(s),s=null,u=!1),l&&(e.setFooterState?.(c),c=null,l=!1),e.renderNow(),!0}function z(){r?.reset(),c=null,l=!1}function M(){for(let h of a.values())h.source?.close?.();a.clear()}function R(){d+=1,g(),M(),o.clear(),e.clearImages(),e.renderNow()}function v(){d+=1,g(),M(),o.clear(),s=null,u=!1,z(),e.reset(),e.renderNow()}return Object.freeze({present:E,clear:y,decode:O,setState:C,flush:w,resetImages:R,reset:v})}var jd=Object.freeze({create:qs});function Vd(e=globalThis){return e.CarrotNaviOverlayStore=jd,jd}var ky=["idle","connecting","buffering","live","recovering","busy"],Bd=Object.freeze(ky),Fy=new Set(Bd);function Xs(e={}){let t=e.target||globalThis,n=e.now||(()=>t.performance.now()),r="idle",o="",i=n();function a(){return{phase:r,reason:o,changedAt:i,ageMs:Math.max(0,Math.round(n()-i))}}function s(u,c=""){let l=String(u||"");if(!Fy.has(l))throw new Error(`Invalid Carrot Navi phase: ${l}`);let d=String(c||"").slice(0,128);if(r===l&&o===d)return!1;let f=r;r=l,o=d,i=n();let p=a();return e.onChange?.({...p,previous:f}),t.dispatchEvent?.(new t.CustomEvent("carrot:navigationphasechange",{detail:{...p,previous:f}})),!0}return Object.freeze({transition:s,snapshot:a})}var Hd=Object.freeze({PHASES:Bd,create:Xs});function Gd(e=globalThis){return e.CarrotNaviLifecycle=Hd,Hd}function Qs(e={}){let t=e.target||globalThis,n=e.pane,r=e.canvas,o=e.video,i=e.overlayCanvas,a=e.overlayStore,s=r?.getContext?.("2d",{alpha:!1})||null,c=(e.createStagingCanvas||(()=>{let y=t.document?.createElement?.("canvas");return y?(y.width=1,y.height=1,y):typeof t.OffscreenCanvas=="function"?new t.OffscreenCanvas(1,1):null}))(),l=c?.getContext?.("2d",{alpha:!1})||null;if(!n||!r||!o||!i||!a||!s||!c||!l)return null;let d=!1,f=!1,p=0;function m(){if(!d||o.readyState<2||o.videoWidth<1||o.videoHeight<1)return!1;let y=n.getBoundingClientRect(),O=Math.min(2,Math.max(1,t.devicePixelRatio||1)),C=y.width>0?y.width:o.videoWidth,w=y.height>0?y.height:o.videoHeight,z=Math.max(1,Math.round(C*O)),M=Math.max(1,Math.round(w*O));c.width!==z&&(c.width=z),c.height!==M&&(c.height=M);let R=Math.max(z/o.videoWidth,M/o.videoHeight),v=z/R,h=M/R;try{a.flush(),l.drawImage(o,Math.max(0,(o.videoWidth-v)/2),Math.max(0,(o.videoHeight-h)/2),v,h,0,0,z,M),i.width>1&&i.height>1&&l.drawImage(i,0,0,i.width,i.height,0,0,z,M),r.width!==z&&(r.width=z),r.height!==M&&(r.height=M),s.drawImage(c,0,0,z,M)}catch{return!1}return f=!0,p=t.performance.now(),e.onFrame?.(p),!0}function b(y){d=!!y,o.hidden=!1,r.hidden=!1}function g(y={}){p=0,y.preserveFrame||(f=!1)}function x(y,O=t.performance.now()){return p>0&&O-p<=Math.max(0,Number(y)||0)}function E(){return{active:d,hasFrame:f,lastFrameAt:p,canvasVisible:!r.hidden}}for(let y of["loadeddata","playing","timeupdate"])o.addEventListener(y,m);return Object.freeze({render:m,setActive:b,invalidate:g,fresh:x,snapshot:E})}var Wd=Object.freeze({create:Qs});function $d(e=globalThis){return e.CarrotNaviCompositor=Wd,Wd}var Xn='video/mp4; codecs="avc1.42E01E"';function Yd(e=Xn,t=globalThis){for(let n of[t.ManagedMediaSource,t.MediaSource]){if(typeof n!="function")continue;let r=n.isTypeSupported||t.MediaSource?.isTypeSupported;try{if(typeof r=="function"&&r.call(n,e))return n}catch{}}return null}function Kd(e=Xn,t=globalThis){return!!Yd(e,t)}function Zs(e,t={}){if(!e)return null;let n=t.target||globalThis,r=null,o=null,i="",a=[],s=!1,u=0,c=0,l=0,d=!1,f=!1,p="",m={mime:"",initCount:0,segmentCount:0,frameCount:0,keyframeCount:0,lastSequence:0,lastSourceTimestampMillis:0,lastDuration:0,lastSegmentAt:0,clearCount:0,lastClearReason:"",lastClearAt:0};function b(h=Xn){return Kd(h,n)}function g(h){let S=e.error;p=String(h?.message||S?.message||(S?.code?`HTMLMediaElement error ${S.code}`:h||"Carrot Navi MSE playback error")),t.onError?.(p)}function x(){typeof e.requestVideoFrameCallback!="function"||u||(u=e.requestVideoFrameCallback(()=>{u=0,t.onFrame?.(),x()}))}function E(){if(!e.buffered?.length)return;let h=e.buffered.length-1,S=e.buffered.start(h),A=e.buffered.end(h),L=Number(e.currentTime),P=Number.isFinite(L)?A-L:Number.POSITIVE_INFINITY;if(d)if(!Number.isFinite(L)||L4){try{e.currentTime=Math.max(S,A-.55)}catch{}e.playbackRate=1}else P>1.2?e.playbackRate=1.05:P>.85?e.playbackRate=1.02:P<.7&&e.playbackRate!==1&&(e.playbackRate=1);else{if(l<2)return;try{e.currentTime=Math.max(S,A-.55)}catch{}d=!0,e.playbackRate=1}e.paused&&e.play().catch(()=>{}),x()}function y(){if(!o||o.updating||r?.readyState!=="open")return;if(o.buffered.length&&a.length<=2){let S=o.buffered.length-1,A=o.buffered.start(0),L=o.buffered.end(S),P=Number(e.currentTime),_=Math.min(L-5,Number.isFinite(P)?P-3:0);if(!s&&_>A+.5){s=!0;try{o.remove(0,_);return}catch{s=!1}}}let h=a.shift();if(h)try{o.appendBuffer(h.bytes),h.media&&(l+=1)}catch(S){g(S)}}function O(){s=!1,E(),y()}function C(){if(u&&typeof e.cancelVideoFrameCallback=="function")try{e.cancelVideoFrameCallback(u)}catch{}u=0;try{e.pause()}catch{}if(e.playbackRate=1,o){o.removeEventListener("updateend",O),o.removeEventListener("error",g);try{o.updating&&o.abort()}catch{}}o=null,r=null,a=[],s=!1,c=0,l=0,d=!1,f=!1,p="",m.lastSegmentAt=0;try{e.srcObject=null}catch{}e.removeAttribute("src");try{e.load()}catch{}i&&n.URL.revokeObjectURL(i),i=""}function w(h,S=Xn){C();let A=String(S||Xn),L=Yd(A,n);if(!L)return g(new Error(`Unsupported Carrot Navi media type: ${A||"unknown"}`)),!1;let P=new L;return r=P,p="",m.mime=A,m.initCount+=1,a.push({bytes:new Uint8Array(h),media:!1}),P.addEventListener("sourceopen",()=>{if(!(r!==P||P.readyState!=="open"||o))try{o=P.addSourceBuffer(A),o.addEventListener("updateend",O),o.addEventListener("error",g),y()}catch(_){g(_)}}),e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.disableRemotePlayback=!0,i=n.URL.createObjectURL(P),e.src=i,!0}function z(h,S={}){if(!r)return!1;let A=!!S.keyframe;if(f){if(!A)return!1;f=!1}return a.length>=12&&(p="Carrot Navi MSE queue overflow",a=a.filter(L=>!L.media),f=!A,f)?!1:(c+=1,m.segmentCount+=1,m.frameCount+=Math.max(1,Number(S.frameCount)||1),m.keyframeCount+=Math.max(0,Number(S.keyframeCount)||(A?1:0)),m.lastSequence=Math.max(0,Number(S.sourceSequence??S.sequence)||0),m.lastSourceTimestampMillis=Math.max(0,Number(S.sourceTimestampMillis)||0),m.lastDuration=Math.max(0,Number(S.durationMs??S.duration)||0),m.lastSegmentAt=n.performance.now(),a.push({bytes:new Uint8Array(h),media:!0,keyframe:A}),y(),!0)}function M(h="cleared"){m.clearCount+=1,m.lastClearReason=String(h).slice(0,64),m.lastClearAt=n.performance.now(),m.lastSegmentAt=0}function R(){let h=[],S=e.buffered;if(!S)return h;for(let A=Math.max(0,S.length-2);AKd(e)});function qd(e=globalThis){return e.CarrotNaviMse=Ud,Ud}var zy="carrotNaviSession",jy="carrot_navi_accepted",Lo="carrot_navi_busy",Qd="carrot_navi_replaced";var Vy="navigation.media.worker";function Hy(e,t){let n=e.resolveAssetUrl||(o=>globalThis.CarrotAssetUrl.resolve(o)),r=String(n(Vy)||"");if(!r)throw new Error("Carrot Navi media worker asset URL is empty");return r}function Js(e={}){let t=e.target||globalThis,n=String(e.statePath||"/ws/carrot_navi/state"),r=String(e.mediaPath||"/ws/carrot_navi/media"),o=Hy(e,t),i=Math.max(100,Number(e.reconnectMs)||500),a=String(t.CarrotStreamIdentity?.clientId||`carrot-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`),s=!1,u=!1,c="",l=!0,d=!1,f=null,p=null,m=null,b=0;function g(_,T=!1){let I=new t.URL(_,t.location.href);return I.protocol=t.location.protocol==="https:"?"wss:":"ws:",I.searchParams.set("client_id",a),T&&I.searchParams.set("takeover","1"),I.href}function x(){return{active:s,ownershipBlocked:u,ownershipCode:c,takeoverArmed:l,stateAccepted:d,stateSocketState:f?.readyState??-1,mediaSocketState:p?.readyState??-1,stateOpen:f?.readyState===t.WebSocket.OPEN,mediaOpen:p?.readyState===t.WebSocket.OPEN,workerActive:!!m}}function E(){e.onConnectionChange?.(x())}function y(_){if(_)try{_.close()}catch{}}function O(){return m||(m=new Worker(o),m.addEventListener("message",_=>e.onWorkerMessage?.(_.data||{})),m.addEventListener("error",_=>e.onError?.(_.message||"Carrot Navi worker error")),m.postMessage({type:"configure"}),m)}function C(_=Lo){let T=String(_||Lo),I=!u||c!==T;u=!0,c=T,l=!1,d=!1,t.clearTimeout(b),b=0;let k=f,D=p;f=null,p=null,y(k),y(D),m?.postMessage({type:"reset-media"}),I&&e.onOwnershipBusy?.(T),E()}function w(_,T,I){if(typeof _!="string")return!1;try{let k=JSON.parse(_);return k?.type!==zy?!1:k.status==="busy"?(C(k.code||Lo),!0):(k.status!=="accepted"||k.code!==jy||!(I==="state"?f===T:p===T)||(u=!1,c="",I==="state"&&(d=!0,v()),E()),!0)}catch{return!1}}function z(_,T,I){let k=I==="state";if(k?f===T:p===T){if(k?(f=null,d=!1):p=null,_.code===4409||_.code===4401){C(_.code===4401?Qd:Lo);return}k&&s&&e.onStateDisconnected?.(),E(),M()}}function M(){t.clearTimeout(b),b=0,!(!s||u)&&(b=t.setTimeout(()=>{b=0,h()},i))}function R(){if(!s||u||f)return;d=!1;let _=new t.WebSocket(g(n,l));f=_,_.addEventListener("open",()=>{f===_&&(l=!1,E())}),_.addEventListener("message",T=>{if(!w(T.data,_,"state")&&typeof T.data=="string")try{let I=JSON.parse(T.data);I?.type==="carrotNaviState"&&I.state&&e.onState?.(I.state)}catch{}}),_.addEventListener("close",T=>z(T,_,"state")),_.addEventListener("error",()=>y(_))}function v(){if(!s||u||!d||p)return;let _=O(),T=new t.WebSocket(g(r,!1));T.binaryType="arraybuffer",p=T,T.addEventListener("open",()=>{p===T&&E()}),T.addEventListener("message",I=>{w(I.data,T,"media")||!(I.data instanceof ArrayBuffer)||m!==_||_.postMessage({type:"media",buffer:I.data},[I.data])}),T.addEventListener("close",I=>z(I,T,"media")),T.addEventListener("error",()=>y(T))}function h(){!s||u||(R(),d&&v())}function S(){s||(s=!0),h(),E()}function A(){if(!s||u)return;let _=p;p=null,y(_),m?.postMessage({type:"reset-media"}),M(),E()}function L(){let _=f,T=p;f=null,p=null,d=!1,y(_),y(T),u=!1,c="",l=!0,t.clearTimeout(b),b=0,s&&h(),E()}function P(){s=!1,u=!1,c="",l=!1,d=!1,t.clearTimeout(b),b=0;let _=f,T=p;f=null,p=null,y(_),y(T),m&&(m.postMessage({type:"reset"}),m.terminate(),m=null),E()}return Object.freeze({start:S,stop:P,recoverMedia:A,requestOwnershipTakeover:L,snapshot:x})}var Xd=Object.freeze({SESSION_BUSY_CODE:Lo,SESSION_REPLACED_CODE:Qd,create:Js});function Zd(e=globalThis){return e.CarrotNaviTransport=Xd,Xd}var ef=Object.freeze({mapStaleMs:1900,stateStaleMs:3500,disconnectGraceMs:1500,sourceSuspendGraceMs:6e3,mediaFreshMs:1600});function ec(e={}){let t=e.transport,n=e.mse,r=e.compositor;if(!t||!n||!r)return null;let o=e.now||(()=>globalThis.performance.now()),i=Object.freeze({...ef,...e.thresholds||{}}),a=!1,s=!1,u=0,c=0,l=!1,d=0;function f(O,C=o()){let w=O?.connected===!0,z=O?.navigationStatus;l=!!(z?.guidanceActive||z?.routePresent),a=!0,u=C,w?(s=!0,c=0,d=0):((s||!c)&&(c=C),s=!1,l&&!d&&(d=C),l||(d=0))}function p(O=o()){(s||!c)&&(c=O),s=!1,l&&!d&&(d=O)}function m(){a=!1,s=!1,u=0,c=0,l=!1,d=0}function b(O=o()){let C=u>0?Math.max(0,Math.round(O-u)):null,w=c>0?Math.max(0,Math.round(O-c)):null,z=d>0?Math.max(0,Math.round(O-d)):null,M=a&&C!==null&&C<=i.stateStaleMs;return{seen:a,connected:s,routeActive:l,suspended:!s&&l,fresh:M,ageMs:C,disconnectedForMs:w,suspendedForMs:z}}function g(O=o(),C=n.snapshot()){let w=Number(C?.media?.lastSegmentAt)||0;return w>0&&O-w<=i.mediaFreshMs}function x(O=o()){let C=b(O);return!C.seen||!C.fresh?!1:C.connected?!0:C.routeActive&&C.suspendedForMs!==null&&C.suspendedForMs<=i.sourceSuspendGraceMs}function E(O=o()){if(!r.snapshot().hasFrame||!r.fresh(i.mapStaleMs,O))return!1;let w=b(O);return w.seen?w.connected?w.fresh:w.disconnectedForMs!==null&&w.disconnectedForMs<=i.disconnectGraceMs:!0}function y(O="",C=o()){let w=b(C),z=t.snapshot(),M=n.snapshot(),R=r.snapshot();return{ready:E(C),source:w.fresh&&w.connected,transport:z.mediaOpen&&g(C,M),decoder:M.mse.readyState==="open"&&!M.error&&!O,presentation:R.hasFrame&&r.fresh(i.mapStaleMs,C)}}return Object.freeze({recordState:f,recordDisconnect:p,reset:m,sourceSnapshot:b,mediaFresh:g,mapReady:E,sourceAvailable:x,snapshot:y,thresholds:i})}var Jd=Object.freeze({DEFAULT_THRESHOLDS:ef,create:ec});function tf(e=globalThis){return e.CarrotNaviHealth=Jd,Jd}function tc(e={}){let t=e.target||globalThis,n=e.workspaceRuntime||t.DriveWorkspaceRuntime,r=e.workspace,o=e.overlay,i=n?.shell;if(!r||!i||n.root!==r)return null;function a(s=i.snapshot()){return{active:s.active,ratio:s.ratio,orientation:s.orientation,mode:s.mode,area1Content:n.contentForSlot(s.area1Slot),compactStage:s.compactPrimary}}return t.addEventListener("drive:workspacelayoutchange",s=>{if(s?.detail?.workspaceId!==String(r.id||""))return;let u=a(s.detail);t.dispatchEvent(new t.CustomEvent("carrot:navigationlayoutchange",{detail:u})),e.onLayout?.(u)}),t.addEventListener("drive:workspaceresizestart",s=>{s?.detail?.workspaceId===String(r.id||"")&&(o?.setRenderSuspended?.(!0),t.dispatchEvent(new t.CustomEvent("carrot:navigationresizestart")))}),t.addEventListener("drive:workspaceresizeend",s=>{s?.detail?.workspaceId===String(r.id||"")&&(o?.setRenderSuspended?.(!1),t.dispatchEvent(new t.CustomEvent("carrot:navigationresizeend")))}),Object.freeze({applyGeometry:i.applyGeometry,snapshot(){let s=i.snapshot();return{...a(s),ratios:s.ratios}}})}var nf=Object.freeze({create:tc});function rf(e=globalThis){return e.CarrotNaviSplit=nf,nf}var of=new WeakMap,Yr=Object.freeze({});function By(e={}){let t=e.target||globalThis,n=e.document||t.document,r=e.workspace||n?.getElementById("carrotDriveWorkspace"),o=e.stage||n?.getElementById("carrotStage"),i=e.root||e.pane||n?.getElementById("carrotNaviPane"),a=e.divider||n?.getElementById("carrotNaviDivider"),s=e.canvas||n?.getElementById("carrotNaviCanvas"),u=e.video||n?.getElementById("carrotNaviVideo"),c=e.overlayCanvas||n?.getElementById("carrotNaviOverlayCanvas"),l=e.statusElement||n?.getElementById("carrotNaviStatus"),d=e.layoutSpec||t.CarrotDriveLayoutSpec,f=e.workspaceRuntime||t.DriveWorkspaceRuntime,p=e.workspaceApi||t.DriveWorkspace;if(!r||!o||!i||!a||!s||!u||!c||!d)return Yr;let m=(e.createOverlay||Us)(c),b=(e.createOverlayStore||qs)(m),g=(e.createLifecycle||Xs)({target:t}),x=(e.createSplit||tc)({target:t,workspaceRuntime:f,workspace:r,stage:o,pane:i,divider:a,overlay:m});if(!m||!b||!g||!x)return Yr;let E=540,y=240,O=300,C=480,w=3e3,z=5e3,M=2e3,R=1e3,v=8,h=!1,S=!1,A=0,L=0,P="",_="",T="",I=!1,k=!1,D=!1,B=!1,W=0,V=e.contentActive===void 0?!0:!!e.contentActive,F=!1,H=(e.createCompositor||Qs)({target:t,pane:i,canvas:s,video:u,overlayCanvas:c,overlayStore:b,onFrame:te}),Y=(e.createMse||Zs)(u,{target:t,onFrame:()=>H?.render(),onError:on});if(!H||!Y)return Yr;let $=(e.createTransport||Js)({target:t,resolveAssetUrl:e.resolveAssetUrl,onState:Re,onStateDisconnected:mt,onWorkerMessage:Ge,onError:on,onConnectionChange:Ke,onOwnershipBusy:Ce});if(!$)return Yr;let K=(e.createHealth||ec)({transport:$,mse:Y,compositor:H,now:()=>t.performance.now()});if(!K)return Yr;let Z=e.introApi||t.DriveContentIntro,ee=Z?.create?.({host:i,className:"carrot-navi-pane__intro",feature:{id:d.CONTENT.NAVIGATION,label:()=>He("web_drive_layout_content_navigation","Carrot Navi")}}),ue=Z?.STATUS,de=e.stateSurfaceApi||t.CarrotUI?.stateSurface,ye=de?.create?.({host:i,className:"carrot-navi-pane__ownershipNotice",featureLabel:()=>He("web_drive_layout_content_navigation","Carrot Navi")});if(!ee||!ue||!ye)return Yr;function U(){return Y.supported()?"mse":""}function X(){let q=t.visualViewport;return{width:Math.round(q?.width||t.innerWidth||0),height:Math.round(q?.height||t.innerHeight||0)}}function pe(q=X()){let oe=f?.viewportOrientation?.();return oe||(q.height>=q.width?p.ORIENTATION.VERTICAL:p.ORIENTATION.HORIZONTAL)}async function xe(q=!1){let oe=t.performance.now();if(B||!q&&D&&oe-W=O&&Se>=C:be>=E&&Se>=y,Qt=V&&S&&Ct()&&Ne&&typeof t.Worker=="function"&&!!U();return Qt&&xe(),Qt&&D&&k}function ft(){return(V||F)&&D&&k&&typeof t.Worker=="function"&&!!U()}function He(q,oe){return typeof t.getUIText=="function"?t.getUIText(q,oe):oe}function Ct(q=x.snapshot()){if(!q.active)return!1;if(q.mode===d.MODE.SPLIT)return!0;let oe=q.area1Content===d.CONTENT.NAVIGATION;return q.mode===d.MODE.AREA_1?oe:!oe}function pt(){let q=x.snapshot(),oe=H.snapshot(),be=$.snapshot();if(!Ct(q)||oe.hasFrame)return ee.hide(),ye.hide(),!1;if(be.ownershipBlocked)return ee.hide(),ye.show(de.STATE.OWNERSHIP,{tone:de.TONE.NEUTRAL,title:He("drive_stream_busy","Active on another device"),actions:[{id:"takeover",label:He("drive_stream_use_here","Use here"),tone:de.ACTION_KIND.PRIMARY,onActivate:()=>Bt("busy action")}]}),!0;ye.hide();let Se;return typeof t.Worker!="function"||!U()?Se={kind:ue.UNSUPPORTED,message:He("drive_content_status_unsupported","Not supported"),description:He("carrot_navi_intro_unsupported_detail","This browser cannot start the navigation video pipeline.")}:D&&!k?Se={kind:ue.UNAVAILABLE,message:He("drive_content_status_unavailable","Unavailable"),description:He("carrot_navi_intro_unavailable_detail","The stream remains stopped for the current device state.")}:T?Se={kind:ue.RECOVERING,message:He("drive_content_status_recovering","Recovering"),description:He("carrot_navi_intro_recovering_detail","The screen will return automatically after recovery.")}:Se={kind:ue.PREPARING,message:He("drive_content_status_preparing","Preparing"),description:He("carrot_navi_intro_preparing_detail","The navigation screen will appear here automatically when it is ready.")},ee.setStatus(Se),!0}function rn(q,oe){if(!l||!Ct())return;let be={waiting:["carrot_navi_waiting_video","지도 영상 대기 중"],disconnected:["carrot_navi_disconnected","내비 연결 끊김 · 재연결 중"],stalled:["carrot_navi_map_stalled","지도 영상 멈춤 · 복구 중"]},[Se,Ne]=be[q]||["",oe||"내비 상태 확인 중"];l.textContent=oe||(typeof t.getUIText=="function"?t.getUIText(Se,Ne):Ne),l.dataset.tone=q==="stalled"?"warning":q,l.hidden=!1}function jn(q=t.performance.now(),oe=!1){if(!l||!Ct()||oe){l&&(l.hidden=!0);return}let be=K.sourceSnapshot(q),Se=H.snapshot();be.seen&&!be.connected?rn("disconnected"):Se.hasFrame&&!H.fresh(K.thresholds.mapStaleMs,q)?rn("stalled"):!Se.hasFrame||T?rn("waiting",T?"지도 디코더 복구 중":""):(l.hidden=!0,delete l.dataset.tone)}function on(q){T=String(q?.message||q||"Carrot Navi decode error"),h&&g.transition("recovering",T),rn("waiting","지도 디코더 복구 중"),ge(T,120),nt()}function te(){t.clearTimeout(L),L=0,P="",T="",g.transition("live","frame presented"),l&&(l.hidden=!0),tt()}function Re(q){K.recordState(q),b.setState(q),tt()}function mt(){K.recordDisconnect(),tt()}function Ce(q){t.clearTimeout(L),L=0,P="",Y.destroy(),H.invalidate(),b.reset(),Ie(),T="",g.transition("busy",String(q||"carrot_navi_busy")),tt(),nt()}function Ke(q){if(!h)return;if(q.ownershipBlocked){g.transition("busy",q.ownershipCode||"carrot_navi_busy"),tt();return}let oe=g.snapshot().phase;!q.mediaOpen&&oe==="live"?g.transition("recovering","media socket closed"):(q.mediaOpen||q.stateOpen)&&oe==="idle"&&g.transition("connecting","socket connected")}function Ge(q={}){if(q.type==="overlay-image"&&q.bitmap){b.present(q.name,q.bitmap,q.sequence,q.sourceTimestampMillis);return}if(q.type==="overlay-bytes"){b.decode(q);return}if(q.type==="overlay-clear"){b.clear(q.name,q.sequence,q.sourceTimestampMillis);return}if(q.type==="overlay-reset"){b.resetImages();return}if(q.type!=="overlay-error"){if(q.type==="pipeline"){_=String(q.mode||"");return}if(q.type==="mse-init"&&q.segment instanceof ArrayBuffer){g.transition("buffering","MSE initialization"),Y.start(q.segment,String(q.mime||Xn));return}if(q.type==="mse-segment"&&q.segment instanceof ArrayBuffer){g.snapshot().phase!=="live"&&g.transition("buffering","MSE segment received"),Y.append(q.segment,q);return}if(q.type==="clear"){H.invalidate({preserveFrame:!0}),Y.markClear(q.reason),g.transition("recovering",String(q.reason||"media cleared")),tt(),nt();return}q.type==="error"&&on(q.message||"decode error")}}function tt(){let q=t.performance.now();jn(q,pt())}function ge(q,oe=0){if(!h||$.snapshot().ownershipBlocked||(P=String(q||"Carrot Navi media recovery").slice(0,128),g.transition("recovering",P),L))return;let be=t.performance.now(),Se=A>0?Math.max(0,A+z-be):0,Ne=Math.max(0,Number(oe)||0,Se);L=t.setTimeout(()=>{L=0,h&&(A=t.performance.now(),T=P||"Carrot Navi media recovery",P="",Y.destroy(),$.recoverMedia(),rn("waiting"),nt())},Ne)}function _n(q=t.performance.now()){let oe=H.snapshot();!h||$.snapshot().ownershipBlocked||!oe.hasFrame||H.fresh(K.thresholds.mapStaleMs,q)||!K.mediaFresh(q)||oe.lastFrameAt<=0||q-oe.lastFrameAt{let oe=q?.detail?.key;(Array.isArray(q?.detail?.keys)?q.detail.keys:[oe]).some(Se=>d.settingKeys.includes(Se))&&ht()}),n.addEventListener("visibilitychange",ht),t.addEventListener("carrot:languagechange",tt),t.visualViewport&&t.visualViewport.addEventListener("resize",ht,{passive:!0}),typeof t.ResizeObserver=="function"&&new t.ResizeObserver(ht).observe(r),new t.MutationObserver(ht).observe(o,{attributes:!0,attributeFilter:["class"]}),t.setInterval(()=>{ht(),tt(),_n()},500),t.setInterval(()=>{nt()},M),ht(),Object.freeze({refresh:ht,requestOwnershipTakeover:Bt,setContentActive:Rt,resize:Qn,status(){let q=x.snapshot(),oe=wt();return{enabled:!0,contentActive:V,contentKeepWarm:F,streamGateAllowed:k,streamGateKnown:D,streamGatePending:B,environmentActive:h,layoutVisible:S,splitOrientation:q.orientation,splitActive:q.active,splitRatio:q.ratio,splitMode:q.mode,splitArea1Content:q.area1Content,intro:ee.snapshot(),ownershipNotice:ye.snapshot(),mapReady:K.mapReady(),phase:g.snapshot(),health:oe.health,sourceState:oe.sourceState,overlay:oe.overlay,decoderMode:oe.decoderMode,mediaPipeline:_,pipelineVersion:v,secureContext:t.isSecureContext,decodeError:oe.decodeError,ownership:oe.ownership,media:oe.media,mse:oe.mse}}})}function Gy(e={}){let t=e.target||globalThis,n=of.get(t);if(n)return n;let r=By(e);return r&&typeof r.setContentActive=="function"&&of.set(t,r),r}function af(e=globalThis,t={}){let n=Gy({...t,target:e});return e.CarrotNaviWeb=n,n}var Wy=Object.freeze(["refresh","requestOwnershipTakeover","setContentActive","resize","status"]);function $y(e){if(!e||Wy.some(o=>typeof e[o]!="function"))return null;let t=Object.freeze({refresh(){return e.refresh()},requestOwnershipTakeover(o){return e.requestOwnershipTakeover(o)}}),n=Object.freeze({activate(o={}){return e.setContentActive(!0,o)},deactivate(o={}){return e.setContentActive(!1,o)},resize(o){return e.resize(o)},status(){return e.status()}});function r(){return{ready:!0,implementation:"CarrotNaviWeb",boundaries:["lifecycle","content"],runtime:e.status()}}return Object.freeze({lifecycle:t,content:n,status:r})}function sf(e=globalThis,t=e.CarrotNaviWeb){let n=$y(t);return e.DriveCarrotNaviFacade=n,n}function nc(e=globalThis){return Nd(e),Ld(e),zd(e),Vd(e),Gd(e),$d(e),qd(e),Zd(e),tf(e),rf(e),e}function cf(e=globalThis,t={}){nc(e);let n=af(e,t.runtime||t),r=sf(e,n),o=null;return r&&t.compatibilityContent!==!1?o=Iu(e,{...t.content,runtime:r.content}):t.compatibilityContent!==!1&&Hr(e,null),Object.freeze({runtime:n,facade:r,content:o})}function Uy(e={}){let t=e.stage||null,n=e.replayViewport||null,r=e.video||null,o=typeof e.getReplay=="function"?e.getReplay:()=>globalThis.CarrotVisionReplay;if(!t||!r)return null;function i(){let p=o();return p&&typeof p=="object"?p:null}function a(){return!!i()?.isActive?.()}function s(){return!!i()?.isReady?.()}function u(p){return a()?(i()?.reportRenderable?.(!!p),!0):!1}function c(){return a()?String(i()?.videoSourceKey?.()||""):""}function l(){return!!(a()&&i()?.shouldHoldFrameDuringSeek?.())}function d(){return t.classList.contains("is-replay")&&n?n:t}function f(p){if(a()){let b=Number(r.currentTime);if(Number.isFinite(b)&&b>=0)return b*1e3}let m=Number(p);return Number.isFinite(m)?m:0}return Object.freeze({isActive:a,isReady:s,reportRenderable:u,videoSourceKey:c,shouldHoldFrameDuringSeek:l,getRenderViewport:d,temporalNowMs:f})}var lf=Object.freeze({create:Uy});function uf(e=globalThis){return e.DriveVisionReplayRenderBridge=lf,lf}function Yy(e={}){let t=e.isReplayActive,n=e.isStageVisible,r=e.cancelScheduledRender,o=e.resetFrameTemporalState,i=e.resetReplayState,a=e.mergePendingRenderState,s=e.flushScheduledRender,u=e.notifyPresentedFrame;if(typeof t!="function"||typeof n!="function"||typeof r!="function"||typeof o!="function"||typeof i!="function"||typeof a!="function"||typeof s!="function"||typeof u!="function")return null;function c(d={}){if(!t()||!n())return!1;let f=!!d.force,p=d.resetTemporal===!0,m=d.overlayDirty!==!1,b=d.hudDirty!==!1;return(f||p||m||b)&&(r(),p&&o(),a({force:f,overlayDirty:m,hudDirty:b}),s()),u({source:"replay",mediaTime:Number.isFinite(Number(d.mediaTime))?Number(d.mediaTime):null,reason:String(d.reason||"replay video frame"),discontinuity:p,discontinuityReason:p?String(d.discontinuityReason||"replay-seek"):null}),!0}function l(){i()}return Object.freeze({renderVideoFrame:c,resetTemporalState:l})}var df=Object.freeze({create:Yy});function ff(e=globalThis){return e.DriveVisionReplayRenderController=df,df}function mf(e={}){let t=new Set,n=typeof e.reportError=="function"?e.reportError:()=>{},r=0,o=null;function i(u){if(typeof u!="function")throw new TypeError("presented-frame listener must be a function");t.add(u);let c=!0;return()=>c?(c=!1,t.delete(u)):!1}function a(u={}){let c=u?.source==="replay"?"replay":"live";o=Object.freeze({...u,source:c,sequence:++r});for(let l of[...t])try{l(o)}catch(d){n(d)}return o}function s(){return Object.freeze({listeners:t.size,sequence:r,last:o})}return Object.freeze({subscribe:i,publish:a,status:s})}var pf=new WeakMap;function rc(e=globalThis){let t=pf.get(e);if(t)return t;let n=mf({reportError(r){e?.console?.error?.("[drive vision] presented-frame listener failed",r)}});return pf.set(e,n),e.DriveVisionPresentedFrames=n,n}var sE=Object.freeze({create:mf,install:rc});function Kr(e,t,n){return Math.min(n,Math.max(t,e))}function Nt(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Xt(e,t=0){let n=Nt(e,t);return n>0?n:t}function ac(e,t,n,r){let o=Math.max(0,n-e),i=Math.max(0,r-t);return Object.freeze({left:e,top:t,right:n,bottom:r,width:o,height:i,centerX:e+o/2,centerY:t+i/2})}function Ky(e,t){return ac(0,0,Math.max(0,e),Math.max(0,t))}function ic(e,t,n){let r=Math.max(0,t),o=Math.max(0,n),i=Nt(e?.left??e?.x,0),a=Nt(e?.top??e?.y,0),s=Nt(e?.right,i+Nt(e?.width,r)),u=Nt(e?.bottom,a+Nt(e?.height,o)),c=Kr(Math.min(i,s),0,r),l=Kr(Math.max(i,s),0,r),d=Kr(Math.min(a,u),0,o),f=Kr(Math.max(a,u),0,o);return l-c>=2&&f-d>=2?ac(c,d,l,f):Ky(r,o)}function qy(e,t,n,r,o){let i=Xt(e,n),a=Xt(t,r),s=Math.max(Xt(o?.scale,1),.01),u=Nt(o?.tx,0),c=Nt(o?.ty,0);return ic({left:u,top:c,right:u+i*s,bottom:c+a*s},n,r)}function Xy(e,t){if(!t||t===e)return Object.freeze({left:0,top:0});let n=e.getBoundingClientRect?.(),r=t.getBoundingClientRect?.();return Object.freeze(n&&r?{left:Nt(r.left,0)-Nt(n.left,0),top:Nt(r.top,0)-Nt(n.top,0)}:{left:Nt(t.offsetLeft,0),top:Nt(t.offsetTop,0)})}function Qy(e){return[e.left,e.top,e.width,e.height,e.render.left,e.render.top,e.render.width,e.render.height,e.stageWidth,e.stageHeight].map(t=>Math.round(t*100)/100).join(",")}function Zy(e={}){let t=e.target||globalThis,n=e.stage,r=e.card;if(!n)return null;let o="",i="",a="",s=null;function u(){r&&(r.style.removeProperty("--carrot-hud-left"),r.style.removeProperty("--carrot-hud-bottom")),o="",i=""}function c(){n.style.removeProperty("--carrot-viewport-left"),n.style.removeProperty("--carrot-viewport-top"),n.style.removeProperty("--carrot-viewport-width"),n.style.removeProperty("--carrot-viewport-height")}function l(){u(),c(),a="",s=null}function d(b={}){let g=b.renderViewport||n,x=Xt(b.stageWidth,Xt(n.clientWidth,0)),E=Xt(b.stageHeight,Xt(n.clientHeight,0)),y=Xt(b.renderWidth,Xt(g?.clientWidth,x)),O=Xt(b.renderHeight,Xt(g?.clientHeight,E));if(!x||!E||!y||!O)return null;let C=b.viewportRect?ic(b.viewportRect,y,O):qy(b.sourceWidth,b.sourceHeight,y,O,b.transform),w=Xy(n,g),z=ac(w.left,w.top,w.left+y,w.top+O),M=ic({left:w.left+C.left,top:w.top+C.top,right:w.left+C.right,bottom:w.top+C.bottom},x,E);return Object.freeze({...M,local:C,render:z,stageWidth:x,stageHeight:E,sourceWidth:Xt(b.sourceWidth,y),sourceHeight:Xt(b.sourceHeight,O)})}function f(b={}){let g=d(b);if(!g)return null;s=g;let x=Qy(g);if(a!==x&&(a=x,n.style.setProperty("--carrot-viewport-left",`${Math.round(g.left)}px`),n.style.setProperty("--carrot-viewport-top",`${Math.round(g.top)}px`),n.style.setProperty("--carrot-viewport-width",`${Math.round(g.width)}px`),n.style.setProperty("--carrot-viewport-height",`${Math.round(g.height)}px`),typeof t.dispatchEvent=="function"&&typeof t.CustomEvent=="function"&&t.dispatchEvent(new t.CustomEvent("carrot:viewportlayout",{detail:g}))),r)if(!t.CarrotLayout?.isWide?.())(o!==""||i!=="")&&u();else{let E=`${Math.round(Kr(g.stageWidth*.028,16,28))}px`,y=`${Math.round(Kr(g.stageHeight*.038,20,30))}px`;o!==E&&(o=E,r.style.setProperty("--carrot-hud-left",E)),i!==y&&(i=y,r.style.setProperty("--carrot-hud-bottom",y))}return g}function p(){return s}function m(){return Object.freeze({viewportSignature:a,viewport:s,hudLeft:o,hudBottom:i})}return Object.freeze({apply:f,current:p,reset:l,resolve:d,status:m})}var oc=Object.freeze({create:Zy});function hf(e=globalThis){return e.DriveVisionViewport=oc,e.DriveVisionHudLayout=oc,oc}function Jy(e={}){let t=e.context;if(!t)return null;function n(i,a){t.clearRect(0,0,i,a)}function r(){}function o(){return{}}return Object.freeze({clear:n,reset:r,status:o})}var gf=Object.freeze({create:Jy});function bf(e=globalThis){return e.DriveVisionHudCanvas=gf,gf}function ev(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function zn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function tv(e,t="",n=0){return e==null?`-${t}`:`${e.toFixed(n)}${t}`}function nv(e,t){let n=String(e||"").split("/").pop().trim().toUpperCase();if(!n)return"-";if(n!=="H264")return n;let o=/profile-level-id=([0-9a-fA-F]{6})/.exec(String(t||""))?.[1]?.slice(0,2)?.toLowerCase()||"",i=o==="42"?"Baseline":o==="4d"?"Main":o==="64"?"High":"";return i?`${n} ${i}`:n}function rv(e){return!!e?.carControl?.longActive}function ov(e){return!!e?.controlsState?.activeLaneLine||ev(e?.carState?.useLaneLineSpeed,0)>0}function yf(e){if(!e?.active)return{visible:!1,tone:"offline",title:"VISION OFFLINE",glance:""};let t=e.network||{},n=e.inbound||{},r=e.video||{},o=String(t.resolutionLabel||"").trim()||"-",i=zn(t.bitrateMbps),a=zn(n.framesPerSecond),s=zn(t.rttMs),u=zn(t.lossPct),c=zn(t.jitterMs),l=zn(n.freezeCount),d=zn(n.framesDecoded),f=zn(n.framesReceived),p=zn(r.readyState),m=e.connectionState==="connecting"||e.iceConnectionState==="checking"||e.iceConnectionState==="disconnected",b=f!=null&&f>0&&d!=null&&d<=0||l!=null&&l>0&&p!=null&&p<3,g=u!=null&&u>=.5||c!=null&&c>=30||s!=null&&s>=150,x=tv(i,"Mbps",i!=null&&i<10?2:1),E=a==null?"-fps":`${Math.round(a)}fps`,y=s==null?"-ms":`${Math.round(s)}ms`,O=c==null?"-ms":`${Math.round(c)}ms`,C=u==null?"-%":`${u.toFixed(u>=10?0:1)}%`,w=nv(e.codec,e.codecParams),z=String(t.protocol||"-").toUpperCase(),M=String(t.localCandidateType||"-"),R=String(t.remoteCandidateType||"-"),v="normal",h="VISION OK",S=`${o} | ${E} | ${x} | ${y}`;if(e.error)v="offline",h="VISION OFFLINE",S="OFFLINE | stats unavailable";else if(m)v="reconnecting",h="VISION RECONNECTING",S="RECONNECTING | waiting stream";else if(b)v="stall",h="VISION STALL",S=`STALL | decode ${d??"-"} | recv ${f??"-"}`;else if(g){v="degraded",h="VISION DEGRADED";let A=[];u!=null&&u>=.5&&A.push(`loss ${C}`),s!=null&&s>=150&&A.push(`RTT ${y}`),c!=null&&c>=30&&A.push(`jitter ${O}`),S=`DEGRADED | ${A.slice(0,2).join(" | ")}`}return{visible:!0,tone:v,title:h,glance:S,video:`${o} | ${E}`,codec:w,bitrate:x,rtt:y,jitter:O,loss:C,freeze:l==null?"-":String(Math.round(l)),path:`${z} ${M} -> ${R}`}}function iv(e){return yf(e).glance||""}var qr=Object.freeze({isLongActive:rv,isLaneMode:ov,buildRtcPerf:yf,formatRtcPerfLabel:iv});function vf(e=globalThis){return e.DriveVisionHudModel=qr,qr}var av=600,sv=12,cv=8e3,lv=1400,uv="(min-aspect-ratio: 13/10), (horizontal-viewport-segments: 2), (vertical-viewport-segments: 2), (min-width: 640px) and (min-height: 650px)";function dv(e={}){let t=e.model||qr;if(!t?.buildRtcPerf)return null;let n=e.window||globalThis.window||globalThis,r=e.document||n.document||globalThis.document;if(!r)return null;let o=e.root||r,i=U=>o.querySelector?.(`#${U}`)||r.getElementById(U),a=i("carrotRtcPerfHud"),s=i("carrotRtcPerfGlance"),u=i("carrotRtcPerfGlanceText"),c=i("carrotRtcPerfSummary"),l=i("carrotRtcPerfTitle"),d=i("carrotRtcPerfVideo"),f=i("carrotRtcPerfCodec"),p=i("carrotRtcPerfBitrate"),m=i("carrotRtcPerfRtt"),b=i("carrotRtcPerfJitter"),g=i("carrotRtcPerfLoss"),x=i("carrotRtcPerfFreeze"),E=i("carrotRtcPerfPath"),y=i("carrotRtcPerfHoldTarget"),O=i("carrotRtcPerfCloseBtn"),C=i("carrotRtcPerfLogBtn"),w=typeof e.isActive=="function"?e.isActive:()=>!0,z=typeof e.isReplayActive=="function"?e.isReplayActive:()=>!1,M=typeof e.showToast=="function"?e.showToast:()=>{},R=!1,v=null,h=null,S=null,A=0,L=0,P=null;function _(){return t.buildRtcPerf(n.CarrotRtcPerf)}function T(){return!!(n.CarrotLayout?.isWide?.()??n.matchMedia(uv).matches)}function I(){v!=null&&(n.clearTimeout(v),v=null)}function k(U){I(),!(!R||U!=="normal")&&(v=n.setTimeout(()=>{D(!1)},cv))}function D(U){let X=_(),pe=!!(U&&X.visible&&T());if(R=pe,c&&(c.hidden=!pe),!pe){I();return}k(X.tone)}function B(){D(!1)}function W(){if(!a||!s||!u)return;if(z()){a.hidden=!0,B();return}let U=_();if(a.hidden=!U.visible,s.dataset.tone=U.tone,u.textContent=U.glance||U.title,!U.visible||!T()){B();return}c&&(c.dataset.tone=U.tone),l&&(l.textContent=U.title),d&&(d.textContent=U.video),f&&(f.textContent=U.codec),p&&(p.textContent=U.bitrate),m&&(m.textContent=U.rtt),b&&(b.textContent=U.jitter),g&&(g.textContent=U.loss),x&&(x.textContent=U.freeze),E&&(E.textContent=U.path),R&&v==null?k(U.tone):R&&U.tone!=="normal"&&I()}function V(){T()||B()}function F(){h!=null&&(n.clearTimeout(h),h=null),S=null,y?.classList.remove("is-holding")}function H(U){U.stopPropagation(),F(),!(!w()||!T())&&(S=U.pointerId,A=U.clientX,L=U.clientY,y.classList.add("is-holding"),y.setPointerCapture?.(U.pointerId),h=n.setTimeout(()=>{h=null,y.classList.remove("is-holding"),D(!R)},av))}function Y(U){S===U.pointerId&&Math.hypot(U.clientX-A,U.clientY-L)>sv&&F()}function $(U){U.preventDefault(),U.stopPropagation()}function K(U){U.stopPropagation(),B()}async function Z(U){U.stopPropagation();let X=C.textContent;C.disabled=!0,C.textContent="SEND";try{if(!n.CarrotVisionDiag?.uploadDiscord)throw new Error("diagnostic upload unavailable");await n.CarrotVisionDiag.uploadDiscord(),C.textContent="SENT",M("Carrot Vision log sent to Discord",{duration:2600})}catch(pe){C.textContent="FAIL",M(`Discord upload failed: ${pe?.message||pe}`,{tone:"error",duration:4200})}finally{P!=null&&n.clearTimeout(P),P=n.setTimeout(()=>{P=null,C.disabled=!1,C.textContent=X},lv)}}function ee(U){R&&(c?.contains(U.target)||y?.contains(U.target)||B())}function ue(){!y||!c||(y.addEventListener("pointerdown",H),y.addEventListener("pointermove",Y),["pointerup","pointercancel","lostpointercapture"].forEach(U=>{y.addEventListener(U,F)}),y.addEventListener("click",$),O?.addEventListener("click",K),C?.addEventListener("click",Z),r.addEventListener("pointerdown",ee,!0))}function de(){B(),F(),P!=null&&(n.clearTimeout(P),P=null),!(!y||!c)&&(y.removeEventListener("pointerdown",H),y.removeEventListener("pointermove",Y),["pointerup","pointercancel","lostpointercapture"].forEach(U=>{y.removeEventListener(U,F)}),y.removeEventListener("click",$),O?.removeEventListener("click",K),C?.removeEventListener("click",Z),r.removeEventListener("pointerdown",ee,!0))}function ye(){return Object.freeze({available:T(),visible:!!(a&&!a.hidden),summaryOpen:R})}return ue(),Object.freeze({sync:W,close:B,layoutChanged:V,destroy:de,status:ye})}var Sf=Object.freeze({create:dv});function Mf(e=globalThis){return e.DriveVisionRtcPerfHud=Sf,Sf}function sc(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function fv(e,t=0){if(!Array.isArray(e))return t;for(let n of e){let r=Number(n);if(Number.isFinite(r))return r}return t}function pv(e={}){let t=e.hudModel||qr;if(!t?.isLaneMode||!t?.isLongActive)return null;function n(r,o,i={}){let a=t.isLaneMode(o),s=r?.modelV2||null,c=(r?.lateralPlan||null)?.position,l=Array.isArray(c?.x)&&c.x.length>2,d={model:s,pathData:a&&l?c:s?.position||null,pathSource:a&&l?"lateralPlan":"modelV2",laneMode:a},f=sc(a?i.ShowPathModeLane:i.ShowPathMode,0),p=sc(a?i.ShowPathColorLane:i.ShowPathColor,13),m=!t.isLongActive(r);if(m)p=sc(i.ShowPathColorCruiseOff,19);else if(p>=20){let g=r?.radarState?.leadOne||{},x=fv(o?.longitudinalPlan?.accels,0);p=13,g.status&&(Math.abs(x)<.5?p=12:x>=.5?p=11:p=10)}let b={mode:f,colorIndex:p,paletteIndex:p%10,emphasisStroke:p>=10||!!o?.carState?.brakeLights,strokeColor:o?.carState?.brakeLights?"rgba(255, 76, 76, 0.96)":"rgba(255, 255, 255, 0.92)",isCruiseOff:m,laneMode:a};return{selectedPath:d,pathStyle:b}}return Object.freeze({resolve:n})}var Af=Object.freeze({create:pv});function Rf(e=globalThis){return e.DriveVisionRoadOverlayPolicy=Af,Af}var cc="default",xf="lane",Ef="road-edge";function hr(e,t,n){return Math.min(n,Math.max(t,e))}function Ee(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function mv(e={}){let t=e.projectPoint,n=e.projectPointPrecise,r=Ee(e.maxDrawDistance,100),o=typeof e.isFullDetailActive=="function"?e.isFullDetailActive:()=>!1;if(typeof t!="function"||typeof n!="function")return null;let i,a,s=null,u=33;function c(T){let I=Number(T);Number.isFinite(I)&&(u=s===null?33:Math.max(0,I-s),s=I),i={pathLengthIdx:new WeakMap,ribbon:new WeakMap,verticalRibbon:new WeakMap,pathZ:new WeakMap,pathY:new WeakMap}}function l(){a=new Map,s=null,u=33}function d(T,I){if(!I||typeof I!="object")return null;let k=T.get(I);return k||(k=new Map,T.set(I,k)),k}function f(T,I){if(o())return 1;let k=Ee(T,0),D=Ee(I,r);return D<=36?1:k>=Math.min(D*.72,62)?3:k>=Math.min(D*.44,34)?2:1}function p(T,I,k=cc){let D=f(T,I);if(D===1&&o())return 1;let B=Ee(T,0);return k===Ef?B>=64?Math.min(D+2,5):B>=40?Math.min(D+1,4):D:k===xf&&B>=58?Math.min(D+1,4):D}function m(T,I,k,D,B=cc){if(I<0)return;let W=0,V=-1;for(;W<=I;)D(W),V=W,W+=p(T[W],k,B);V!==I&&D(I)}function b(T,I="side"){return T===Ef?I==="center"?1.12:1.22:T===xf?I==="center"?1.06:1.12:1}function g(T,I,k){let D=Ee(T,0),B=Math.max(52,Math.min(Ee(I,r),r));if(D<=16)return 0;let W=hr((D-16)/Math.max(1,B-16),0,1);return k*W}function x(T,I,k,D=.34){if(!Array.isArray(T)||T.length<3)return T;let B=null;for(let W=1;W({x:Z.x,y:Z.y}))),B[W].x=H.x+($-H.x)*V,B[W].y=H.y+(K-H.y)*V}return B||T}function E(T,I){let k=Number(T),D=Number(I);return!Number.isFinite(D)||D<=0?1:!Number.isFinite(k)||k<=0?0:k>=250?1:1-Math.exp(-k/D)}function y(T,I,k){let D=k.x-I.x,B=k.y-I.y,W=Math.sqrt(Math.hypot(D,B));return T+Math.max(W,1e-4)}function O(T,I,k,D,B){let V=y(0,T,I),F=y(V,I,k),H=y(F,k,D),Y=V+(F-V)*B,$=(U,X,pe,xe)=>{let Je=xe-pe;if(!(Math.abs(Je)>1e-9))return{x:U.x,y:U.y};let et=(Y-pe)/Je;return{x:U.x+(X.x-U.x)*et,y:U.y+(X.y-U.y)*et}},K=$(T,I,0,V),Z=$(I,k,V,F),ee=$(k,D,F,H),ue=$(K,Z,0,F),de=$(Z,ee,V,H),ye=$(ue,de,V,F);return{x:hr(ye.x,Math.min(I.x,k.x),Math.max(I.x,k.x)),y:hr(ye.y,Math.min(I.y,k.y),Math.max(I.y,k.y))}}function C(T,I=4){let k=Math.max(1,Math.round(I));if(!Array.isArray(T)||T.length<2||k===1)return T;let D=W=>T[hr(W,0,T.length-1)],B=[T[0]];for(let W=0;W({x:B.x,y:B.y}));let D=hr(k,0,1);return I.map((B,W)=>({x:T[W].x+(B.x-T[W].x)*D,y:T[W].y+(B.y-T[W].y)*D}))}function z(T,I,k){if(!T||!I?.polygon?.length)return I;let D=E(u,k),B=a.get(T),W=w(B?.left,I.left,D),V=w(B?.right,I.right,D),F=w(B?.center,I.center,D),H={left:W,right:V,center:F,polygon:W.length>=2&&V.length>=2?W.concat([...V].reverse()):[]};return a.set(T,H),H}function M(T,I){let k=d(i.pathLengthIdx,T),D=Number.isFinite(Number(I))?Math.round(Number(I)*100):"default";if(k?.has(D))return k.get(D);let B=Array.isArray(T?.x)?T.x:[],W=0;for(let V=1;VI);V+=1)W=V;return k?.set(D,W),W}function R(T,I,k,D,B,W=!1,V=0,F=cc){let H=d(i.ribbon,I),Y=[Math.round(Ee(k,0)*1e3),Math.round(Ee(D,0)*1e3),Math.round(Ee(B,r)*100),W?1:0,Math.round(Ee(V,0)*1e3),F].join("|");if(H?.has(Y))return H.get(Y);let $=Array.isArray(I?.x)?I.x:[],K=Array.isArray(I?.y)?I.y:[],Z=Array.isArray(I?.z)?I.z:[],ee=[],ue=[],de=[],ye=[],U=M(I,B);m($,U,B,on=>{let te=Ee($[on],NaN);if(!Number.isFinite(te)||te<0)return;let Re=Ee(K[on],0)+V,mt=Ee(Z[on],0)+D,Ce=n(T,te,Re-k,mt),Ke=n(T,te,Re+k,mt),Ge=n(T,te,Re,mt);!Ce||!Ke||!Ge||!W&&de.length&&Ge.y>de[de.length-1].y||(ee.push(Ce),ue.push(Ke),de.push(Ge),ye.push(te))},F);let X=Ee(B,r),pe=b(F,"side"),xe=b(F,"center"),Je=x(ee,ye,X,.34*pe),et=x(ue,ye,X,.34*pe),ft=x(de,ye,X,.24*xe),He=o(),Ct=He?C(Je):Je,pt=He?C(et):et,rn=He?C(ft):ft,jn={left:Ct,right:pt,center:rn,polygon:Ct.length>=2&&pt.length>=2?Ct.concat([...pt].reverse()):[]};return H?.set(Y,jn),jn}function v(T,I,k,D,B,W){let V=d(i.verticalRibbon,I),F=[Math.round(Ee(k,0)*1e3),Math.round(Ee(D,0)*1e3),Math.round(Ee(B,0)*1e3),Math.round(Ee(W,r)*100)].join("|");if(V?.has(F))return V.get(F);let H=Array.isArray(I?.x)?I.x:[],Y=Array.isArray(I?.y)?I.y:[],$=Array.isArray(I?.z)?I.z:[],K=[],Z=[],ee=[],ue=M(I,W);m(H,ue,W,pe=>{let xe=Ee(H[pe],NaN);if(!Number.isFinite(xe)||xe<0)return;let Je=Ee(Y[pe],0)+k,et=Ee($[pe],0),ft=t(T,xe,Je,et+D),He=t(T,xe,Je,et+B);!ft||!He||K.length&&ft.y>K[K.length-1].y||(K.push(ft),Z.push(He),ee.push(xe))});let de=Ee(W,r),ye=x(K,ee,de,.34),U=x(Z,ee,de,.34),X=ye.length>=2&&U.length>=2?ye.concat([...U].reverse()):[];return V?.set(F,X),X}function h(T,I,k,D){if(!Array.isArray(T)||!Array.isArray(I)||T.length<2||I.length<2||T.length!==I.length)return[];let B=[],W=[];for(let V=0;VF&&W({}),r=typeof e.isPerformanceActive=="function"?e.isPerformanceActive:()=>!1,o=e.paletteColor,i=e.rgba,a=e.getCachedGradient,s=e.geometry||{},u=wn(e.pathZOffset,1.22),c=wn(e.maxDrawDistance,100);if(!t||typeof o!="function"||typeof i!="function"||typeof a!="function"||typeof s.drawPolygon!="function"||typeof s.drawPolyline!="function"||typeof s.buildRibbon!="function"||typeof s.smoothRibbon!="function"||typeof s.buildBandPolygon!="function"||typeof s.getSceneMaxDistance!="function"||typeof s.getPathMaxDistance!="function"||typeof s.getPathLengthIndex!="function")return null;function l(C,w,z,M){if(!Array.isArray(C)||C.length<3||C.length!==w.length)return;let R=o(z.paletteIndex),v=z.emphasisStroke?z.strokeColor:"";for(let h=0;h{let h=t.createLinearGradient(0,w,0,w*.32);return h.addColorStop(0,i(C,M)),h.addColorStop(.55,i(C,R)),h.addColorStop(1,i(C,0)),h})}function p(C,w,z){if(!C.polygon.length)return;let M=o(w.paletteIndex);if(w.mode===0){s.drawPolygon(C.polygon,i(M,.42),w.emphasisStroke?w.strokeColor:"",w.emphasisStroke?2:0);return}let R=d(w),v=r()?{type:"vertical-gradient",color:M,bottomAlpha:R.solidAlpha,midAlpha:R.midAlpha}:f(M,z,w);s.drawPolygon(C.polygon,v,w.emphasisStroke?w.strokeColor:"",w.emphasisStroke?1.7:0)}function m(C,w){if(!C.center.length)return;let z={1:[14,11],2:[10,8],3:[26,12],4:[18,10,5,10],5:[30,12],6:[12,7],7:[20,8,4,8],8:[8,6]},M=o(w.paletteIndex),R=z[w.mode]||z[1],v=R.reduce((S,A)=>S+A,0),h=-(performance.now()/120%v);s.drawPolyline(C.center,i(M,.78),5.5,R,h),w.emphasisStroke&&s.drawPolyline(C.center,w.strokeColor,1.6)}function b(C,w){let z=w.mode===9?3:w.mode===10?4:w.mode===11?5:6;l(C.left,C.right,w,z)}function g(C,w){let z=o(w.paletteIndex),M=[];(w.mode===13||w.mode===14)&&(M.push(s.buildBandPolygon(C.left,C.right,0,.18)),M.push(s.buildBandPolygon(C.left,C.right,.82,1))),(w.mode===13||w.mode===15)&&M.push(s.buildBandPolygon(C.left,C.right,.38,.62));for(let R of M)s.drawPolygon(R,i(z,.34),w.emphasisStroke?w.strokeColor:"",w.emphasisStroke?1.4:0)}function x(){return .9*gr(wn(n().ShowPathWidth,100)/100,.1,2)}function E(C,w,z,M,R,v){if(!C||!Array.isArray(C.x)||!C.x.length)return;let h=s.getSceneMaxDistance(w,z),S=s.buildRibbon(M,C,x(),u,s.getPathMaxDistance(h),!1),A=s.smoothRibbon(`path:${v?.laneMode?"lane":"model"}:${v?.mode??0}`,S,110);if(!(A.polygon.length<3)&&(p(A,v,R),v.mode!==0)){if(v.mode>=13&&v.mode<=15){g(A,v);return}if(v.mode>=9){b(A,v);return}m(A,v)}}function y(C,w,z,M){let R=Array.isArray(C?.laneLines)?C.laneLines:[],v=Array.isArray(C?.laneLineProbs)?C.laneLineProbs:[];if(!R.length)return;let h=wn(z?.carState?.leftLaneLine,0),S=wn(z?.carState?.rightLaneLine,0),A=s.getSceneMaxDistance(C,w),L=s.getPathLengthIndex(R[0],A);for(let P=0;P=.02?_:_>=.003?gr(_*6,.02,.12):0;if(T<=0)continue;let I=P===1&&Math.floor(h/10)===2,k=P===2&&Math.floor(S/10)===2,D=I||k?{r:255,g:217,b:94}:{r:255,g:255,b:255},W=Math.max(I||k?.025:.01,.025*T)*1.4,V=_>=.02?gr(T,.12,.7):gr(T*3,.16,.26),F=_>=.02?.2:.24,H=wn(R[P]?.x?.[L],c),Y=s.buildRibbon(M,R[P],W,0,H,!1,0,Cf),$=s.smoothRibbon(`lane:${P}`,Y,140);if(s.drawPolygon($.polygon,`rgba(${D.r},${D.g},${D.b},${V.toFixed(3)})`,`rgba(${D.r},${D.g},${D.b},${F.toFixed(3)})`,1),P===1&&h%10===4||P===2&&S%10===4){let K=P===1?-.3:.3,Z=s.buildRibbon(M,R[P],W,0,H,!1,K,Cf),ee=s.smoothRibbon(`lane:${P}:double:${K}`,Z,140);s.drawPolygon(ee.polygon,`rgba(${D.r},${D.g},${D.b},${V.toFixed(3)})`,`rgba(${D.r},${D.g},${D.b},${F.toFixed(3)})`,1)}}}function O(C,w,z){let M=Array.isArray(C?.roadEdges)?C.roadEdges:[],R=Array.isArray(C?.roadEdgeStds)?C.roadEdgeStds:[];if(!M.length)return;let v=s.getSceneMaxDistance(C,w),h=s.getPathLengthIndex(M[0],v);for(let S=0;S0&&nn(e?.dRel,1/0)({}),n=nn(e.pathZOffset,1.22),r=e.geometry||{},o=e.ui||{};if(typeof r.buildVerticalRibbon!="function"||typeof r.drawPolygon!="function"||typeof r.samplePathY!="function"||typeof r.interpolate!="function"||typeof r.projectPoint!="function"||typeof r.drawPolyline!="function"||typeof o.getScale!="function"||typeof o.displayDistance!="function"||typeof o.clampTextAnchor!="function"||typeof o.drawText!="function")return null;function i(s,u,c,l){if(!s||!Array.isArray(s.x)||s.x.length<2)return;let d=u?.radarState||{},f=c?.carState||{},p=u?.lateralPlan||{},m=nn(f?.vEgo,nn(f?.vEgoCluster,0)),b=nn(p?.laneChangeState,0),g=nn(p?.laneChangeDirection,0),x=!!f?.leftBlindspot,E=!!f?.rightBlindspot,y=!x&&b===1&&g===1&&_f(d?.leadLeft,m),O=!E&&b===1&&g===2&&_f(d?.leadRight,m);if(!x&&!E&&!y&&!O)return;let C="rgba(255, 215, 0, 0.48)",w="rgba(255, 215, 0, 0.84)",z="rgba(0, 204, 0, 0.44)",M="rgba(0, 204, 0, 0.80)",R=(v,h,S)=>{let A=r.buildVerticalRibbon(l,s,v,1.15,.6,40);A.length<8||r.drawPolygon(A,h,S,1.2)};x?R(-1.7,C,w):y&&R(-1.7,z,M),E?R(1.7,C,w):O&&R(1.7,z,M)}function a(s,u,c,l,d){if(nn(t().ShowPathEnd,0)<=0)return;let f=nn(u?.desiredDistance,0);if(!Number.isFinite(f)||f<=0)return;let p=Array.isArray(s?.x)?s.x:[];if(p.length<2)return;let m=nn(p[p.length-1],0);if(!m||f>m)return;let b=r.samplePathY(s,f),g=r.interpolate(f,p,Array.isArray(s?.z)?s.z:[]);if(!Number.isFinite(b)||!Number.isFinite(g))return;let x=r.projectPoint(c,f,b-1,g+n),E=r.projectPoint(c,f,b+1,g+n);if(!x||!E)return;let y=o.getScale(l,d);r.drawPolyline([x,E],"rgba(255,255,255,0.92)",Math.max(3*y,1.6));let O=`${o.displayDistance(f).toFixed(1)}(${nn(u?.tFollow,0).toFixed(2)})`,C=Math.max(20*y,12),w=o.clampTextAnchor({x:E.x+10,y:E.y-4},O,C,l,d);o.drawText(O,w.x,w.y,{fontSize:C,fontWeight:800,align:"left",strokeWidth:Math.max(3.4*y,1.8)})}return Object.freeze({drawBlindspotBarriers:i,drawProjectedTfMarker:a})}var Nf=Object.freeze({create:bv});function Df(e=globalThis){return e.DriveVisionRoadOverlayAuxRenderer=Nf,Nf}function Dt(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function lc(e={}){let t=typeof e.text=="function"?e.text:(c,l)=>l;function n(c){let l=Array.isArray(c?.leadsV3)?c.leadsV3[0]:null,d=Dt(l?.prob,0),f=Dt(l?.x?.[0],0);return d>.5&&f>0?Math.max(0,f-1.52):0}function r(c,l){let d=l?.longitudinalPlan||{},f=c?.carrotMan||l?.carrotMan||{},p=l?.carState||{},m=Dt(d?.xState,Dt(f?.xState,-1)),b=Dt(d?.trafficState,Dt(f?.trafficState,-1)),g=!!l?.controlsState?.enabled,x=Dt(p?.vEgo,Dt(p?.vEgoCluster,0)),E=!!p?.brakeHoldActive,y=Dt(p?.softHoldActive,0)>0,O=Dt(p?.carrotCruise,0)>0;return E||y||O?{text:E?"AUTOHOLD":y?"SOFTHOLD":"CARROT",xState:m,showDistanceBadge:!1}:g?m===3||m===5?{text:x<1?b>=1e3?"Signal Error":"Signal Ready":"Signal slowing",xState:m,showDistanceBadge:!1}:m===4?{text:t("e2e_driving","E2E driving"),xState:m,showDistanceBadge:!1}:m===0||m===1||m===2?{text:"",xState:m,showDistanceBadge:!0}:{text:"",xState:m,showDistanceBadge:!1}:{text:"",xState:m,showDistanceBadge:!0}}function o(c){return c===0?"#ffffff":c===1?"#b0b0b0":"#23d55d"}function i(c){let l=c?.carState||{};return l?.brakeHoldActive?"AUTOHOLD":Dt(l?.softHoldActive,0)>0?"SOFTHOLD":Dt(l?.carrotCruise,0)>0?"CARROT":""}function a(c){let l=c&&typeof c=="object"?c:{},d=[...Array.isArray(l.leadsLeft)?l.leadsLeft:[],...Array.isArray(l.leadsRight)?l.leadsRight:[],...Array.isArray(l.leadsCenter)?l.leadsCenter:[]];if(d.length)return d;let f=[];return l.leadOne?.status&&f.push(l.leadOne),l.leadTwo?.status&&f.push(l.leadTwo),f}function s(c){let d=(Array.isArray(c?.laneLines)?c.laneLines:[])[2];return Array.isArray(d?.x)&&Array.isArray(d?.z)&&d.x.length&&d.z.length?d:c?.position||null}function u(c,l){let d=c?.leadTwo||null,f=!!d?.status&&!!d?.radar&&Dt(d?.dRel,0)>Dt(c?.leadOne?.dRel,0)+3,p=Dt(l?.longitudinalPlanSource,0)===2?2:1;return{lead:d,valid:f,status:p}}return Object.freeze({getPrimaryVisionDistance:n,resolveLeadState:r,getDistanceBadgeTextColor:o,getPathStatusText:i,getRadarTracks:a,getRadarProjectionLine:s,resolveLeadTwo:u})}var Pf=Object.freeze({create:lc});function Lf(e=globalThis){return e.DriveVisionRoadOverlayLeadModel=Pf,Pf}var kf=1500;function yv(e,t,n){return Math.min(n,Math.max(t,e))}function Pt(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function vv(e={}){let t=e.context,n=e.model||lc(e.modelOptions),r=typeof e.getParams=="function"?e.getParams:()=>({}),o=typeof e.isMetricDisplay=="function"?e.isMetricDisplay:()=>!0,i=typeof e.displayDistance=="function"?e.displayDistance:R=>Number(R),a=e.baseCamera||{width:1928,height:1208},s=String(e.fontFamily||"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"),u=e.projection||{},c=e.geometry||{},l=e.ui||{},d=e.temporal||{};if(!t||!n?.resolveLeadState||typeof u.projectLeadBox!="function"||typeof u.projectLeadTwoBox!="function"||typeof u.projectPathEndAnchorBox!="function"||typeof u.samplePathZ!="function"||typeof u.projectPointPrecise!="function"||typeof c.drawPolyline!="function"||typeof c.drawPolygon!="function"||typeof c.circlePolygon!="function"||typeof l.getScale!="function"||typeof l.getBadgeOffsets!="function"||typeof l.getVisibleRect!="function"||typeof l.fillRoundedRect!="function"||typeof l.strokeRoundedRect!="function"||typeof l.drawText!="function"||typeof d.now!="function"||typeof d.resetLeadSlot!="function"||typeof d.resetLeadTwo!="function")return null;let f,p;function m(){f={lastValidMs:0,box:null,strokeColor:null,isLeadScc:!1,radarDist:0,visionDist:0,badgeTextColor:"#ffffff"},p={lastCameraFrameId:NaN,lastModelFrameId:NaN,lastSourceWidth:NaN,lastSourceHeight:NaN}}function b(R=d.now()){return!f.box||R-Pt(f.lastValidMs,0)>=kf?null:f.box}function g(R,v,h,S){let A=Pt(R,NaN),L=Pt(v,NaN),P=Pt(h,NaN),_=Pt(S,NaN),T=p,I=Number.isFinite(T.lastSourceWidth)&&Number.isFinite(T.lastSourceHeight)&&(Math.abs(T.lastSourceWidth-A)>.5||Math.abs(T.lastSourceHeight-L)>.5),k=Number.isFinite(T.lastCameraFrameId)&&Number.isFinite(_)&&_{let X=B*.62,pe=Math.max(52*F,16*F+de.length*X),xe=ye-pe*.5;l.fillRoundedRect(t,xe,V,pe,D,k.radius,U),t.save(),t.font=`800 ${B}px ${s}`,t.textAlign="center",t.textBaseline="middle",t.lineJoin="round",t.strokeStyle="rgba(0,0,0,0.82)",t.fillStyle=A,t.lineWidth=k.strokeWidth,t.strokeText(de,ye,V+D*.54),t.fillText(de,ye,V+D*.54),t.restore()},Y=S?"rgba(255,0,0,0.92)":"rgba(255,175,3,0.92)",$="rgba(0,0,255,0.92)",K=R.centerX-k.dx,Z=R.centerX+k.dx,ee=v<10?v.toFixed(1):v.toFixed(0),ue=h<10?h.toFixed(1):h.toFixed(0);v>0&&h>0?(H(ee,K,Y),H(ue,Z,$)):v>0?H(ee,K,Y):h>0&&H(ue,Z,$)}function O(R,v,h,S,A,L,P){if(!R?.rect||!v)return;let _=l.getScale(h,S),T=l.getBadgeOffsets(h,S),I=l.getVisibleRect(h,S,A,L,P),k=Math.min(R.centerY+T.textBaselineOffset,Math.max(I.top+6*_,I.bottom-6*_));l.drawText(v,R.centerX,k,{fontSize:Math.max(50*_,22),fontWeight:900,fillStyle:"#ffffff",strokeStyle:"rgba(0,0,0,0.88)",strokeWidth:Math.max(4*_,2.2),align:"center",baseline:"bottom"})}function C(R,v,h,S,A){if(!R||!v)return;let L=l.getScale(S,A),P=Math.max(40*L,35*L*String(v).length),_=Math.max(42*L,20),T=R.x-P*.5,I=R.y-35*L;l.fillRoundedRect(t,T,I,P,_,Math.max(15*L,7),h),l.drawText(String(v),R.x,R.y,{fontSize:Math.max(40*L,18),fontWeight:900,strokeWidth:Math.max(4.2*L,2.2)})}function w(R,v,h,S,A,L=null){let P=n.getPathStatusText(v);if(!P)return;let _=L||u.projectPathEndAnchorBox(R,h,S,A);if(!_)return;let T=l.getScale(S,A),I=Math.max(50*T,22),k=yv(_.centerY+60*T,I+8*T,A-10*T);l.drawText(P,_.centerX,k,{fontSize:I,fontWeight:900,fillStyle:"#ffffff",strokeStyle:"rgba(0,0,0,0.88)",strokeWidth:Math.max(4*T,2.2),align:"center",baseline:"bottom"})}function z(R,v,h,S,A){let L=r(),P=Pt(L.ShowRadarInfo,0);if(P<=0)return;let _=n.getRadarProjectionLine(v);if(!_)return;let T=Pt(L.RadarLatFactor,0)/100,I=o();for(let k of n.getRadarTracks(R)){let D=Pt(k?.dRel,0);if(!Number.isFinite(D)||D<=2.5)continue;let B=Pt(k?.yRel,0),W=u.samplePathZ(_,D)-.61,V=u.projectPointPrecise(h,D,-B,W);if(!V)continue;let F=Pt(k?.vLeadK,Pt(k?.vRel,0)),H=Pt(k?.vLat,0),Y=Math.sqrt(F*F+H*H),$=F>=0?Y:-Y,K=!!k?.radar,Z=Pt(k?.modelProb,0);if(Y>3){let ee=Math.max(2,D+F*T),ue=B+H*T,de=Math.abs(F)>3?u.projectPointPrecise(h,ee,-ue,W):null;if(de){let X=$>=0?"rgba(35,213,93,0.94)":"rgba(255,59,48,0.94)",pe=l.getScale(S,A);c.drawPolyline([V,de],X,Math.max(3*pe,1.6)),c.drawPolygon(c.circlePolygon(de.x,de.y,Math.max(10*pe,5)),X)}let ye="rgba(255,59,48,0.96)";K?Math.abs(Z-.01)<.001?ye="rgba(35,213,93,0.96)":$>0&&(ye="rgba(255,167,38,0.96)"):ye="rgba(61,123,255,0.96)";let U=$*(I?3.6:2.2369363);if(C(V,U.toFixed(0),ye,S,A),P>=2){let X=l.getScale(S,A);l.drawText(i(Pt(k?.yRel,0)).toFixed(1),V.x,V.y-40*X,{fontSize:Math.max(30*X,15),fontWeight:900,strokeWidth:Math.max(3.8*X,2)}),l.drawText(i(D).toFixed(1),V.x,V.y+30*X,{fontSize:Math.max(30*X,15),fontWeight:900,strokeWidth:Math.max(3.8*X,2)})}}else if(P>=3){let ee=l.getScale(S,A);l.drawText("*",V.x,V.y,{fontSize:Math.max(40*ee,18),fontWeight:900,strokeWidth:Math.max(4.2*ee,2.2)})}}}function M(R,v,h,S,A,L,P,_,T){let I=v?.radarState||{},k=R?.position||null,D=n.resolveLeadState(v,h),B=v?.roadCameraState||null,W=n.resolveLeadTwo(I,h?.longitudinalPlan||{});g(A,L,R?.frameId,B?.frameId);let V=u.projectLeadBox(I?.leadOne,k,S,A,L,0,P,_,T,{includeDistanceBadge:D?.showDistanceBadge!==!1,includeStateText:!!D?.text}),F=d.now(),H=null;if(V){let Y=V.radarTrackId<1,$=V.radarDetected?Y?"rgba(255,0,0,0.96)":"rgba(255,175,3,0.96)":"rgba(0,0,255,0.96)";if(E(V,!0),x(V,$,"rgba(0,0,0,0.20)",!0),f.lastValidMs=F,f.box=V,f.strokeColor=$,f.isLeadScc=Y,D?.showDistanceBadge!==!1){let K=I?.leadOne?.radar?Math.max(0,Pt(I?.leadOne?.dRel,0)):0,Z=n.getPrimaryVisionDistance(R);if(f.radarDist=K,f.visionDist=Z,K>0||Z>0){let ee=n.getDistanceBadgeTextColor(D?.xState);f.badgeTextColor=ee,y(V,K,Z,Y,ee,A,L,P,_,T)}}D?.text&&O(V,D.text,A,L,P,_,T),H=V}else if(f.box&&F-f.lastValidMs0||Y.visionDist>0)&&y(Y.box,Y.radarDist,Y.visionDist,Y.isLeadScc,Y.badgeTextColor,A,L,P,_,T),D?.text&&O(Y.box,D.text,A,L,P,_,T),H=Y.box}else f.box=null;if(W.valid){let Y=u.projectLeadTwoBox(W.lead,k,S,A,L,P,_,T);Y&&(E(Y,!1),x(Y,"rgba(218,111,37,0.96)",W.status===2?"rgba(255,0,0,0.20)":"rgba(0,0,0,0.20)",!1))}else d.resetLeadSlot(1),d.resetLeadTwo();w(k,h,S,A,L,H),z(I,R,S,A,L)}return m(),Object.freeze({draw:M,reset:m,getHeldBox:b})}var Ff=Object.freeze({create:vv});function zf(e=globalThis){return e.DriveVisionRoadOverlayLeadRenderer=Ff,Ff}var Tt=Object.freeze({INACTIVE:"inactive",SUSPENDED:"suspended",WAITING:"waiting",RUNNING:"running"}),hn=Object.freeze({VISIBLE:"visible",HIDDEN:"hidden",FROZEN:"frozen"}),In=Object.freeze({UNKNOWN:"unknown",REACHABLE:"reachable",UNREACHABLE:"unreachable"}),mn=Object.freeze({IDLE:"idle",CONNECTING:"connecting",CONNECTED:"connected",RECOVERING:"recovering",BLOCKED:"blocked"}),Oe=Object.freeze({USER_START:"user-start",USER_STOP:"user-stop",PAGE_HIDDEN:"page-hidden",PAGE_FROZEN:"page-frozen",PAGE_VISIBLE:"page-visible",PAGE_RESTORED:"page-restored",WINDOW_FOCUS:"window-focus",SOURCE_AVAILABLE:"source-available",SOURCE_UNAVAILABLE:"source-unavailable",NETWORK_REACHABLE:"network-reachable",NETWORK_UNREACHABLE:"network-unreachable",CONNECT_BEGIN:"connect-begin",CONNECT_SUCCESS:"connect-success",CONNECT_FAILURE:"connect-failure",CONNECT_ABORTED:"connect-aborted",CONNECTION_LOST:"connection-lost",OWNERSHIP_BLOCKED:"ownership-blocked",OWNERSHIP_RELEASED:"ownership-released",DISCONNECT_COMPLETE:"disconnect-complete"}),gn=Object.freeze({ENSURE_RUNNING:"ensure-running",ENSURE_SUSPENDED:"ensure-suspended",ENSURE_STOPPED:"ensure-stopped",SCHEDULE_RECOVERY:"schedule-recovery"}),Sv=new Set(Object.values(Oe)),Mv=new Set(Object.values(hn)),Av=new Set(Object.values(In)),Rv=new Set(Object.values(mn));function Vf(e){return e.requested?e.page!==hn.VISIBLE?Tt.SUSPENDED:!e.sourceAvailable||e.network===In.UNREACHABLE?Tt.WAITING:Tt.RUNNING:Tt.INACTIVE}function jf(e){return e===Tt.RUNNING?gn.ENSURE_RUNNING:e===Tt.INACTIVE?gn.ENSURE_STOPPED:gn.ENSURE_SUSPENDED}function xv(e){return Mv.has(e)?e:hn.VISIBLE}function Ev(e){return Av.has(e)?e:In.UNKNOWN}function Tv(e){return Rv.has(e)?e:mn.IDLE}function Hf(e){return Object.freeze({requested:!!e.requested,page:xv(e.page),sourceAvailable:e.sourceAvailable!==!1,network:Ev(e.network),desired:e.desired,phase:Tv(e.phase),revision:Math.max(0,Number.parseInt(e.revision,10)||0)})}function Bf(e={}){let t={requested:!1,page:hn.VISIBLE,sourceAvailable:!0,network:In.UNKNOWN,phase:mn.IDLE,revision:0,...e};return t.desired=Vf(t),Hf(t)}function Ov(e,t){return e.requested!==t.requested||e.page!==t.page||e.sourceAvailable!==t.sourceAvailable||e.network!==t.network||e.desired!==t.desired||e.phase!==t.phase}function Cv(e,t){let n=Bf(e),r=typeof t=="string"?t:t?.type;if(!Sv.has(r))throw new TypeError(`Unknown Carrot Vision session event: ${String(r)}`);let o={...n},i=null;switch(r){case Oe.USER_START:o.requested=!0;break;case Oe.USER_STOP:o.requested=!1;break;case Oe.PAGE_HIDDEN:o.page=hn.HIDDEN;break;case Oe.PAGE_FROZEN:o.page=hn.FROZEN;break;case Oe.PAGE_VISIBLE:case Oe.PAGE_RESTORED:case Oe.WINDOW_FOCUS:o.page=hn.VISIBLE;break;case Oe.SOURCE_AVAILABLE:o.sourceAvailable=!0;break;case Oe.SOURCE_UNAVAILABLE:o.sourceAvailable=!1;break;case Oe.NETWORK_REACHABLE:o.network=In.REACHABLE;break;case Oe.NETWORK_UNREACHABLE:o.network=In.UNREACHABLE;break;case Oe.CONNECT_BEGIN:o.phase=mn.CONNECTING;break;case Oe.CONNECT_SUCCESS:o.phase=mn.CONNECTED,n.desired!==Tt.RUNNING&&(i=jf(n.desired));break;case Oe.CONNECT_FAILURE:case Oe.CONNECTION_LOST:o.phase=n.desired===Tt.RUNNING?mn.RECOVERING:mn.IDLE,n.desired===Tt.RUNNING&&(i=gn.SCHEDULE_RECOVERY);break;case Oe.CONNECT_ABORTED:case Oe.DISCONNECT_COMPLETE:o.phase=mn.IDLE;break;case Oe.OWNERSHIP_BLOCKED:o.phase=mn.BLOCKED;break;case Oe.OWNERSHIP_RELEASED:o.phase=mn.IDLE,n.desired===Tt.RUNNING&&(i=gn.ENSURE_RUNNING);break;default:break}o.desired=Vf(o);let a=[];n.desired!==o.desired?a.push(jf(o.desired)):i&&a.push(i);let s=Ov(n,o);return o.revision=s?n.revision+1:n.revision,Object.freeze({changed:s,state:Hf(o),effects:Object.freeze(a)})}var uc=Object.freeze({desired:Tt,page:hn,network:In,phase:mn,event:Oe,effect:gn,createState:Bf,reduce:Cv});function Gf(e=globalThis){return e?(e.DriveVisionSessionPolicy||(e.DriveVisionSessionPolicy=uc),e.DriveVisionSessionPolicy):uc}var Wf=uc;var wv=Object.freeze({[Tt.INACTIVE]:gn.ENSURE_STOPPED,[Tt.SUSPENDED]:gn.ENSURE_SUSPENDED,[Tt.WAITING]:gn.ENSURE_SUSPENDED,[Tt.RUNNING]:gn.ENSURE_RUNNING});function Iv(e){if(typeof queueMicrotask=="function"){queueMicrotask(e);return}Promise.resolve().then(e)}function _v(e,t=!1){return e===hn.FROZEN?Oe.PAGE_FROZEN:e===hn.HIDDEN?Oe.PAGE_HIDDEN:t?Oe.PAGE_RESTORED:Oe.PAGE_VISIBLE}function Nv(e){return e===In.REACHABLE?Oe.NETWORK_REACHABLE:e===In.UNREACHABLE?Oe.NETWORK_UNREACHABLE:null}function Dv(e,t){return Object.freeze({...e||{},...t||{},reasons:Object.freeze([...(e?.reasons||[]).filter(Boolean),...(t?.reasons||[]).filter(Boolean),t?.reason].filter(Boolean)),freshSession:!!(e?.freshSession||t?.freshSession)})}function Pv(e={}){let t=e.policy||Wf,n=e.handlers||{},r=typeof e.schedule=="function"?e.schedule:Iv,o=typeof e.onTransition=="function"?e.onTransition:null,i=typeof e.onEffect=="function"?e.onEffect:null,a=typeof e.onError=="function"?e.onError:null,s=t.createState(e.initialState||{}),u=null,c=!1,l=!1,d=!1,f=[];function p(){if(c||l||u)return;let w=f;f=[],w.forEach(z=>z(s))}async function m(){if(l||d){p();return}l=!0;try{for(;u&&!d;){let w=u;u=null;let z=n[w.effect];if(i?.(w),typeof z=="function")try{await z(Object.freeze({effect:w.effect,detail:w.detail,state:s,revision:w.revision}))}catch(M){a?.(M,w)}}}finally{l=!1,u&&!d&&b(),p()}}function b(){c||l||d||(c=!0,r(()=>{c=!1,m()}))}function g(w,z={}){if(!w||d)return;let M=u?.effect===w?u.detail:null;u=Object.freeze({effect:w,detail:Dv(M,z),revision:s.revision}),b()}function x(w,z={}){if(d)return Object.freeze({changed:!1,state:s,effects:Object.freeze([])});let M=typeof w=="string"?w:w?.type,R=t.reduce(s,w),v=s;s=R.state,o?.(Object.freeze({type:M,previous:v,...R,detail:z}));let h=M===Oe.PAGE_RESTORED;return R.effects.forEach(S=>{g(S,{...z,event:M,freshSession:!!(z.freshSession||h)})}),R}function E(w={},z={}){if(Object.prototype.hasOwnProperty.call(w,"requested")){let M=!!w.requested;M!==s.requested&&x(M?Oe.USER_START:Oe.USER_STOP,z)}if(Object.prototype.hasOwnProperty.call(w,"page")){let M=w.page;(M!==s.page||z.restored===!0)&&x(_v(M,z.restored===!0),z)}if(Object.prototype.hasOwnProperty.call(w,"sourceAvailable")){let M=w.sourceAvailable!==!1;M!==s.sourceAvailable&&x(M?Oe.SOURCE_AVAILABLE:Oe.SOURCE_UNAVAILABLE,z)}if(Object.prototype.hasOwnProperty.call(w,"network")){let M=w.network,R=Nv(M);R&&M!==s.network&&x(R,z)}return s}function y(w={}){g(wv[s.desired],{...w,event:"reconcile"})}function O(){return!c&&!l&&!u?Promise.resolve(s):new Promise(w=>f.push(w))}function C(){d=!0,u=null,p()}return Object.freeze({dispatch:x,updateInputs:E,reconcile:y,whenIdle:O,destroy:C,snapshot:()=>s,status:()=>Object.freeze({state:s,scheduled:c,processing:l,pendingEffect:u?.effect||null,destroyed:d})})}var $f=Object.freeze({create:Pv});function Uf(e=globalThis){return e?(e.DriveVisionLifecycleController||(e.DriveVisionLifecycleController=$f),e.DriveVisionLifecycleController):$f}var Kf="vision-connection-stale",ko=class extends Error{constructor(t="Carrot Vision connection attempt is no longer current"){super(t),this.name="AbortError",this.code=Kf}};function Lv(e){return typeof e=="function"?e():typeof AbortController=="function"?new AbortController:null}function kv(e,t){if(!(!e||e.signal?.aborted))try{e.abort(new ko(t))}catch{try{e.abort()}catch{}}}function Fv(e={}){let t=e.abortControllerFactory,n=typeof e.now=="function"?e.now:()=>Date.now(),r=0,o=null,i=null,a="idle",s="";function u(g){return!!(g&&o===g&&g.generation===r&&g.signal?.aborted!==!0)}function c(g,x=""){if(!u(g))throw new ko(x||"Carrot Vision connection attempt was superseded");return g}function l(g="connection cancelled",x=null){if(x&&o!==x)return!1;let E=i,y=!!o;return r+=1,o=null,i=null,a="idle",s=String(g||"connection cancelled"),kv(E,s),y}function d(g={}){l(g.supersedeReason||"connection superseded"),r+=1;let x=Lv(t),E=Object.freeze({generation:r,attemptId:String(g.attemptId||""),signal:x?.signal||null,startedAtMs:n()});return o=E,i=x,a="connecting",s="",E}function f(g){return c(g),a="active",!0}function p(g,x={}){return!(!u(g)||x.generation!=null&&Number(x.generation)!==g.generation||x.attemptId!=null&&String(x.attemptId)!==g.attemptId)}function m(g,x){return!u(g)||typeof x!="function"?!1:(x(g),!0)}function b(){return Object.freeze({generation:r,phase:a,active:!!o,attemptId:o?.attemptId||"",startedAtMs:o?.startedAtMs||0,aborted:!!o?.signal?.aborted,lastCancelReason:s})}return Object.freeze({begin:d,cancel:l,assertCurrent:c,isCurrent:u,markActive:f,matches:p,runIfCurrent:m,current:()=>o,snapshot:b})}var Yf=Object.freeze({abortCode:Kf,AbortError:ko,create:Fv});function qf(e=globalThis){return e?(e.DriveVisionConnectionTransactions||(e.DriveVisionConnectionTransactions=Yf),e.DriveVisionConnectionTransactions):Yf}var Xr=Object.freeze({DISABLED:"disabled",CHECKING:"checking",REACHABLE:"reachable",WAITING:"waiting"}),zv=Object.freeze([300,600,1200,2400,4e3]);function jv(e,t){return setTimeout(e,t)}function Vv(e){clearTimeout(e)}function dc(e,t){let n=Number(e);return Number.isFinite(n)&&n>=0?n:t}function Hv(e){return Object.freeze({enabled:e.enabled,state:e.state,reachable:e.reachable,generation:e.generation,failureCount:e.failureCount,inFlight:e.inFlight,queueScheduled:e.queueScheduled,nextCheckAtMs:e.nextCheckAtMs,lastSuccessAtMs:e.lastSuccessAtMs,lastFailureAtMs:e.lastFailureAtMs,lastReason:e.lastReason,lastError:e.lastError,browserOnlineHint:e.browserOnlineHint,originClassification:e.originClassification})}function Bv(e={}){if(typeof e.probe!="function")throw new TypeError("Carrot Vision network recovery requires a probe function");let t=e.probe,n=typeof e.schedule=="function"?e.schedule:jv,r=typeof e.cancel=="function"?e.cancel:Vv,o=typeof e.now=="function"?e.now:Date.now,i=typeof e.onState=="function"?e.onState:null,a=dc(e.healthyIntervalMs,12e3),s=dc(e.probeTimeoutMs,1500),u=Array.isArray(e.backoffMs)&&e.backoffMs.length?Object.freeze(e.backoffMs.map(D=>dc(D,500))):zv,c=e.AbortControllerImpl||globalThis.AbortController,l=!1,d=Xr.DISABLED,f=null,p=0,m=0,b=null,g=null,x=null,E=null,y=null,O=null,C=null,w="",z="",M=null,R="not-checked";function v(){return Hv({enabled:l,state:d,reachable:f,generation:p,failureCount:m,inFlight:!!x,queueScheduled:b!==null,nextCheckAtMs:y,lastSuccessAtMs:O,lastFailureAtMs:C,lastReason:w,lastError:z,browserOnlineHint:M,originClassification:R})}function h(D,B={}){d=D,B.reason&&(w=String(B.reason));let W=v();return i?.(W,Object.freeze({...B})),W}function S(){b!==null&&r(b),b=null,y=null}function A(){g!==null&&r(g),g=null}function L(D,B,W=!1){if(!l)return!1;S();let V=Math.max(0,Number(D)||0);return y=o()+V,W&&h(Xr.WAITING,{reason:B,delayMs:V}),b=n(()=>{b=null,y=null,P(B)},V),!0}async function P(D="network check"){if(!l)return!1;if(x)return x;S();let B=++p,W=f===!0;E=typeof c=="function"?new c:null;let V=E?.signal;h(Xr.CHECKING,{reason:D,retainedReachability:W}),s>0&&E&&(g=n(()=>{g=null;try{E?.abort(new DOMException("Server reachability probe timed out","TimeoutError"))}catch{E?.abort()}},s));let F=(async()=>{try{let H=await t(Object.freeze({signal:V,generation:B,reason:D}));if(!l||B!==p)return!1;if(H===!1||H?.ok===!1)throw new Error(H?.error||"Server reachability probe failed");return A(),f=!0,m=0,O=o(),z="",R="current-origin-reachable",h(Xr.REACHABLE,{reason:D}),L(a,"scheduled server reachability check"),!0}catch(H){if(A(),!l||B!==p||V?.aborted&&H?.name==="AbortError")return!1;f=!1,m+=1,C=o(),z=String(H?.message||H||"Server reachability probe failed"),R=m>=3?"possible-origin-address-change-or-hotspot-route":"current-origin-unreachable";let Y=u[Math.min(m-1,u.length-1)];return L(Y,D,!0),!1}finally{B===p&&(A(),E=null,x=null)}})();return x=F,F}function _(D,B={}){let W=!!D;return W===l?(W&&B.force===!0&&T(B.reason||"forced network check"),v()):(l=W,l?(f=!1,m=0,R="not-checked",P(B.reason||"network recovery enabled"),v()):(p+=1,S(),A(),E?.abort(),E=null,x=null,f=null,m=0,z="",R="not-checked",h(Xr.DISABLED,{reason:B.reason||"network recovery disabled"})))}function T(D="network hint"){return l?(S(),P(D)):Promise.resolve(!1)}function I(D,B="browser network hint"){return M=typeof D=="boolean"?D:null,T(B)}function k(){_(!1,{reason:"network recovery destroyed"})}return Object.freeze({setEnabled:_,requestCheck:T,noteBrowserHint:I,reportTransportFailure:T,snapshot:v,destroy:k})}var Xf=Object.freeze({state:Xr,create:Bv});function Qf(e=globalThis){return e?(e.DriveVisionNetworkRecovery||(e.DriveVisionNetworkRecovery=Xf),e.DriveVisionNetworkRecovery):Xf}var br="/shared-assets",Zf=`${br}/icons_mici/carrot_wheel_org.png`,fc=`${br}/icons_mici/carrot_wheel_lane.png`,Jf=`${br}/icons_mici/settings/network/wifi_strength_full.png`,ep=`${br}/images/speed_bg.png`,tp=`${br}/images/traffic_red.png`,np=`${br}/images/traffic_green.png`,rp=`${br}/fonts/KaiGenGothicKR-Bold.ttf`;var op="carrot-hud-overlay-style",Gv=` +(()=>{var kc={schemaVersion:1,defaults:{primary:"vision",secondary:"navigation"},contents:[{id:"vision",labelKey:"web_settings_carrot_vision",supportedSlots:["primary","secondary"],supportedSources:["live","replay"],singleton:!0},{id:"navigation",labelKey:"web_settings_navigation",supportedSlots:["primary","secondary"],supportedSources:["live","replay"],singleton:!0},{id:"drive_insights",labelKey:"web_drive_layout_content_drive_insights",supportedSlots:["primary","secondary"],supportedSources:["live","replay"],singleton:!0}]};var Ft=Object.freeze({UNMOUNTED:"unmounted",INACTIVE:"inactive",ACTIVE:"active",DESTROYED:"destroyed"}),Fc=Object.freeze(["mount","activate","deactivate","resize","status","destroy"]),zc=new WeakSet;function um(e){return e?.target||globalThis}function dm(e,t={},n={}){let r=String(e||"").trim();if(!r)throw new TypeError("DriveContent requires a name");for(let y of Fc)if(t[y]!=null&&typeof t[y]!="function")throw new TypeError(`DriveContent ${r}.${y} must be a function`);let o=um(n),i=null,a=Ft.UNMOUNTED,s=!1,u=0;function c(y){if(a===Ft.DESTROYED)throw new Error(`DriveContent ${r} cannot ${y} after destroy`)}function l(){return{name:r,state:a,mounted:i!==null,active:a===Ft.ACTIVE,keepWarm:s,rootConnected:!!(i&&(i.isConnected??!0)),generation:u}}function d(y){typeof o.dispatchEvent!="function"||typeof o.CustomEvent!="function"||o.dispatchEvent(new o.CustomEvent("drive:contentstatechange",{detail:{...l(),reason:String(y||"")}}))}function f(y){if(c("mount"),!y||typeof y!="object")throw new TypeError(`DriveContent ${r}.mount requires a root element`);if(i===y)return!1;if(a===Ft.ACTIVE)throw new Error(`DriveContent ${r} must deactivate before moving to another root`);let O=i;return t.mount?.(y,Object.freeze({previousRoot:O,remount:O!==null})),i=y,a=Ft.INACTIVE,s=!1,u+=1,d(O===null?"mount":"remount"),!0}function m(y={}){if(c("activate"),i===null)throw new Error(`DriveContent ${r} must mount before activate`);let O=t.activate?.(y),C=a!==Ft.ACTIVE||s;return a=Ft.ACTIVE,s=!1,C&&(u+=1,d("activate")),O??C}function p(y={}){if(c("deactivate"),i===null||a!==Ft.ACTIVE)return!1;let O=!!y.keepWarm,C=t.deactivate?.({...y,keepWarm:O});return a=Ft.INACTIVE,s=O,u+=1,d("deactivate"),C??!0}function b(y){return c("resize"),i===null?!1:t.resize?.(y,{active:a===Ft.ACTIVE})??!1}function g(){let y={};try{let O=t.status?.();O&&typeof O=="object"&&(y=O)}catch(O){y={error:String(O?.message||O||"status failed")}}return{...y,...l()}}function x(){if(a===Ft.DESTROYED)return!1;let y=null;try{a===Ft.ACTIVE&&t.deactivate?.({keepWarm:!1,reason:"destroy"})}catch(O){y=O}try{t.destroy?.(i)}catch(O){y??=O}finally{i=null,a=Ft.DESTROYED,s=!1,u+=1,d("destroy")}if(y)throw y;return!0}let E=Object.freeze({name:r,mount:f,activate:m,deactivate:p,resize:b,status:g,destroy:x});return zc.add(E),E}function oo(e){return!!(e&&typeof e=="object"&&zc.has(e))}var Wo=Object.freeze({STATE:Ft,HOOK_NAMES:Fc,create:dm,isContent:oo});function jc(e=globalThis){return e.DriveContent=Wo,Wo}var Ki=Object.freeze(["primary","secondary"]),qi=Object.freeze(["live","replay"]),fm="NO_SUPPORTED_CONTENT",Vc=/^[a-z][a-z0-9_]*$/,pm=Object.freeze(["id","labelKey","factory","supportedSlots","supportedSources","singleton"]),mm=Object.freeze(["schemaVersion","defaults","contents"]),hm=Object.freeze(["id","labelKey","supportedSlots","supportedSources","singleton"]),gm=Object.freeze(["primary","secondary"]),bm=Object.freeze(["slot","source","fallbackId","selectedIds"]),ym=Object.freeze(["mount","activate","deactivate","resize","status","destroy"]),Ui=class extends Error{constructor(t,n){super(n),this.name="DriveContentRegistryError",this.code=t}};function Fe(e,t){throw new Ui(e,t)}function Hc(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function io(e,t,n,r){Hc(e)||Fe(r,`${n} must be an object`);let o=Object.keys(e).sort(),i=[...t].sort();(o.length!==i.length||o.some((a,s)=>a!==i[s]))&&Fe(r,`${n} must contain exactly: ${t.join(", ")}`)}function Tr(e,t,n){return(typeof e!="string"||!Vc.test(e))&&Fe(n,`${t} must match ${Vc}`),e}function Bc(e,t,n){return(typeof e!="string"||!e.trim())&&Fe(n,`${t} must be a non-empty string`),e.trim()}function $o(e,t,n,r){(!Array.isArray(e)||e.length===0)&&Fe(r,`${n} must be a non-empty array`);let o=[],i=new Set;for(let a of e)(typeof a!="string"||!t.includes(a))&&Fe(r,`${n} contains unsupported value: ${String(a)}`),i.has(a)&&Fe(r,`${n} must not contain duplicates`),i.add(a),o.push(a);return Object.freeze(o)}function vm(e,t){let n="INVALID_CONTENT_CATALOG",r=`content catalog entry ${t}`;return io(e,hm,r,n),typeof e.singleton!="boolean"&&Fe(n,`${r}.singleton must be boolean`),Object.freeze({id:Tr(e.id,`${r}.id`,n),labelKey:Bc(e.labelKey,`${r}.labelKey`,n),supportedSlots:$o(e.supportedSlots,Ki,`${r}.supportedSlots`,n),supportedSources:$o(e.supportedSources,qi,`${r}.supportedSources`,n),singleton:e.singleton})}function Xi(e){let t="INVALID_CONTENT_CATALOG";io(e,mm,"content catalog",t),e.schemaVersion!==1&&Fe(t,"content catalog schemaVersion must be 1"),io(e.defaults,gm,"content catalog defaults",t),(!Array.isArray(e.contents)||e.contents.length===0)&&Fe(t,"content catalog contents must be a non-empty array");let n=e.contents.map(vm),r=new Set;for(let i of n)r.has(i.id)&&Fe(t,`duplicate content catalog id: ${i.id}`),r.add(i.id);let o=Object.freeze({primary:Tr(e.defaults.primary,"content catalog defaults.primary",t),secondary:Tr(e.defaults.secondary,"content catalog defaults.secondary",t)});for(let[i,a]of Object.entries(o))r.has(a)||Fe(t,`content catalog defaults.${i} references unknown id: ${a}`);return Object.freeze({schemaVersion:1,defaults:o,contents:Object.freeze(n)})}function Sm(e){let t="INVALID_DESCRIPTOR";return io(e,pm,"drive content descriptor",t),typeof e.factory!="function"&&Fe(t,"drive content descriptor.factory must be a function"),typeof e.singleton!="boolean"&&Fe(t,"drive content descriptor.singleton must be boolean"),Object.freeze({id:Tr(e.id,"drive content descriptor.id",t),labelKey:Bc(e.labelKey,"drive content descriptor.labelKey",t),factory:e.factory,supportedSlots:$o(e.supportedSlots,Ki,"drive content descriptor.supportedSlots",t),supportedSources:$o(e.supportedSources,qi,"drive content descriptor.supportedSources",t),singleton:e.singleton})}function Yi(e){let t="INVALID_CONTEXT";io(e,bm,"drive content context",t),Ki.includes(e.slot)||Fe(t,`unsupported drive content slot: ${String(e.slot)}`),qi.includes(e.source)||Fe(t,`unsupported drive content source: ${String(e.source)}`);let n=Tr(e.fallbackId,"drive content context.fallbackId",t);Array.isArray(e.selectedIds)||Fe(t,"drive content context.selectedIds must be an array");let r=e.selectedIds.map((o,i)=>Tr(o,`drive content context.selectedIds[${i}]`,t));return Object.freeze({slot:e.slot,source:e.source,fallbackId:n,selectedIds:Object.freeze(r)})}function Gc(e){(!e||typeof e!="object")&&Fe("INVALID_REGISTRY","drive content registry is required");for(let t of["register","get","list","create","has"])typeof e[t]!="function"&&Fe("INVALID_REGISTRY",`drive content registry.${t} is required`);return e}function Wc(e,t){return e.supportedSlots.includes(t.slot)&&e.supportedSources.includes(t.source)}function Mm(e,t){return e.singleton&&t.has(e.id)}function Am(e){return!!(e&&typeof e=="object"&&ym.every(t=>typeof e[t]=="function"))}function Uo(e,t,n){let r=Gc(e),o=Yi(n),i=new Set(o.selectedIds),a=c=>!!(c&&Wc(c,o)&&!Mm(c,i)),s=typeof t=="string"?r.get(t):null;if(a(s))return s;let u=r.get(o.fallbackId);if(a(u))return u;for(let c of r.list(o))if(a(c))return c;Fe(fm,`No supported drive content for ${o.slot}/${o.source}`)}function Rm(){let e=[],t=new Map,n=new Map,r;function o(c){let l=Sm(c);return t.has(l.id)&&Fe("DUPLICATE_CONTENT_ID",`drive content id is already registered: ${l.id}`),e.push(l),t.set(l.id,l),l}function i(c){return typeof c=="string"&&t.get(c)||null}function a(c){return typeof c=="string"&&t.has(c)}function s(c){let l=Yi(c);return Object.freeze(e.filter(d=>Wc(d,l)))}function u(c,l){let d=Yi(l),f=Uo(r,c,d);if(n.has(f.id))return n.get(f.id);let m=f.factory(d);return Am(m)||Fe("INVALID_CONTENT_INSTANCE",`drive content factory ${f.id} must return a DriveContent instance`),n.set(f.id,m),m}return r=Object.freeze({register:o,get:i,list:s,create:u,has:a}),r}function xm(e){return e instanceof Map?new Map(e):(Hc(e)||Fe("INVALID_FACTORY_MAP","drive content factories must be an object or Map"),new Map(Object.keys(e).map(t=>[t,e[t]])))}function $c(e,t){let n=Xi(e),r=xm(t),o=new Set(n.contents.map(({id:a})=>a));for(let a of r.keys())o.has(a)||Fe("UNKNOWN_FACTORY_ID",`factory has no content catalog entry: ${String(a)}`);let i=Rm();for(let a of n.contents){r.has(a.id)||Fe("MISSING_FACTORY",`content catalog id has no factory: ${a.id}`);let s=r.get(a.id);typeof s!="function"&&Fe("INVALID_FACTORY",`factory must be a function: ${a.id}`),i.register({...a,factory:s})}return i}function Uc(e,t=globalThis){let n=Gc(e);return(!t||typeof t!="object"&&typeof t!="function")&&Fe("INVALID_FACADE_TARGET","drive content registry facade target must be an object"),t.DriveContentRegistry=n,n}var Sn=Object.freeze({HORIZONTAL:"horizontal",VERTICAL:"vertical"}),Zi=Object.freeze({SPLIT:"split",AREA_1:"area_1",AREA_2:"area_2"}),Ji=Object.freeze({VISION:"vision",NAVIGATION:"navigation"}),ea=Object.freeze({[Sn.HORIZONTAL]:Object.freeze({mode:"carrot_navi_horizontal_mode",area1Content:"carrot_navi_horizontal_area_1",area2Content:"carrot_navi_horizontal_area_2",ratio:"carrot_navi_split_ratio"}),[Sn.VERTICAL]:Object.freeze({mode:"carrot_navi_vertical_mode",area1Content:"carrot_navi_vertical_area_1",area2Content:"carrot_navi_vertical_area_2",ratio:"carrot_navi_vertical_split_ratio"})}),Em=Object.freeze(Object.values(ea).flatMap(e=>Object.values(e))),Qi=Object.freeze({primary:Ji.VISION,secondary:Ji.NAVIGATION});function ta(e){return String(e||"").toLowerCase()===Sn.VERTICAL?Sn.VERTICAL:Sn.HORIZONTAL}function Tm(e=globalThis,t=e?.document){let n=e?.CarrotLayout?.orientation?.();if(n==="portrait")return Sn.VERTICAL;if(n==="landscape")return Sn.HORIZONTAL;let r=e?.visualViewport,o=Number(r?.width||t?.documentElement?.clientWidth||e?.innerWidth||0);return Number(r?.height||t?.documentElement?.clientHeight||e?.innerHeight||0)>=o?Sn.VERTICAL:Sn.HORIZONTAL}function Yc(e){return Object.values(Zi).includes(e)?e:Zi.SPLIT}function Kc(e){let t=Number(e),n=Number.isFinite(t)?t:.5,r=Math.max(.3,Math.min(.7,Math.round(n/.05)*.05));return Number(r.toFixed(2))}function qc(e){return ea[ta(e)]}function Yo(e,t,n){return Object.prototype.hasOwnProperty.call(e||{},n)?e[n]:t?.[n]}function Om(e){let t=typeof e=="function"?e():e;return t&&typeof t=="object"?t:{}}function Xc(e){let t=e&&typeof e=="object"?e:Qi;return Object.freeze({primary:typeof t.primary=="string"?t.primary:Qi.primary,secondary:typeof t.secondary=="string"?t.secondary:Qi.secondary})}function Qc(e={},t={}){let n=t.registry,r=t.source||"live",o=Xc(t.contentDefaults),i=Uo(n,e.area1,{slot:"primary",source:r,fallbackId:o.primary,selectedIds:[]}),a=Uo(n,e.area2,{slot:"secondary",source:r,fallbackId:o.secondary,selectedIds:[i.id]});return Object.freeze({area1:i.id,area2:a.id})}function Cm(e,t,n={}){let r=ta(t),o=qc(r),i=Om(n.settingDefaults),a=Qc({area1:Yo(e,i,o.area1Content),area2:Yo(e,i,o.area2Content)},n);return Object.freeze({orientation:r,mode:Yc(Yo(e,i,o.mode)),ratio:Kc(Yo(e,i,o.ratio)),area1Content:a.area1,area2Content:a.area2})}function wm(e){if(!e||typeof e!="object")throw new TypeError("drive layout registry is required");for(let t of["register","get","list","create","has"])if(typeof e[t]!="function")throw new TypeError(`drive layout registry.${t} is required`);return e}function Zc(e={}){let t=wm(e.registry),n=Xc(e.contentDefaults),r=e.settingDefaults||{},o=e.source||"live";function i(s,u={}){return Qc(s,{registry:t,source:u.source||o,contentDefaults:u.contentDefaults||n})}function a(s,u,c={}){return Cm(s,u,{registry:t,source:c.source||o,contentDefaults:c.contentDefaults||n,settingDefaults:c.settingDefaults||r})}return Object.freeze({ORIENTATION:Sn,MODE:Zi,CONTENT:Ji,SETTINGS:ea,settingKeys:Em,normalizeOrientation:ta,orientationForViewport:Tm,normalizeMode:Yc,normalizeRatio:Kc,keysFor:qc,normalizeContents:i,read:a})}function Jc(e,t=globalThis){if(!e||typeof e!="object"||typeof e.read!="function")throw new TypeError("drive layout spec facade requires a layout spec");if(!t||typeof t!="object"&&typeof t!="function")throw new TypeError("drive layout spec facade target must be an object");return t.CarrotDriveLayoutSpec=e,e}var ce=Object.freeze({PRIMARY:"primary",SECONDARY:"secondary"}),Xe=Object.freeze({HORIZONTAL:"horizontal",VERTICAL:"vertical"}),je=Object.freeze({SPLIT:"split",AREA_1:"area_1",AREA_2:"area_2"}),el=Object.freeze({dividerWidth:8,dividerHeight:8,settleMs:240,minRatio:.3,maxRatio:.7,compactPrimaryRatio:.5,compactPrimaryMinWidth:0,compactPrimaryMinHeight:0,ratioStep:.05,initialRatio:.7,verticalRatio:null}),tl=Object.freeze({active:"is-drive-workspace-active",resizing:"is-drive-workspace-resizing",settling:"is-drive-workspace-settling",primarySplit:"is-drive-workspace-split",primaryCompact:"is-drive-workspace-compact-primary",documentCompact:"is-drive-workspace-compact-primary",horizontal:"is-drive-workspace-horizontal",vertical:"is-drive-workspace-vertical",swapped:"is-drive-workspace-swapped",area1Only:"is-drive-workspace-area-1-only",area2Only:"is-drive-workspace-area-2-only",suspended:"is-drive-workspace-suspended"}),Ko=new WeakMap;function Im(e,t){let n=e.target||globalThis,r=e.document||t?.ownerDocument||n.document,o=e.setTimeout||n.setTimeout?.bind(n)||globalThis.setTimeout.bind(globalThis),i=e.clearTimeout||n.clearTimeout?.bind(n)||globalThis.clearTimeout.bind(globalThis),a=e.requestAnimationFrame||n.requestAnimationFrame?.bind(n)||(u=>o(u,0)),s=e.cancelAnimationFrame||n.cancelAnimationFrame?.bind(n)||i;return{target:n,documentRoot:r,setTimer:o,clearTimer:i,requestFrame:a,cancelFrame:s,ResizeObserver:e.ResizeObserver||n.ResizeObserver}}function $t(e){return Array.from(e?.childNodes||e?.children||[])}function nl(e,t){if(e){if(typeof e.replaceChildren=="function"){e.replaceChildren(...t);return}for(;e.firstChild;)e.removeChild(e.firstChild);for(let n of t)e.appendChild(n)}}function rl(e,t){return Object.prototype.hasOwnProperty.call(e?.dataset||{},t)?e.dataset[t]:void 0}function ol(e,t,n){e?.dataset&&(n===void 0?delete e.dataset[t]:e.dataset[t]=n)}function na(e={}){let t=e.root,n=e.primary,r=e.secondary,o=e.divider;if(!t||!n||!r||!o)return null;let i=Ko.get(t);if(i)return i;let a=Im(e,t),{target:s,documentRoot:u}=a,c=e.parking||u?.createElement?.("div")||null;if(!c||typeof c.appendChild!="function")throw new Error("DriveWorkspace requires a parking host");c.hidden=!0,c.inert=!0,c.dataset.driveWorkspaceParking="",c.removeAttribute?.("aria-hidden"),c.parentElement!==t&&c.parentNode!==t&&t.appendChild(c);let l=e.contentApi||s.DriveContent||Wo,d=e.registry||s.DriveContentRegistry||null,f={...el,...e.geometry||{}},m={...tl,...e.classNames||{}},p={dividerWidth:"--drive-workspace-divider-width",secondaryWidth:"--drive-workspace-secondary-width",dividerHeight:"--drive-workspace-divider-height",secondaryHeight:"--drive-workspace-secondary-height",...e.styleProperties||{}},b={layout:"drive:workspacelayoutchange",resizeStart:"drive:workspaceresizestart",resizeEnd:"drive:workspaceresizeend",content:"drive:workspacecontentchange",...e.events||{}};t.classList?.add("drive-workspace"),n.dataset.driveWorkspaceSlot=ce.PRIMARY,r.dataset.driveWorkspaceSlot=ce.SECONDARY,o.dataset.driveWorkspaceDivider="";let g=!1,x=!1,E=!1,y=de(e.orientation),O=ye(e.layout?.mode),C=String(e.layout?.area1Slot||ce.PRIMARY),w=null,z=0,M=null,R=null,v=null,h=0,S=0,A="",L=0,P=0,_=!1,T="live",I=new Map([[ce.PRIMARY,null],[ce.SECONDARY,null]]),k=new Map,D=new WeakMap,B=new Map,W=[],V=[];C=U(C);function F(N){if(g)throw new Error(`DriveWorkspace cannot ${N} after destroy`)}function H(N,j,G,Q){typeof N?.addEventListener=="function"&&(N.addEventListener(j,G,Q),W.push([N,j,G,Q]))}function Y(N,j){!N||typeof s.dispatchEvent!="function"||typeof s.CustomEvent!="function"||s.dispatchEvent(new s.CustomEvent(N,{detail:j}))}function $(N){return[...new Set([tl[N],m[N]].filter(Boolean))]}function K(N,j,G){if(!N?.classList)return;let Q=!!G;for(let se of $(j))N.classList.contains(se)!==Q&&N.classList.toggle(se,Q)}function Z(N,j){return!!(N?.classList&&$(j).some(G=>N.classList.contains(G)))}function ee(N,...j){if(!N?.classList)return;let G=j.flatMap($);G.length&&N.classList.remove(...G)}function ue(N){K(n,"primarySplit",N);for(let j of[n,r])for(let G of $t(j))K(G,"primarySplit",N)}function de(N){return String(N||"").toLowerCase()===Xe.VERTICAL?Xe.VERTICAL:Xe.HORIZONTAL}function ye(N){let j=String(N||"").trim().toLowerCase();return Object.values(je).includes(j)?j:je.SPLIT}function U(N){let j=String(N||"").trim().toLowerCase();if(!I.has(j))throw new RangeError(`Unknown DriveWorkspace slot: ${N}`);return j}function X(N){return U(N)===ce.PRIMARY?n:r}function pe(N){let j=Number(N),G=Number(f.initialRatio),Q=Number.isFinite(G)?G:el.initialRatio;return Math.max(f.minRatio,Math.min(f.maxRatio,Number.isFinite(j)?j:Q))}function xe(N){let j=pe(N),G=Math.round(j/f.ratioStep)*f.ratioStep;return Number(Math.max(f.minRatio,Math.min(f.maxRatio,G)).toFixed(2))}w={[Xe.HORIZONTAL]:xe(f.initialRatio),[Xe.VERTICAL]:xe(f.verticalRatio!=null&&Number.isFinite(Number(f.verticalRatio))?f.verticalRatio:f.initialRatio)};function Je(){return w[y]??xe(f.initialRatio)}function et(N){let j=U(N);if(E)return!1;if(!x)return j===ce.PRIMARY;if(O===je.SPLIT)return!0;let G=O===je.AREA_1?C:C===ce.PRIMARY?ce.SECONDARY:ce.PRIMARY;return j===G}function ft(){let N=x&&!E&&O===je.SPLIT;o.setAttribute?.("aria-disabled",String(!N)),o.setAttribute?.("aria-hidden",String(!N)),o.tabIndex=N?0:-1}function He(){let N=y===Xe.VERTICAL;K(t,"horizontal",!N),K(t,"vertical",N),t.dataset.driveWorkspaceOrientation=y,o.setAttribute?.("aria-orientation",N?"horizontal":"vertical"),ft()}function wt(){let N=C===ce.SECONDARY;K(t,"swapped",N),K(t,"area1Only",O===je.AREA_1),K(t,"area2Only",O===je.AREA_2),t.dataset.driveWorkspaceMode=O,n.dataset.driveWorkspaceArea=N?je.AREA_2:je.AREA_1,r.dataset.driveWorkspaceArea=N?je.AREA_1:je.AREA_2,ft()}function pt(){for(let N of Object.values(ce)){let j=X(N),G=et(N);j.hidden=!G,j.inert=!G,j.dataset.driveWorkspaceVisible=String(G),G?j.removeAttribute?.("aria-hidden"):j.setAttribute?.("aria-hidden","true")}o.hidden=!x||O!==je.SPLIT,ft()}function on(N){let j=X(N).getBoundingClientRect?.()||{};return Object.freeze({x:Number(j.x??j.left??0),y:Number(j.y??j.top??0),top:Number(j.top||0),right:Number(j.right||0),bottom:Number(j.bottom||0),left:Number(j.left||0),width:Math.max(0,Number(j.width||0)),height:Math.max(0,Number(j.height||0)),devicePixelRatio:Math.max(1,Number(s.devicePixelRatio||1))})}function Vn(N){return[N.left,N.top,N.width,N.height,N.devicePixelRatio].map(j=>Number(j).toFixed(2)).join("|")}function an(N,j=!1){let G=U(N),Q=I.get(G);if(!Q||!et(G))return!1;let se=on(G),ve=Vn(se);return!j&&k.get(G)===ve?!1:(Q.content.resize(se),k.set(G,ve),!0)}function te(N={}){if(F("resize contents"),R!==null||Z(t,"resizing"))return!1;let j=!!N.force,G=!1;for(let Q of Object.values(ce))G=an(Q,j)||G;return G}function Re(N=!1){g||(_=_||!!N,!L&&(L=a.requestFrame(()=>{L=0;let j=_;_=!1,g||te({force:j})})))}function mt(N){return I.get(U(N))?.content?.status?.()||null}function Ce(N="workspace layout"){F("sync content activity");let j=!1;for(let G of Object.values(ce)){let Q=I.get(G);if(!Q)continue;let se=Q.content.status?.()||{},ve=x&&et(G);ve&&!se.active?(Q.content.activate({reason:N,slot:G,source:Q.source}),j=!0):!ve&&se.active&&(Q.content.deactivate({keepWarm:!1,reason:N,slot:G,source:Q.source}),j=!0)}return j}function Ke(N,j,G){return{workspaceId:String(t.id||""),slot:N,action:j,contentId:String(G?.id||""),contentName:String(G?.content?.name||"")}}function Ge(N,j,G){let Q=d?.get?.(j);if(!Q)throw new RangeError(`Unknown drive content id: ${String(j)}`);if(!Q.supportedSlots?.includes(N))throw new RangeError(`Drive content ${j} does not support slot ${N}`);if(!Q.supportedSources?.includes(G))throw new RangeError(`Drive content ${j} does not support source ${G}`);return Q}function tt(N={},j={}){if(!d?.get||!d?.create)throw new Error("DriveWorkspace setContents requires a DriveContent registry");let G=String(j.source||"live"),Q={[ce.PRIMARY]:String(N.primaryId||""),[ce.SECONDARY]:String(N.secondaryId||"")},se={[ce.PRIMARY]:Ge(ce.PRIMARY,Q.primary,G),[ce.SECONDARY]:Ge(ce.SECONDARY,Q.secondary,G)};if(Q.primary===Q.secondary&&se.primary.singleton)throw new Error(`Drive content ${Q.primary} is singleton and cannot occupy both slots`);let ve=new Map,we=[];for(let ke of Object.values(ce)){let qe=Q[ke],yt=d.create(qe,{slot:ke,source:G,fallbackId:qe,selectedIds:[...we]});if(!(l?.isContent?.(yt)||oo(yt)))throw new TypeError(`Drive content factory ${qe} must return a DriveContent instance`);if([...ve.values()].some(Wt=>Wt.content===yt))throw new Error(`Drive content instance ${qe} cannot occupy both slots`);ve.set(ke,Object.freeze({id:qe,descriptor:se[ke],content:yt,source:G})),we.push(qe)}return{records:ve,source:G}}function ge(N,j){let G=X(N);if(!j){delete G.dataset.driveContent,delete G.dataset.driveContentName;return}G.dataset.driveContent=j.id,G.dataset.driveContentName=j.content.name}function Nn(N){return[...new Set((N||[]).filter(Boolean))]}function It(N,j,G=[]){let Q=new Set(G),se=D.get(N)||[],ve=$t(j).filter(ke=>!Q.has(ke)),we=Nn([...ve,...se.filter(ke=>ke.parentNode===j||ke.parentElement===j)]);return we.length&&D.set(N,we),we}function nt(N){let j=u?.activeElement;return!j||!(N||[]).some(Q=>Q===j||Q.contains?.(j))?!1:(j.blur?.(),!0)}function Ie(N){if(!N)return[];N.status?.().active&&N.deactivate({keepWarm:!1,reason:"workspace content parking"}),nt(D.get(N)||[]);let j=$t(c);return N.mount(c),It(N,c,j)}function fe(N){if(!N||N===c)return[];let j=$t(N);nt(j);for(let G of j)c.appendChild(G);return j}function We(N,j){if($t(j).length)throw new Error(`DriveWorkspace slot ${String(j.dataset?.driveWorkspaceSlot||"")} is not empty`);let G=$t(j);N.mount(j);let Q=It(N,j,G);if(!Q.length||$t(j).some(se=>!Q.includes(se)))throw new Error(`Drive content ${String(N.name||"")} must own every top-level slot node`);return Q}function Ar(N){return B.get(N)||null}function Gt(){let N=!0,j={};for(let G of Object.values(ce)){let Q=I.get(G),se=X(G),ve=$t(se),we=!!(Q&&Ar(Q.content)),ke=Q&&!we?D.get(Q.content)||[]:[],qe=ve.filter(sn=>!ke.includes(sn)).length,yt=ke.filter(sn=>sn.parentNode!==se&&sn.parentElement!==se).length,Wt=qe===0&&yt===0&&ve.length===ke.length&&(!Q||we||ke.length>0);N=N&&Wt,j[G]=Object.freeze({contentId:String(Q?.id||""),presented:we,rootCount:ve.length,orphanCount:qe,missingCount:yt,consistent:Wt})}for(let[G,Q]of B){let se=D.get(G)||[],ve=se.length>0&&se.every(we=>we.parentNode===Q.host||we.parentElement===Q.host);N=N&&ve}return Object.freeze({consistent:N,slots:Object.freeze(j)})}function Rt(){let N=Gt();if(!N.consistent)throw new Error(`DriveWorkspace DOM ownership violation: ${JSON.stringify(N.slots)}`);return N}function Zn(N,j){return T!==j?!1:Object.values(ce).every(G=>I.get(G)?.id===N.get(G)?.id&&I.get(G)?.content===N.get(G)?.content)}function ht(N={},j={}){if(F("set contents"),B.size)throw new Error("DriveWorkspace cannot change slot contents during standalone presentation");let G=String(j.source||"live"),Q=Gt();if(T===G&&I.get(ce.PRIMARY)?.id===String(N.primaryId||"")&&I.get(ce.SECONDARY)?.id===String(N.secondaryId||"")&&Q.consistent)return!1;let{records:se,source:ve}=tt(N,j);if(Zn(se,ve)&&Q.consistent)return!1;let we=new Map(I),ke=T,qe=new Map;for(let $e of we.values())$e&&qe.set($e.content,!!$e.content.status?.().active);let yt=new Map,Wt=new Map;for(let $e of[...we.values(),...se.values()])$e&&!Wt.has($e.content)&&Wt.set($e.content,[...D.get($e.content)||[]]);let sn=$t(c);for(let $e of Object.values(ce)){let st=X($e);yt.set($e,{children:$t(st),driveContent:rl(st,"driveContent"),driveContentName:rl(st,"driveContentName")})}try{let $e=new Set(Object.values(ce).filter(Me=>{let he=we.get(Me),De=se.get(Me);return he?.id===De?.id&&he?.content===De?.content&&ve===ke&&Q.slots[Me].consistent})),st=new Set;for(let Me of Object.values(ce)){if($e.has(Me))continue;let he=we.get(Me),De=se.get(Me);he&&st.add(he.content),De&&st.add(De.content)}for(let Me of st)Ie(Me);for(let Me of Object.values(ce))$e.has(Me)||fe(X(Me));for(let[Me,he]of se)$e.has(Me)||We(he.content,X(Me));for(let Me of Object.values(ce))I.set(Me,se.get(Me)),k.delete(Me),ge(Me,se.get(Me));T=ve,pt(),Ce("workspace content changed"),ue(x&&!E&&O===je.SPLIT),Jt(),Re(!0),Rt();for(let Me of Object.values(ce)){let he=we.get(Me),De=se.get(Me);(he?.id!==De?.id||he?.content!==De?.content)&&Y(b.content,Ke(Me,he?"switch":"register",De))}return!0}catch($e){let st=null;try{let Me=new Set([...we.values()].filter(Boolean).map(he=>he.content));for(let he of se.values())he.content.status?.().active&&!qe.get(he.content)&&he.content.deactivate({keepWarm:!1,reason:"workspace content rollback"}),Me.has(he.content)||Ie(he.content);for(let he of we.values())he?.content?.status?.().active&&he.content.deactivate({keepWarm:!1,reason:"workspace content rollback move"});nl(c,sn);for(let he of Object.values(ce))nl(X(he),yt.get(he).children);for(let[he,De]of we)De&&De.content.mount(X(he));for(let he of Object.values(ce)){let De=yt.get(he);ol(X(he),"driveContent",De.driveContent),ol(X(he),"driveContentName",De.driveContentName),I.set(he,we.get(he))}for(let[he,De]of Wt)D.set(he,De);T=ke,k.clear(),pt(),ue(x&&!E&&O===je.SPLIT),Jt();for(let[he,De]of qe)De&&!he.status?.().active&&he.activate({reason:"workspace content rollback"})}catch(Me){st=Me}throw st&&($e.rollbackError=st),$e}}function q(N,j){F("register content");let G=U(N);if(!(l?.isContent?.(j)||oo(j)))throw new TypeError(`DriveWorkspace ${G} requires a DriveContent instance`);let Q=I.get(G);if(Q?.content===j)return!1;if(Q)throw new Error(`DriveWorkspace ${G} already contains ${Q.content.name}`);if(B.has(j))throw new Error(`Drive content ${j.name} is in standalone presentation`);Ie(j),fe(X(G)),We(j,X(G));let se=Object.freeze({id:String(j.name||""),descriptor:null,content:j,source:T});return I.set(G,se),ge(G,se),pt(),Ce("workspace content registered"),Re(!0),Rt(),Y(b.content,Ke(G,"register",se)),!0}function oe(N,j=null){F("unregister content");let G=U(N),Q=I.get(G);return!Q||j&&Q.content!==j?!1:(Q.content.status?.().active&&Q.content.deactivate({keepWarm:!1,reason:"workspace content unregistered",slot:G}),Ie(Q.content),fe(X(G)),I.set(G,null),k.delete(G),ge(G,null),pt(),Rt(),Y(b.content,Ke(G,"unregister",Q)),!0)}function be(N,j,G={}){if(F("present content"),!(l?.isContent?.(N)||oo(N)))throw new TypeError("DriveWorkspace presentation requires a DriveContent instance");if(!j||typeof j.appendChild!="function")throw new TypeError("DriveWorkspace presentation requires a host element");if(!E)throw new Error("DriveWorkspace must be suspended before standalone presentation");let Q=B.get(N);if(Q?.host===j)return!N.status?.().active&&G.activate!==!1&&N.activate(G),N.resize?.(j.getBoundingClientRect?.()),!1;Q&&Se(N);let se=Object.values(ce).find(ke=>I.get(ke)?.content===N)||null;N.status?.().active&&N.deactivate({keepWarm:!1,reason:"workspace standalone presentation",slot:se}),nt(D.get(N)||[]);let ve=$t(j);if(N.mount(j),!It(N,j,ve).length)throw new Error(`Drive content ${N.name} did not mount a presentation root`);return B.set(N,Object.freeze({host:j,slot:se})),Rt(),G.activate!==!1&&N.activate(G),N.resize?.(j.getBoundingClientRect?.()),!0}function Se(N){if(F("restore presented content"),!B.get(N))return!1;N.status?.().active&&N.deactivate({keepWarm:!1,reason:"workspace presentation restore"}),nt(D.get(N)||[]),B.delete(N);let G=Object.values(ce).find(Q=>I.get(Q)?.content===N)||null;return G?(fe(X(G)),We(N,X(G))):Ie(N),Rt(),!0}function Ne(N){return I.get(U(N))?.content||null}function Zt(N){return I.get(U(N))?.id||""}function Wi(){let N={};for(let j of Object.values(ce))N[j]=mt(j);return N}function Jt(N=0){let j=Je(),Q=[...I.entries()].find(([,De])=>De?.id==="vision"||De?.content?.name==="vision")?.[0]||ce.PRIMARY,se=Q===C?j:1-j,ve=y===Xe.VERTICAL,we=Math.max(0,N||(ve?t.clientHeight:t.clientWidth)),ke=x&&!E&&O===je.SPLIT?ve?f.dividerHeight:f.dividerWidth:0,qe=Math.max(0,we-ke)*se,yt=Math.max(0,ve?t.clientWidth:t.clientHeight),Wt=ve?yt:qe,sn=ve?qe:yt,$e=Wtke?ke:0,yt=qe?Math.max(0,(ve-ke)*(1-Q)):0,Wt=G?0:qe,sn=G?0:yt,$e=G?qe:0,st=G?yt:0,Me=Math.round(Q*100),he=`${Me}%`;o.dataset.ratio=he;let De=`${100-Me}%`;n.dataset.splitRatio=C===ce.PRIMARY?he:De,r.dataset.splitRatio=C===ce.SECONDARY?he:De,o.setAttribute?.("aria-valuenow",String(Me));let ro=[y,O,C,Wt,sn.toFixed(2),$e,st.toFixed(2),we?1:0].join("|"),Lc=ro!==A;return Lc&&(A=ro,t.style?.setProperty(p.dividerWidth,`${Wt}px`),t.style?.setProperty(p.secondaryWidth,`${sn}px`),t.style?.setProperty(p.dividerHeight,`${$e}px`),t.style?.setProperty(p.secondaryHeight,`${st}px`),e.onGeometry?.({active:x,ratio:Q,orientation:y,mode:O,area1Slot:C,compactPrimary:we,renderContent:N})),N&&Re(),Lc}function yn(){let N=R,j=N!==null||Z(t,"resizing");if(R=null,v=null,h=0,N!==null&&o.hasPointerCapture?.(N)&&o.releasePointerCapture?.(N),z&&a.cancelFrame(z),z=0,a.clearTimer(S),S=0,M!==null&&(w[y]=M),M=null,w[y]=xe(w[y]),Jt(),ee(t,"resizing","settling"),e.onResizeStateChange?.(!1),j&&!g){let G=Dn();Y(b.resizeEnd,G),e.onResizeEnd?.(G)}}function Rr(N){F("set active");let j=!!N;return j===x?!1:(x=j,t.dataset.driveWorkspaceActive=String(x),x?(wt(),K(t,"active",!0),ue(!E&&O===je.SPLIT),pt(),gt(!1),Ce("workspace activated"),P&&a.cancelFrame(P),P=a.requestFrame(()=>{P=0,!g&&x&&Re(!0)})):(P&&a.cancelFrame(P),P=0,yn(),K(t,"active",!1),ue(!1),pt(),Ce("workspace deactivated"),gt()),kt(),!0)}function Ho(N){F("set suspended");let j=!!N;return j===E?!1:(E=j,t.dataset.driveWorkspaceSuspended=String(E),K(t,"suspended",E),E&&yn(),pt(),ue(x&&!E&&O===je.SPLIT),Ce(E?"workspace suspended":"workspace resumed"),gt(!1),kt(),!0)}function xr(){if(z=0,M===null||g)return;w[y]=pe(M),M=null;let N=y===Xe.VERTICAL?v?.height:v?.width;gt(!1,N||0)}function no(N){M=xe(N),z||(z=a.requestFrame(xr))}function Er(N){if(!v||O!==je.SPLIT)return;let j=N.getCoalescedEvents?.(),G=j?.length?j[j.length-1]:N,Q=y===Xe.VERTICAL,se=Q?f.dividerHeight:f.dividerWidth,ve=Q?v.height:v.width;if(ve<=se)return;let we=Q?G.clientY:G.clientX,ke=Q?v.top:v.left,qe=we-h;no((qe-ke-se/2)/(ve-se))}function vn(N){if(R===null||N&&N.pointerId!==R)return;let j=R;R=null,v=null,h=0,o.hasPointerCapture?.(j)&&o.releasePointerCapture?.(j),z&&a.cancelFrame(z),z=0,M!==null&&(w[y]=pe(M)),M=null,K(t,"resizing",!1),K(t,"settling",!0),w[y]=xe(w[y]),e.onResizeStateChange?.(!1),gt(),a.clearTimer(S),S=a.setTimer(()=>{S=0,g||K(t,"settling",!1)},f.settleMs),Hn(),kt();let G=Dn();Y(b.resizeEnd,G),e.onResizeEnd?.(G)}function bt(N){if(!x||O!==je.SPLIT)return;N.preventDefault?.(),R=N.pointerId,v=t.getBoundingClientRect?.()||{};let j=o.getBoundingClientRect?.()||{};h=y===Xe.VERTICAL?N.clientY-(Number(j.top||0)+Number(j.height||0)/2):N.clientX-(Number(j.left||0)+Number(j.width||0)/2),a.clearTimer(S),S=0,K(t,"settling",!1),K(t,"resizing",!0),e.onResizeStateChange?.(!0);let G=Dn();Y(b.resizeStart,G),e.onResizeStart?.(G),o.setPointerCapture?.(N.pointerId),Er(N)}function Bo(N){N.pointerId!==R||!o.hasPointerCapture?.(N.pointerId)||Er(N)}function Go(N){N.pointerId===R&&Er(N)}function Jn(){vn()}function rm(N){if(!x||O!==je.SPLIT)return;let j=y===Xe.VERTICAL?"ArrowUp":"ArrowLeft",G=y===Xe.VERTICAL?"ArrowDown":"ArrowRight";[j,G,"Home","End"].includes(N.key)&&(N.preventDefault?.(),N.key==="Home"?w[y]=f.minRatio:N.key==="End"?w[y]=f.maxRatio:w[y]=xe(w[y]+(N.key===j?-f.ratioStep:f.ratioStep)),gt(),Hn(),kt())}function $i(){Re(!0)}H(o,"pointerdown",bt),H(o,"pointermove",Bo);for(let N of["pointerup","pointercancel","lostpointercapture"])H(o,N,vn);if(H(s,"pointermove",Go,{passive:!0}),H(s,"pointerup",vn,{capture:!0,passive:!0}),H(s,"pointercancel",vn,{capture:!0,passive:!0}),H(s,"blur",Jn,{passive:!0}),H(o,"keydown",rm),H(s,"resize",$i,{passive:!0}),H(s,"orientationchange",$i,{passive:!0}),H(s.visualViewport,"resize",$i,{passive:!0}),typeof a.ResizeObserver=="function"){let N=new a.ResizeObserver(()=>{g||(x?gt():Re(!0))});N.observe(t),V.push(N);let j=new a.ResizeObserver(()=>Re());j.observe(n),j.observe(r),V.push(j)}function om(N){F("set orientation");let j=de(N);return j===y?!1:(yn(),y=j,A="",He(),wt(),gt(),kt(),!0)}function im(N,j={}){F("set ratio");let G=typeof j=="boolean"?{persist:j}:j,Q=de(G.orientation||y);if(Q===y&&R!==null)return!1;let se=xe(N);return w[Q]===se?!1:(w[Q]=se,Q===y&>(),G.persist&&Hn(Q),Q===y&&kt(),!0)}function am(N={}){F("set layout");let j=ye(N.mode),G=U(N.area1Slot||ce.PRIMARY);return j===O&&G===C?!1:(yn(),O=j,C=G,A="",wt(),pt(),ue(x&&!E&&O===je.SPLIT),Ce("workspace layout changed"),gt(),kt(),!0)}function sm(){return Dn()}function cm(){if(g)return!1;g=!0;let N=x;x=!1,z&&a.cancelFrame(z),L&&a.cancelFrame(L),P&&a.cancelFrame(P),z=0,L=0,P=0,a.clearTimer(S),S=0,M=null,_=!1,R=null,v=null;for(let[G,Q,se,ve]of W.splice(0))G.removeEventListener?.(Q,se,ve);for(let G of V.splice(0))G.disconnect?.();let j=new Set([...[...I.values()].filter(Boolean).map(G=>G.content),...B.keys()]);for(let G of j)Ie(G);B.clear();for(let[G]of I)fe(X(G)),I.set(G,null),ge(G,null);return k.clear(),ee(t,"active","resizing","settling","swapped","area1Only","area2Only","suspended"),ue(!1),K(n,"primaryCompact",!1),K(u?.documentElement,"documentCompact",!1),t.dataset.driveWorkspaceActive="false",t.dataset.driveWorkspaceSuspended="false",Ko.delete(t),e.onDestroy?.({wasActive:N}),!0}t.dataset.driveWorkspaceActive=String(x),t.dataset.driveWorkspaceSuspended=String(E),He(),wt(),pt();let Pc=Object.freeze({setActive:Rr,setSuspended:Ho,setOrientation:om,setRatio:im,setLayout:am,setContents:ht,applyGeometry:gt,cancelDrag:yn,snapshot:sm,registerContent:q,unregisterContent:oe,getContent:Ne,contentIdForSlot:Zt,contentForSlot:Zt,contentSnapshot:Wi,domOwnershipStatus:Gt,assertDomOwnership:Rt,presentContent:be,restorePresentedContent:Se,syncContentActivity:Ce,resizeContents:te,destroy:cm});return Ko.set(t,Pc),Pc}function _m(e){return e&&typeof e=="object"&&Ko.get(e)||null}var qo=Object.freeze({SLOT:ce,ORIENTATION:Xe,LAYOUT_MODE:je,create:na,get:_m});function il(e=globalThis){return e.DriveWorkspace=qo,qo}var Bn=Object.freeze({root:"carrotDriveWorkspace",primary:"carrotDrivePrimarySlot",secondary:"carrotDriveSecondarySlot",parking:"carrotDriveParking",divider:"carrotNaviDivider",visionRoot:"carrotStage",navigationRoot:"carrotNaviPane"}),ra=new WeakMap;function sl(e,t,n=null){t.parentElement===e||t.parentNode===e||e.insertBefore(t,n&&(n.parentElement===e||n.parentNode===e)?n:null)}function al(e,t,n,r,o){let i=e.getElementById(n);return i||(i=e.createElement("div"),i.id=n),i.classList?.add("drive-workspace__slot"),i.dataset.driveWorkspaceSlot=r,sl(t,i,o),i}function Nm(e,t){let n=e.getElementById(Bn.parking);return n||(n=e.createElement("div"),n.id=Bn.parking),n.hidden=!0,n.inert=!0,n.dataset.driveWorkspaceParking="",n.removeAttribute?.("aria-hidden"),sl(t,n),n}function Dm(e=document){let t=e.getElementById(Bn.root),n=e.getElementById(Bn.visionRoot),r=e.getElementById(Bn.navigationRoot),o=e.getElementById(Bn.divider);if(!t||!n||!r||!o)return null;let i=Nm(e,t);n.parentElement!==i&&n.parentNode!==i&&i.appendChild(n),r.parentElement!==i&&r.parentNode!==i&&i.appendChild(r);let a=al(e,t,Bn.primary,ce.PRIMARY,o),s=al(e,t,Bn.secondary,ce.SECONDARY,i);return delete n.dataset.driveWorkspaceSlot,delete r.dataset.driveWorkspaceSlot,n.removeAttribute?.("aria-hidden"),r.removeAttribute?.("aria-hidden"),Object.freeze({root:t,primary:a,secondary:s,parking:i,divider:o,visionRoot:n,navigationRoot:r})}function Pm(e){let t=e.target||globalThis,n=e.document||t.document;return{target:t,documentRoot:n,MutationObserver:e.MutationObserver||t.MutationObserver}}function Lm(e={}){let{target:t,documentRoot:n,MutationObserver:r}=Pm(e),o=e.elements||Dm(n),i=e.workspaceApi||t.DriveWorkspace||qo,a=e.registry||t.DriveContentRegistry,s=e.layoutSpec||t.CarrotDriveLayoutSpec;if(!o||!i?.create||!a?.create||!s?.read)return null;let{root:u,primary:c,secondary:l,parking:d,divider:f,visionRoot:m,navigationRoot:p}=o,b=ra.get(u);if(b)return b;let g=[],x=[],E=!1,y=m.classList.contains("is-replay"),O=null,C=null;function w($,K,Z,ee){typeof $?.addEventListener=="function"&&($.addEventListener(K,Z,ee),g.push([$,K,Z,ee]))}function z(){if(typeof s.orientationForViewport=="function")return s.orientationForViewport(t,n);let $=t.CarrotLayout?.orientation?.();if($==="portrait")return Xe.VERTICAL;if($==="landscape")return Xe.HORIZONTAL;let K=t.visualViewport,Z=Number(K?.width||n.documentElement?.clientWidth||t.innerWidth||0);return Number(K?.height||n.documentElement?.clientHeight||t.innerHeight||0)>=Z?Xe.VERTICAL:Xe.HORIZONTAL}function M($=z(),K=e.settings||t.CarrotWebSettingsState){return s.read(K,$,{source:e.source||"live"})}let R=M(Xe.HORIZONTAL),v=M(Xe.VERTICAL),h=z()===Xe.VERTICAL?v:R,S=(e.createWorkspace||na)({root:u,primary:c,secondary:l,parking:d,divider:f,registry:a,contentApi:e.contentApi||t.DriveContent,target:t,document:n,orientation:h.orientation,layout:{mode:h.mode,area1Slot:ce.PRIMARY},geometry:{dividerWidth:8,dividerHeight:8,settleMs:240,minRatio:.3,maxRatio:.7,compactPrimaryRatio:.5,compactPrimaryMinWidth:360,compactPrimaryMinHeight:300,ratioStep:.05,initialRatio:R.ratio,verticalRatio:v.ratio,...e.geometry||{}},persist($,K){let Z=s.keysFor(K).ratio;typeof t.setWebSettingByKey=="function"&&t.setWebSettingByKey(Z,$.toFixed(2)).catch(()=>{}),e.persist?.($,K,Z)}});if(!S)return null;function A($=M()){if(!$||E)return!1;let K=S.setContents({primaryId:$.area1Content,secondaryId:$.area2Content},{source:e.source||"live"}),Z=S.setOrientation($.orientation),ee=S.setRatio($.ratio,{orientation:$.orientation}),ue=S.setLayout({mode:$.mode,area1Slot:ce.PRIMARY});return S.assertDomOwnership(),C=null,u.dataset.driveWorkspaceLayoutState="applied",Z||ee||K||ue}function L($,K="sync"){if(C=$,u.dataset.driveWorkspaceLayoutState="error",t.console?.error?.(`[drive] workspace layout ${K} failed`,$),typeof t.dispatchEvent=="function"&&typeof t.CustomEvent=="function"){let Z=null;try{Z=M()}catch{}t.dispatchEvent(new t.CustomEvent("drive:workspacelayoutapplyerror",{detail:Object.freeze({reason:K,message:String($?.message||$||"layout apply failed"),requested:Z,actual:S.snapshot()})}))}}function P(){let $=t.DriveContentVision;return $?(S.presentContent($,u,{reason:"recorded replay presentation",slot:"standalone",source:"replay"}),!0):!1}function _(){let $=t.DriveContentVision;return $?S.restorePresentedContent($):!1}function T($){if(E)return!1;let K=!!$;if(K===y){if(K&&(u.classList?.add("is-drive-workspace-replay"),S.setSuspended?.(!0),S.setActive(!1),!P()))throw new Error("Recorded replay presentation is unavailable");return!0}if(K){y=!0,u.classList?.add("is-drive-workspace-replay"),u.dataset.driveWorkspacePresentation="replay";try{if(S.setSuspended?.(!0),S.setActive(!1),!P())throw new Error("Recorded replay presentation is unavailable");return S.applyGeometry(),!0}catch(ee){y=!1,u.classList?.remove("is-drive-workspace-replay"),delete u.dataset.driveWorkspacePresentation;try{_(),S.setSuspended?.(!1),A(M()),S.setActive(I())}catch(ue){ee.restoreError=ue}throw ee}}let Z=null;try{_()}catch(ee){Z=ee}y=!1,u.classList?.remove("is-drive-workspace-replay"),delete u.dataset.driveWorkspacePresentation;try{A(M())}catch(ee){L(ee,"replay restore")}return S.setSuspended?.(!1),S.setActive(I()),S.applyGeometry(),Z&&L(Z,"replay release"),!0}function I(){return n.body?.dataset?.page==="carrot"&&!n.hidden&&!y}function k($={}){if(E)return null;try{if(y){if(u.classList?.add("is-drive-workspace-replay"),S.setSuspended?.(!0),S.setActive(!1),!P())throw new Error("Recorded replay presentation is unavailable")}else _(),A(M()),S.setSuspended?.(!1),S.setActive(I());S.applyGeometry()}catch(K){if(L(K,"sync"),$.throwOnError===!0)throw K}return S.snapshot()}function D($){return S.contentIdForSlot($)}function B($){let K=String($||"");for(let Z of Object.values(ce))if(D(Z)===K)return Z;return null}function W(){return Object.freeze({replayPresentationActive:y,layoutState:String(u.dataset.driveWorkspaceLayoutState||"idle"),layoutError:C?String(C?.message||C):"",workspace:S.snapshot()})}function V($){let K=$?.detail?.key;(Array.isArray($?.detail?.keys)?$.detail.keys:[K]).some(ee=>s.settingKeys.includes(ee))&&k()}function F(){let $=m.classList.contains("is-replay")&&!!t.CarrotVisionReplay?.isActive?.();if($!==y)try{T($)}catch(K){L(K,"replay presentation")}}typeof t.registerWebSettingsGuard=="function"&&(O=t.registerWebSettingsGuard($=>{y||$.keys.some(K=>s.settingKeys.includes(K))&&A(M(z(),$.settings))}));for(let $ of["resize","orientationchange","carrot:viewportlayout","carrot:pagechange"])w(t,$,k,{passive:!0});if(w(t,"carrot:websettingschange",V),w(n,"visibilitychange",k,{passive:!0}),w(t.visualViewport,"resize",k,{passive:!0}),typeof r=="function"){let $=new r(F);$.observe(m,{attributes:!0,attributeFilter:["class"]}),x.push($)}function H(){if(E)return!1;E=!0;for(let[$,K,Z,ee]of g.splice(0))$.removeEventListener?.(K,Z,ee);for(let $ of x.splice(0))$.disconnect?.();return O?.(),O=null,S.destroy(),ra.delete(u),!0}let Y=Object.freeze({root:u,primary:c,secondary:l,parking:d,divider:f,compatibilityRoots:Object.freeze({vision:m,navigation:p}),shell:S,viewportOrientation:z,readLayout:M,applyLayout:A,setReplayPresentation:T,presentationActive:I,sync:k,status:W,slotForContent:B,contentForSlot:D,destroy:H});ra.set(u,Y);try{e.syncOnCreate!==!1&&k({throwOnError:!0})}catch($){throw H(),$}return Y}function cl(e=globalThis,t={}){let n=Lm({...t,target:e});return e.DriveWorkspaceRuntime=n,n}var km=Object.freeze(["refresh","resize","requestRender","renderText","renderReplayVideoFrame","resetReplayTemporalState","getDisplayModeIndex","setDisplayModeIndex"]),er=null,ll=null,Fm=null;function zm(e){if(!e||km.some(a=>typeof e[a]!="function"))return null;let t=Object.freeze({refresh(){return e.refresh()},resize(a){return e.resize(a)},renderText(){return e.renderText()}}),n=Object.freeze({requestRender(a={}){return e.requestRender(a)}}),r=Object.freeze({renderVideoFrame(a={}){return e.renderReplayVideoFrame(a)},resetTemporalState(){return e.resetReplayTemporalState()}}),o=Object.freeze({getModeIndex(){return e.getDisplayModeIndex()},setModeIndex(a,s={}){return e.setDisplayModeIndex(a,s)}});function i(){return{ready:!0,implementation:"HomeDrive",boundaries:["lifecycle","live","replay","display"]}}return Object.freeze({lifecycle:t,live:n,replay:r,display:o,status:i})}function Xo(){return er}function jm(e=globalThis,t={}){let n=t.implementation??e?.HomeDrive;if(!n)return null;if(er){if(n!==ll)throw new Error("DriveVisionFacade is an app-lifetime singleton")}else{if(er=zm(n),!er)return null;ll=n,Fm=er}return e.DriveVisionFacade=er,er}function Or(e=globalThis,t={}){return jm(e,t)}var ul=new WeakMap;function Vm(e={}){let t=e.target||globalThis,n=e.document||t.document,r=e.root||n?.getElementById?.("driveHudCard"),o=e.workspace||n?.getElementById?.("carrotDriveWorkspace"),i=e.stage||n?.getElementById?.("carrotStage");if(!r||!o)return null;let a=new Set,s=!1,u=!1,c=!1,l=null;function d(){return t.CarrotHudOverlay||null}function f(){let h=t.visualViewport;return{width:Number(h?.width||n.documentElement.clientWidth||t.innerWidth||0),height:Number(h?.height||n.documentElement.clientHeight||t.innerHeight||0)}}function m(){let{width:h,height:S}=f();return S>=h?"vertical":"horizontal"}function p(){let h=d();if(!h)return!1;for(let S of a)h.setSuppressed?.(S,!0);return u&&!c?h.activate?.():h.deactivate?.(),l&&h.update?.(l),!0}function b(){let h=m(),S=i?.classList.contains("is-drive-workspace-compact-primary")===!0,A=c||!u||h==="vertical"||S||a.size>0;return r.dataset.visionHudOrientation=h,r.dataset.visionHudCompact=String(S),r.classList.toggle("is-vision-hud-suppressed",A),r.hidden=A,r.inert=A,A?r.setAttribute("aria-hidden","true"):r.removeAttribute("aria-hidden"),!A}function g(h=r){if(c)throw new Error("Vision HUD cannot mount after destroy");if(h!==r)throw new Error("Vision HUD must use #driveHudCard");return s?!1:(s=!0,b(),!0)}function x(){if(c)throw new Error("Vision HUD cannot activate after destroy");let h=!u;s=!0,u=!0;let S=d();return p(),b(),S?.relayout?.(f()),h}function E(){let h=u;return u=!1,d()?.deactivate?.(),b(),h}function y(){return c||!u?!1:(b(),d()?.relayout?.(f()),!0)}function O(h){return!h||c?!1:(l=h,d()?.update?.(h),b(),!0)}function C(h){return c?!1:(r.classList.toggle("driveHudCard--loading",!!h),!0)}function w(h,S){if(c)return!1;let A=String(h||"external");return S?a.add(A):a.delete(A),d()?.setSuppressed?.(A,!!S),A==="replay-insights"&&r.classList.toggle("is-replay-suppressed",!!S),b()}function z(){return c?!1:(l&&d()?.update?.(l),!0)}function M(){let h=d()?.status?.()||null;return Object.freeze({mounted:s,active:u,destroyed:c,orientation:m(),visible:!r.hidden&&!r.classList.contains("is-vision-hud-suppressed"),suppressions:Object.freeze(Array.from(a)),presentation:h})}function R(){return c?!1:(u=!1,s=!1,c=!0,l=null,a.clear(),d()?.destroy?.(),r.classList.remove("is-replay-suppressed","driveHudCard--loading"),b(),!0)}function v(){c||y()}for(let h of["resize","orientationchange","carrot:viewportlayout","carrot:pagechange","drive:workspacelayoutchange"])t.addEventListener(h,v,{passive:!0});return e.autoMount!==!1&&g(),Object.freeze({root:r,mount:g,activate:x,deactivate:E,resize:y,update:O,setLoading:C,setSuppressed:w,renderText:z,syncPresentation:p,status:M,destroy:R})}function ao(e=globalThis,t={}){let n=ul.get(e);if(n)return n;let r=Vm({...t,target:e});return r&&ul.set(e,r),r}function so(e=globalThis,t={}){let n=ao(e,t);return e.DriveVisionHudContent=n,n}function Hm(e=globalThis){if(Array.isArray(e?.CarrotWebCapabilitiesSpec))return e.CarrotWebCapabilitiesSpec;let t=e?.__CARROT_BOOTSTRAP__?.webCapabilitiesSpec;return Array.isArray(t)?t:[]}function Bm(e=globalThis){if(Array.isArray(e?.CarrotWebSettingsSpec))return e.CarrotWebSettingsSpec;let t=e?.__CARROT_BOOTSTRAP__?.webSettingsSpec;return Array.isArray(t)?t:[]}function Gm(e,t=globalThis){let n=String(e||"");return Hm(t).find(r=>r?.id===n)||null}function Wm(e,t=globalThis){let n=String(e||""),r=Bm(t).find(o=>o?.key===n);return typeof r?.requiresCapability=="string"&&r.requiresCapability?r.requiresCapability:null}function $m(e,t=globalThis){let n=String(e||""),r=t?.CarrotWebCapabilitiesState;if(r&&Object.prototype.hasOwnProperty.call(r,n))return!!r[n];let o=t?.__CARROT_BOOTSTRAP__?.webCapabilities;if(o&&Object.prototype.hasOwnProperty.call(o,n))return!!o[n];let a=Gm(n,t)?.settingKey,s=t?.CarrotWebSettingsState||t?.__CARROT_BOOTSTRAP__?.webSettings;return!!(a&&s?.[a])}function Qo(e,t=globalThis){let n=Wm(e,t);return!n||$m(n,t)}var Gn="vision_ar_enabled",dl=!0;function fl(e=globalThis){return!dl||!(typeof e?.isWebSettingUnlocked=="function"?e.isWebSettingUnlocked(Gn):Qo(Gn,e))?!1:typeof e?.getWebSettingByKey=="function"?!!e.getWebSettingByKey(Gn,!1):Object.prototype.hasOwnProperty.call(e?.CarrotWebSettingsState||{},Gn)?!!e.CarrotWebSettingsState[Gn]:!!e?.__CARROT_BOOTSTRAP__?.webSettings?.[Gn]}function oa(e={}){let t=e.target||globalThis,n=e.documentRoot||t?.document||null,r=e.createRuntime;if(typeof r!="function")throw new TypeError("Vision AR activation gate requires createRuntime");let o=!1,i=!1,a=null,s="";function u(){return fl(t)}function c(){if(!a)return!1;let E=a;return a=null,E.destroy?.(),!0}function l(){if(i)return!1;if(!u()||n?.hidden===!0)return s="",c(),!1;if(!o)return c(),!1;try{if(a||=r(),!a)throw new Error("AR runtime을 만들 수 없습니다");return s="",a.activate?.(),!0}catch(E){return s=String(E?.message||E||"AR activation failed"),t?.console?.warn?.("[vision ar] activate failed",E),c(),!1}}function d(E){(E?.detail?.keys||[E?.detail?.key]).includes(Gn)&&l()}function f(){l()}t?.addEventListener?.("carrot:websettingschange",d),t?.addEventListener?.("carrot:webcapabilitieschange",l),n?.addEventListener?.("visibilitychange",f);function m(){return i?!1:(o=!0,l())}function p(){return i?!1:(o=!1,c())}function b(){return o&&u()?a?.resize?.()??!1:!1}function g(){let E=a?.status?.()||{};return Object.freeze({...E,enabled:u(),visionActive:o,documentHidden:n?.hidden===!0,runtimeCreated:!!a,lastError:s})}function x(){return i?!1:(i=!0,o=!1,t?.removeEventListener?.("carrot:websettingschange",d),t?.removeEventListener?.("carrot:webcapabilitieschange",l),n?.removeEventListener?.("visibilitychange",f),c(),!0)}return Object.freeze({activateVision:m,deactivateVision:p,resize:b,sync:l,status:g,destroy:x})}var tr=Object.freeze([0,0,1]);function ia(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function nr(e,t=null){if(!Array.isArray(e)||e.length<3)return t;let n=[Number(e[0]),Number(e[1]),Number(e[2])];return n.every(Number.isFinite)?n:t}function aa(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function sa(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function co(e,t){let n=nr(e,t),r=n?Math.hypot(n[0],n[1],n[2]):0;return r>1e-9?n.map(o=>o/r):[...t]}function Ut(e,t=tr){let n=co(e,[1,0,0]),r=co(t,tr),o=r.map((s,u)=>s-n[u]*aa(r,n));Math.hypot(...o)<=1e-9&&(r=Math.abs(n[2])<.9?tr:[0,1,0],o=r.map((s,u)=>s-n[u]*aa(r,n))),o=co(o,tr);let i=co(sa(n,o),[0,-1,0]),a=co(sa(i,n),tr);return Object.freeze({forward:Object.freeze(n),right:Object.freeze(i),up:Object.freeze(a)})}function cn(e=0,t=0){let n=ia(e),r=ia(t),o=Math.cos(r);return Ut([Math.cos(n)*o,Math.sin(n)*o,Math.sin(r)])}function Mn(e){if(!e)return cn();let t=nr(e.roadForward),n=nr(e.roadUp,tr);return t?Ut(t,n):cn(e.headingRad,e.pitchRad)}function pl(e){if(!e)return cn();let t=nr(e.faceForward),n=nr(e.faceUp,tr);return t?Ut(t,n):Mn(e)}function zt(e){let t=Ut(e?.forward,e?.up);return Object.freeze({roadForward:t.forward,roadRight:t.right,roadUp:t.up,headingRad:Math.atan2(t.forward[1],t.forward[0]),pitchRad:Math.atan2(t.forward[2],Math.hypot(t.forward[0],t.forward[1]))})}function ml(e){let t=Ut(e?.forward,e?.up);return Object.freeze({faceForward:t.forward,faceRight:t.right,faceUp:t.up,faceHeadingRad:Math.atan2(t.forward[1],t.forward[0])})}function lo(e,t){let n=nr(e,[0,0,0]),r=nr(t,[0,0,0]),o=Math.hypot(r[0],r[1],r[2]);if(!(o>1e-9))return Object.freeze([...n]);let i=r.map(l=>l/o),a=Math.cos(o),s=Math.sin(o),u=sa(i,n),c=aa(i,n);return Object.freeze(n.map((l,d)=>l*a+u[d]*s+i[d]*c*(1-a)))}function ca(e,t){let n=Ut(e?.forward,e?.up);return Ut(lo(n.forward,t),lo(n.up,t))}function Zo(e,t,n){let r=Ut(e?.forward,e?.up),o=Ut(t?.forward,t?.up),i=Math.max(0,Math.min(1,ia(n))),a=(s,u)=>s.map((c,l)=>c+(u[l]-c)*i);return Ut(a(r.forward,o.forward),a(r.up,o.up))}var Ae=Object.freeze({GEODETIC_WGS84:"geodetic-wgs84",LOCAL_WORLD_ENU:"local-world-enu",LOCAL_WORLD_DEVICE:"local-world-device-origin",NED:"ned",DEVICE_FRD:"openpilot-device-frd",CALIBRATED_FRD:"openpilot-calibrated-frd",ROUTE_FLU:"route-local-flu",VIEW_RDF:"openpilot-view-rdf",MARKER_RUB:"marker-local-right-up-backward",STAGE_CSS_PIXEL:"stage-css-pixel"}),la=Object.freeze({orientationNED:Ae.NED,velocityDevice:Ae.DEVICE_FRD,accelerationDevice:Ae.DEVICE_FRD,angularVelocityDevice:Ae.DEVICE_FRD});function Um(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function Cr(e,t,n="value"){let r=e?.coordinateFrame;if(r!==t)throw new TypeError(`${n} coordinateFrame must be ${t}; received ${String(r)}`);return e}function gl(e){let t=Um(e);if(!t)return null;let n=r=>r===0?0:-r;return Object.freeze([t[0],n(t[1]),n(t[2])])}var Pn=gl,An=gl;function hl(e){return Array.isArray(e)?Object.freeze(e.map(t=>{let n=Number(t);return Number.isFinite(n)?n===0?0:-n:t})):e}function ua(e){if(!e||!Array.isArray(e.x)||!Array.isArray(e.y))return null;if(e.coordinateFrame&&e.coordinateFrame!==Ae.CALIBRATED_FRD)throw new TypeError(`modelV2.position coordinateFrame must be ${Ae.CALIBRATED_FRD}`);return Object.freeze({...e,x:e.x,y:hl(e.y),...Array.isArray(e.z)?{z:hl(e.z)}:{},sourceCoordinateFrame:Ae.CALIBRATED_FRD,coordinateFrame:Ae.ROUTE_FLU})}function da(e){if(!e)return null;Cr(e,Ae.DEVICE_FRD,"cameraOdometry");let t=Pn(e.trans),n=Pn(e.rot);return!t||!n?null:Object.freeze({...e,trans:t,rot:n,sourceCoordinateFrame:Ae.DEVICE_FRD,coordinateFrame:Ae.ROUTE_FLU})}var fa=Object.freeze({maxHoldMs:3500,maxDriftM:2.5,maxStepMs:200}),vt=Object.freeze({LIVE:"live",HELD:"held",DROPPED:"dropped"});function at(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function pa(e,t,n){let r=at(n,0);if(!e||!t||!(r>0))return e||null;t.coordinateFrame!==void 0&&Cr(t,Ae.ROUTE_FLU,"anchor odometry");let o=Array.isArray(t.trans)?t.trans:[],i=Array.isArray(t.rot)?t.rot:[],a=at(o[0],0),s=at(o[1],0),u=at(o[2],0),c=[-at(i[0],0)*r,-at(i[1],0)*r,-at(i[2],0)*r],l=lo([at(e.x,0)-a*r,at(e.y,0)-s*r,at(e.z,0)-u*r],c),d=ca(Mn(e),c);return Object.freeze({...e,x:l[0],y:l[1],z:l[2],...zt(d)})}function ma(e,t,n){let r=at(n,0);if(!t||!(r>0))return 0;let o=Array.isArray(t.transStd)?t.transStd:[],i=Array.isArray(t.rotStd)?t.rotStd:[],a=Math.hypot(at(o[0],0),at(o[1],0),at(o[2],0)),s=Math.hypot(at(i[0],0),at(i[1],0),at(i[2],0)),u=Math.hypot(at(e?.x,0),at(e?.y,0),at(e?.z,0));return Math.abs(a)*r+Math.abs(s)*r*u}var Jo=Object.freeze({MODEL_PATH:"model-path-bounded",UNKNOWN_FLAT:"unknown-flat"}),uo=Object.freeze({fullHeightConfidenceM:70,maxHeightDistanceM:120,maxAbsGrade:.25,maxLateralInnovationM:3,lateralCorrectionGain:.35,maxLateralCorrectionM:.75}),ti=Object.freeze({z:0,roadGrade:0,heightSource:Jo.UNKNOWN_FLAT,heightConfidence:0,heightLimited:!1});function wr(e){if(e==null||e===""||typeof e=="boolean")return null;let t=Number(e);return Number.isFinite(t)?t:null}function ei(e,t,n){return Math.min(n,Math.max(t,e))}function Ym(e,t,n){if(!e.length||e[0].z===null)return null;let r=0,o=Math.abs(e[0].z)>1e-6;for(let i=1;i1e-9&&(o=!0);let d=Math.min(t,s.x)-a.x;if(d>0&&(r+=l*d),t<=s.x)return{z:r,grade:l,limited:o}}return null}function ha(e,t,n={}){let r=n.limits?{...uo,...n.limits}:uo,o=Array.isArray(e?.x)?e.x:null,i=Array.isArray(e?.y)?e.y:null,a=Array.isArray(e?.z)?e.z:null,s=wr(t);if(!o||!i||o.length<2||s===null||s<0)return null;let u=Math.min(o.length,i.length),c=[],l=null;for(let C=0;C=2&&w.x>=s){l=[c.at(-2),w];break}}if(!l||s=r.maxHeightDistanceM?0:s<=r.fullHeightConfidenceM?1:(r.maxHeightDistanceM-s)/(r.maxHeightDistanceM-r.fullHeightConfidenceM),O=E&&s=r.maxHeightDistanceM)})}function ga(e,t,n={}){let r=n.limits?{...uo,...n.limits}:uo,o=wr(e),i=wr(t);if(o===null||i===null||n.enabled!==!0)return Object.freeze({y:o??i??0,correctionM:0,accepted:!1});let a=i-o;if(Math.abs(a)>r.maxLateralInnovationM)return Object.freeze({y:o,correctionM:0,accepted:!1});let s=ei(a*r.lateralCorrectionGain,-r.maxLateralCorrectionM,r.maxLateralCorrectionM);return Object.freeze({y:o+s,correctionM:s,accepted:!0})}function fo(e,t){let n=ha(e,t);if(!n)return null;let r=Ut(n.tangent),{tangent:o,...i}=n;return Object.freeze({...i,...zt(r),coordinateFrame:Ae.ROUTE_FLU})}var rr=Object.freeze({minimumRangeM:200,defaultRangeM:300,maximumRangeM:300});function bl(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function Ir(e=rr.defaultRangeM){let t=bl(e,rr.defaultRangeM);return Math.min(rr.maximumRangeM,Math.max(rr.minimumRangeM,t))}function ba(e,t){let n=bl(e);return n!==null&&n>=0&&n<=Ir(t)}var Ue=Object.freeze({TURN_GATE:"turn_gate",COMMIT_ARROW:"commit_arrow",DESTINATION_PIN:"destination_pin",CAUTION_SIGN:"caution_sign",LANE_BAND:"lane_band",SECTION_GATE:"section_gate",SIGNAL_HEAD:"signal_head",CROSSROAD_CARD:"crossroad_card",SPEED_SIGN:"speed_sign"}),yl=Object.freeze({laneBand:!1}),po=Object.freeze({BILLBOARD:"billboard",SURFACE:"surface"}),Km=Object.freeze(new Set([Ue.LANE_BAND]));function ya(e){return Km.has(e)?po.SURFACE:po.BILLBOARD}var uS=Object.freeze({defaultSupportHeightM:1.05,supportHeightMByKind:Object.freeze({[Ue.TURN_GATE]:1.05,[Ue.COMMIT_ARROW]:1.05,[Ue.CAUTION_SIGN]:.95,[Ue.SECTION_GATE]:.95,[Ue.SIGNAL_HEAD]:1.05,[Ue.CROSSROAD_CARD]:1.05,[Ue.SPEED_SIGN]:.95})});var Yt=Object.freeze({PREVIEW:"preview",APPROACH:"approach",PRECISE:"precise",COMMIT:"commit",PASSED:"passed"}),Wn=Object.freeze({baseMps:16.7,previewEnterM:rr.defaultRangeM,approachEnterM:150,preciseEnterM:70,commitEnterM:15,passedExitM:-8,speedScaleMin:.6,speedScaleMax:1.8}),dS=Object.freeze({turn:Object.freeze({edge:[.21,.95,.63],fill:[.09,.45,.3],glow:[.35,1,.7]}),caution:Object.freeze({edge:[1,.78,.25],fill:[.42,.3,.06],glow:[1,.86,.45]}),destination:Object.freeze({edge:[1,.45,.78],fill:[.42,.12,.28],glow:[1,.6,.85]}),lane:Object.freeze({edge:[.35,.82,1],fill:[.08,.3,.44],glow:[.55,.9,1]}),uncertain:Object.freeze({edge:[.72,.76,.78],fill:[.2,.22,.24],glow:[.8,.84,.86]})}),fS=Object.freeze({laneWidthDefaultM:3.5,laneWidthMinM:2.8,laneWidthMaxM:4.2,gate:Object.freeze({heightM:4.2,postWidthM:.26,beamHeightM:.34,depthM:.22,sideMarginM:.15,chevronCount:3}),arrow:Object.freeze({chevronCount:3,chevronWidthM:2.2,chevronDepthM:1.1,chevronThickM:.42,spacingM:2.6,liftM:.06}),pin:Object.freeze({heightM:5,headRadiusM:.85,stemRadiusM:.12,radialSegments:12}),sign:Object.freeze({diameterM:1.7,heightM:3.2,ringThickM:.22,radialSegments:20}),laneBand:Object.freeze({lengthM:26,liftM:.03,fadeStartRatio:.55})}),pS=Object.freeze([Object.freeze({id:"xs",maxMinSidePx:380,maxHeightRatio:.34,maxWidthRatio:.56,minWidthPx:112,safeMarginPx:12,minHeightPx:24,labels:!1,chevronCount:2,lod:"flat",maxMarkers:1}),Object.freeze({id:"sm",maxMinSidePx:560,maxHeightRatio:.38,maxWidthRatio:.54,minWidthPx:136,safeMarginPx:14,minHeightPx:30,labels:!0,chevronCount:2,lod:"flat",maxMarkers:2}),Object.freeze({id:"md",maxMinSidePx:900,maxHeightRatio:.42,maxWidthRatio:.52,minWidthPx:164,safeMarginPx:16,minHeightPx:38,labels:!0,chevronCount:3,lod:"solid",maxMarkers:2}),Object.freeze({id:"lg",maxMinSidePx:1/0,maxHeightRatio:.46,maxWidthRatio:.5,minWidthPx:192,safeMarginPx:18,minHeightPx:44,labels:!0,chevronCount:3,lod:"solid",maxMarkers:3})]),_r=Object.freeze({backend:"three",failureMode:"hidden",canvas2dFallback:!1,devicePixelRatioMax:2,degradedDevicePixelRatioMax:1.5,targetFps:30,degradedFps:15,performance:Object.freeze({slowBudgetRatio:.9,degradeWindowFrames:12,degradeSlowFrames:9,recoverBudgetRatio:.72,recoverWindowFrames:60,recoverFastFrames:54}),alphaByConfidence:Object.freeze({high:1,medium:.72,low:.42,hidden:0}),fadeInMs:280,fadeOutMs:420,cacheGraceMs:900,selectionHysteresisMs:320,viewportEnterPaddingPx:0,viewportExitPaddingPx:32,farLegibilityScaleMax:3,worldObjectMaxHeightRatio:.62,worldObjectMaxWidthRatio:.78,nearMarkerDepthM:3,nearUprightMarkerDepthM:8,laneBandPresentation:Object.freeze({viewPitchRad:-Math.PI/4,farLengthScaleMax:5,maxScreenHeightRatio:.52,maxScreenWidthRatio:.92}),presentation:Object.freeze({positionHalfLifeMs:160,orientationHalfLifeMs:220,scaleHalfLifeMs:180,maxStepMs:250,snapDistanceM:12,nearWorldScaleMin:.28})}),qm=Object.freeze({maxYawRad:Math.PI*.39}),mo=Object.freeze({maxGpsAgeMs:4e3,maxHorizontalAccuracyM:40,maxPositionSeparationM:60,separationAccuracyMultiplier:3,minBearingCheckSpeedMps:2,maxBearingAccuracyDeg:45,maxHeadingDisagreementDeg:60,routeWorldPositionSigmaM:12,routeWorldHeadingSigmaDeg:18});function vl(e,t,n){return Math.min(n,Math.max(t,e))}function Sl(e,t){let n=Number(e);return Number.isFinite(n)?n:t}function Ml(e,t={}){let n=Math.max(0,Sl(e,Wn.baseMps)),r=vl(n/Wn.baseMps,Wn.speedScaleMin,Wn.speedScaleMax);return Object.freeze({preview:Ir(t.discoveryRangeM),approach:Wn.approachEnterM*r,precise:Wn.preciseEnterM*r,commit:Wn.commitEnterM,passed:Wn.passedExitM})}function ho(e,t,n={}){let r=Sl(e,NaN);if(!Number.isFinite(r))return Yt.PASSED;let o=Ml(t,n);return r>16&255}, ${o>>8&255}, ${o&255}, ${i})`}var Ma=Object.freeze({outlineM:.055,outlineOpacity:.95,textStrokePx:10,dropShadowPx:18,shadowPlaneOpacity:.42,shadowPlaneScale:1.35,emissiveIntensity:.28}),ni=Object.freeze({preview:Object.freeze({scale:.78,opacity:.62,chevrons:0,showSecondary:!1}),approach:Object.freeze({scale:.9,opacity:.85,chevrons:2,showSecondary:!0}),precise:Object.freeze({scale:1,opacity:1,chevrons:3,showSecondary:!0}),commit:Object.freeze({scale:1.12,opacity:1,chevrons:3,showSecondary:!1})});function Aa(e){return Al[e]||Al[Te.GUIDE]}function Ra(e){return Zm[e]||rt.BAR}function Rn(e={}){let t=Object.values(Te).includes(e.tone)?e.tone:Te.GUIDE,n=e.shape||Ra(t),r=ni[e.phase]?e.phase:"precise",o=ni[r],i=Math.sign(Number(e.turnSign)||0),a=ln[n]||ln[rt.BAR],s=Number(e.laneWidthM)||3.5,u,c;n===rt.BAND?(u=s*a.insetRatio,c=a.lengthM):n===rt.CIRCLE?u=c=a.diameterM:n===rt.PIN?(u=a.headDiameterM,c=a.heightM):(u=a.widthM,c=a.heightM);let l=u*o.scale,d=c*o.scale;return Object.freeze({tone:t,shape:n,phase:r,palette:Aa(t),primary:String(e.primary??""),secondary:o.showSecondary?String(e.secondary??""):"",turnSign:i,chevronCount:i===0?0:o.chevrons,distanceM:Number(e.distanceM)||0,widthM:l,heightM:d,mountHeightM:ln.mountHeightM,depthM:a.depthM??.24,radiusM:a.radiusM??0,opacity:o.opacity,scale:o.scale})}function Cl(e,t,n,r,o,i){let a=Math.min(i,r/2,o/2);e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+o,a),e.arcTo(t+r,n+o,t,n+o,a),e.arcTo(t,n+o,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}function $n(e,t,n,r,{px:o,weight:i,color:a,stroke:s,align:u="center",maxWidth:c=0}){if(!t)return;let l=o;if(c>0){e.font=`${i} ${l}px ${ct.family}`;let f=e.measureText(t).width;f>c&&(l=Math.max(12,Math.floor(l*(c/f))))}let d=l;e.font=`${i} ${d}px ${ct.family}`,e.textAlign=u,e.textBaseline="middle",e.lineJoin="round",s&&(e.lineWidth=Ma.textStrokePx*(d/o),e.strokeStyle=s,e.strokeText(t,n,r)),e.fillStyle=a,e.fillText(t,n,r)}function th(e,t,n){if(!t.chevronCount)return;let r=ln.chevron,o=n.w*r.widthRatio,i=n.w*r.gapRatio,a=n.w*r.insetRatio,s=n.h*.46,u=n.y+n.h/2,c=t.turnSign,l=c>0?n.x+n.w-a-(o*t.chevronCount+i*(t.chevronCount-1)):n.x+a;e.save();for(let d=0;d0?(e.moveTo(f,u-s/2),e.lineTo(f+o*.62,u),e.lineTo(f,u+s/2),e.lineTo(f+o*.28,u)):(e.moveTo(f+o*.62,u-s/2),e.lineTo(f,u),e.lineTo(f+o*.62,u+s/2),e.lineTo(f+o*.34,u)),e.closePath(),e.fill()}e.restore()}function nh(e,t,n,r){let o=t.palette,i=r*.06,a={x:i,y:i,w:n-i*2,h:r-i*2},s=t.radiusM/t.heightM*a.h,u=e.createLinearGradient(0,a.y,0,a.y+a.h);u.addColorStop(0,xt(o.surfaceTop,ut.surfaceTop)),u.addColorStop(1,xt(o.surface,ut.surface)),Cl(e,a.x,a.y,a.w,a.h,s),e.fillStyle=u,e.fill(),e.lineWidth=r*.03,e.strokeStyle=xt(o.edge,ut.edge),e.globalAlpha=Ma.outlineOpacity,e.stroke(),e.globalAlpha=1,th(e,t,a);let c=t.chevronCount?a.w*(ln.chevron.widthRatio*t.chevronCount+ln.chevron.gapRatio*(t.chevronCount-1)+ln.chevron.insetRatio*1.5):0,l=t.turnSign<0?a.x+c:a.x,d=a.w-c,f=l+d/2,m=!!t.secondary,p=a.y+a.h/2,b=d*.9;$n(e,t.primary,f,m?p-r*.105:p,{px:ct.primaryPx,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),stroke:"rgba(0,0,0,0.45)",maxWidth:b}),m&&$n(e,t.secondary,f,p+r*.205,{px:ct.secondaryPx,weight:ct.secondaryWeight,color:o.inkMuted,stroke:"rgba(0,0,0,0.35)",maxWidth:b})}function rh(e,t,n,r){let o=t.palette,i=n/2,a=r/2,s=ln.badgeFillRatio/2,u=n*s,c=r*s,l=Math.min(u,c)*.13;e.save(),e.translate(i,a),e.rotate(Math.PI/4);let d=Math.min(u,c)*Math.SQRT1_2*2;Cl(e,-d/2,-d/2,d,d,l);let f=e.createLinearGradient(0,-d/2,0,d/2);f.addColorStop(0,xt(o.surfaceTop,ut.surfaceTop)),f.addColorStop(1,xt(o.surface,ut.surface)),e.fillStyle=f,e.fill(),e.lineWidth=d*.055,e.strokeStyle=xt(o.accent,ut.edge),e.stroke(),e.restore();let m=!!t.secondary,p=n*.62;$n(e,t.primary,i,m?a-r*.075:a,{px:ct.primaryPx*.78,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),stroke:"rgba(255,255,255,0.30)",maxWidth:p}),m&&$n(e,t.secondary,i,a+r*.155,{px:ct.secondaryPx*.86,weight:ct.secondaryWeight,color:o.inkMuted,maxWidth:p})}function oh(e,t,n,r){let o=t.palette,i=n/2,a=r/2,s=Math.min(n,r)*(ln.badgeFillRatio/2),u=s*.17;e.beginPath(),e.arc(i,a,s,0,Math.PI*2),e.fillStyle=xt(o.surface,ut.surface),e.fill(),e.beginPath(),e.arc(i,a,s-u/2,0,Math.PI*2),e.lineWidth=u,e.strokeStyle=xt(o.accent,ut.edge),e.stroke();let c=!!t.secondary,l=(s-u)*1.55;$n(e,t.primary,i,c?a-r*.055:a,{px:ct.badgePx*1.55,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),maxWidth:l}),c&&$n(e,t.secondary,i,a+r*.205,{px:ct.secondaryPx*.78,weight:ct.secondaryWeight,color:o.inkMuted,maxWidth:l})}function ih(e,t,n,r){let o=t.palette,i=n/2,a=r*.42,s=Math.min(n,r)*(ln.badgeFillRatio/2)*.86;e.beginPath(),e.arc(i,a,s,0,Math.PI*2);let u=e.createRadialGradient(i,a-s*.4,s*.1,i,a,s);u.addColorStop(0,xt(o.surfaceTop,ut.surfaceTop)),u.addColorStop(1,xt(o.surface,ut.surface)),e.fillStyle=u,e.fill(),e.lineWidth=s*.12,e.strokeStyle=xt(o.edge,ut.edge),e.stroke();let c=s*1.45;$n(e,t.primary,i,t.secondary?a-s*.18:a,{px:ct.primaryPx*.62,weight:ct.primaryWeight,color:xt(o.ink,ut.ink),stroke:"rgba(0,0,0,0.35)",maxWidth:c}),t.secondary&&$n(e,t.secondary,i,a+s*.44,{px:ct.secondaryPx*.9,weight:ct.secondaryWeight,color:o.inkMuted,maxWidth:c})}var yS=Object.freeze({[rt.BAR]:nh,[rt.DIAMOND]:rh,[rt.CIRCLE]:oh,[rt.PIN]:ih});function ri(e){let t=Number(e);return!Number.isFinite(t)||t<0?"":t<1e3?`${Math.round(t/10)*10}m`:`${(t/1e3).toFixed(t>=1e4?0:1)}km`}var ah=Object.freeze({left:"좌회전",right:"우회전",slight_left:"좌측",slight_right:"우측",sharp_left:"급좌회전",sharp_right:"급우회전",uturn:"유턴",straight:"직진"});function oi(e={}){let t=ri(e.distanceM),n=e.turn||{},r=ah[n.direction]||"",o={distanceM:e.distanceM,phase:e.phase};if(e.kind===Ue.LANE_BAND){let a=Rn({...o,tone:Te.LANE,primary:t,secondary:"권장 차선",laneWidthM:Number(e.laneWidthM)||3.5});return Object.freeze({...a,kind:e.kind,laneOffsetM:Number(e.laneOffsetM)||0,surface:!0})}if(ya(e.kind)===po.SURFACE)return null;let i=a=>a?Object.freeze({...a,kind:e.kind}):null;switch(e.kind){case"turn_gate":return i(Rn({...o,tone:Te.GUIDE,primary:t||r,secondary:[r,e.label].filter(Boolean).join(" · "),turnSign:n.sign}));case"commit_arrow":return i(Rn({...o,tone:Te.GUIDE,primary:r||"직진",secondary:"",turnSign:n.sign}));case"destination_pin":return i(Rn({...o,tone:Te.DESTINATION,primary:"도착",secondary:t}));case"caution_sign":return i(Rn({...o,tone:Te.CAUTION,primary:t,secondary:e.sdiFamily==="bump"?"과속방지턱":e.sdiFamily==="police"?"경찰":e.sdiFamily==="camera"?"단속카메라":"도로 주의"}));case"section_gate":return i(Rn({...o,tone:Te.RESTRICT,primary:String(e.limitKph||""),secondary:e.suspended?"구간단속 일시중지":`구간 평균 ${Math.round(e.averageKph||e.overallAverageKph||0)}`}));case"speed_sign":return i(Rn({...o,tone:Te.RESTRICT,primary:String(e.speedLimitKph||""),secondary:""}));case"signal_head":{let s=(Array.isArray(e.lamps)?e.lamps:[]).find(c=>c.on);if(!s)return null;let u={red:"정지",green:"직진",left:"좌회전",right:"우회전",uturn:"유턴"};return i(Rn({...o,tone:Te.CAUTION,primary:u[s.id]||"신호",secondary:s.remainSec>0||e.counterRemainSec>0?`${Math.round(s.remainSec||e.counterRemainSec)}초`:t}))}case"crossroad_card":return i(Rn({...o,tone:Te.GUIDE,primary:t,secondary:"교차로"}));default:return null}}var wl="guidance:primary",sh="guidance:next",ch="guidance:commit";var ii=Object.freeze({pointToleranceM:12,pointClusterM:8,forwardResetM:35,promotionDistanceToleranceM:120,missingGraceTicks:4});function ai(e){let t=Number(e);return Number.isFinite(t)?t:null}function xa(e){return String(e?.source||"unknown")}function Il(e){return e?.descriptor||e||{}}function si(e){return String(e?.kind||Il(e).kind||"unknown")}function _l(e){let t=ai(e?.latitude),n=ai(e?.longitude);if(e?.pointValid!==!0||t===null||n===null)return null;let r=t*Math.PI/180;return Object.freeze({north:t*111320,east:n*111320*Math.cos(r)})}function lh(e,t=ii.pointClusterM){let n=_l(e);if(!n)return"";let r=Math.max(1,ai(t)||ii.pointClusterM);return`${Math.round(n.north/r)},${Math.round(n.east/r)}`}function uh(e,t){return!e||!t?null:Math.hypot(e.north-t.north,e.east-t.east)}function Nl(e){let t=Il(e);return String(e?.turn?.code??t?.turnCode??e?.sdiCode??e?.sdiFamily??t?.sdiFamily??e?.imageCode??t?.imageCode??e?.speedLimitKph??t?.speedLimitKph??e?.limitKph??t?.limitKph??e?.turnCode??"")}function dh(e){for(let t of[e?.stableEventId,e?.navigationEventId,e?.eventId]){let n=String(t??"").trim();if(n)return n}return""}function fh(e){return e==="guidanceCurrent"||e==="guidanceNext"}function ph(e){let t=xa(e);return Object.freeze({source:t,slot:go(e),kind:si(e),semantic:Nl(e),providedId:dh(e),point:_l(e?.point),distanceM:ai(e?.distanceM),guidance:fh(t)})}function go(e={}){let t=xa(e),n=si(e);return t==="calibrationProbe"?wl:t==="guidanceCurrent"?n==="commit_arrow"?ch:wl:t==="guidanceNext"?sh:`${t}:${n}`}function bo(e={}){let t=xa(e),n=lh(e?.point),r=Nl(e);return n&&(t==="guidanceCurrent"||t==="guidanceNext")?["guidance:event",si(e),n,String(r)].join("|"):[go(e),t,si(e),n,String(r)].join("|")}function mh(e,t,n){if(e.kind!==t.kind)return null;if(e.providedId||t.providedId)return e.providedId&&e.providedId===t.providedId?-1e3:null;let r=e.guidance&&t.guidance;if(!r&&e.slot!==t.slot)return null;let o=uh(e.point,t.point);if(o!==null){if(o>n.pointToleranceM)return null;let a=e.semantic===t.semantic?0:4,s=e.source===t.source?0:1;return o+a+s}if(e.semantic!==t.semantic)return null;let i=e.distanceM===null||t.distanceM===null?0:t.distanceM-e.distanceM;return e.slot===t.slot?i>n.forwardResetM?null:100+Math.abs(i):r&&e.source==="guidanceNext"&&t.source==="guidanceCurrent"&&Math.abs(i)<=n.promotionDistanceToleranceM?200+Math.abs(i):null}function Ea(e={}){let t=Object.freeze({...ii,...e.limits||{}}),n=null,r=0,o=0,i=new Map;function a(c=null){n=c===null?null:String(c||"legacy"),r=0,o=0,i=new Map}function s(c=[],l={}){let d=String(l.sessionId||"legacy");n!==d&&a(d),o+=1;let f=new Set,m=[];for(let p of Array.isArray(c)?c:[]){let b=ph(p),g=null,x=1/0;for(let O of i.values()){if(f.has(O.id))continue;let C=mh(O,b,t);C===null||C>=x||(g=O,x=C)}let E=b.providedId?`ar-event|${d}|${b.kind}|provided:${b.providedId}`:"",y=g?.id||E||`ar-event|${d}|${b.kind}|${++r}`;i.set(y,Object.freeze({...b,id:y,seenTick:o})),f.add(y),m.push(y)}for(let[p,b]of i)o-b.seenTick>t.missingGraceTicks&&i.delete(p);return Object.freeze(m)}function u(){return Object.freeze({sessionId:n,occurrenceCount:r,tracked:i.size,tick:o,limits:t})}return Object.freeze({assign:s,reset:a,status:u,limits:t})}var Dl=111320,xn=Object.freeze({maxRangeM:2e3,routeSlackRatio:1.2,routeSlackM:30,maxTangentSnapM:140,maxRouteStartSnapM:160,maneuverLookAheadM:12});function jt(e){let t=Number(e);return Number.isFinite(t)?t:null}function Ln(e,t,n,r){let o=jt(e),i=jt(t),a=jt(n),s=jt(r);if(o===null||i===null||a===null||s===null)return null;let u=(a-o)*Dl;return{east:(s-i)*Dl*Math.cos(o*Math.PI/180),north:u}}function ir(e,t,n){let r=jt(e),o=jt(t),i=jt(n);if(r===null||o===null||i===null)return null;let a=i*Math.PI/180,s=Math.sin(a),u=Math.cos(a);return{x:r*s+o*u,y:o*s-r*u,...ti,coordinateFrame:Ae.ROUTE_FLU}}function Ta(e,t,n={}){if(!e||e.present===!1||!t||t.pointValid===!1)return null;let r=Ln(e.latitude,e.longitude,t.latitude,t.longitude);if(!r)return null;let o=jt(e.headingDeg);if(o===null)return null;let i=ir(r.east,r.north,o);if(!i)return null;let a=Math.hypot(i.x,i.y);if(!(a>0)||a>xn.maxRangeM)return null;let s=jt(n.routeDistanceM);if(s!==null&&s>0){let u=s*xn.routeSlackRatio+xn.routeSlackM;if(a>u)return null}return i.x<=0?null:Object.freeze({...i,rangeM:a})}function Oa(e,t,n,r={}){if(!e||e.present===!1||!t||t.pointValid===!1||!Array.isArray(n)||n.length<2)return null;let o=jt(r.maxTangentSnapM)??xn.maxTangentSnapM,i=Math.max(0,jt(r.lookAheadM)??0),a=[];for(let l of n){let d=Ln(t.latitude,t.longitude,l?.latitude,l?.longitude),f=d&&ir(d.east,d.north,e.headingDeg);f&&a.push(f)}if(a.length<2)return null;let s=null;for(let l=1;l.01))continue;let g=Math.max(0,Math.min(1,-(d.x*m+d.y*p)/b)),x=d.x+m*g,E=d.y+p*g,y=Math.hypot(x,E);s&&y>=s.distanceM||(s={distanceM:y,headingRad:Math.atan2(p,m),index:l,x,y:E})}if(!s||s.distanceM>o)return null;if(!(i>0))return s.headingRad;let u=i,c={x:s.x,y:s.y};for(let l=s.index;l.01){if(u<=p){let b=u/p,g=c.x+f*b,x=c.y+m*b;return Math.atan2(x-s.y,g-s.x)}u-=p}c=d}return s.headingRad}function hh(e,t){return e&&e.routePointCount===t&&Number.isInteger(e.index)&&e.index>0&&e.index.01)||i<-Math.sqrt(s)*.25)continue;let u=Math.max(0,Math.min(1,-(r.x*i+r.y*a)/s)),c=r.x+i*u,l=r.y+a*u,d=Math.hypot(c,l);(!t||d.01){if(r<=c){let l=r/c,d=o.x+s*l,f=o.y+u*l,m=Math.hypot(d,f);return!(d>0)||m>xn.maxRangeM?null:Object.freeze({x:d,y:f,...ti,rangeM:m,headingRad:Math.atan2(u,s),routeStartIndex:t.index,routeAlongTrackM:jt(t.alongTrackM),routeDerived:!0,coordinateFrame:Ae.ROUTE_FLU})}r-=c}o=a}return null}function Dr(e,t,n,r={}){if(!e||e.present===!1||!Array.isArray(t)||t.length<2)return null;let o=jt(n);if(o===null||!(o>0)||o>xn.maxRangeM)return null;let i=[];for(let u of t){let c=Ln(e.latitude,e.longitude,u?.latitude,u?.longitude),l=c&&ir(c.east,c.north,e.headingDeg);l&&i.push(l)}if(i.length<2)return null;let a=jt(r.maxRouteStartSnapM)??xn.maxRouteStartSnapM,s=[hh(r.routeMatch,i.length),gh(i)];for(let u of s){if(!u||u.snapDistanceM>a)continue;let c=bh(i,u,o);if(c)return c}return null}var jl=Object.freeze({maxIntegrationStepMs:250,maxLivePoseAgeMs:180,maxOrientationStdRad:.35,maxOrientationInnovationRad:.45,orientationCorrectionGain:.08,maxVelocityStdMps:5,maxVelocityInnovationMps:8,velocityFusionGain:.35,maxAngularVelocityStdRadps:.5,maxAngularVelocityInnovationRadps:.7,angularVelocityFusionGain:.35,maxAccelerationStdMps2:8,maxAccelerationMps2:20,maxGeoPositionSigmaM:25,maxGeoPositionInnovationM:25,geoPositionCorrectionGain:.25,maxGeoPositionCorrectionM:3,maxGeoPositionStepM:.25,maxGeoHeadingSigmaDeg:25,maxGeoYawInnovationRad:35*Math.PI/180,geoYawCorrectionGain:.2,maxGeoYawCorrectionRad:4*Math.PI/180,maxGeoYawStepRad:.5*Math.PI/180}),Ca=Object.freeze([1,0,0,0]),yo=Object.freeze([0,0,0]),Vl=1e6;function kn(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function Vt(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function wa(e){if(!Array.isArray(e)||e.length<4)return null;let t=e.slice(0,4).map(Number);return t.every(Number.isFinite)?t:null}function dt(e){let t=wa(e);if(!t)return null;let n=Math.hypot(...t);if(!(n>0))return null;let r=t.map(o=>o/n);return r[0]<0?Object.freeze(r.map(o=>-o)):Object.freeze(r)}function ar(e,t){let n=wa(e),r=wa(t);if(!n||!r)return null;let[o,i,a,s]=n,[u,c,l,d]=r;return dt([o*u-i*c-a*l-s*d,o*c+i*u+a*d-s*l,o*l-i*d+a*u+s*c,o*d+i*l-a*c+s*u])}function yh(e){let t=Vt(e);if(!t)return null;let[n,r,o]=t,i=Math.cos(n/2),a=Math.sin(n/2),s=Math.cos(r/2),u=Math.sin(r/2),c=Math.cos(o/2),l=Math.sin(o/2);return dt([i*s*c+a*u*l,a*s*c-i*u*l,i*u*c+a*s*l,i*s*l-a*u*c])}function Pl(e){let t=dt(e);return t?Object.freeze([t[0],-t[1],-t[2],-t[3]]):null}function vh(e,t,n){let r=dt(e),o=dt(t);if(!r||!o)return null;let i=Math.max(0,Math.min(1,kn(n,0))),a=r.reduce((d,f,m)=>d+f*o[m],0);if(a<0&&(o=o.map(d=>-d),a=-a),a>.9995)return dt(r.map((d,f)=>d+(o[f]-d)*i));let s=Math.acos(Math.max(-1,Math.min(1,a))),u=Math.sin(s),c=Math.sin((1-i)*s)/u,l=Math.sin(i*s)/u;return dt(r.map((d,f)=>d*c+o[f]*l))}function Sh(e,t){let n=dt(e),r=dt(t);if(!n||!r)return null;let o=Math.abs(n.reduce((i,a,s)=>i+a*r[s],0));return 2*Math.acos(Math.max(-1,Math.min(1,o)))}function ci(e,t){if(!e||e.valid!==!0)return null;let n=Vt([e.x,e.y,e.z]),r=Vt([e.xStd,e.yStd,e.zStd]);return!n||!r||r.some(o=>o<0||o>t)?null:Object.freeze({value:n,std:r,worstStd:Math.max(...r)})}function Ll(e,t){return Math.hypot(...e.map((n,r)=>n-t[r]))}function Ia(e,t,n){return Math.min(n,Math.max(t,e))}function kl(e){return Math.atan2(Math.sin(e),Math.cos(e))}function Mh(e){let t=dt(e);if(!t)return null;let[n,r,o,i]=t;return Object.freeze([Math.atan2(2*(n*r+o*i),1-2*(r*r+o*o)),Math.asin(Ia(2*(n*o-i*r),-1,1)),Math.atan2(2*(n*i+r*o),1-2*(o*o+i*i))])}function Fl(e,t,n){return Object.freeze(e.map((r,o)=>r+(t[o]-r)*n))}function Hl(e,t,n){let r=kn(e?.timestamp,null);return r!==null&&r>0&&Math.abs(t-r)/Vl<=n.maxLivePoseAgeMs}function zl(e,t,n,r){let o=Vt(e?.trans),i=Vt(e?.rot),a=t?.inputsOK===!0&&t?.posenetOK===!0&&t?.sensorsOK!==!1&&Hl(t,n,r),s=a?ci(t.velocityDevice,r.maxVelocityStdMps):null,u=a?ci(t.angularVelocityDevice,r.maxAngularVelocityStdRadps):null,c=a?ci(t.accelerationDevice,r.maxAccelerationStdMps2):null,l=o&&s?Ll(o,s.value):null,d=i&&u?Ll(i,u.value):null,f=c?Math.hypot(...c.value):null,m=l!==null&&l<=r.maxVelocityInnovationMps,p=d!==null&&d<=r.maxAngularVelocityInnovationRadps,b=f!==null&&f<=r.maxAccelerationMps2;return Object.freeze({velocity:m?Fl(o,s.value,r.velocityFusionGain):o,angularVelocity:p?Fl(i,u.value,r.angularVelocityFusionGain):i,velocityAccepted:m,angularAccepted:p,accelerationAccepted:b,velocityInnovationMps:l,angularInnovationRadps:d,accelerationMagnitudeMps2:f,livePoseFresh:a})}function li(e){let t=Vt(e);if(!t)return null;let n=Math.hypot(...t);if(n<1e-12)return Ca;let r=n/2,o=Math.sin(r)/n;return dt([Math.cos(r),t[0]*o,t[1]*o,t[2]*o])}function un(e,t){let n=dt(e),r=Vt(t);if(!n||!r)return null;let[o,i,a,s]=n,[u,c,l]=r,d=2*(a*l-s*c),f=2*(s*u-i*l),m=2*(i*c-a*u);return Object.freeze([u+o*d+(a*m-s*f),c+o*f+(s*d-i*m),l+o*m+(i*f-a*d)])}function Bl(e){let t=dt(e);if(!t)return null;let[n,r,o,i]=t;return Object.freeze([Object.freeze([1-2*(o*o+i*i),2*(r*o-i*n),2*(r*i+o*n)]),Object.freeze([2*(r*o+i*n),1-2*(r*r+i*i),2*(o*i-r*n)]),Object.freeze([2*(r*i-o*n),2*(o*i+r*n),1-2*(r*r+o*o)])])}function Gl(e,t){let n=Vt(e),r=Bl(t);return!n||!r?null:Object.freeze([r[0][0],r[0][1],r[0][2],n[0],r[1][0],r[1][1],r[1][2],n[1],r[2][0],r[2][1],r[2][2],n[2],0,0,0,1])}function _a(e,t){let n=Vt(t),r=Vt(e?.position),o=un(e?.orientation,n);return!n||!r||!o?null:Object.freeze(o.map((i,a)=>i+r[a]))}function Na(e,t){let n=Vt(t),r=Vt(e?.position),o=dt(e?.orientation);if(!n||!r||!o)return null;let i=n.map((a,s)=>a-r[s]);return un([o[0],-o[1],-o[2],-o[3]],i)}function En(e,t={}){let n=Object.freeze([...e.position]),r=Object.freeze([...e.orientation]);return Object.freeze({epoch:e.epoch,initialized:e.timestampNs!==null,timestampNs:e.timestampNs,position:n,orientation:r,matrixWorldFromDevice:Gl(n,r),worldCoordinateFrame:Ae.LOCAL_WORLD_DEVICE,deviceCoordinateFrame:Ae.DEVICE_FRD,samples:e.samples,integrations:e.integrations,skippedGaps:e.skippedGaps,fusion:Object.freeze({...e.fusion}),geoCorrection:Object.freeze({...e.geoCorrection,pendingPosition:Object.freeze([...e.geoPendingPosition])}),...t})}function Da(e={}){let t=Object.freeze({...jl,...e.limits||{}}),n={epoch:String(e.epoch||"uninitialized"),timestampNs:null,position:[...yo],orientation:[...Ca],samples:0,integrations:0,skippedGaps:0,worldFromNed:null,lastLivePoseTimestampNs:null,fusion:{orientationReferenceReady:!1,orientationAccepted:0,orientationRejected:0,velocityAccepted:0,angularVelocityAccepted:0,accelerationAccepted:0,lastOrientationInnovationRad:null,lastVelocityInnovationMps:null,lastAngularInnovationRadps:null,lastAccelerationMagnitudeMps2:null,lastLivePoseFresh:!1,lastReason:"not observed"},geoReference:null,geoLastObservationKey:null,geoPendingPosition:[...yo],geoPendingYawRad:0,geoCorrection:{referenceReady:!1,accepted:0,rejected:0,yawAccepted:0,yawRejected:0,appliedFrames:0,lastPositionInnovationM:null,lastYawInnovationRad:null,lastPositionSigmaM:null,lastHeadingSigmaDeg:null,pendingYawRad:0,lastReason:"not observed"}},r=En(n,{accepted:!1,reason:"not initialized",dtMs:null});function o(l={}){return n.epoch=String(l.epoch||"uninitialized"),n.timestampNs=null,n.position=[...yo],n.orientation=[...Ca],n.samples=0,n.integrations=0,n.skippedGaps=0,n.worldFromNed=null,n.lastLivePoseTimestampNs=null,n.fusion={orientationReferenceReady:!1,orientationAccepted:0,orientationRejected:0,velocityAccepted:0,angularVelocityAccepted:0,accelerationAccepted:0,lastOrientationInnovationRad:null,lastVelocityInnovationMps:null,lastAngularInnovationRadps:null,lastAccelerationMagnitudeMps2:null,lastLivePoseFresh:!1,lastReason:"reset"},n.geoReference=null,n.geoLastObservationKey=null,n.geoPendingPosition=[...yo],n.geoPendingYawRad=0,n.geoCorrection={referenceReady:!1,accepted:0,rejected:0,yawAccepted:0,yawRejected:0,appliedFrames:0,lastPositionInnovationM:null,lastYawInnovationRad:null,lastPositionSigmaM:null,lastHeadingSigmaDeg:null,pendingYawRad:0,lastReason:"reset"},r=En(n,{accepted:!1,reason:String(l.reason||"reset"),dtMs:null}),r}function i(l,d){let f=kn(l?.timestamp,null),m=l?.inputsOK===!0&&l?.posenetOK===!0&&l?.sensorsOK!==!1&&Hl(l,d,t),p=m?ci(l.orientationNED,t.maxOrientationStdRad):null;if(!p)return n.fusion.lastReason=m?"orientation invalid/std rejected":"livePose stale/state rejected",!1;if(f===n.lastLivePoseTimestampNs)return n.fusion.lastReason="livePose sample already fused",!1;n.lastLivePoseTimestampNs=f;let b=yh(p.value);if(!b)return n.fusion.orientationRejected+=1,n.fusion.lastReason="orientation conversion failed",!1;if(!n.worldFromNed)return n.worldFromNed=ar(n.orientation,Pl(b)),n.fusion.orientationReferenceReady=!0,n.fusion.lastReason="livePose NED reference initialized",!1;let g=ar(n.worldFromNed,b),x=Sh(n.orientation,g);if(n.fusion.lastOrientationInnovationRad=x,x===null||x>t.maxOrientationInnovationRad)return n.fusion.orientationRejected+=1,n.fusion.lastReason="orientation innovation rejected",!1;let E=t.orientationCorrectionGain/(1+p.worstStd*8),y=vh(n.orientation,g,E);return y?(n.orientation=[...y],n.fusion.orientationAccepted+=1,n.fusion.lastReason="livePose orientation corrected",!0):(n.fusion.orientationRejected+=1,n.fusion.lastReason="orientation correction failed",!1)}function a(){let l=Math.hypot(...n.geoPendingPosition),d=!1;if(l>1e-6){let m=Math.min(l,t.maxGeoPositionStepM)/l,p=n.geoPendingPosition.map(b=>b*m);n.position=n.position.map((b,g)=>b+p[g]),n.geoPendingPosition=n.geoPendingPosition.map((b,g)=>b-p[g]),d=!0}if(Math.abs(n.geoPendingYawRad)>1e-8){let f=Ia(n.geoPendingYawRad,-t.maxGeoYawStepRad,t.maxGeoYawStepRad),m=ar(n.orientation,li([0,0,f]));m&&(n.orientation=[...m]),n.geoPendingYawRad-=f,d=!0}n.geoCorrection.pendingYawRad=n.geoPendingYawRad,d&&(n.geoCorrection.appliedFrames+=1)}function s(l){let d=String(l?.key||"");if(!(d&&d!==n.geoLastObservationKey))return a(),!1;n.geoLastObservationKey=d;let m=kn(l?.latitude,null),p=kn(l?.longitude,null),b=kn(l?.headingDeg,null),g=kn(l?.positionSigmaM,null),x=kn(l?.headingSigmaDeg,null);if(n.geoCorrection.lastPositionSigmaM=g,n.geoCorrection.lastHeadingSigmaDeg=x,l?.valid!==!0||m===null||p===null||b===null||g===null||g<0||g>t.maxGeoPositionSigmaM)return n.geoCorrection.rejected+=1,n.geoCorrection.lastReason=l?.valid===!0?"geographic covariance rejected":"geographic quality gate rejected",a(),!1;if(!n.geoReference)return n.geoReference=Object.freeze({latitude:m,longitude:p,headingDeg:b,position:Object.freeze([...n.position]),orientation:Object.freeze([...n.orientation])}),n.geoCorrection.referenceReady=!0,n.geoCorrection.lastReason="geographic reference initialized",a(),!1;let E=Ln(n.geoReference.latitude,n.geoReference.longitude,m,p),y=E&&ir(E.east,E.north,n.geoReference.headingDeg),O=y?An([y.x,y.y,y.z]):null,C=O?un(n.geoReference.orientation,O):null;if(!C)return n.geoCorrection.rejected+=1,n.geoCorrection.lastReason="geographic frame conversion failed",a(),!1;let z=n.geoReference.position.map((R,v)=>R+C[v]).map((R,v)=>R-n.position[v]),M=Math.hypot(...z);if(n.geoCorrection.lastPositionInnovationM=M,M>t.maxGeoPositionInnovationM)n.geoCorrection.rejected+=1,n.geoPendingPosition=[...yo],n.geoCorrection.lastReason="geographic position innovation rejected";else{let R=1/(1+g/5),v=Math.min(t.maxGeoPositionCorrectionM,M*t.geoPositionCorrectionGain*R),h=M>1e-9?v/M:0;n.geoPendingPosition=z.map(S=>S*h),n.geoCorrection.accepted+=1,n.geoCorrection.lastReason="geographic position correction accepted"}if(l?.yawUsable===!0&&x!==null&&x>=0&&x<=t.maxGeoHeadingSigmaDeg){let R=Pl(n.geoReference.orientation),v=ar(R,n.orientation),h=Mh(v),S=kl((b-n.geoReference.headingDeg)*Math.PI/180),A=h?kl(S-h[2]):null;if(n.geoCorrection.lastYawInnovationRad=A,A!==null&&Math.abs(A)<=t.maxGeoYawInnovationRad){let L=1/(1+x/10);n.geoPendingYawRad=Ia(A*t.geoYawCorrectionGain*L,-t.maxGeoYawCorrectionRad,t.maxGeoYawCorrectionRad),n.geoCorrection.yawAccepted+=1}else n.geoPendingYawRad=0,n.geoCorrection.yawRejected+=1,n.geoCorrection.lastReason="geographic yaw innovation rejected"}else n.geoPendingYawRad=0,n.geoCorrection.lastYawInnovationRad=null;return a(),!0}function u(l={}){let d=l.odometry;if(!d)return r=En(n,{accepted:!1,reason:"odometry missing",dtMs:null}),r;Cr(d,Ae.DEVICE_FRD,"world pose odometry");let f=kn(l.timestampNs??d.targetTimestampNs,null),m=Vt(d.trans),p=Vt(d.rot);if(!m||!p||f===null||f<=0)return r=En(n,{accepted:!1,reason:"invalid pose sample",dtMs:null}),r;if(n.timestampNs===null){n.timestampNs=f,n.samples+=1;let R=zl(d,l.livePose,f,t);return n.fusion.lastLivePoseFresh=R.livePoseFresh,n.fusion.lastVelocityInnovationMps=R.velocityInnovationMps,n.fusion.lastAngularInnovationRadps=R.angularInnovationRadps,n.fusion.lastAccelerationMagnitudeMps2=R.accelerationMagnitudeMps2,i(l.livePose,f),s(l.geographicObservation),r=En(n,{accepted:!0,reason:"origin initialized",dtMs:0}),r}let b=(f-n.timestampNs)/Vl;if(b<0)return r=En(n,{accepted:!1,reason:"timestamp regression",dtMs:b}),r;if(b===0)return r=En(n,{accepted:!0,reason:"same presented frame",dtMs:0}),r;if(n.timestampNs=f,n.samples+=1,b>t.maxIntegrationStepMs||l.trackingState==="lost")return n.skippedGaps+=1,r=En(n,{accepted:!1,reason:l.trackingState==="lost"?"tracking lost — integration skipped":`integration gap ${Math.round(b)}ms`,dtMs:b}),r;let g=zl(d,l.livePose,f,t),x=g.velocity||m,E=g.angularVelocity||p;n.fusion.lastLivePoseFresh=g.livePoseFresh,n.fusion.lastVelocityInnovationMps=g.velocityInnovationMps,n.fusion.lastAngularInnovationRadps=g.angularInnovationRadps,n.fusion.lastAccelerationMagnitudeMps2=g.accelerationMagnitudeMps2,g.velocityAccepted&&(n.fusion.velocityAccepted+=1),g.angularAccepted&&(n.fusion.angularVelocityAccepted+=1),g.accelerationAccepted&&(n.fusion.accelerationAccepted+=1);let y=b/1e3,O=li(E.map(R=>R*y)),C=li(E.map(R=>R*y*.5)),w=ar(n.orientation,C),z=un(w,x.map(R=>R*y)),M=ar(n.orientation,O);return!z||!M?(r=En(n,{accepted:!1,reason:"SE(3) integration failed",dtMs:b}),r):(n.position=n.position.map((R,v)=>R+z[v]),n.orientation=[...M],i(l.livePose,f),s(l.geographicObservation),n.integrations+=1,r=En(n,{accepted:!0,reason:"integrated",dtMs:b}),r)}function c(){return r}return Object.freeze({update:u,reset:o,status:c,limits:t})}function ui(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function vo(e){return Object.freeze([...e])}function di(e,t){let n=dt(e?.orientation);return n?un([n[0],-n[1],-n[2],-n[3]],t):null}function Pr(e){return e?.initialized===!0&&e.worldCoordinateFrame===Ae.LOCAL_WORLD_DEVICE&&e.deviceCoordinateFrame===Ae.DEVICE_FRD&&Array.isArray(e.position)&&Array.isArray(e.orientation)&&!!dt(e.orientation)}function Pa(e,t){if(!e||!Pr(t))return null;let n=[ui(e.x),ui(e.y),ui(e.z)];if(n.some(f=>f===null))return null;let r=An(n),o=_a(t,r),i=Mn(e),a=pl(e),s=un(t.orientation,An(i.forward)),u=un(t.orientation,An(i.up)),c=Array.isArray(e.faceForward)||Array.isArray(e.faceUp),l=c?un(t.orientation,An(a.forward)):null,d=c?un(t.orientation,An(a.up)):null;return!o||!s||!u?null:Object.freeze({coordinateFrame:Ae.LOCAL_WORLD_DEVICE,epoch:String(t.epoch||"uninitialized"),position:vo(o),roadForward:vo(s),roadUp:vo(u),...l&&d?{faceForward:vo(l),faceUp:vo(d)}:{},createdAtTimestampNs:ui(t.timestampNs)})}function La(e,t,n={}){if(!e||!Pr(t)||e.coordinateFrame!==Ae.LOCAL_WORLD_DEVICE||String(e.epoch)!==String(t.epoch))return null;let r=Na(t,e.position),o=di(t,e.roadForward),i=di(t,e.roadUp);if(!r||!o||!i)return null;let a=Pn(r),s=Pn(o),u=Pn(i),c=zt({forward:s,up:u}),l={};if(e.faceForward&&e.faceUp){let d=di(t,e.faceForward),f=di(t,e.faceUp);d&&f&&(l=ml({forward:Pn(d),up:Pn(f)}))}return Object.freeze({...n,x:a[0],y:a[1],z:a[2],...c,...l,coordinateFrame:Ae.ROUTE_FLU})}var Lr=Object.freeze({durationMs:1200,maxPositionInnovationM:10,maxOrientationInnovationRad:Math.PI/3});function sr(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function $l(e,t,n){return Math.min(n,Math.max(t,e))}function Mo(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function Wl(e){let t=Mo(e),n=t?Math.hypot(...t):0;return n>1e-9?t.map(r=>r/n):null}function Ah(e,t){let n=Wl(e),r=Wl(t);if(!n||!r)return 1/0;let o=$l(n.reduce((i,a,s)=>i+a*r[s],0),-1,1);return Math.acos(o)}function Rh(e,t){let n=Mo(e),r=Mo(t);return n&&r?Math.hypot(...n.map((o,i)=>r[i]-o)):1/0}function So(e){return Object.freeze([...e])}function Ao(e,t){if(!e)return 1;let n=Math.max(1,sr(e.durationMs,Lr.durationMs));return $l((sr(t,e.startedAtMs)-e.startedAtMs)/n,0,1)}function ka(e,t,n,r={}){let o=Object.freeze({...Lr,...r.policy||{}}),i=Rh(e?.position,t?.position),a=Ah(e?.roadForward,t?.roadForward),s=e?.coordinateFrame&&e.coordinateFrame===t?.coordinateFrame,u=e?.epoch!==void 0&&String(e.epoch)===String(t?.epoch),c="";s?u?i>o.maxPositionInnovationM?c="position-innovation-rejected":a>o.maxOrientationInnovationRad&&(c="orientation-innovation-rejected"):c="world-epoch-mismatch":c="coordinate-frame-mismatch";let l=Object.freeze({positionInnovationM:i,orientationInnovationRad:a,lateralInnovationM:sr(r.lateralInnovationM,0),heightInnovationM:sr(r.heightInnovationM,0)});return Object.freeze(c?{accepted:!1,reason:c,...l}:{accepted:!0,reason:"",...l,transition:Object.freeze({from:e,to:t,startedAtMs:sr(n,0),durationMs:Math.max(1,sr(o.durationMs,Lr.durationMs)),...l})})}function Fa(e,t){if(!e?.from||!e?.to)return null;let n=Ao(e,t);if(n<=0)return e.from;if(n>=1)return e.to;let r=n*n*(3-2*n),o=(u,c)=>{let l=Mo(u),d=Mo(c);return l&&d?l.map((f,m)=>f+(d[m]-f)*r):null},i=Zo({forward:e.from.roadForward,up:e.from.roadUp},{forward:e.to.roadForward,up:e.to.roadUp},r),s=e.from.faceForward&&e.from.faceUp&&e.to.faceForward&&e.to.faceUp?Zo({forward:e.from.faceForward,up:e.from.faceUp},{forward:e.to.faceForward,up:e.to.faceUp},r):null;return Object.freeze({coordinateFrame:e.from.coordinateFrame,epoch:e.from.epoch,position:So(o(e.from.position,e.to.position)),roadForward:So(i.forward),roadUp:So(i.up),...s?{faceForward:So(s.forward),faceUp:So(s.up)}:{},createdAtTimestampNs:sr(e.to.createdAtTimestampNs,e.from.createdAtTimestampNs)})}function fi(e,t,n="blending"){return e?Object.freeze({state:n,progress:n==="complete"?1:Ao(e,t),durationMs:e.durationMs,positionInnovationM:e.positionInnovationM,orientationInnovationRad:e.orientationInnovationRad,lateralInnovationM:e.lateralInnovationM,heightInnovationM:e.heightInnovationM}):null}var _e=Object.freeze({GEO_PATH:"geo+path",GEO_ONLY:"geo-only",PATH_ONLY:"path-only",HELD:"held",SURFACE:"surface",WORLD:"world-anchor"}),Va=Object.freeze({...fa,maxUntrackedHoldMs:1e3,eventForwardJumpM:35,unresolvedGraceMs:3500,unresolvedGraceFixes:8,maxCreationPositionInnovationM:15,maxCreationYawInnovationRad:12*Math.PI/180}),pi=Object.freeze({ACTIVE:"active",ACTIVE_UNRESOLVED:"active-unresolved"});function me(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function za(e,t){let n=me(e);return n===null?"":n.toFixed(t)}function xh(e,t=Va,n={}){if(n.trackingState==="lost"||n.trackingState==="initializing")return Object.freeze({accepted:!1,reason:"pose-propagation-settling"});if(!Pr(e))return Object.freeze({accepted:!0,reason:"not-applicable"});let r=e.geoCorrection;if(!r)return Object.freeze({accepted:!0,reason:"not-required"});if(r.referenceReady!==!0)return Object.freeze({accepted:!1,reason:"geo-reference-unavailable"});if(me(r.accepted,0)<1)return Object.freeze({accepted:!1,reason:"geo-reference-settling"});let o=me(r.lastPositionInnovationM);if(o!==null&&o>t.maxCreationPositionInnovationM)return Object.freeze({accepted:!1,reason:"geo-position-settling",positionInnovationM:o});let i=me(r.lastYawInnovationRad);return i!==null&&Math.abs(i)>t.maxCreationYawInnovationRad?Object.freeze({accepted:!1,reason:"geo-yaw-settling",yawInnovationRad:i}):Object.freeze({accepted:!0,reason:"stable",positionInnovationM:o,yawInnovationRad:i})}function Ul(e){if(!e)return null;let t=String(e.sessionId||""),n=me(e.generation,0),r=String(n),o=me(e.publishMonoTimeNanos,0);if(t||n>0||o>0)return`${t}|${r}|${o}`;let i=e.vehicle||{},a=e.guidanceCurrent||{},s=e.guidanceNext||{},u=e.speed||{};return[za(i.latitude,7),za(i.longitude,7),za(i.headingDeg,2),a.present===!1?0:1,me(a.turnType,0),me(a.distanceM,0),s.present===!1?0:1,me(s.turnType,0),me(s.distanceM,0),me(u.sdiType,-1),me(u.sdiDistanceM,0)].join("|")}function Yl(e){if(!e)return null;let t=String(e.sessionId||"");return t?`session:${t}`:"legacy"}function ja(e){return e?.markerId?String(e.markerId):e?.eventKey?String(e.eventKey):bo(e)}function kr(e){return e?.descriptor?.surface===!0}function Eh(e,t){return kr(e)?_e.SURFACE:t?e.placedBy==="geo"?_e.GEO_PATH:_e.PATH_ONLY:_e.HELD}function Kl(e,t,n={}){if(!e?.anchor)return null;let r=kr(e)?me(e.distanceM,me(e.anchor.x)):me(e.anchor.x);if(r===null||r<0)return null;let o=fo(t,r);if(!o)return null;let i=me(e.roadOffsetM),a=me(e.lateralCorrectionM,0);if(i===null||n.captureOffset===!0){let c=ga(e.anchor.y,o.y,{enabled:e.placedBy==="geo"&&e.anchor.routeDerived===!0});a=c.correctionM,i=kr(e)?0:c.y-me(o.y,0)}let s=Mn(o),u=e.placedBy==="geo"?cn(me(e.anchor.headingRad,o.headingRad),Math.atan2(s.forward[2],Math.hypot(s.forward[0],s.forward[1]))):s;return{...e,roadOffsetM:i,lateralCorrectionM:a,sourceMode:Eh(e,!0),anchor:Object.freeze({...e.anchor,...o,y:me(o.y,0)+i,z:me(o.z,0),lateralCorrectionM:a,...zt(u)}),driftM:0}}function Th(e,t,n){if(!e?.anchor)return null;let r={...e,anchorKey:ja(e),lifecycleState:pi.ACTIVE,unresolvedSinceMs:null,unresolvedFixes:0,roadOffsetM:null,sourceMode:e.placedBy==="geo"?_e.GEO_ONLY:_e.PATH_ONLY,driftM:0},o=Kl(r,t,{captureOffset:!0})||r,i=Pa(o.anchor,n);return i?{...o,worldAnchor:i}:o}function Oh(e,t,n,r,o){if(e?.placedBy!=="geo"||e.sourceMode!==_e.GEO_ONLY||t?.sourceMode!==_e.GEO_PATH||!e.worldAnchor||!t.worldAnchor||!Pr(r))return null;let i=La(e.worldAnchor,r,e.anchor);if(!i)return null;let a=e.anchor?.routeDerived!==!0&&t.anchor?.routeDerived!==!0,s=Mn(t.anchor),u=cn(me(i.headingRad,me(e.anchor?.headingRad,0)),Math.atan2(s.forward[2],Math.hypot(s.forward[0],s.forward[1]))),c=a?Object.freeze({...t.anchor,x:me(i.x,me(e.anchor?.x,0)),y:me(i.y,me(e.anchor?.y,0)),z:me(t.anchor.z,me(i.z,0)),...zt(u)}):t.anchor,l=a?Pa(c,r):t.worldAnchor;if(!l)return null;let d=ka(e.worldAnchor,l,n,{policy:o,lateralInnovationM:me(t.anchor.y,0)-me(i?.y,0),heightInnovationM:me(t.anchor.z,0)-me(i?.z,0)});return d.accepted?Object.freeze({accepted:!0,transition:Object.freeze({...d.transition,targetAnchor:c,targetSourceMode:t.sourceMode})}):Object.freeze({accepted:!1,diagnostic:Object.freeze({state:"rejected",reason:d.reason,positionInnovationM:d.positionInnovationM,orientationInnovationRad:d.orientationInnovationRad,lateralInnovationM:d.lateralInnovationM,heightInnovationM:d.heightInnovationM})})}function Ch(e,t,n,r,o,i){if(!e?.anchor||!t?.anchor)return t;let a=me(e.anchor.x,e.distanceM),s=me(t.anchor.x,t.distanceM);if((a===null||s===null?0:s-a)>n.eventForwardJumpM)return t;if(!e.handoff){let c=Oh(e,t,r,o,i);if(c?.accepted)return{...t,placedBy:e.placedBy,sourceMode:e.sourceMode,anchor:Object.freeze({...e.anchor}),worldAnchor:e.worldAnchor,handoff:c.transition,handoffDiagnostic:null,driftM:e.driftM};c&&(t={...t,handoffDiagnostic:c.diagnostic})}return{...t,placedBy:e.placedBy,roadOffsetM:e.roadOffsetM,lateralCorrectionM:e.lateralCorrectionM,sourceMode:e.sourceMode,anchor:Object.freeze({...e.anchor}),...e.worldAnchor?{worldAnchor:e.worldAnchor}:{},...e.handoff?{handoff:e.handoff}:{},handoffDiagnostic:e.handoffDiagnostic||t.handoffDiagnostic||null,driftM:e.driftM}}function wh(e,t){return e.map(n=>{let r=n.handoff;return!r||Ao(r,t)<1?n:{...n,anchor:r.targetAnchor,worldAnchor:r.to,sourceMode:r.targetSourceMode,handoff:null,handoffDiagnostic:fi(r,t,"complete")}})}function Ih(e,t,n,r,o=!1){let i=n===null?0:Math.max(0,t-n);return e.map(a=>{let s=a.handoff?Fa(a.handoff,t):a.worldAnchor,u=a.handoff?.targetAnchor||a.anchor,l=(!o&&s?La(s,r,u):null)||a.anchor,d=kr(a)?me(a.distanceM,0):Math.max(0,me(l?.x,a.distanceM)||0),f=a.source==="calibrationProbe"?Object.freeze({...a.descriptor,primary:ri(d)}):a.descriptor;return Object.freeze({...a,worldAnchor:s,handoff:a.handoff?fi(a.handoff,t):a.handoffDiagnostic||null,anchor:l,descriptor:f,distanceM:d,anchorAgeMs:Math.round(i)})})}function Ha(e={}){let t=Object.freeze({...Va,...e.limits||{}}),n=Object.freeze({...Lr,...e.handoffPolicy||{}}),r=typeof e.bypassWorldAnchor=="function"?()=>e.bypassWorldAnchor()===!0:(()=>{let M=e.bypassWorldAnchor===!0;return()=>M})(),o=[],i=null,a=null,s=null,u=null,c=0,l=0,d=vt.DROPPED,f=null,m=!1,p=null,b=null,g=0,x=null,E="아직 유효한 앵커 없음";function y(M="초기화됨"){o=[],i=null,a=null,s=null,u=null,c=0,l=0,d=vt.DROPPED,f=null,m=!1,p=null,b=null,g=0,x=null,E=M}function O(M){return{state:d,anchors:o.length?Ih(o,M,u,p,r()):null,holdMs:c,driftM:l,sourceMode:f,fixId:i,sourceId:a,fixAgeMs:u===null?null:Math.max(0,M-u),reason:E}}function C(M,R,v,h,S,A,L,P){let _=L?new Map(o.map(D=>[D.anchorKey,D])):new Map,T=new Map((Array.isArray(R)?R:[]).map(D=>[ja(D),D]).filter(([D])=>!!D)),I=[],k=new Set;g=0,x=null;for(let D=0;Dt.eventForwardJumpM)&&B?.placedBy==="geo"&&!kr(B)){let K=xh(p,t,P);if(!K.accepted){k.add(W),g+=1,x=K.reason;continue}}let $=Th(B,A,p);$&&(k.add($.anchorKey),I.push(Ch(V,$,t,S,p,n)))}for(let[D,B]of T){if(k.has(D))continue;let W=_.get(D);if(!W)continue;let V=W.unresolvedSinceMs===null||W.unresolvedSinceMs===void 0?S:me(W.unresolvedSinceMs,S),F=Math.max(0,me(W.unresolvedFixes,0))+1;S-V>t.unresolvedGraceMs||F>t.unresolvedGraceFixes||I.push({...W,source:B.source||W.source,markerId:B.markerId||W.markerId,eventKey:B.eventKey||W.eventKey,lifecycleSlot:B.lifecycleSlot||W.lifecycleSlot,descriptor:B.descriptor||W.descriptor,distanceM:me(B.distanceM,W.distanceM),confidence:B.confidence||W.confidence,lifecycleState:pi.ACTIVE_UNRESOLVED,unresolvedSinceMs:V,unresolvedFixes:F})}o=I,i=v,a=h,u=S,c=0,l=0,d=o.length?vt.LIVE:vt.DROPPED,m=!1,f=o.length&&o.every(D=>!!D.worldAnchor)?_e.WORLD:o.length&&o.every(D=>D.sourceMode===_e.SURFACE)?_e.SURFACE:o.some(D=>D.sourceMode===_e.GEO_ONLY)?_e.GEO_ONLY:o.some(D=>D.sourceMode===_e.GEO_PATH)?_e.GEO_PATH:_e.PATH_ONLY,E=o.length?"":g?`world anchor creation deferred: ${x}`:"새 fix에 배치 가능한 앵커 없음"}function w(M={}){let R=me(M.nowMs,0),v=s===null?0:R-s;if(v<0&&(y("시간 역행/replay seek"),v=0),s=R,Pr(M.worldPose)){let V=String(M.worldPose.epoch||"uninitialized");b!==null&&V!==b&&(y("world pose epoch changed - anchors reset"),s=R),p=M.worldPose,b=V}o=wh(o,R);let h=M.valid!==!1,S=Array.isArray(M.candidates)?M.candidates:[],A=Array.isArray(M.activeMarkers)?M.activeMarkers:[],L=M.lifecycleAuthoritative===!0,P=M.trackingRecovered===!0,_=M.probe===!0||S.length>0&&S.every(V=>V?.source==="calibrationProbe");if(h){let V=_?"calibrationProbe":Ul(M.navi),F=_?"calibrationProbe":Yl(M.navi),H=!_&&a!==null&&F!==a;if(S.length>0?P||V!==i||!o.length:L&&V!==i)return C(S,A,V,F,R,M.modelPosition,!H&&(!_||!m&&!P),{trackingState:M.trackingState,canHold:M.canHold}),H?E=o.length?"session 변경 — 이전 앵커 reset":E:P&&(E=o.length?"tracking 복구 — fresh fix 재정합":E),O(R)}if(!o.length)return h||(E=M.reason||"source 무효 — 유지할 앵커 없음"),O(R);if(M.trackingState==="lost"&&!h)return y(M.reason||"tracking lost — anchor fade-out"),O(R);if(o.every(V=>!!V.worldAnchor)&&p)return c=M.trackingState==="tracking"?0:c+Math.max(0,v),l=Math.max(0,me(M.trackingUncertaintyM,0)),d=M.trackingState==="tracking"?vt.LIVE:vt.HELD,f=_e.WORLD,E=d===vt.LIVE?"immutable world anchor":`${M.trackingState||"tracking"} world pose hold ${Math.round(c)}ms`,m=d!==vt.LIVE,O(R);let I=!!M.odometry&&M.canHold===!0;if(v>t.maxStepMs&&I)return d=vt.HELD,f=_e.HELD,E=`프레임 간격 ${Math.round(v)}ms — 앵커 유지, 적분 생략`,O(R);if(!I||m){if(m=!0,c+=Math.max(0,v),M.retainAnchor===!0)return d=vt.HELD,f=_e.HELD,E=`${M.trackingState||"tracking"} freeze ${Math.round(c)}ms`,O(R);if(c>t.maxUntrackedHoldMs){let V=M.trackingState==="lost"&&M.reason?String(M.reason):"";return y(V?`${V} — ${Math.round(c)}ms 후 앵커 해제`:`odometry untracked ${Math.round(c)}ms - anchor dropped`),O(R)}return d=vt.HELD,f=_e.HELD,E=`odometry untracked hold ${Math.round(c)}ms`,O(R)}let k=Math.max(0,v)/1e3,D=M.precise!==!0||!h,B=0,W=[];for(let V of o){if(kr(V)){W.push(M.precise===!0&&Kl(V,M.modelPosition)||V);continue}let F=pa(V.anchor,M.odometry,k),H={...V,anchor:F};if(M.precise===!0&&h){W.push(H);continue}D=!0;let Y=me(V.driftM,0)+ma(V.anchor,M.odometry,k);B=Math.max(B,Y),W.push({...H,sourceMode:_e.HELD,driftM:Y})}if(o=W,D){if(c+=Math.max(0,v),l=B,c>t.maxHoldMs||l>t.maxDriftM){let V=c>t.maxHoldMs?`유지 시간 초과 (${t.maxHoldMs}ms)`:`누적 드리프트 ${l.toFixed(2)}m > ${t.maxDriftM}m`;return y(V),O(R)}d=vt.HELD,f=_e.HELD,E=`유지 중 ${Math.round(c)}ms / 드리프트 ${l.toFixed(2)}m`}else c=0,l=0,d=vt.LIVE,f=o.some(V=>V.sourceMode===_e.GEO_PATH)?_e.GEO_PATH:o.some(V=>V.sourceMode===_e.GEO_ONLY)?_e.GEO_ONLY:o.every(V=>V.sourceMode===_e.SURFACE)?_e.SURFACE:_e.PATH_ONLY,E="odometry world lock";return O(R)}function z(M=s??0){let R=O(M);return Object.freeze({state:R.state,sourceMode:R.sourceMode,anchorCount:o.length,fixId:R.fixId,sourceId:R.sourceId,fixAgeMs:R.fixAgeMs===null?null:Math.round(R.fixAgeMs),holdMs:Math.round(R.holdMs),driftM:+R.driftM.toFixed(3),reason:R.reason,worldEpoch:b,worldLockedCount:o.filter(v=>!!v.worldAnchor).length,unresolvedCount:o.filter(v=>v.lifecycleState===pi.ACTIVE_UNRESOLVED).length,creationDeferredCount:g,creationGateReason:x,handoffCount:o.filter(v=>!!v.handoff).length,handoff:R.anchors?.find(v=>v.handoff)?.handoff||null,sample:R.anchors?.[0]?.anchor?Object.freeze({x:+Number(R.anchors[0].anchor.x).toFixed(1),y:+Number(R.anchors[0].anchor.y).toFixed(1),z:+Number(R.anchors[0].anchor.z??0).toFixed(1),markerId:R.anchors[0].markerId||R.anchors[0].eventKey||null,lifecycleSlot:R.anchors[0].lifecycleSlot||null,source:R.anchors[0].source||null,heightSource:R.anchors[0].anchor.heightSource||null,heightConfidence:+Number(R.anchors[0].anchor.heightConfidence??0).toFixed(2),lateralCorrectionM:+Number(R.anchors[0].lateralCorrectionM??0).toFixed(2)}):null})}return Object.freeze({update:w,reset:y,status:z,limits:t})}var Un=Object.freeze({EXACT_FRAME:"exact-frame",ESTIMATED_FRAME:"estimated-frame",MEDIA_FRAME:"media-frame",UNMAPPED:"unmapped"}),cr=1e6,Ba=1e9,_h=250*cr;function lr(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function Ro(e){let t=lr(e);return t!==null&&t>0?t:null}function gi(e,t=100){let n=Ro(e?.timestampEof),r=Math.max(0,lr(t,100));return n===null?null:n-r*cr}function Wa(){let e=null,t=null;function n(i=null,a=null,s=null){let u=i?.source==="replay"?a?.domain==="replay-media":i?.source==="live"?a?.domain!=="replay-media":!1,c=Ro(i?.cameraTimestampEof),l=lr(i?.mediaTime),d=l===null?null:l*1e3,f=lr(i?.frameId),m=String(i?.clockMappingConfidence||"");if(u&&c!==null){let b=m===Un.ESTIMATED_FRAME?Un.ESTIMATED_FRAME:Un.EXACT_FRAME;return e=Object.freeze({domain:"cereal-monotonic",targetTimeMs:c/cr,targetTimestampNs:c,mediaTimeMs:d,mediaToCerealOffsetNs:d===null?null:c-l*Ba,sourceFrameId:f,sequence:i?.sequence??null,confidence:b,mapped:!0}),e.mediaToCerealOffsetNs!==null&&(t=e.mediaToCerealOffsetNs),e}if(u&&a?.domain==="replay-media"&&d!==null){let b=Ro(s?.cameraTimestampEof);if(b!==null){let g=b-l*Ba;(t===null||Math.abs(g-t)>_h)&&(t=g)}if(t!==null){let g=l*Ba+t;return e=Object.freeze({domain:"cereal-monotonic",targetTimeMs:g/cr,targetTimestampNs:g,mediaTimeMs:d,mediaToCerealOffsetNs:t,sourceFrameId:f,sequence:i?.sequence??null,confidence:Un.ESTIMATED_FRAME,mapped:!0}),e}return e=Object.freeze({domain:"replay-media",targetTimeMs:d,targetTimestampNs:null,mediaTimeMs:d,mediaToCerealOffsetNs:null,sourceFrameId:f,sequence:i?.sequence??null,confidence:Un.MEDIA_FRAME,mapped:!0}),e}let p=Ro(s?.cameraTimestampEof);return u&&p!==null?(e=Object.freeze({domain:"cereal-monotonic",targetTimeMs:p/cr,targetTimestampNs:p,mediaTimeMs:d,mediaToCerealOffsetNs:t,sourceFrameId:f,sequence:i?.sequence??null,confidence:Un.ESTIMATED_FRAME,mapped:!0}),e):(e=Object.freeze({domain:a?.domain||null,targetTimeMs:null,targetTimestampNs:null,mediaTimeMs:d,mediaToCerealOffsetNs:null,sourceFrameId:f,sequence:i?.sequence??null,confidence:Un.UNMAPPED,mapped:!1}),e)}function r(){e=null,t=null}function o(){return e}return Object.freeze({map:n,reset:r,status:o})}function hi(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function mi(e,t,n){let r=hi(e),o=hi(t);return!r||!o?null:Object.freeze(r.map((i,a)=>i+(o[a]-i)*n))}function Ga(e,t){return Object.freeze({...e,...t,temporalAlignment:Object.freeze(t.temporalAlignment)})}function $a(e={}){let t=Math.max(0,lr(e.poseDelayMs,100)),n=Math.max(2,Math.round(lr(e.capacity,64))),r=Math.max(0,lr(e.maxExtrapolationMs,150)),o=[];function i(c){let l=gi(c,t);if(l===null||!hi(c?.trans)||!hi(c?.rot))return!1;let d=Object.freeze({odometry:c,observationTimestampNs:l});return o[o.length-1]?.observationTimestampNs===l?o[o.length-1]=d:(o.push(d),o.sort((m,p)=>m.observationTimestampNs-p.observationTimestampNs),o.length>n&&(o=o.slice(-n))),!0}function a(c){let l=Ro(c);if(l===null||!o.length)return null;let d=o.findIndex(O=>O.observationTimestampNs>=l);if(d===-1){let O=o[o.length-1],C=(l-O.observationTimestampNs)/cr;return C>r?null:Ga(O.odometry,{observationTimestampNs:O.observationTimestampNs,targetTimestampNs:l,temporalAlignment:{mode:C===0?"exact":"bounded-extrapolation",poseDelayMs:t,targetDeltaMs:C}})}let f=o[d];if(f.observationTimestampNs===l||d===0){let O=(f.observationTimestampNs-l)/cr;return O>r?null:Ga(f.odometry,{observationTimestampNs:f.observationTimestampNs,targetTimestampNs:l,temporalAlignment:{mode:O===0?"exact":"bounded-lookahead",poseDelayMs:t,targetDeltaMs:-O}})}let m=o[d-1],p=f.observationTimestampNs-m.observationTimestampNs,b=p>0?(l-m.observationTimestampNs)/p:0,g=mi(m.odometry.trans,f.odometry.trans,b),x=mi(m.odometry.rot,f.odometry.rot,b),E=mi(m.odometry.transStd,f.odometry.transStd,b),y=mi(m.odometry.rotStd,f.odometry.rotStd,b);return Ga(m.odometry,{...g?{trans:g}:{},...x?{rot:x}:{},...E?{transStd:E}:{},...y?{rotStd:y}:{},observationTimestampNs:l,targetTimestampNs:l,temporalAlignment:{mode:"interpolated",poseDelayMs:t,targetDeltaMs:0,alpha:b}})}function s(){o=[]}function u(){return Object.freeze({samples:o.length,poseDelayMs:t,maxExtrapolationMs:r,firstObservationTimestampNs:o[0]?.observationTimestampNs??null,lastObservationTimestampNs:o.at(-1)?.observationTimestampNs??null})}return Object.freeze({push:i,sampleAt:a,reset:s,status:u})}var St=Object.freeze({OK:"ok",STALE:"stale",FRAME_GAP:"frame_gap",MISSING:"missing"}),ql=Object.freeze({maxFrameIdGap:8,maxModelAgeMs:350,maxOdometryAgeMs:350,maxOdometryFrameGap:8,maxPoseAgeMs:700,maxCalibrationAgeMs:2e4,maxNaviAgeMs:8e3,maxVelAngleStd:.8*Math.PI/180,maxRotStd:.12}),Nh=1e6,Ka=Object.freeze({maxTransMps:120,maxRotRadps:6,maxStd:50,maxOrientationRad:Math.PI*2+.1,maxCalibrationRad:Math.PI});function bi(e,t){return!Array.isArray(e)||e.length===0?!1:e.every(n=>{let r=Number(n);return Number.isFinite(r)&&Math.abs(r)<=t})}function Dh(e){if(!e)return!1;let t=Ka;return bi(e.trans,t.maxTransMps)&&bi(e.rot,t.maxRotRadps)&&(e.transStd===void 0||bi(e.transStd,t.maxStd))&&(e.rotStd===void 0||bi(e.rotStd,t.maxStd))}function Ph(e){if(!e)return!1;let t=e.orientationNED;if(!t)return!1;let n=Ka;for(let r of["x","y","z"]){let o=Number(t[r]);if(!Number.isFinite(o)||Math.abs(o)>n.maxOrientationRad)return!1}return typeof e.inputsOK=="boolean"&&typeof e.posenetOK=="boolean"}function dn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Ua(e,t){let n=dn(e),r=dn(t);return n===null||r===null||n<=0||r<=0?null:(n-r)/Nh}function Lh(e){let t=e?.rpyCalib;return Array.isArray(t)&&t.length>=3&&t.slice(0,3).every(n=>{let r=Number(n);return Number.isFinite(r)&&Math.abs(r)<=Ka.maxCalibrationRad})}function xo(e,t,n){let r=dn(e),o=dn(t?.[n]);return r===null||o===null||r0?d:null,m=f??dn(n?.timestampEof),p=[];if(!n||!r)return Object.freeze({state:St.MISSING,reasons:Object.freeze(["camera/model 없음"]),frameIdGap:null,modelAgeMs:null,odometryAgeMs:null,odometryUsable:!1,poseAgeMs:null,calibrationAgeMs:null,naviAgeMs:null,poseOk:!1,calibrated:!1,calibrationPlausible:!1,naviUsable:!1,presentedClockConfidence:e.presentedClock?.confidence||"unmapped",presentedTargetTimestampNs:f,odometryPoseDelayMs:100,clockDomain:e.clockDomain==="replay-media"?"replay-media":"live-monotonic",canDrawPrecise:!1,canHoldAnchor:!1});let g=dn(e.presentedClock?.sourceFrameId)??dn(n.frameId),x=dn(r.frameId),E=g!==null&&x!==null?Math.abs(g-x):null,y=St.OK;E===null?(y=St.MISSING,p.push("frameId 없음")):E>t.maxFrameIdGap&&(y=St.FRAME_GAP,p.push(`frame gap ${E} > ${t.maxFrameIdGap}`));let O=dn(r.frameAge),C=O===null?null:O*50,w=l?null:xo(c,u,"modelV2"),z=l?C??0:w===null?C:Math.max(w,C??0),M=St.OK;!l&&w===null?(M=St.MISSING,p.push("model 수신시각 없음")):z>t.maxModelAgeMs&&(M=St.STALE,p.push(`model age ${z.toFixed(0)}ms`));let R=null,v=!1;if(o){let V=gi(o),F=Ua(m,V),H=l?null:xo(c,u,"cameraOdometry");R=l?Math.abs(F??0):H===null?null:Math.max(H,Math.abs(F??0));let Y=dn(o.frameId),$=Y!==null&&g!==null?Math.abs(g-Y):null,K=Array.isArray(o.trans)?Math.abs(Number(o.trans[0])||0):null,Z=Array.isArray(o.transStd)?Math.abs(Number(o.transStd[1])||0):null,ee=K!==null&&Z!==null&&K>1?Math.atan2(Z,K):null,ue=Array.isArray(o.rotStd)?Math.max(...o.rotStd.map(pe=>Math.abs(Number(pe)||0))):null,de=R!==null&&R<=t.maxOdometryAgeMs,ye=$===null||$<=t.maxOdometryFrameGap,U=(ee===null||ee<=t.maxVelAngleStd)&&(ue===null||ue<=t.maxRotStd),X=Dh(o);if(X||p.push("odometry 값이 비정상 — 디코드 오프셋 의심"),v=de&&ye&&U&&X,!l&&H===null?p.push("odometry 수신시각 없음"):de||p.push(`odometry age ${R.toFixed(0)}ms`),ye||p.push(`odometry frame gap ${$}`),!U){let pe=ee===null?"n/a":`${(ee*180/Math.PI).toFixed(3)}°`;p.push(`odometry 불확실 velAngleStd=${pe} rotStd=${ue?.toFixed(4)}`)}}let h=l?null:xo(c,u,"livePose"),S=Ua(m,i?.timestamp),A=l?Math.abs(S??0):h===null?null:Math.max(h,Math.abs(S??0)),L=!!i&&Ph(i);i&&!L&&p.push("livePose 값이 비정상 — 디코드 오프셋 의심"),i||p.push("livePose 없음"),!l&&h===null?p.push("livePose 수신시각 없음"):A>t.maxPoseAgeMs&&p.push(`livePose age ${A.toFixed(0)}ms`);let P=L&&i.inputsOK===!0&&i.posenetOK===!0&&i.sensorsOK!==!1&&A!==null&&A<=t.maxPoseAgeMs;i&&L&&!P&&p.push("livePose 품질/상태 not OK");let _=Fh(a?.calStatus);_||p.push(`calStatus=${a?.calStatus??"없음"}`);let T=Lh(a);T||p.push("calibration rpy 비정상/누락");let I=l?a?0:null:xo(c,u,"liveCalibration"),k=St.OK;I===null?(k=St.MISSING,p.push("calibration 수신시각 없음")):I>t.maxCalibrationAgeMs&&(k=St.STALE,p.push(`calibration age ${I.toFixed(0)}ms`));let D=!1,B=null;if(s){let V=s.navigationStatus?.offRoute===!0,F=s.navigationStatus?.guidanceActive===!0,H=s.navigationStatus?.routePresent===!0,Y=l?null:xo(c,u,"carrotNavi"),$=Ua(m,s.publishMonoTimeNanos);B=l?Math.abs($??0):Y===null?null:Math.max(Y,Math.abs($??0));let K=B!==null&&B<=t.maxNaviAgeMs;D=(F||H)&&!V&&K,!l&&Y===null?p.push("navi 수신시각 없음"):K||p.push(`navi age ${B.toFixed(0)}ms`),(!F&&!H||V)&&p.push("navi off-route/안내없음")}let W=zh(y,M,k);return Object.freeze({state:W,reasons:Object.freeze(p),frameIdGap:E,modelAgeMs:z,odometryAgeMs:R,poseAgeMs:A,calibrationAgeMs:I,naviAgeMs:B,odometryUsable:v,poseOk:P,calibrated:_,calibrationPlausible:T,naviUsable:D,presentedClockConfidence:e.presentedClock?.confidence||"unmapped",presentedTargetTimestampNs:f,odometryPoseDelayMs:100,clockDomain:l?"replay-media":"live-monotonic",canDrawPrecise:W===St.OK&&_&&T,canHoldAnchor:_&&T&&v&&P})}var jh=Object.freeze({TURN:"turn",FORK:"fork",RAMP:"ramp",ROTARY:"rotary",UTURN:"uturn",ARRIVE:"arrive",NOTIFICATION:"notification",UNKNOWN:"unknown"}),Vh=Object.freeze({LEFT:"left",RIGHT:"right",SLIGHT_LEFT:"slight_left",SLIGHT_RIGHT:"slight_right",SHARP_LEFT:"sharp_left",SHARP_RIGHT:"sharp_right",STRAIGHT:"straight",UTURN:"uturn"}),ne=Vh,le=jh,Hh=new Map([[12,[le.TURN,ne.LEFT]],[13,[le.TURN,ne.RIGHT]],[16,[le.TURN,ne.SHARP_LEFT]],[19,[le.TURN,ne.SHARP_RIGHT]],[1e3,[le.TURN,ne.SLIGHT_LEFT]],[1001,[le.TURN,ne.SLIGHT_RIGHT]],[14,[le.UTURN,ne.UTURN]],[1002,[le.FORK,ne.SLIGHT_LEFT]],[1003,[le.FORK,ne.SLIGHT_RIGHT]],[7,[le.FORK,ne.LEFT]],[17,[le.FORK,ne.LEFT]],[44,[le.FORK,ne.LEFT]],[75,[le.FORK,ne.LEFT]],[76,[le.FORK,ne.LEFT]],[118,[le.FORK,ne.LEFT]],[6,[le.FORK,ne.RIGHT]],[43,[le.FORK,ne.RIGHT]],[73,[le.FORK,ne.RIGHT]],[74,[le.FORK,ne.RIGHT]],[117,[le.FORK,ne.RIGHT]],[123,[le.FORK,ne.RIGHT]],[124,[le.FORK,ne.RIGHT]],[1006,[le.RAMP,ne.LEFT]],[1007,[le.RAMP,ne.RIGHT]],[102,[le.RAMP,ne.SLIGHT_LEFT]],[105,[le.RAMP,ne.SLIGHT_LEFT]],[112,[le.RAMP,ne.SLIGHT_LEFT]],[115,[le.RAMP,ne.SLIGHT_LEFT]],[101,[le.RAMP,ne.SLIGHT_RIGHT]],[104,[le.RAMP,ne.SLIGHT_RIGHT]],[111,[le.RAMP,ne.SLIGHT_RIGHT]],[114,[le.RAMP,ne.SLIGHT_RIGHT]],[131,[le.ROTARY,ne.SLIGHT_RIGHT]],[132,[le.ROTARY,ne.SLIGHT_RIGHT]],[133,[le.ROTARY,ne.RIGHT]],[134,[le.ROTARY,ne.SHARP_RIGHT]],[135,[le.ROTARY,ne.SHARP_RIGHT]],[136,[le.ROTARY,ne.SHARP_LEFT]],[137,[le.ROTARY,ne.SHARP_LEFT]],[138,[le.ROTARY,ne.SHARP_LEFT]],[139,[le.ROTARY,ne.LEFT]],[140,[le.ROTARY,ne.SLIGHT_LEFT]],[141,[le.ROTARY,ne.SLIGHT_LEFT]],[142,[le.ROTARY,ne.STRAIGHT]],[201,[le.ARRIVE,ne.STRAIGHT]],[51,[le.NOTIFICATION,ne.STRAIGHT]]]),Xl=Object.freeze({[ne.LEFT]:{sign:-1,curvature:-.045,yawDeg:-80},[ne.RIGHT]:{sign:1,curvature:.045,yawDeg:80},[ne.SHARP_LEFT]:{sign:-1,curvature:-.075,yawDeg:-120},[ne.SHARP_RIGHT]:{sign:1,curvature:.075,yawDeg:120},[ne.SLIGHT_LEFT]:{sign:-1,curvature:-.02,yawDeg:-35},[ne.SLIGHT_RIGHT]:{sign:1,curvature:.02,yawDeg:35},[ne.STRAIGHT]:{sign:0,curvature:0,yawDeg:0},[ne.UTURN]:{sign:-1,curvature:-.11,yawDeg:-175}});function Ql(e){let t=Number(e),n=Number.isFinite(t)?Hh.get(t):null,[r,o]=n||[le.UNKNOWN,ne.STRAIGHT],i=Xl[o]||Xl[ne.STRAIGHT];return Object.freeze({code:t,family:r,direction:o,...i})}var Fr=Object.freeze({CAMERA:"camera",SECTION:"section",BUMP:"bump",POLICE:"police",OTHER:"other"}),Bh=new Set([0,1,7,8,75,76]),Gh=new Set([2,3,4]),Wh=new Set([100,101]);function Zl(e){let t=Number(e);return!Number.isFinite(t)||t<0?Object.freeze({code:t,family:null}):t===22?Object.freeze({code:t,family:Fr.BUMP}):Wh.has(t)?Object.freeze({code:t,family:Fr.POLICE}):Gh.has(t)?Object.freeze({code:t,family:Fr.SECTION}):Bh.has(t)?Object.freeze({code:t,family:Fr.CAMERA}):Object.freeze({code:t,family:Fr.OTHER})}function $h(e){if(!e||e.visible!==!0)return null;let t=Number(e.distanceM);if(!Number.isFinite(t)||t<=0)return null;let n=[],r=(o,i,a,s)=>{i===!0&&n.push(Object.freeze({id:o,on:a===!0,remainSec:Number(s)||0}))};return r("red",e.redValid,e.redOn,e.redRemainSec),r("left",e.leftValid,e.leftOn,e.leftRemainSec),r("green",e.greenValid,e.greenOn,e.greenRemainSec),r("right",e.rightValid,e.rightOn,e.rightRemainSec),r("uturn",e.uturnValid,e.uturnOn,e.uturnRemainSec),n.length?Object.freeze({lamps:Object.freeze(n),distanceM:t,counterRemainSec:e.uiCounterValid===!0&&Number(e.uiCounterRemainSec)||0}):null}function Uh(e,t=3.5){let n=Array.isArray(e?.available)?e.available:[],r=Number(e?.count)||n.length;if(!r||!n.length)return null;let o=[];for(let c=0;cc+l,0)/o.length,a=(r-1)/2,s=-(i-a)*t,u=Math.max(...o)-Math.min(...o)+1;return Object.freeze({offsetM:s===0?0:s,widthM:Math.max(1,u)*t,selectedCount:o.length})}var Tn=Object.freeze({GUIDANCE_CURRENT:"guidanceCurrent",GUIDANCE_NEXT:"guidanceNext",LANE:"lane",SDI:"sdi",SDI_SECONDARY:"sdiSecondary",SECTION:"section",TRAFFIC_SIGNAL:"trafficSignal",CROSSROAD:"crossroad",DESTINATION:"destination"}),KS=Object.freeze({CARROT_NAVI:"world-anchor",CARROT_MAN:"hud-only",STOCK_NAVI:"hud-only"});function Xa(e,t={}){let n=Number(t.laneWidthM)||3.5,r=[],o=f=>{f&&r.push(Object.freeze(f))},i=(f,m)=>{if(!f||f.present===!1)return null;let p=Number(f.distanceM);if(!Number.isFinite(p)||p<=0)return null;let b=Ql(f.turnType),g=f.pointValid===!0?{pointValid:!0,latitude:f.latitude,longitude:f.longitude}:null;return b.family===le.ARRIVE?{source:m,kind:Ue.DESTINATION_PIN,distanceM:p,point:g,tone:Te.DESTINATION,label:f.mainText||f.roadName||"",turn:b}:b.direction===ne.STRAIGHT||b.family===le.NOTIFICATION||b.family===le.UNKNOWN?null:{source:m,kind:Ue.TURN_GATE,distanceM:p,point:g,tone:Te.GUIDE,label:f.roadName||f.mainText||"",turn:b,variant:b.family,laneWidthM:n}};o(i(e?.guidanceCurrent,Tn.GUIDANCE_CURRENT)),o(i(e?.guidanceNext,Tn.GUIDANCE_NEXT));let a=r.find(f=>f.source===Tn.GUIDANCE_CURRENT);if(a&&a.kind===Ue.TURN_GATE&&a.turn.sign!==0&&o({source:Tn.GUIDANCE_CURRENT,kind:Ue.COMMIT_ARROW,distanceM:Math.max(0,a.distanceM-6),tone:Te.GUIDE,eventDistanceM:a.distanceM,turn:a.turn,curvature:a.turn.curvature,label:""}),yl.laneBand){let f=p=>p&&p.present!==!1&&p.visible===!0&&Number.isFinite(Number(p.distanceM))&&Number(p.distanceM)>0,m=f(e?.laneCurrent)?e.laneCurrent:(Array.isArray(e?.laneAhead)?e.laneAhead:[]).filter(f).sort((p,b)=>Number(p.distanceM)-Number(b.distanceM))[0];if(m){let p=Uh(m,n);p&&o({source:Tn.LANE,kind:Ue.LANE_BAND,distanceM:Number(m.distanceM),tone:Te.LANE,laneOffsetM:p.offsetM,laneWidthM:p.widthM,selectedLaneCount:p.selectedCount,label:""})}}let s=e?.speed,u=(f,m)=>{if(s?.[`${f}Present`]!==!0)return;let p=Number(s[`${f}DistanceM`]),b=Zl(s[`${f}Type`]);if(!b.family||b.family===Fr.SECTION||!Number.isFinite(p)||p<=0)return;let g=Number(s[`${f}SpeedLimitKph`])||0;o({source:m,kind:Ue.CAUTION_SIGN,distanceM:p,tone:Te.CAUTION,sdiFamily:b.family,speedLimitKph:g,blockType:Number(s[`${f}BlockType`])||0,blockDistanceM:Number(s[`${f}BlockDistanceM`])||0,label:String(g||"")})};u("sdi",Tn.SDI),u("secondarySdi",Tn.SDI_SECONDARY);let c=Number(s?.sectionRemainingDistanceM);s?.sectionPresent===!0&&s.sectionOffRoute!==!0&&Number.isFinite(c)&&c>0&&o({source:Tn.SECTION,kind:Ue.SECTION_GATE,distanceM:c,tone:Te.RESTRICT,active:s.sectionActive===!0,averageKph:Number(s.sectionAverageKph)||0,overallAverageKph:Number(s.sectionOverallAverageKph)||0,remainingTimeSec:Number(s.sectionRemainingTimeSec)||0,suspended:s.sectionSuspended===!0,limitKph:Number(s.sectionSpeedLimitKph)||0,progress:Number(s.sectionProgress)||0,laneWidthM:n});let l=$h(e?.trafficSignal);l&&o({source:Tn.TRAFFIC_SIGNAL,kind:Ue.SIGNAL_HEAD,distanceM:l.distanceM,tone:Te.CAUTION,lamps:l.lamps,counterRemainSec:l.counterRemainSec,label:""});let d=e?.crossroad;return d?.visible===!0&&Number(d.distanceM)>0&&o({source:Tn.CROSSROAD,kind:Ue.CROSSROAD_CARD,distanceM:Number(d.distanceM)||0,tone:Te.GUIDE,imageCode:Number(d.imageCode)||0,label:""}),Object.freeze(r)}var Qa=Object.freeze({maxHeadingErrorRad:75*Math.PI/180,defaultStartSnapM:45,minDynamicStartSnapM:18,maxDynamicStartSnapM:60,positionSigmaSnapGain:2,minProgressWindowM:220,progressWindowRatio:.35,maxBackwardM:12,progressResetM:50,headingPenaltyM:14,progressPenaltyM:12,continuityPenaltyRatio:.08,branchSwitchHysteresisM:8,adjacentSegmentGrace:1});function Eo(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function Za(e,t,n){return Math.min(n,Math.max(t,e))}function Yh(e){return Math.atan2(Math.sin(e),Math.cos(e))}function Kh(e,t){if(!e||e.present===!1||!Array.isArray(t))return[];let n=[];for(let r of t){let o=Ln(e.latitude,e.longitude,r?.latitude,r?.longitude),i=o&&ir(o.east,o.north,e.headingDeg);i&&n.push(i)}return n}function qh(e){let t=[0];for(let n=1;n0)||!(t>0))return null;let a=i;if(a===null&&o>0&&(a=r-o),a===null||a<0)return null;let s=Za(a/r,0,1);return Object.freeze({movedDistanceM:a,expectedAlongTrackM:t*s,windowM:Math.max(n.minProgressWindowM,t*n.progressWindowRatio)})}function Qh(e,t,n){let r=e?.polyline?.[0]||{},o=e?.polyline?.[Math.floor((e?.polyline?.length||1)/2)]||{},i=e?.polyline?.at?.(-1)||{},a=u=>{let c=Eo(u);return c===null?"?":c.toFixed(4)},s=[t.length,`${a(r.latitude)},${a(r.longitude)}`,`${a(o.latitude)},${a(o.longitude)}`,`${a(i.latitude)},${a(i.longitude)}`].join(":");return n?`session:${n}:${s}`:`legacy:${s}`}function Zh(e,t){let n=Eo(e);return n===null||n<0?t.defaultStartSnapM:Za(t.minDynamicStartSnapM+n*t.positionSigmaSnapGain,t.minDynamicStartSnapM,t.maxDynamicStartSnapM)}function zr(e,t,n={}){let r=Object.freeze({...Qa,...n.limits||{}}),o=t?.polyline,i=Kh(e,o);if(i.length<2)return null;let a=qh(i),s=a.at(-1);if(!(s>.01))return null;let u=Xh(t,s,r),c=n.previous||null,l=Zh(n.positionSigmaM,r),d=[];for(let m=1;m.01))continue;let y=Math.sqrt(E),O=Math.atan2(x,g),C=Math.abs(Yh(O));if(C>r.maxHeadingErrorRad)continue;let w=Za(-(p.x*g+p.y*x)/E,0,1),z=p.x+g*w,M=p.y+x*w,R=Math.hypot(z,M);if(R>l)continue;let v=a[m-1]+y*w;if(c&&vu.windowM)continue;let S=c?c.alongTrackM+Math.max(0,(u?.expectedAlongTrackM??c.progressExpectedAlongTrackM??c.alongTrackM)-(c.progressExpectedAlongTrackM??c.alongTrackM)):null,A=S===null?0:Math.abs(v-S),L=R+C/r.maxHeadingErrorRad*r.headingPenaltyM+(u?h/u.windowM*r.progressPenaltyM:0)+A*r.continuityPenaltyRatio;d.push({index:m,t:w,x:z,y:M,snapDistanceM:R,alongTrackM:v,headingRad:O,headingErrorRad:C,progressErrorM:h,score:L})}if(!d.length)return null;d.sort((m,p)=>m.score-p.score||m.index-p.index);let f=d[0];if(c&&Math.abs(f.index-c.index)>r.adjacentSegmentGrace){let m=d.filter(p=>Math.abs(p.index-c.index)<=r.adjacentSegmentGrace).sort((p,b)=>p.score-b.score)[0];m&&m.score<=f.score+r.branchSwitchHysteresisM&&(f=m)}return Object.freeze({...f,routeLengthM:s,routePointCount:i.length,maxStartSnapM:l,progressExpectedAlongTrackM:u?.expectedAlongTrackM??null,progressMovedDistanceM:u?.movedDistanceM??null,routeSignature:Qh(t,i,n.sessionId)})}function Ja(e={}){let t=Object.freeze({...Qa,...e.limits||{}}),n=null,r=null,o=0,i=0;function a(c=null){n=null,r=c===null?null:String(c||"legacy")}function s(c,l,d={}){let f=String(d.sessionId||"legacy");r!==f&&a(f);let m=zr(c,l,{limits:t,positionSigmaM:d.positionSigmaM,previous:n,sessionId:f});if(n&&(!m||m.routeSignature!==n.routeSignature)){let p=zr(c,l,{limits:t,positionSigmaM:d.positionSigmaM,sessionId:f});p?.routeSignature!==n.routeSignature&&(m=p)}return m?(n&&m.progressExpectedAlongTrackM!==null&&n.progressExpectedAlongTrackM!==null&&m.progressExpectedAlongTrackMi.identityInput),o=n?.assign?.(r,{sessionId:t?.sessionId||(e.every(i=>i.source==="calibrationProbe")?"calibration-probe":"legacy")});return e.map((i,a)=>{let s=o?.[a]||bo(i.identityInput);return Object.freeze({descriptor:i.descriptor,distanceM:i.distanceM,point:i.point||null,source:i.source,markerId:s,eventKey:s,lifecycleSlot:go(i.identityInput),confidence:i.confidence||"high",discovery:i.discovery||null})})}function eg(e,{vehicle:t,routePolyline:n,routeMatch:r,modelPosition:o,geoAllowed:i=!1,routeAllowed:a=i,failures:s=null}={}){if(o?.coordinateFrame&&o.coordinateFrame!==Ae.ROUTE_FLU)throw new TypeError("anchorSigns modelPosition must use route-local FLU");let u=[];for(let c of Array.isArray(e)?e:[]){let l=c.descriptor?.kind,d=l==="turn_gate"||l==="commit_arrow"||l==="destination_pin",f=d||c.source==="guidanceCurrent"||c.source==="guidanceNext"||c.source==="crossroad",m=(i||a)&&c.point?Ta(t,c.point,{routeDistanceM:c.distanceM}):null;if(m){let x=d&&r?Dr(t,n,c.distanceM+xn.maneuverLookAheadM,{routeMatch:r}):null,E=d&&Array.isArray(n)?null:Oa(t,c.point,n),y=x?.headingRad??E,O=cn(y??0);m=Object.freeze({...m,routeStartIndex:x?.routeStartIndex??r?.index??null,routeAlongTrackM:x?.routeAlongTrackM??r?.alongTrackM??null,...zt(O)})}let p=null;if(!m&&a&&f&&(p=Dr(t,n,c.distanceM,{routeMatch:r}),p)){let x=p.headingRad??0;if(d){let y=Dr(t,n,c.distanceM+xn.maneuverLookAheadM,{routeMatch:r});y&&Math.hypot(y.x-p.x,y.y-p.y)>.5&&(x=Math.atan2(y.y-p.y,y.x-p.x))}let E=cn(x);p=Object.freeze({...p,headingRad:x,...zt(E)})}let b=m||p?null:fo(o,c.distanceM);if(!m&&!p&&!b&&a&&(p=Dr(t,n,c.distanceM,{routeMatch:r}),p)){let x=cn(p.headingRad??0);p=Object.freeze({...p,...zt(x)})}let g=m||b||p;g?u.push({...c,anchor:g,placedBy:m||p?"geo":"path"}):s&&s.push({src:c.source,dist:Math.round(Number(c.distanceM)||0),pt:c.point?1:0,sem:f?1:0})}return u}function eu(e={},t={}){let n=Jh(e,t),r=e.navi?.route,o={sessionId:e.navi?.sessionId,positionSigmaM:e.routePositionSigmaM},i=e.canDrawPrecise&&(e.routeAllowed===!0||e.geoAllowed===!0)?t.routeMatcher?.match?t.routeMatcher.match(e.navi?.vehicle,r,o):zr(e.navi?.vehicle,r,o):null,a=[],s=e.canDrawPrecise?eg(n,{vehicle:e.navi?.vehicle,routePolyline:r?.polyline,routeMatch:i,modelPosition:e.modelPosition,geoAllowed:e.geoAllowed===!0,routeAllowed:e.routeAllowed===!0||e.geoAllowed===!0,failures:a}):null,u=e.navi?.vehicle,c=Object.freeze({precise:e.canDrawPrecise===!0,geo:e.geoAllowed===!0,route:e.routeAllowed===!0||e.geoAllowed===!0,routePts:Array.isArray(r?.polyline)?r.polyline.length:-1,veh:u?.present!==!1&&Number.isFinite(Number(u?.latitude))?1:0,head:Number.isFinite(Number(u?.headingDeg))?1:0,matchIdx:i?i.index:null,pathM:Array.isArray(e.modelPosition?.x)?Math.round(Number(e.modelPosition.x.at(-1))||0):null,fails:Object.freeze(a.slice(0,4))});return{signs:n,fresh:s&&s.length?s:null,diag:c}}function On(e){let t=Number(e);return Number.isFinite(t)?t:null}function es(e,t){let n=On(e),r=On(t);return n!==null&&r!==null&&n>=-90&&n<=90&&r>=-180&&r<=180}function tg(e){if(!Array.isArray(e))return!1;let t=0;for(let n of e)if(es(n?.latitude,n?.longitude)&&(t+=1),t>=2)return!0;return!1}function ng(e,t,n){let r=On(e),o=On(t?.[n]);return r===null||o===null||rt.maxGpsAgeMs&&o.push(`Comma GPS age ${l.toFixed(0)}ms`);let d=r?.hasFix===!0&&es(r?.latitude,r?.longitude);d||o.push("Comma GPS fix/좌표 없음");let f=On(r?.horizontalAccuracy);f===null||f<0?o.push("Comma GPS 수평 정확도 없음"):f>t.maxHorizontalAccuracyM&&o.push(`Comma GPS 수평 오차 ${f.toFixed(1)}m`);let m=null;if(a&&d){let O=Ln(n.latitude,n.longitude,r.latitude,r.longitude);m=O?Math.hypot(O.east,O.north):null;let C=Math.max(t.maxPositionSeparationM,Math.max(0,f??0)*t.separationAccuracyMultiplier);(m===null||m>C)&&o.push(`TMap/Comma 위치 불일치 ${m?.toFixed(1)??"n/a"}m`)}let p=On(r?.speed),b=p!==null&&p>=t.minBearingCheckSpeedMps,g=On(r?.bearingAccuracyDeg),x=null;b&&(g===null||g<0||g>t.maxBearingAccuracyDeg?o.push("Comma GPS 진행방향 정확도 부족"):(x=rg(n?.headingDeg,r?.bearingDeg),(x===null||x>t.maxHeadingDisagreementDeg)&&o.push(`TMap/Comma 방향 불일치 ${x?.toFixed(1)??"n/a"}°`)));let E=f===null||m===null?null:Math.hypot(f,m*.5),y=b&&g!==null&&x!==null?Math.hypot(g,x*.5):null;return Object.freeze({canUseGeo:o.length===0,canUseRoute:u,fallback:o.length?u?"navi-route":"model-path":null,gpsAgeMs:l,horizontalAccuracyM:f,separationM:m,bearingAccuracyDeg:g,headingDisagreementDeg:x,positionSigmaM:E,headingSigmaDeg:y,reasons:Object.freeze(o),routeReasons:Object.freeze(i)})}function ts(e){if(!Array.isArray(e)||e.length<3)return null;let t=e.slice(0,3).map(Number);return t.every(Number.isFinite)?t:null}function ou(e){let t=ts(e);if(!t)return null;let[n,r,o]=t,i=Math.cos(n),a=Math.sin(n),s=Math.cos(r),u=Math.sin(r),c=Math.cos(o),l=Math.sin(o);return Object.freeze([Object.freeze([c*s,c*u*a-l*i,c*u*i+l*a]),Object.freeze([l*s,l*u*a+c*i,l*u*i-c*a]),Object.freeze([-u,s*a,s*i])])}function nu(e,t){let n=ts(t);return!e||!n?null:Object.freeze(e.map(r=>r[0]*n[0]+r[1]*n[1]+r[2]*n[2]))}function ru(e,t){let n=ts(t);return!e||!n?null:Object.freeze(e.map(r=>Math.sqrt((r[0]*n[0])**2+(r[1]*n[1])**2+(r[2]*n[2])**2)))}function ns(e,t){if(!e)return null;let n=ou(t),r=nu(n,e.trans),o=nu(n,e.rot);if(!n||!r||!o)return null;let i=ru(n,e.transStd),a=ru(n,e.rotStd);return Object.freeze({...e,trans:r,rot:o,...i?{transStd:i}:{},...a?{rotStd:a}:{},sourceCoordinateFrame:Ae.CALIBRATED_FRD,coordinateFrame:Ae.DEVICE_FRD})}function iu(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function og(e){let t=Math.floor(iu(e,240));return Math.max(1,Math.min(1200,t))}function rs(e,t=0){if(e==null)return e??null;if(["string","number","boolean"].includes(typeof e))return e;if(t>=6)return"[depth-limit]";if(Array.isArray(e))return Object.freeze(e.slice(0,64).map(n=>rs(n,t+1)));if(typeof e=="object"){let n={};for(let r of Object.keys(e).slice(0,64))n[r]=rs(e[r],t+1);return Object.freeze(n)}return String(e)}function os(e={}){let t=og(e.capacity),n=typeof e.now=="function"?e.now:()=>globalThis.performance?.now?.()??Date.now(),r=e.enabled===!0,o=1,i=0,a=[];function s(f,m={},p=n()){if(!r)return null;let b=Object.freeze({sequence:o++,kind:String(f||"unknown"),atMs:iu(p,null),payload:rs(m)});return a.length>=t&&(a.shift(),i+=1),a.push(b),b}function u(){let f=a.length>0||i>0;return a=[],i=0,o=1,f}function c(f,m={}){return m.clear===!0&&u(),r=f===!0,r}function l(){return Object.freeze({enabled:r,capacity:t,size:a.length,dropped:i})}function d(){return Object.freeze({...l(),entries:Object.freeze([...a])})}return Object.freeze({record:s,clear:u,setEnabled:c,isEnabled:()=>r,status:l,snapshot:d})}var ig=Object.freeze({defaultCapacity:240,maxCapacity:1200});var Yn=Object.freeze({LIVE_MONOTONIC:"live-monotonic",REPLAY_MEDIA:"replay-media"}),Oo=Object.freeze({CLOCK_DOMAIN_CHANGE:"clock-domain-change",SESSION_EPOCH_CHANGE:"session-epoch-change",TIME_REVERSAL:"time-reversal",REPLAY_SEEK:"replay-seek"});function ag(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function sg(e){return e==null||e===""?null:String(e)}function is(){let e=null;function t(o={}){let i=o.domain===Yn.REPLAY_MEDIA?Yn.REPLAY_MEDIA:Yn.LIVE_MONOTONIC,a=Math.max(0,ag(o.nowMs,0)),s=sg(o.epoch),u=e?.domain===i?a-e.nowMs:null,c=null;return e&&(o.explicitDiscontinuity===!0?c=String(o.discontinuityReason||Oo.REPLAY_SEEK):e.domain!==i?c=Oo.CLOCK_DOMAIN_CHANGE:e.epoch!==s?c=Oo.SESSION_EPOCH_CHANGE:u<0&&(c=Oo.TIME_REVERSAL)),e=Object.freeze({domain:i,nowMs:a,epoch:s}),Object.freeze({domain:i,nowMs:a,epoch:s,deltaMs:u,discontinuity:c!==null,discontinuityReason:c})}function n(){e=null}function r(){return e}return Object.freeze({update:t,reset:n,status:r})}var Be=Object.freeze({INITIALIZING:"initializing",TRACKING:"tracking",COASTING:"coasting",DEGRADED:"degraded",LOST:"lost"}),cu=Object.freeze({minHealthySamples:1,expectedFrameHoldMs:90,maxCoastingMs:1200,maxDegradedMs:4e3,initializingTimeoutMs:2e3,minLateralBudgetM:2.5,maxLateralBudgetM:12,lateralBudgetDistanceRatio:.015,coastingBudgetRatio:.55,noOdometryTranslationStdMps:.12,noOdometrySpeedStdRatio:.01,noOdometryRotationStdRadps:.002});function ur(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function jr(e,t,n){return Math.min(n,Math.max(t,e))}function au(e){if(!Array.isArray(e)||e.length===0)return null;let t=e.map(n=>ur(n,0));return Math.hypot(...t)}function cg(e){if(e.sampleId!==null&&e.sampleId!==void 0&&e.sampleId!=="")return String(e.sampleId);let t=ur(e.presentedTimestampNs);return t!==null&&t>0?`time:${t}`:null}function lg(e,t,n){return e===Be.TRACKING?1:e===Be.COASTING?1-jr((t-n.expectedFrameHoldMs)/Math.max(1,n.maxCoastingMs-n.expectedFrameHoldMs),0,1)*.22:e===Be.DEGRADED?.72-jr((t-n.maxCoastingMs)/Math.max(1,n.maxDegradedMs-n.maxCoastingMs),0,1)*.3:0}function su(e){return Object.freeze({...e,uncertainty:Object.freeze({...e.uncertainty}),reasons:Object.freeze([...e.reasons])})}function as(e={}){let t=Object.freeze({...cu,...e.limits||{}}),n=Be.INITIALIZING,r=null,o=null,i=null,a=null,s=0,u=0,c=0,l=null;function d(p="reset"){return n=Be.INITIALIZING,r=null,o=null,i=null,a=null,s=0,u=0,c=0,l=su({state:n,previousState:n,transition:null,recovered:!1,canCreateAnchor:!1,canPropagateAnchor:!1,retainAnchor:!1,alpha:0,predictionAgeMs:null,uncertainty:{translationSigmaM:0,rotationSigmaRad:0,lateralM:0,budgetM:t.minLateralBudgetM,utilization:0},reasons:[String(p||"reset")]}),l}function f(p={}){let b=Math.max(0,ur(p.nowMs,0));r===null&&(r=b);let g=o===null?0:b-o;g<0&&(g=0),g=Math.min(g,t.maxDegradedMs),o=b;let x=n,E=ur(p.presentedTimestampNs,null),y=p.spatialClockReady===!0&&E!==null&&E>0,O=p.odometry||null,C=p.sync?.canDrawPrecise===!0,w=p.sync?.canHoldAnchor===!0&&!!O,z=y&&C&&w,M=cg(p),R=M!==null&&M!==a;R&&(a=M);let v=[];if(p.discontinuity===!0)n=Be.LOST,s=0,r=b,i=null,a=null,u=0,c=0,v.push(String(p.discontinuityReason||"timeline discontinuity"));else if(z&&R)s+=1,i=b,u=0,c=0,n=s>=t.minHealthySamples?Be.TRACKING:Be.INITIALIZING;else{z&&!R&&v.push("presented sample not advanced"),y||v.push("presented frame clock unmapped"),C||v.push(...p.sync?.reasons||["precise sync unavailable"]),w||v.push("odometry/pose propagation unavailable");let T=g/1e3,I=au(O?.transStd),k=au(O?.rotStd),D=Math.abs(ur(p.egoSpeedMps,0));u+=(I===null?t.noOdometryTranslationStdMps+D*t.noOdometrySpeedStdRatio:I)*T,c+=(k===null?t.noOdometryRotationStdRadps:k)*T;let B=i===null?Math.max(0,b-r):Math.max(0,b-i),W=jr(Math.abs(ur(p.anchorDistanceM,40)),0,300),V=jr(t.minLateralBudgetM+W*t.lateralBudgetDistanceRatio,t.minLateralBudgetM,t.maxLateralBudgetM),F=u+W*c;i===null?n=B<=t.initializingTimeoutMs?Be.INITIALIZING:Be.LOST:x===Be.TRACKING&&B<=t.expectedFrameHoldMs?n=Be.TRACKING:B<=t.maxCoastingMs&&F<=V*t.coastingBudgetRatio?n=Be.COASTING:B<=t.maxDegradedMs&&F<=V?n=Be.DEGRADED:n=Be.LOST}let h=i===null?Math.max(0,b-r):Math.max(0,b-i),S=jr(Math.abs(ur(p.anchorDistanceM,40)),0,300),A=jr(t.minLateralBudgetM+S*t.lateralBudgetDistanceRatio,t.minLateralBudgetM,t.maxLateralBudgetM),L=u+S*c;n===Be.DEGRADED?v.push(`tracking degraded age=${Math.round(h)}ms uncertainty=${L.toFixed(2)}/${A.toFixed(2)}m`):n===Be.LOST&&p.discontinuity!==!0&&v.push(`tracking budget exceeded age=${Math.round(h)}ms uncertainty=${L.toFixed(2)}/${A.toFixed(2)}m`);let P=n===Be.TRACKING&&x!==Be.TRACKING&&x!==Be.INITIALIZING,_=n===Be.TRACKING||n===Be.COASTING||n===Be.DEGRADED;return l=su({state:n,previousState:x,transition:n===x?null:`${x}->${n}`,recovered:P,canCreateAnchor:C,canPropagateAnchor:_&&w,retainAnchor:_,alpha:C?1:+lg(n,h,t).toFixed(3),predictionAgeMs:Math.round(h),uncertainty:{translationSigmaM:+u.toFixed(4),rotationSigmaRad:+c.toFixed(6),lateralM:+L.toFixed(4),budgetM:+A.toFixed(3),utilization:+(A>0?L/A:1).toFixed(3)},reasons:v}),l}function m(){return l}return d("not started"),Object.freeze({update:f,reset:d,status:m,limits:t})}var ss=new WeakMap,ug="drive.vision.ar.worker";function dg({host:e,documentRoot:t,target:n,options:r,onBroken:o,onDrawn:i}){if(typeof n.Worker!="function"||typeof t.createElement!="function")return null;let a=t.createElement("canvas");if(typeof a.transferControlToOffscreen!="function")return null;a.className="carrot-ar__canvas",a.style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:6;display:none",e.appendChild(a);let s;try{let v=r.resolveAssetUrl||(S=>n.CarrotAssetUrl?.resolve?.(S)),h=String(v(ug)||"");if(!h)throw new Error("AR worker asset URL 없음");s=new n.Worker(h)}catch(v){return a.remove?.(),n.console?.warn?.("[carrot] AR 워커 시작 실패 — AR 숨김:",v?.message||v),null}let u=!1,c="",l=!1,d=null,f=null,m="",p={pixelWidth:0,pixelHeight:0},b={left:0,top:0,width:0,height:0},g={posted:0,completed:0,deferred:0,replaced:0,discarded:0},x={navi:0,modelPosition:0,reusedNavi:0,reusedModelPosition:0},E={navi:{initialized:!1,reference:null,revision:null},modelPosition:{initialized:!1,reference:null,revision:null}};function y(v,h){a.dataset&&(h==null||h===""?delete a.dataset[v]:a.dataset[v]=String(h))}y("arReady",!1),y("arBackend","pending");function O(v){c||(c=String(v||"Three AR worker failed"),u=!1,l=!1,d=null,a.style.display="none",y("arReady",!1),y("arBackend","failed"),y("arReason",c),s.terminate?.(),o?.(c))}s.onmessage=v=>{let h=v.data||{};if(h.type==="ready"){if(h.backend!=="three"){O("unexpected AR renderer backend");return}u=!0,a.style.display="",y("arReady",!0),y("arBackend",h.backend);return}if(h.type==="error"){O(h.error||"worker error");return}if(h.type==="drawn"){if(c)return;l=!1,g.completed+=1,f=h,i?.(h),y("arOk",h.ok===!0),y("arDrawn",h.renderer?.drawn??0),y("arSkipped",h.renderer?.skipped??0);let S=String(h.renderer?.lastReason||""),A=String(h.hold?.reason||"");if(y("arRenderReason",S||null),y("arHoldState",h.hold?.state||null),y("arHoldReason",A||null),y("arAnchorMode",h.hold?.sourceMode||null),y("arAnchorCount",h.hold?.anchorCount??null),y("arHoldMs",h.hold?.holdMs??null),y("arDriftM",h.hold?.driftM??null),y("arTracking",h.tracking?.state||null),y("arTrackingAlpha",h.tracking?.alpha??null),y("arTrackingUncertaintyM",h.tracking?.uncertainty?.lateralM??null),y("arWorldPoseInitialized",h.worldPose?.initialized===!0),y("arWorldPoseIntegrations",h.worldPose?.integrations??null),y("arWorldPoseEpoch",h.worldPose?.epoch||null),y("arReason",S||m||A||null),y("arSignCount",h.composition?.signCount??0),y("arComposedAnchorCount",h.composition?.anchoredCount??0),y("arQueuePending",d?1:0),y("arQueueReplaced",g.replaced),d){let L=d;d=null,z(L)}}},s.onerror=v=>{O(v?.message||"worker failed")};function C(v,h,S){let A=E[v],L=S!=null&&S!=="",P=L?String(S):null;return!A.initialized||(L?A.revision!==P:A.reference!==h)?(A.initialized=!0,A.reference=h,A.revision=P,!0):!1}function w(v={}){let h=v.composeInput||{},S=v.sourceRevisions||{},A=h.navi??null,L=h.modelPosition??null,P={};C("navi",A,S.navi)?(P.navi=A,x.navi+=1):x.reusedNavi+=1,C("modelPosition",L,S.modelPosition)?(P.modelPosition=L,x.modelPosition+=1):x.reusedModelPosition+=1;let _={...h};delete _.navi,delete _.modelPosition;let{sourceRevisions:T,...I}=v;return{...I,composeInput:_,...Object.keys(P).length?{sourceUpdate:P}:{}}}function z(v){return!u||c?!1:l?(g.deferred+=1,d&&(g.replaced+=1),d=v,y("arQueuePending",1),y("arQueueReplaced",g.replaced),!0):(l=!0,g.posted+=1,s.postMessage({type:"frame",payload:w(v)}),!0)}try{let v=a.transferControlToOffscreen();s.postMessage({type:"init",canvas:v,performance:{targetFps:r.targetFps,degradedFps:r.degradedFps}},[v])}catch(v){return a.remove?.(),s.terminate?.(),n.console?.warn?.("[carrot] OffscreenCanvas 이전 실패 — AR 숨김:",v?.message||v),null}function M(v){let h=Math.max(1,ie(v?.stageWidth,0)),S=Math.max(1,ie(v?.stageHeight,0));if(!(h>1&&S>1))return!1;let A=ie(v?.viewportLeft,0),L=ie(v?.viewportTop,0),P={left:A,top:L,width:h,height:S};return P.left===b.left&&P.top===b.top&&P.width===b.width&&P.height===b.height?!1:(b=P,a.style.left=`${A}px`,a.style.top=`${L}px`,a.style.width=`${h}px`,a.style.height=`${S}px`,y("arViewport",`${A},${L},${h}x${S}`),!0)}function R(v){let h=a.getBoundingClientRect?.()||{},S=Math.max(1,ie(n.devicePixelRatio,1)),L=f?.performance?.level==="degraded"?_r.degradedDevicePixelRatioMax:_r.devicePixelRatioMax,P=Math.min(S,Math.max(1,ie(L,1))),_=ie(v?.stageWidth,h.width||1),T=ie(v?.stageHeight,h.height||1),I=Math.max(1,Math.round(_*P)),k=Math.max(1,Math.round(T*P));return(I!==p.pixelWidth||k!==p.pixelHeight)&&(p={pixelWidth:I,pixelHeight:k,dpr:P},s.postMessage({type:"resize",pixelWidth:I,pixelHeight:k})),p}return Object.freeze({canvas:a,render(v){M(v?.stage);let h=R(v?.stage);m=String(v?.sync?.reasons?.[0]||""),y("arSync",v?.sync?.state||"missing"),y("arCanDraw",v?.sync?.canDrawPrecise===!0),y("arClockDomain",v?.clockDomain||null),y("arPresentedClock",v?.presentedClock?.domain||null),y("arClockConfidence",v?.presentedClock?.confidence||"unmapped"),y("arTracking",v?.tracking?.state||null),y("arTrackingAlpha",v?.tracking?.alpha??null),y("arWorldPoseEpoch",v?.worldPoseEpoch||null),y("arSyncReason",m||null),y("arReason",m||null);let S=v?.stage?{...v,stage:{...v.stage,devicePixelRatio:h.dpr}}:v;return z(S)},reset(){d&&(g.discarded+=1),d=null;for(let v of Object.values(E))v.initialized=!1,v.reference=null,v.revision=null;s.postMessage({type:"reset"})},status(){return Object.freeze({mode:"worker",ready:u,broken:c||null,composition:f?.composition||null,hold:f?.hold||null,renderer:f?.renderer||null,performance:f?.performance||null,canvas:`${p.pixelWidth}x${p.pixelHeight}`,dpr:p.dpr||1,queue:Object.freeze({...g,inFlight:l,pending:!!d,maxPending:1}),sourceTransfers:Object.freeze({...x}),viewport:Object.freeze({...b})})},destroy(){try{s.postMessage({type:"destroy"})}catch{}s.terminate?.(),a.remove?.()}})}function ie(e,t=null){if(e==null||e==="")return t;let n=Number(e);return Number.isFinite(n)?n:t}function lu(e){return e?Object.freeze({present:e.present!==!1,distanceM:ie(e.distanceM),turnType:ie(e.turnType),roadName:String(e.roadName||""),latitude:ie(e.latitude),longitude:ie(e.longitude),pointValid:e.pointValid===!0}):null}function fg(e){let t=e?.navigationStatus||null,n=e?.vehicle||null,r=e?.route||null,o=Array.isArray(r?.polyline)?r.polyline:[];return Object.freeze({present:!!e,sessionId:String(e?.sessionId||""),connected:e?.connected===!0,guidanceActive:t?.guidanceActive===!0,offRoute:t?.offRoute===!0,routePresent:t?.routePresent===!0||r?.present===!0,vehicle:Object.freeze({present:n?.present!==!1&&!!n,latitude:ie(n?.latitude),longitude:ie(n?.longitude),headingDeg:ie(n?.headingDeg),speedKph:ie(n?.speedKph)}),route:Object.freeze({present:r?.present===!0,pointCount:o.length,totalDistanceM:ie(r?.totalDistanceM),remainingDistanceM:ie(r?.remainingDistanceM),movedDistanceM:ie(r?.movedDistanceM)}),guidanceCurrent:lu(e?.guidanceCurrent),guidanceNext:lu(e?.guidanceNext),publishMonoTimeNanos:ie(e?.publishMonoTimeNanos)})}function pg(e){return e?Object.freeze({state:e.state,canDrawPrecise:e.canDrawPrecise===!0,canHoldAnchor:e.canHoldAnchor===!0,frameIdGap:ie(e.frameIdGap),modelAgeMs:ie(e.modelAgeMs),odometryAgeMs:ie(e.odometryAgeMs),poseAgeMs:ie(e.poseAgeMs),calibrationAgeMs:ie(e.calibrationAgeMs),naviAgeMs:ie(e.naviAgeMs),naviUsable:e.naviUsable===!0,presentedClockConfidence:String(e.presentedClockConfidence||"unmapped"),presentedTargetTimestampNs:ie(e.presentedTargetTimestampNs),reasons:Object.freeze([...e.reasons||[]].map(String))}):null}function mg(e){return e?Object.freeze({canUseGeo:e.canUseGeo===!0,canUseRoute:e.canUseRoute===!0,fallback:String(e.fallback||""),positionSigmaM:ie(e.positionSigmaM),headingSigmaDeg:ie(e.headingSigmaDeg),separationM:ie(e.separationM),reasons:Object.freeze([...e.reasons||[]].map(String)),routeReasons:Object.freeze([...e.routeReasons||[]].map(String))}):null}function hg(e,t,n){let r=[];t&&r.push(ie(n,40));for(let i of[e?.guidanceCurrent,e?.guidanceNext]){if(i?.present===!1)continue;let a=ie(i?.distanceM,null);a!==null&&a>=0&&r.push(a)}let o=ie(e?.speed?.sdiDistanceM,null);return o!==null&&o>=0&&r.push(o),r.length?Math.min(300,Math.max(...r)):40}function gg(e,t,n){let r=e?.vehicle,o=ie(r?.latitude),i=ie(r?.longitude),a=ie(r?.headingDeg),s=ie(e?.publishMonoTimeNanos,0),u=ie(t?.unixTimestampMillis,0),c=s>0?`navi:${s}`:`legacy:${o}|${i}|${a}|${u}`,l=n?.canUseGeo===!0,d=!l&&n?.canUseRoute===!0,f=l?ie(n?.positionSigmaM):d?mo.routeWorldPositionSigmaM:null,m=l?ie(n?.headingSigmaDeg):d?mo.routeWorldHeadingSigmaDeg:null;return Object.freeze({key:c,valid:l||d,latitude:o,longitude:i,headingDeg:a,positionSigmaM:f,headingSigmaDeg:m,yawUsable:a!==null&&m!==null,source:l?"tmap-comma-verified":d?"tmap-route":"unavailable",sourceTimestampNs:s>0?s:null,reasons:l?[]:n?.routeReasons||n?.reasons||[]})}function bg(e=globalThis,t=0){let n=e?.CarrotVisionReplay,r=n?.status?.()||null,o=typeof n?.isActive=="function"?n.isActive():r?.active===!0,i=ie(r?.currentTime,null);if(o&&i!==null&&i>=0){let a=String(n?.videoSourceKey?.()||r?.segment||r?.route||"replay");return Object.freeze({domain:Yn.REPLAY_MEDIA,nowMs:i*1e3,epoch:a})}return Object.freeze({domain:Yn.LIVE_MONOTONIC,nowMs:Math.max(0,ie(t,0)),epoch:"live"})}function uu(e={}){let t=e.target||globalThis,n=e.document||t.document;if(!n?.createElement)return null;let r=e.host||n.getElementById?.("carrotVisionStage")||n.querySelector?.(".carrot-stage");if(!r)return null;let o=os({enabled:e.traceEnabled===!0,capacity:e.traceCapacity,now:()=>t.performance?.now?.()??Date.now()}),i=e.diagnosticProbe===!0,a=e.bypassWorldAnchor??!1,s=()=>{},u=()=>{},c=new Set,l=e.renderer?null:dg({host:r,documentRoot:n,target:t,options:e,onBroken:te=>s(te),onDrawn:te=>u(te)}),d=e.renderer||null;if(!d&&!l)return null;let f=!1,m=!1,p=null,b=null,g=null,x=null,E=0,y=null,O=0,C=0,w="none",z=0,M=null,R=null,v=0,h=null,S=Math.max(1,ie(e.targetFps,_r.targetFps)),A=Math.min(S,Math.max(1,ie(e.degradedFps,_r.degradedFps))),L=ie(e.probeDistanceM,40),P=null,_=null,T="",I=null,k=null,D=null,B=null,W=null,V=null,F=null,H=null,Y=null,$=e.timelineTracker||is(),K=e.presentedClockMapper||Wa(),Z=e.odometryTimeline||$a(),ee=e.trackingTracker||as({limits:e.trackingLimits}),ue=e.worldPoseTracker||Da({limits:e.worldPoseLimits}),de=e.anchorStore||Ha({limits:e.holdLimits,bypassWorldAnchor:a}),ye=e.identityTracker||Ea(),U=e.routeMatcher||Ja();function X(te){for(let Re of[...c])try{Re(te)}catch(mt){t.console?.error?.("[carrot AR debug] frame listener failed",mt)}}function pe(te){if(typeof te!="function")throw new TypeError("AR diagnostic listener must be a function");c.add(te);let Re=!0;return()=>Re?(Re=!1,c.delete(te)):!1}u=te=>{te?.worldPose&&(B=te.worldPose);let Re=l?.status?.()||null,mt=Object.freeze({dpr:Re?.dpr??null,queue:Re?.queue||null,sourceTransfers:Re?.sourceTransfers||null}),Ce=te&&Object.freeze({...te,transport:mt});X(Ce),o.isEnabled()&&o.record("worker-drawn",{traceFrameId:te?.traceFrameId??null,ok:te?.ok===!0,composition:te?.composition||null,hold:te?.hold||null,worldPose:te?.worldPose||null,renderer:te?.renderer||null,performance:te?.performance||null,transport:mt})},s=te=>{!f||m||(o.record("worker-failure",{reason:String(te||"worker failed")}),f=!1,b?.(),b=null,w="none",de.reset(),ye.reset(),U.reset(),p?.release?.(),p=null)};function xe(te=!1){if(!f||m)return!1;let Re=t.performance?.now?.()??Date.now(),Ce=1e3/(l?Math.max(1,ie(l.status().performance?.fps,S)):S);if(!te&&y!==null&&Re-y0;Zn&&(V=We.targetTimeMs);let ht=qa({roadCameraState:ge.roadCameraState,modelV2:nt,cameraOdometry:ge.cameraOdometry,livePose:ge.livePose,liveCalibration:ge.liveCalibration,carrotNavi:ge.carrotNavi,nowMs:fe.nowMs,clockDomain:fe.domain,presentedClock:We,receivedAtMonotonic:tt?.receivedAtMonotonic}),q=tu({nowMs:fe.nowMs,clockDomain:fe.domain,receivedAtMonotonic:tt?.receivedAtMonotonic,naviUsable:ht.naviUsable,naviVehicle:ge.carrotNavi?.vehicle,naviRoutePolyline:ge.carrotNavi?.route?.polyline,gpsLocationExternal:Nn.gpsLocationExternal});x=q;let oe=gg(ge.carrotNavi,Nn.gpsLocationExternal,q),be=ht;g=be;let Se=ie(Nn.carState?.vEgo,0),Ne=ee.update({nowMs:fe.nowMs,sampleId:We.targetTimestampNs??We.sourceFrameId??R?.sequence,presentedTimestampNs:We.targetTimestampNs,spatialClockReady:Zn,sync:be,odometry:Rt,egoSpeedMps:Se,anchorDistanceM:hg(ge.carrotNavi,i,L),discontinuity:fe.discontinuity,discontinuityReason:fe.discontinuityReason});D=Ne;let Zt=String(ge.carrotNavi?.sessionId||"");Zt&&(T=Zt);let Wi=T||"no-navigation-session",Jt=`${fe.domain}|${fe.epoch}|${Wi}`,Dn=nt?.position||null;Dn!==F&&(F=Dn,H=ua(Dn));let kt=H,Hn=kt?.x,gt=kt?.y;P=Array.isArray(Hn)&&Array.isArray(gt)?Object.freeze({pathLengthM:Hn.at(-1)??null,lateralAtProbeM:(()=>{for(let bt=1;bt=L)return+Number(gt[bt]).toFixed(2);return null})(),lateralSpread:+(Math.max(...gt.map(Number))-Math.min(...gt.map(Number))).toFixed(2)}):null;let yn=V??fe.nowMs,Rr={navi:ge.carrotNavi||null,naviUsable:be.naviUsable,laneWidthM:ie(ge.lateralPlan?.laneWidth,3.5),egoSpeedMps:Se,calibrationProbe:i,probeDistanceM:L,canDrawPrecise:Ne.canCreateAnchor,geoAllowed:q.canUseGeo,routeAllowed:q.canUseRoute,routePositionSigmaM:q.positionSigmaM,modelPosition:kt},Ho=Ne.canPropagateAnchor&&Zn&&!!Rt,xr=O+1,no=c.size>0,Er=no?Object.freeze({replayTimeMs:fe.domain===Yn.REPLAY_MEDIA?fe.nowMs:null,timeline:Object.freeze({domain:fe.domain,nowMs:fe.nowMs,epoch:fe.epoch,deltaMs:fe.deltaMs,discontinuity:fe.discontinuity,discontinuityReason:fe.discontinuityReason}),presented:R,presentedClock:We,sync:pg(be),positionQuality:mg(q),navi:fg(ge.carrotNavi),sources:Object.freeze({cameraFrameId:ie(ge.roadCameraState?.frameId),modelFrameId:ie(nt?.frameId),odometryFrameId:ie(ge.cameraOdometry?.frameId),livePoseTimestamp:ie(ge.livePose?.timestamp)}),worldEpoch:Jt}):null;o.isEnabled()&&o.record("frame-submit",{traceFrameId:xr,force:te===!0,presented:R,timeline:{domain:fe.domain,nowMs:fe.nowMs,epoch:fe.epoch,deltaMs:fe.deltaMs,discontinuity:fe.discontinuity,discontinuityReason:fe.discontinuityReason},presentedClock:We,stage:Ge?{width:Ge.stageWidth??null,height:Ge.stageHeight??null,viewportLeft:Ge.viewportLeft??null,viewportTop:Ge.viewportTop??null}:null,sources:{cameraFrameId:ge.roadCameraState?.frameId??null,cameraTimestampEof:ge.roadCameraState?.timestampEof??null,modelFrameId:nt?.frameId??null,modelFrameAge:nt?.frameAge??null,odometryFrameId:ge.cameraOdometry?.frameId??null,odometryTimestampEof:ge.cameraOdometry?.timestampEof??null,odometryObservationTimestampNs:Rt?.observationTimestampNs??null,odometryAlignment:Rt?.temporalAlignment||null,livePoseTimestamp:ge.livePose?.timestamp??null,naviPublishMonoTimeNanos:ge.carrotNavi?.publishMonoTimeNanos??null,geographicPositionSigmaM:q.positionSigmaM,geographicHeadingSigmaDeg:q.headingSigmaDeg,coordinateFrames:{modelPosition:kt?.coordinateFrame??null,cameraOdometry:Rt?.coordinateFrame??null,cameraOdometryDevice:Gt?.coordinateFrame??null,worldPose:B?.worldCoordinateFrame??Ae.LOCAL_WORLD_DEVICE,livePose:la,tmapRoute:Ae.ROUTE_FLU}},sync:{state:be.state,canDrawPrecise:be.canDrawPrecise,canHoldAnchor:be.canHoldAnchor,naviUsable:be.naviUsable,reasons:be.reasons},tracking:Ne,worldPoseEpoch:Jt,probe:i},Re);let vn;if(l)vn=l.render({nowMs:yn,presentationNowMs:fe.nowMs,stage:Ge?{...Ge,devicePixelRatio:t.devicePixelRatio||1}:null,sync:be,tracking:Ne,deviceOdometry:Gt,livePose:ge.livePose,geographicObservation:oe,worldPoseEpoch:Jt,worldPoseTargetTimestampNs:We.targetTimestampNs,clockDomain:fe.domain,presentedClock:We,timelineDiscontinuity:fe.discontinuity,timelineDiscontinuityReason:fe.discontinuityReason,canHoldAnchor:Ho,routeOdometry:Rt,traceFrameId:xr,debugFrame:Er,diagnosticsEnabled:no,composeInput:Rr,sourceRevisions:{navi:ge.carrotNavi?.publishMonoTimeNanos??null,modelPosition:nt?.frameId??null}});else{(fe.discontinuity||W!==Jt)&&(ue.reset({epoch:Jt,reason:fe.discontinuity?fe.discontinuityReason||"timeline discontinuity":"navigation/session epoch initialized"}),W=Jt),B=Gt?ue.update({timestampNs:We.targetTimestampNs,odometry:Gt,livePose:ge.livePose,geographicObservation:oe,trackingState:Ne.state}):ue.status(),fe.discontinuity&&(de.reset(),ye.reset(),U.reset(),d.reset?.());let bt=eu(Rr,{identityTracker:ye,routeMatcher:U});_=Object.freeze({signCount:bt.signs.length,anchoredCount:bt.fresh?.length||0,sources:Object.freeze(bt.signs.map(Jn=>Jn.source||"unknown")),diag:bt.diag||null});let Bo=bt.signs.length>0&&bt.signs.every(Jn=>Jn?.source==="calibrationProbe"),Go=de.update({nowMs:yn,navi:Rr.navi,probe:Bo,candidates:bt.fresh,modelPosition:kt,valid:Bo||!Rr.navi||be.naviUsable,canHold:Ho,precise:Ne.canCreateAnchor,trackingState:Ne.state,trackingRecovered:Ne.recovered,retainAnchor:Ne.retainAnchor,trackingUncertaintyM:Ne.uncertainty?.lateralM,reason:Ne.reasons[0]||"",odometry:Rt,worldPose:B});vn=d.render({stage:Ge,sync:be,tracking:Ne,nowMs:fe.nowMs,clockDomain:fe.domain,held:Go.state===vt.HELD,modelPosition:kt,egoSpeedMps:Se,signs:Go.anchors||[],diagnosticsEnabled:no}),X(Object.freeze({type:"drawn",traceFrameId:xr,ok:vn===!0,debugFrame:Er,composition:_,hold:de.status(yn),tracking:Ne,worldPose:B,renderer:d.status?.()||null,performance:null})),o.isEnabled()&&o.record("main-drawn",{traceFrameId:xr,ok:vn===!0,composition:{signCount:bt.signs.length,anchoredCount:bt.fresh?.length||0,sources:bt.signs.map(Jn=>Jn.source||"unknown")},hold:de.status(yn),renderer:d.status?.()||null})}return O+=1,E=t.performance?.now?.()??Date.now(),vn}function Je(){let te=e.frameSync||t.CarrotVisionFrameSync,Re=(Ce={})=>{z+=1,M=Ce?.source||null;let Ke=Ce?.metadata||{};M==="replay"&&Ke.discontinuity===!0&&(Y=Object.freeze({sequence:Ce?.sequence??null,reason:String(Ke.discontinuityReason||"replay-seek")})),R=Object.freeze({source:M,sequence:Ce?.sequence??null,reason:Ce?.reason||null,mediaTime:Ke.mediaTime??null,expectedDisplayTime:Ke.expectedDisplayTime??null,presentedFrames:Ke.presentedFrames??null,rtpTimestamp:Ke.rtpTimestamp??null,captureTime:Ke.captureTime??null,receiveTime:Ke.receiveTime??null,frameId:Ce?.frameId??null,cameraTimestampEof:Ce?.cameraTimestampEof??null,clockMappingConfidence:Ce?.clockMappingConfidence||"unmapped",discontinuity:Ke.discontinuity===!0,discontinuityReason:Ke.discontinuityReason||null}),o.record("presented-frame",R),xe(!1)&&(v+=1,h=R.sequence)};if(typeof te?.subscribePresented=="function")return w="presented-channel",te.subscribePresented(Re);w="render-request-fallback";let mt=()=>Re({source:"render-request"});return t.addEventListener?.("carrot:render-request",mt),()=>t.removeEventListener?.("carrot:render-request",mt)}function et(){if(m||f||l?.status().broken)return!1;let te=e.activity||t.CarrotDriveDataActivity;return te?.acquire&&(p=te.acquire({owner:"vision_ar",ar:!0})),f=!0,C=t.performance?.now?.()??Date.now(),z=0,M=null,R=null,v=0,h=null,y=null,I=null,k=null,V=null,F=null,H=null,Y=null,$.reset(),K.reset(),Z.reset(),ee.reset("activate"),U.reset(),D=null,ue.reset({epoch:"uninitialized",reason:"activate"}),T="",B=null,W=null,b=Je(),o.record("activate",{frameSignalMode:w,diagnosticProbeEnabled:i}),xe(!0),y=null,!0}function ft(){return m||!f?!1:(o.record("deactivate",{frames:O,presentedSignals:z}),f=!1,b?.(),b=null,w="none",de.reset(),ye.reset(),U.reset(),l?.reset(),I=null,k=null,V=null,F=null,H=null,Y=null,$.reset(),K.reset(),Z.reset(),ee.reset("deactivate"),D=null,ue.reset({epoch:"uninitialized",reason:"deactivate"}),T="",B=null,W=null,p?.release?.(),p=null,l?l.render({sync:null,signs:[]}):d.render({}),!0)}function He(){return f?xe(!0):!1}function wt(te){if(!i)return!1;let Re=ie(te,null);return Re===null||Re<=0?!1:(L=Re,de.reset(),ye.reset(),U.reset(),l?.reset(),xe(!0),!0)}function pt(){let te=e.provider||t.CarrotDriveLiveStateProvider,Re=e.stage||t.CarrotVisionStageTransform,Ce=te?.snapshot?.()?.overlayState||{},Ge=(e.frameSync||t.CarrotVisionFrameSync)?.selectModel?.()||Ce.modelV2,tt=Ce.carrotNavi||null,ge=tt?.navigationStatus||null,Nn=t.CarrotVisionReplay?.status?.()||null,It=l?.status()||null,nt=(l?It?.composition:_)||null,Ie=[],fe=t.performance?.now?.()??Date.now();f||Ie.push("AR 런타임 비활성 (주행화면이 활성인지 확인)"),f&&fe-C>=1e3&&z===0&&Ie.push("presented-frame 신호가 들어오지 않음"),te||Ie.push("CarrotDriveLiveStateProvider 없음"),Re||Ie.push("CarrotVisionStageTransform 없음 (영상이 렌더 중인지 확인)"),Ge?Array.isArray(Ge?.position?.x)||Ie.push("modelV2.position.x 없음"):Ie.push("modelV2 없음"),Ce.roadCameraState||Ie.push("roadCameraState 없음"),Ce.liveCalibration||Ie.push("liveCalibration 없음"),g&&!g.canDrawPrecise&&Ie.push("AR gate 차단: "+g.reasons.join(", "));let We=l?It?.renderer?.drawn??null:d.status().drawn;return l&&It?.broken&&Ie.push("AR 워커 오류: "+It.broken),l&&!It?.ready&&Ie.push("AR 워커 준비 중"),We===0&&Ie.length===0&&(nt?.signCount===0?Ie.push("AR 마커 후보 없음"):nt?.anchoredCount===0?Ie.push("AR 마커는 있으나 model/geo 앵커를 만들지 못함"):It?.renderer?.lastReason?Ie.push("AR 렌더러가 프레임을 건너뜀: "+It.renderer.lastReason):Ie.push("AR 마커와 앵커는 있으나 렌더러가 그리지 못함")),Object.freeze({ok:Ie.length===0,problems:Object.freeze(Ie),calStatusRaw:Ce.liveCalibration?.calStatus??null,camFrameId:Ce.roadCameraState?.frameId??null,modelFrameId:Ge?.frameId??null,pathLengthM:Array.isArray(Ge?.position?.x)?Ge.position.x.at(-1):null,drawn:We,composition:nt,frameSignal:Object.freeze({mode:w,received:z,lastSource:M}),replay:Nn,navi:Object.freeze({present:!!tt,connected:tt?.connected===!0,guidanceActive:ge?.guidanceActive===!0,offRoute:ge?.offRoute===!0,routePresent:ge?.routePresent===!0,usable:g?.naviUsable??null,ageMs:g?.naviAgeMs??null})})}function on(){let te=l?.status()||null;return Object.freeze({active:f,destroyed:m,frames:O,lastFrameAt:E,frameSignalMode:w,presentedSignals:z,presentedSubmissions:v,lastSubmittedPresentedSequence:h,lastPresentedSource:M,targetFps:S,degradedFps:A,currentFps:l?Math.max(1,ie(te?.performance?.fps,S)):S,presentationClock:"presented-frame",presentationLoopActive:!1,leaseActive:!!p?.active,positionQuality:x,timeline:I,presentedClock:k,odometryTimeline:Z.status(),tracking:D||ee.status(),worldPose:B||ue.status(),sync:g?Object.freeze({state:g.state,canDrawPrecise:g.canDrawPrecise,canHoldAnchor:g.canHoldAnchor,calibrated:g.calibrated,calibrationPlausible:g.calibrationPlausible,frameIdGap:g.frameIdGap,modelAgeMs:g.modelAgeMs,odometryAgeMs:g.odometryAgeMs,poseAgeMs:g.poseAgeMs,calibrationAgeMs:g.calibrationAgeMs,naviAgeMs:g.naviAgeMs,naviUsable:g.naviUsable,presentedClockConfidence:g.presentedClockConfidence,presentedTargetTimestampNs:g.presentedTargetTimestampNs,odometryPoseDelayMs:g.odometryPoseDelayMs,reasons:g.reasons}):null,mode:l?"worker":"main",renderer:l?te?.renderer:d.status(),worker:te,composition:(l?te?.composition:_)||null,probeEnabled:i,probeDistanceM:L,trace:o.status(),anchor:P,hold:l?te?.hold:de.status()})}function Vn(){return m?!1:(ft(),m=!0,l?.destroy(),d?.destroy(),c.clear(),ss.delete(t),!0)}let an=Object.freeze({enable(te={}){return o.setEnabled(!0,te)},disable(te={}){return o.setEnabled(!1,te)},clear:o.clear,status:o.status,snapshot:o.snapshot});return Object.freeze({activate:et,deactivate:ft,resize:He,status:on,diagnose:pt,setProbeDistance:wt,subscribeDiagnostics:pe,destroy:Vn,render:xe,trace:an})}function du(e={}){let t=e.target||globalThis,n=ss.get(t);if(n)return n;let r=uu({...e,target:t});return r&&ss.set(t,r),r}function cs(e=globalThis,t={}){let n=du({...t,target:e});return n&&(e.CarrotVisionAr=n),n}var fn=Object.freeze({ACTIVE_CANDIDATE:"active-candidate",ACTIVE_VISIBLE:"active-visible",ACTIVE_OFFSCREEN:"active-offscreen",ACTIVE_SUPPRESSED:"active-suppressed",PASSING:"passing",BEHIND_CAMERA:"behind-camera",NEAR_PLANE:"near-plane",PLAN_REJECTED:"plan-rejected",PROJECTION_UNAVAILABLE:"projection-unavailable",INACTIVE_FADING:"inactive-fading"}),DM=Object.freeze({[fn.ACTIVE_CANDIDATE]:"active marker candidate",[fn.ACTIVE_VISIBLE]:"visible",[fn.ACTIVE_OFFSCREEN]:"outside camera viewport",[fn.ACTIVE_SUPPRESSED]:"overlap selection suppressed",[fn.PASSING]:"marker passing camera",[fn.BEHIND_CAMERA]:"behind camera",[fn.NEAR_PLANE]:"inside near-plane passing zone",[fn.PLAN_REJECTED]:"visibility plan rejected",[fn.PROJECTION_UNAVAILABLE]:"projection unavailable",[fn.INACTIVE_FADING]:"inactive marker fading"});var Ye=Object.freeze({OK:"ok",WARN:"warn",IDLE:"idle",OFF:"off"});function Le(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function dr(e){let t=Le(e?.worker?.renderer?.drawn);return t===null?Le(e?.renderer?.drawn,0)??0:t}function ls(e){return Object.entries(e).map(([t,n])=>n?t:"-").join("")}function us(e){return e===!0?"ON":"off"}function ds(e){if(!e||e.active!==!0)return{tone:Ye.OFF,label:"AR 꺼짐",hint:"주행화면 비활성"};let t=Le(e.composition?.signCount,0)??0,n=Le(e.composition?.anchoredCount,0)??0,r=dr(e);return r>0?{tone:Ye.OK,label:"표시중",hint:`그림 ${r}`}:n>0?{tone:Ye.WARN,label:"앵커O·렌더X",hint:"렌더러가 못 그림"}:t>0?{tone:Ye.WARN,label:"표지O·앵커X",hint:"앵커 생성 실패"}:{tone:Ye.IDLE,label:"표지 없음",hint:"안내/후보 없음"}}function vi(e){if(!e)return"—";let t=[`gate:${ls({G:e.geo,R:e.route,P:e.precise})}`,`pts:${e.routePts}`,`veh:${e.veh}${e.head}`,`match:${e.matchIdx??"-"}`,`path:${e.pathM===null||e.pathM===void 0?"-":`${e.pathM}m`}`];return Array.isArray(e.fails)&&e.fails.length&&t.push(`fail:${e.fails.map(n=>`${n.src}@${n.dist}m`).join(",")}`),t.join(" ")}function fu(e){return e?`x${e.x} y${e.y} z${e.z}`:"—"}function pu(e){let t=e?.worker?.renderer||e?.renderer||null;if(!t)return"—";let n=[`draw ${Le(t.drawn,0)}`,`skip ${Le(t.skipped,0)}`];return t.lastReason&&n.push(String(t.lastReason)),Array.isArray(t.skips)&&t.skips.length&&n.push(`[${t.skips.join(" | ")}]`),n.join(" · ")}function Si(e){let t=e?.worker;if(!t)return"—";let n=t.viewport||{};return`${t.canvas||"—"} @ ${Le(n.left,0)},${Le(n.top,0)}`}function Mi(e,t){let n=t?.calStatusRaw,r=e?.sync?.calibrationPlausible,o=e?.sync?.calibrated;return`cal:${n??"—"} ${ls({C:o===!0,P:r===!0})}`}function mu(e,t){let n=dr(e);return e?.tracking?.reasons?.[0]||(Array.isArray(t?.problems)&&t.problems.length?t.problems[0]:null)||e?.sync?.reasons?.[0]||(n>0?"":ds(e).hint)}function hu(e,t){let n=t?.camFrameId??"—",r=t?.modelFrameId??"—";return`cam ${n} · model ${r}`}function gu(e){let t=e?.sync;return t?["model","odometry","pose","navi"].map(n=>`${n[0]}${Le(t[`${n}AgeMs`],"—")}`).join(" "):"—"}function bu(e){let t=e?.navi;return t?`${ls({P:t.present,C:t.connected,G:t.guidanceActive,R:t.routePresent})}${t.offRoute?" offRoute":""} age${Le(t.ageMs,"—")}`:"—"}function yu(e){let t=e?.positionQuality;if(!t)return"—";let n=[`geo:${t.canUseGeo?"ON":"off"}`,`route:${t.canUseRoute?"ON":"off"}`];return t.horizontalAccuracyM!==null&&t.horizontalAccuracyM!==void 0&&n.push(`acc${Number(t.horizontalAccuracyM).toFixed(1)}m`),t.separationM!==null&&t.separationM!==void 0&&n.push(`sep${Number(t.separationM).toFixed(1)}m`),t.positionSigmaM!==null&&t.positionSigmaM!==void 0&&n.push(`σ${Number(t.positionSigmaM).toFixed(1)}m`),n.join(" ")}function vu(e){let t=e?.positionQuality,n=t?.reasons?.[0],r=t?.routeReasons?.[0];return[r&&`route:${r}`,n&&`geo:${n}`].filter(Boolean).join(" | ")||"—"}function Su(e){let t=e?.timeline;return t?`${t.domain||"—"} ${t.discontinuity?`끊김(${t.discontinuityReason||"?"})`:"연속"}`:"—"}function Mu(e){let t=e?.odometryTimeline;if(!t)return"—";let n=Le(e?.presentedClock?.targetTimestampNs),r=Le(t.lastObservationTimestampNs),o=n===null||r===null?null:Math.round((n-r)/1e6),i=Le(t.maxExtrapolationMs,150);return`samples ${Le(t.samples,0)} · lag ${o===null?"—":`${o}ms`}/${i}ms`}function Au(e){let t=e?.worldPose;return t?t.initialized?`init · ${Le(t.integrations,0)}회`:"미초기화":"—"}function Ru(e){let t=e?.replay;if(!t)return"라이브";let n=t.currentTime===void 0?"":` ${Number(t.currentTime).toFixed(1)}s`;return`${t.active?"재생":"정지"}${t.loading?"·로딩":""}${n} ${t.segment||""}`.trim()}function xu(e){let t=e?.frameSignal;return t?`${t.mode||"—"} rx${Le(t.received,0)} ${t.lastSource||""}`.trim():"—"}function Eu(e){let t=[e?.mode||"—",`fps ${Le(e?.currentFps,"—")}`,`frames ${Le(e?.frames,0)}`],n=e?.worker;return n&&t.push(`worker ${n.ready?"ok":"대기"}${n.broken?`·${n.broken}`:""}`),t.join(" · ")}function fs(e){let t=Math.max(0,Math.round(e/100)/10);return`${String(Math.floor(t/60)).padStart(2,"0")}:${(t%60).toFixed(1).padStart(4,"0")}`}var Tu=".carrot-ar__canvas";function vg(e){let t=e.getBoundingClientRect?.();return t?{x:Math.round(t.left),y:Math.round(t.top),w:Math.round(t.width),h:Math.round(t.height)}:null}function Sg(e){if(!e)return"없음";let t=String(e.tagName||"?").toLowerCase();if(e.id)return`${t}#${e.id}`;let n=typeof e.className=="string"&&e.className.trim()?e.className.trim().split(/\s+/)[0]:"";return n?`${t}.${n}`:t}function Vr(e=globalThis,t={}){let n=t.document||e?.document,r=t.canvas||n?.querySelector?.(t.selector||Tu);if(!r)return null;let o=vg(r),a=(r.ownerDocument?.defaultView||e)?.getComputedStyle?.(r)||{},s={display:a.display||"",visibility:a.visibility||"",opacity:a.opacity||"",zIndex:a.zIndex||""},u=null;if(o&&o.w>0&&o.h>0&&n?.elementFromPoint){let c=n.elementFromPoint(o.x+o.w/2,o.y+o.h/2);u=c===r?null:c}return{rect:o,style:s,coveredBy:Sg(u),ready:r.dataset?.arReady??null,backend:r.dataset?.arBackend??null,drawn:r.dataset?.arDrawn??null}}function Co(e){if(!e)return"캔버스 없음";let{rect:t,style:n}=e;if(!t)return"rect 없음";let r=`${t.w}x${t.h}@${t.x},${t.y}`,o=n.display==="none"||n.visibility==="hidden"||Number(n.opacity)===0,i=[r,`z${n.zIndex||"auto"}`];return o&&i.push(`숨김(${n.display}/${n.visibility}/${n.opacity})`),t.w>0&&t.h>0||i.push("크기0"),e.coveredBy&&e.coveredBy!=="없음"&&i.push(`위:${e.coveredBy}`),i.join(" ")}var ps=Object.freeze([Object.freeze({id:"pipeline",label:"파이프라인",fields:Object.freeze([Object.freeze({id:"counts",label:"표지·앵커·그림",value:e=>[Le(e?.composition?.signCount,0)??0,Le(e?.composition?.anchoredCount,0)??0,dr(e)].join(" · "),tone:e=>dr(e)>0?Ye.OK:Ye.WARN}),Object.freeze({id:"tracking",label:"track·hold",value:e=>{let t=e?.tracking,n=`${t?.canCreateAnchor?"C":"-"}${t?.canPropagateAnchor?"P":"-"}`;return`${t?.state||"—"}[${n}] · ${e?.hold?.state||"—"}(${Le(e?.hold?.anchorCount,0)??0})`},tone:e=>e?.tracking?.canCreateAnchor?Ye.OK:Ye.WARN}),Object.freeze({id:"sources",label:"navi·route",value:e=>`${us(e?.sync?.naviUsable)} · ${us(e?.positionQuality?.canUseRoute)}`,tone:e=>e?.sync?.naviUsable&&e?.positionQuality?.canUseRoute?Ye.OK:Ye.WARN})])}),Object.freeze({id:"compose",label:"앵커 입력",fields:Object.freeze([Object.freeze({id:"gate",label:"gate",value:e=>vi(e?.composition?.diag),wide:!0}),Object.freeze({id:"anchor",label:"첫 앵커",value:e=>fu(e?.hold?.sample)})])}),Object.freeze({id:"render",label:"렌더 경로",fields:Object.freeze([Object.freeze({id:"renderer",label:"renderer",value:e=>pu(e),wide:!0}),Object.freeze({id:"canvas",label:"canvas",value:e=>Si(e)}),Object.freeze({id:"alpha",label:"alpha",value:e=>{let t=e?.worker?.renderer||e?.renderer||null,n=Le(e?.tracking?.alpha,null),r=Le(t?.minimumVisibilityAlpha,null);return`track ${n??"—"} · vis ${r??"—"}`},tone:e=>{let t=Le(e?.tracking?.alpha,1);return t!==null&&t>.05?Ye.OK:Ye.WARN}}),Object.freeze({id:"surface",label:"표면",value:()=>Co(Vr()),tone:()=>{let e=Vr();if(!e?.rect)return Ye.WARN;let t=e.style.display==="none"||e.style.visibility==="hidden"||Number(e.style.opacity)===0,n=e.coveredBy&&e.coveredBy!=="없음";return!t&&e.rect.w>0&&e.rect.h>0&&!n?Ye.OK:Ye.WARN},wide:!0}),Object.freeze({id:"calibration",label:"보정",value:(e,t)=>Mi(e,t),tone:e=>e?.sync?.calibrationPlausible===!0?Ye.OK:Ye.WARN})])}),Object.freeze({id:"clock",label:"시계",fields:Object.freeze([Object.freeze({id:"presented",label:"presented·gap",value:e=>`${e?.sync?.presentedClockConfidence||"—"} · ${e?.sync?.frameIdGap??"—"}`,tone:e=>e?.sync?.presentedClockConfidence==="unmapped"?Ye.WARN:Ye.OK}),Object.freeze({id:"timeline",label:"timeline",value:e=>Su(e)}),Object.freeze({id:"world",label:"worldPose",value:e=>Au(e)}),Object.freeze({id:"odoTimeline",label:"odometry",value:e=>Mu(e)}),Object.freeze({id:"frameSignal",label:"frame신호",value:(e,t)=>xu(t),wide:!0})])}),Object.freeze({id:"sources",label:"소스",fields:Object.freeze([Object.freeze({id:"frames",label:"frameId",value:(e,t)=>hu(e,t)}),Object.freeze({id:"ages",label:"age(ms)",value:e=>gu(e)}),Object.freeze({id:"navi",label:"navi",value:(e,t)=>bu(t),wide:!0}),Object.freeze({id:"syncState",label:"sync",value:e=>`${e?.sync?.state||"—"} ${e?.sync?.canDrawPrecise?"precise":"—"}/${e?.sync?.canHoldAnchor?"hold":"—"}`,tone:e=>e?.sync?.canDrawPrecise?Ye.OK:Ye.WARN})])}),Object.freeze({id:"quality",label:"위치 품질",fields:Object.freeze([Object.freeze({id:"pq",label:"판정",value:e=>yu(e),wide:!0}),Object.freeze({id:"pqReason",label:"사유",value:e=>vu(e),wide:!0})])}),Object.freeze({id:"runtime",label:"런타임",fields:Object.freeze([Object.freeze({id:"perf",label:"성능",value:e=>Eu(e),wide:!0}),Object.freeze({id:"replay",label:"리플레이",value:(e,t)=>Ru(t),wide:!0})])})]);function Ai(e,t){let n=e?.document,r=()=>{if(!n?.createElement)return!1;try{let i=n.createElement("textarea");i.value=t,i.setAttribute("readonly",""),i.style.cssText="position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;",(n.body||n.documentElement).appendChild(i),i.select(),i.setSelectionRange(0,t.length);let a=n.execCommand?.("copy")===!0;return i.remove(),a}catch{return!1}};return typeof e?.navigator?.clipboard?.writeText!="function"?Promise.resolve(r()):e.navigator.clipboard.writeText(t).then(()=>!0).catch(()=>r())}function Hr(e,t){t&&e.set(t,(e.get(t)||0)+1)}function Ou(e,t){let n=Number(t);Number.isFinite(n)&&(e.min=e.min===null?n:Math.min(e.min,n),e.max=e.max===null?n:Math.max(e.max,n))}function Cu(e,t=""){return e.min===null?"—":e.min===e.max?`${e.min}${t}`:`${e.min}${t} ~ ${e.max}${t}`}function Mg(e,t=6){return[...e.entries()].sort((n,r)=>r[1]-n[1]).slice(0,t).map(([n,r])=>` ${n} x${r}`)}function ms(e={}){let t=typeof e.now=="function"?e.now:()=>Date.now(),n=t(),r=new Map,o=new Map,i=new Map,a=new Map,s=new Map,u=new Map,c={min:null,max:null},l={min:null,max:null},d={sign:0,anchored:0,drawn:0,frames:0,withAnchor:0,withDraw:0},f=null,m=null;function p(g){d.frames+=1,Hr(r,g.badge),Hr(o,g.reason),Hr(a,g.gate),Hr(s,g.hold),Hr(u,g.track);for(let x of g.skips||[])Hr(i,x);g.anchor&&(Ou(c,g.anchor.x),Ou(l,g.anchor.y)),Number(g.anchored)>0&&(d.withAnchor+=1),Number(g.drawn)>0&&(d.withDraw+=1),d.sign=Math.max(d.sign,Number(g.sign)||0),d.anchored=Math.max(d.anchored,Number(g.anchored)||0),d.drawn=Math.max(d.drawn,Number(g.drawn)||0),f=g.fixed||f,m=g}function b(){let g=t()-n,x=[`AR 진단 요약 ${fs(g)} 동안 ${d.frames}프레임`,`현재 ${m?`${m.badge} ${m.sign}·${m.anchored}·${m.drawn} ${m.track} ${m.hold}`:"—"}`,`도달 앵커생성 ${d.withAnchor}프레임 / 렌더 ${d.withDraw}프레임 / 최대 ${d.sign}·${d.anchored}·${d.drawn}`,`앵커 x ${Cu(c,"m")} · y ${Cu(l,"m")}`];f&&x.push(`환경 ${f}`);let E=[["상태",r],["track",u],["hold",s],["gate",a],["렌더 스킵",i],["차단 사유",o]];for(let[y,O]of E)O.size&&(x.push(`─ ${y} (${O.size}종)`),x.push(...Mg(O)));return x.join(` +`)}return Object.freeze({observe:p,report:b,get frames(){return d.frames},reset(){r.clear(),o.clear(),i.clear(),a.clear(),s.clear(),u.clear(),c.min=c.max=l.min=l.max=null,d.frames=d.withAnchor=d.withDraw=0,d.sign=d.anchored=d.drawn=0,m=null}})}function J(e,t=null){let n=Number(e);return Number.isFinite(n)?n:t}function re(e,t=3){let n=J(e);if(n===null)return null;let r=10**t;return Math.round(n*r)/r}function _o(e){return Array.isArray(e)?e.map(String).filter(Boolean):[]}function xi(e){return e?{x:re(e.x),y:re(e.y),z:re(e.z),markerId:e.markerId?String(e.markerId):void 0,lifecycleSlot:e.lifecycleSlot?String(e.lifecycleSlot):void 0,headingRad:re(e.headingRad,5),billboardYawRad:re(e.billboardYawRad,5),source:e.source?String(e.source):void 0,roadGrade:re(e.roadGrade,5),heightSource:e.heightSource?String(e.heightSource):void 0,heightConfidence:re(e.heightConfidence,3),heightLimited:e.heightLimited===!0,routeDerived:e.routeDerived===!0}:null}function Ag(e){return{markerId:String(e?.markerId||""),lifecycleSlot:String(e?.lifecycleSlot||""),source:String(e?.source||"unknown"),kind:String(e?.kind||""),distanceM:re(e?.distanceM,2),visible:e?.visible===!0,visibilityState:String(e?.visibilityState||""),reason:String(e?.reason||""),phase:String(e?.phase||""),confidence:String(e?.confidence||""),alpha:re(e?.alpha,4),worldScale:re(e?.worldScale,4),anchor:xi(e?.anchor),screen:e?.screen?{centerX:re(e.screen.centerX,2),centerY:re(e.screen.centerY,2),widthPx:re(e.screen.widthPx,2),heightPx:re(e.screen.heightPx,2),depth:re(e.screen.depth,4)}:null}}function Rg(e){return e?{state:String(e.state||""),reason:e.reason?String(e.reason):void 0,progress:re(e.progress,4),durationMs:re(e.durationMs,1),positionInnovationM:re(e.positionInnovationM),orientationInnovationRad:re(e.orientationInnovationRad,5),lateralInnovationM:re(e.lateralInnovationM),heightInnovationM:re(e.heightInnovationM)}:null}function Iu(e={},t={}){let n=e.debugFrame||{},r=n.presentedClock||{},o=n.sync||{},i=e.tracking||{},a=e.hold||{},s=e.composition||{},u=e.renderer||{},c=e.worldPose||{},l=J(n.replayTimeMs,J(t.currentTime,0)*1e3);return{mediaTimeMs:re(l,1),traceFrameId:J(e.traceFrameId),ok:e.ok===!0,presented:{sequence:J(n.presented?.sequence),sourceFrameId:J(r.sourceFrameId??n.presented?.frameId),confidence:String(r.confidence||"unmapped"),mapped:r.mapped===!0,targetTimestampNs:r.targetTimestampNs===null||r.targetTimestampNs===void 0?null:J(r.targetTimestampNs)},sources:{cameraFrameId:J(n.sources?.cameraFrameId),modelFrameId:J(n.sources?.modelFrameId),odometryFrameId:J(n.sources?.odometryFrameId),livePoseTimestamp:J(n.sources?.livePoseTimestamp)},sync:{state:String(o.state||""),precise:o.canDrawPrecise===!0,hold:o.canHoldAnchor===!0,frameIdGap:J(o.frameIdGap),modelAgeMs:re(o.modelAgeMs,1),odometryAgeMs:re(o.odometryAgeMs,1),poseAgeMs:re(o.poseAgeMs,1),naviAgeMs:re(o.naviAgeMs,1),naviUsable:o.naviUsable===!0,reasons:_o(o.reasons)},navi:n.navi||null,positionQuality:n.positionQuality||null,tracking:{state:String(i.state||""),canCreateAnchor:i.canCreateAnchor===!0,canPropagateAnchor:i.canPropagateAnchor===!0,retainAnchor:i.retainAnchor===!0,alpha:re(i.alpha,4),predictionAgeMs:re(i.predictionAgeMs,1),lateralUncertaintyM:re(i.uncertainty?.lateralM),budgetM:re(i.uncertainty?.budgetM),reasons:_o(i.reasons)},composition:{signs:J(s.signCount,0),anchors:J(s.anchoredCount,0),sources:_o(s.sources),gate:s.diag||null},hold:{state:String(a.state||""),sourceMode:a.sourceMode?String(a.sourceMode):null,anchorCount:J(a.anchorCount,0),unresolvedCount:J(a.unresolvedCount,0),creationDeferredCount:J(a.creationDeferredCount,0),creationGateReason:a.creationGateReason?String(a.creationGateReason):null,handoffCount:J(a.handoffCount,0),fixId:a.fixId?String(a.fixId):null,sourceId:a.sourceId?String(a.sourceId):null,worldEpoch:a.worldEpoch?String(a.worldEpoch):null,holdMs:re(a.holdMs,1),driftM:re(a.driftM),reason:String(a.reason||""),sample:xi(a.sample),handoff:Rg(a.handoff)},worldPose:{initialized:c.initialized===!0,epoch:String(c.epoch||n.worldEpoch||""),integrations:J(c.integrations,0),position:Array.isArray(c.position)?c.position.slice(0,3).map(d=>re(d,4)):null,orientation:Array.isArray(c.orientation)?c.orientation.slice(0,4).map(d=>re(d,6)):null,reason:String(c.reason||""),dtMs:re(c.dtMs,2),geoCorrection:c.geoCorrection?{referenceReady:c.geoCorrection.referenceReady===!0,accepted:J(c.geoCorrection.accepted,0),rejected:J(c.geoCorrection.rejected,0),yawAccepted:J(c.geoCorrection.yawAccepted,0),yawRejected:J(c.geoCorrection.yawRejected,0),appliedFrames:J(c.geoCorrection.appliedFrames,0),positionInnovationM:re(c.geoCorrection.lastPositionInnovationM),yawInnovationRad:re(c.geoCorrection.lastYawInnovationRad,5),positionSigmaM:re(c.geoCorrection.lastPositionSigmaM),headingSigmaDeg:re(c.geoCorrection.lastHeadingSigmaDeg),reason:String(c.geoCorrection.lastReason||"")}:null},renderer:{drawn:J(u.drawn,0),skipped:J(u.skipped,0),selectionSuppressed:J(u.selectionSuppressed,0),trackingAlpha:re(u.trackingAlpha,4),minimumVisibilityAlpha:re(u.minimumVisibilityAlpha,4),reason:String(u.lastReason||""),visibilityStates:u.visibilityStates&&typeof u.visibilityStates=="object"?{...u.visibilityStates}:{},markers:Array.isArray(u.markers)?u.markers.map(Ag):[]},performance:e.performance?{fps:re(e.performance.fps,1),averageWorkMs:re(e.performance.averageWorkMs,3),lastWorkMs:re(e.performance.lastWorkMs,3),slowFrames:J(e.performance.slowFrames,0),level:String(e.performance.level||"")}:null,transport:e.transport?{dpr:re(e.transport.dpr,2),queue:e.transport.queue?{posted:J(e.transport.queue.posted,0),completed:J(e.transport.queue.completed,0),deferred:J(e.transport.queue.deferred,0),replaced:J(e.transport.queue.replaced,0),discarded:J(e.transport.queue.discarded,0),inFlight:e.transport.queue.inFlight===!0,pending:e.transport.queue.pending===!0,maxPending:J(e.transport.queue.maxPending,1)}:null,sourceTransfers:e.transport.sourceTransfers?{navi:J(e.transport.sourceTransfers.navi,0),modelPosition:J(e.transport.sourceTransfers.modelPosition,0),reusedNavi:J(e.transport.sourceTransfers.reusedNavi,0),reusedModelPosition:J(e.transport.sourceTransfers.reusedModelPosition,0)}:null}:null}}function Fn(e,t){let n=String(t||"unknown");e[n]=(e[n]||0)+1}function en(e,t,n,r={}){e.length>=1200||e.push({type:t,mediaTimeMs:n.mediaTimeMs,traceFrameId:n.traceFrameId,...r})}function hs(e,t,n,r){let o=J(e.lastEventAt?.get(t),Number.NEGATIVE_INFINITY);return n-o0&&n!==null&&n>0&&Math.abs(t-n)>5e9}function xg(e,t){let n=e.frames.at(-1)||null;if(!t.presented.mapped&&hs(e,"clock-unmapped",t.mediaTimeMs,500)&&en(e.events,"clock-unmapped",t),(t.sync.frameIdGap??0)>8&&en(e.events,"frame-gap",t,{gap:t.sync.frameIdGap}),t.hold.sample&&Math.abs(t.hold.sample.y??0)>8&&hs(e,"anchor-lateral-outlier",t.mediaTimeMs,500)&&en(e.events,"anchor-lateral-outlier",t,{x:t.hold.sample.x,y:t.hold.sample.y,fixId:t.hold.fixId}),t.hold.anchorCount>0&&t.renderer.drawn===0&&hs(e,"anchor-not-rendered",t.mediaTimeMs,500)&&en(e.events,"anchor-not-rendered",t,{reason:t.renderer.reason,visibilityStates:t.renderer.visibilityStates,markers:t.renderer.markers.map(u=>({markerId:u.markerId,state:u.visibilityState,reason:u.reason}))}),!n)return;if(n.hold.sample?.markerId&&n.hold.sample.markerId===t.hold.sample?.markerId){let u=Math.hypot(J(t.hold.sample.x,0)-J(n.hold.sample.x,0),J(t.hold.sample.y,0)-J(n.hold.sample.y,0));u>=8&&en(e.events,"anchor-position-jump",t,{meters:re(u,1),from:xi(n.hold.sample),to:xi(t.hold.sample),fromFixId:n.hold.fixId,toFixId:t.hold.fixId})}n.tracking.state!==t.tracking.state&&en(e.events,"tracking-transition",t,{from:n.tracking.state,to:t.tracking.state}),n.renderer.drawn>0!=t.renderer.drawn>0&&en(e.events,t.renderer.drawn>0?"marker-visible":"marker-hidden",t),n.hold.state!==t.hold.state&&en(e.events,"hold-transition",t,{from:n.hold.state,to:t.hold.state,reason:t.hold.reason});let r=n.composition.gate?.matchIdx??null,o=t.composition.gate?.matchIdx??null;r!==o&&en(e.events,"route-match-changed",t,{from:r,to:o}),n.worldPose.integrations>t.worldPose.integrations&&en(e.events,"world-pose-reset",t,{from:n.worldPose.integrations,to:t.worldPose.integrations});let i=n.navi||{},a=t.navi||{},s=u=>[u.present,u.guidanceActive,u.routePresent,u.vehicle?.present,u.route?.pointCount].join(":");s(i)!==s(a)&&en(e.events,"navi-snapshot-changed",t,{from:s(i),to:s(a)}),Io(n)!==Io(t)&&en(e.events,"navi-clock-domain-transition",t,{from:Io(n)?"mismatch":"aligned",to:Io(t)?"mismatch":"aligned",naviPublishMonoTimeNanos:J(t.navi?.publishMonoTimeNanos),presentedTargetTimestampNs:J(t.presented?.targetTimestampNs)})}function Eg(e){let t=null;try{t=e.CarrotDriveLiveStateProvider?.snapshot?.()?.overlayState?.carrotNavi}catch{}let n=Array.isArray(t?.route?.polyline)?t.route.polyline:[];if(n.length<2)return null;let r=n.map(a=>({latitude:re(a?.latitude,7),longitude:re(a?.longitude,7)})),o=r[Math.floor(r.length/2)];return{signature:[String(t?.sessionId||"legacy"),r.length,r[0]?.latitude,r[0]?.longitude,o?.latitude,o?.longitude,r.at(-1)?.latitude,r.at(-1)?.longitude].join(":"),points:r}}function Tg(e){let t=new Map,n=350,r=2e3;for(let s=0;s=3&&(u=!0)}u&&a.push(s.markerId)}return Object.freeze({markerCount:t.size,transitions:o,maxRapidTransitions:i,blinkingIds:Object.freeze(a.sort())})}function wu(e){let t=e.frames,n=J(t[0]?.mediaTimeMs),r=J(t.at(-1)?.mediaTimeMs),o=e.durationSeconds*1e3,i=n!==null&&r!==null?Math.max(0,r-n):0,a={frames:t.length,events:e.events.length,tracking:{},hold:{},clock:{},visibility:{},markerStates:{},eventTypes:{},anchorRange:{x:[null,null],y:[null,null]},coverage:{requestedStartMs:0,requestedEndMs:re(o,1),firstMediaTimeMs:re(n,1),lastMediaTimeMs:re(r,1),capturedSpanMs:re(i,1),missingTailMs:re(Math.max(0,o-(r??0)),1),ratio:re(o>0?Math.min(1,(r??0)/o):0,4),complete:n!==null&&n<=250&&r>=o-250,effectiveFps:re(i>0?(t.length-1)*1e3/i:0,2)},transitions:{tracking:0,hold:0,visibility:0,naviUsable:0},navi:{usableFrames:0,unusableFrames:0,clockMismatchFrames:0},worldPose:{integratedFrames:0,maxIntegrations:0,geoAccepted:0,geoRejected:0,geoAppliedFrames:0,yawAccepted:0,yawRejected:0,anchorCreationDeferredFrames:0,anchorCreationGateReasons:{}},markerContinuity:null,transport:{maxDpr:0,queue:{deferred:0,replaced:0,discarded:0,maxPending:0},sourceTransfers:{navi:0,modelPosition:0,reusedNavi:0,reusedModelPosition:0}},reasons:{sync:{},tracking:{},hold:{}},flags:[]},s=(l,d)=>{let f=J(d);f!==null&&(l[0]=l[0]===null?f:Math.min(l[0],f),l[1]=l[1]===null?f:Math.max(l[1],f))},u={tracking:null,hold:null,visibility:null,naviUsable:null};for(let l of t){Fn(a.tracking,l.tracking.state),Fn(a.hold,l.hold.state),Fn(a.clock,l.presented.confidence);let d=l.renderer.drawn>0?"visible":"hidden",f=l.sync.naviUsable===!0;Fn(a.visibility,d);for(let[p,b]of Object.entries(l.renderer.visibilityStates||{}))a.markerStates[p]=(a.markerStates[p]||0)+Number(b||0);a.navi[f?"usableFrames":"unusableFrames"]+=1,Io(l)&&(a.navi.clockMismatchFrames+=1);let m=J(l.worldPose?.integrations,0);m>0&&(a.worldPose.integratedFrames+=1),a.worldPose.maxIntegrations=Math.max(a.worldPose.maxIntegrations,m),a.worldPose.geoAccepted=Math.max(a.worldPose.geoAccepted,J(l.worldPose?.geoCorrection?.accepted,0)),a.worldPose.geoRejected=Math.max(a.worldPose.geoRejected,J(l.worldPose?.geoCorrection?.rejected,0)),a.worldPose.geoAppliedFrames=Math.max(a.worldPose.geoAppliedFrames,J(l.worldPose?.geoCorrection?.appliedFrames,0)),a.worldPose.yawAccepted=Math.max(a.worldPose.yawAccepted,J(l.worldPose?.geoCorrection?.yawAccepted,0)),a.worldPose.yawRejected=Math.max(a.worldPose.yawRejected,J(l.worldPose?.geoCorrection?.yawRejected,0)),J(l.hold?.creationDeferredCount,0)>0&&(a.worldPose.anchorCreationDeferredFrames+=1,Fn(a.worldPose.anchorCreationGateReasons,l.hold.creationGateReason)),a.transport.maxDpr=Math.max(a.transport.maxDpr,J(l.transport?.dpr,0));for(let p of["deferred","replaced","discarded","maxPending"])a.transport.queue[p]=Math.max(a.transport.queue[p],J(l.transport?.queue?.[p],0));for(let p of["navi","modelPosition","reusedNavi","reusedModelPosition"])a.transport.sourceTransfers[p]=Math.max(a.transport.sourceTransfers[p],J(l.transport?.sourceTransfers?.[p],0));for(let p of _o(l.sync?.reasons))Fn(a.reasons.sync,p);for(let p of _o(l.tracking?.reasons))Fn(a.reasons.tracking,p);l.hold?.reason&&Fn(a.reasons.hold,l.hold.reason);for(let[p,b]of Object.entries({tracking:l.tracking.state,hold:l.hold.state,visibility:d,naviUsable:f}))u[p]!==null&&u[p]!==b&&(a.transitions[p]+=1),u[p]=b;s(a.anchorRange.x,l.hold.sample?.x),s(a.anchorRange.y,l.hold.sample?.y)}for(let l of e.events)Fn(a.eventTypes,l.type);a.anchorRange.x=a.anchorRange.x.map(l=>re(l)),a.anchorRange.y=a.anchorRange.y.map(l=>re(l));let c=(l,d=8)=>Object.fromEntries(Object.entries(l).sort((f,m)=>m[1]-f[1]).slice(0,d));return a.reasons.sync=c(a.reasons.sync),a.reasons.tracking=c(a.reasons.tracking),a.reasons.hold=c(a.reasons.hold),a.worldPose.anchorCreationGateReasons=c(a.worldPose.anchorCreationGateReasons),a.markerContinuity=Tg(t),a.coverage.complete||a.flags.push("capture-incomplete"),a.navi.clockMismatchFrames>0&&a.flags.push("mixed-clock-domain"),a.transitions.naviUsable>4&&a.flags.push("navi-flapping"),a.markerContinuity.blinkingIds.length>0&&a.flags.push("marker-blinking"),a.worldPose.integratedFrames===0&&a.flags.push("world-pose-not-integrated"),(a.tracking.lost||0)>t.length*.2&&a.flags.push("tracking-mostly-lost"),a}function Ri(e){let t=J(e);return t===null?"—":`${(t/1e3).toFixed(2)}초`}function wo(e,t,n=5){let r=Object.entries(t||{}).sort((o,i)=>i[1]-o[1]).slice(0,n);return r.length?[`${e}:`,...r.map(([o,i])=>`- ${o} ×${i}`)]:[]}function Og(e={}){let t=e.summary||{},n=t.coverage||{},o=["AR 리플레이 진단 요약",`구간: ${(e.replay||{}).segment||"—"}`,`판정: ${n.complete?"수집 완료":"수집 불완전"} · 종료 ${e.stopReason||"—"}`,`범위: ${Ri(n.firstMediaTimeMs)} ~ ${Ri(n.lastMediaTimeMs)} / 요청 ${Ri(n.requestedEndMs)}`,`프레임: ${t.frames||0} · 실효 ${J(n.effectiveFps,0).toFixed(2)}fps · 이벤트 ${t.events||0}`,`상태전환: Navi ${t.transitions?.naviUsable||0} · 표시 ${t.transitions?.visibility||0} · tracking ${t.transitions?.tracking||0} · hold ${t.transitions?.hold||0}`,`Navi: 유효 ${t.navi?.usableFrames||0} · 무효 ${t.navi?.unusableFrames||0} · 시계불일치 ${t.navi?.clockMismatchFrames||0}`,`worldPose: 적분 프레임 ${t.worldPose?.integratedFrames||0} · 최대 ${t.worldPose?.maxIntegrations||0}`,`새 앵커 보류: ${t.worldPose?.anchorCreationDeferredFrames||0}프레임`,`Worker: DPR 최대 ${J(t.transport?.maxDpr,0).toFixed(2)} · 대기 ${t.transport?.queue?.deferred||0} · 교체 ${t.transport?.queue?.replaced||0} · 폐기 ${t.transport?.queue?.discarded||0}`,`앵커: x ${t.anchorRange?.x?.join(" ~ ")||"—"}m · y ${t.anchorRange?.y?.join(" ~ ")||"—"}m`,`플래그: ${t.flags?.length?t.flags.join(", "):"없음"}`,...wo("마커 상태",t.markerStates,10),...wo("주요 tracking 차단",t.reasons?.tracking),...wo("주요 sync 차단",t.reasons?.sync),...wo("새 앵커 보류 사유",t.worldPose?.anchorCreationGateReasons),...wo("이벤트",t.eventTypes,10)],i=[],a=new Map;for(let s of Array.isArray(e.events)?e.events:[]){let u=a.get(s.type)||0;u>=2||i.length>=18||(a.set(s.type,u+1),i.push(`- ${Ri(s.mediaTimeMs)} ${s.type}`))}return i.length&&o.push("대표 이상 시각:",...i),o.join(` +`)}function Cg(e){return String(e||"replay").replace(/[^a-zA-Z0-9._-]+/g,"_").slice(0,96)}function wg(e,t,n){let r=e.Blob||globalThis.Blob,o=e.URL||globalThis.URL,i=e.document;if(!r||!o?.createObjectURL||!i?.createElement)return!1;let a=new r([JSON.stringify(n,null,2)],{type:"application/json"}),s=o.createObjectURL(a),u=i.createElement("a");return u.href=s,u.download=t,u.hidden=!0,(i.body||i.documentElement)?.appendChild?.(u),u.click?.(),u.remove?.(),e.setTimeout?.(()=>o.revokeObjectURL?.(s),1e3),!0}function gs(e={}){let t=e.target||globalThis,n=e.setInterval||t.setInterval?.bind(t),r=e.clearInterval||t.clearInterval?.bind(t),o=e.download||((M,R)=>wg(t,M,R)),i=e.now||(()=>t.performance?.now?.()??Date.now()),a=new Set,s="idle",u=0,c="",l=null,d=null,f=null,m=null,p=0;function b(){return Object.freeze({phase:s,running:s==="preparing"||s==="running"||s==="saving",progress:u,error:c||null,frames:l?.frames.length||0,durationSeconds:l?.durationSeconds||60,lastResult:m})}function g(){let M=b();for(let R of[...a])R(M)}function x(M,R=""){s=M,c=String(R||""),g()}function E(){d?.(),d=null,f!==null&&r?.(f),f=null}async function y(M="complete",R=!0){if(!l||l.finishing)return m;l.finishing=!0,x("saving"),E();let v=l,h=v.control;h.pause?.();let S=new Date().toISOString(),A=wu(v),L=M==="complete"&&!A.coverage.complete?"incomplete-render-tail":M,P={schemaVersion:3,kind:"carrot-ar-replay-diagnostic",createdAt:v.createdAt,endedAt:S,stopReason:L,replay:{route:v.initial.route,segment:v.initial.segment,duration:v.initial.duration,requestedStart:0,requestedEnd:v.durationSeconds,captureStart:J(A.coverage.firstMediaTimeMs,0)/1e3,captureEnd:J(A.coverage.lastMediaTimeMs,0)/1e3,playbackRate:1},environment:{userAgent:String(t.navigator?.userAgent||""),devicePixelRatio:J(t.devicePixelRatio,1),viewport:{width:J(t.innerWidth),height:J(t.innerHeight)}},summary:A,routeGeometries:[...v.routeGeometries.values()],events:v.events,frames:v.frames},_=Og(P),T={...P,report:_},I=`carrot-ar-${Cg(v.initial.segment)}-${S.replace(/[:.]/g,"-")}.json`,k=!1;return R&&(k=o(I,T)!==!1),await h.restore?.(v.initial),m=Object.freeze({filename:I,downloaded:k,frames:v.frames.length,reason:L,complete:A.coverage.complete,summary:A,report:_}),l=null,u=A.coverage.ratio,x(A.coverage.complete?"complete":"warning"),m}function O(M){if(!l||l.finishing||!M?.debugFrame)return;let R=t.CarrotVisionReplay?.status?.()||{},v=Iu(M,R),h=J(v.mediaTimeMs);if(h===null)return;if(!l.armed){if(h>1500)return;l.armed=!0}if(h<-1||h>l.durationSeconds*1e3+250)return;if(l.frames.length>=3600){y("frame-limit").catch(()=>{});return}xg(l,v),l.frames.push(v);let S=[v.navi?.sessionId||"",v.navi?.route?.pointCount||0,v.navi?.publishMonoTimeNanos||0].join(":");if(S!==l.lastRouteProbeKey){l.lastRouteProbeKey=S;let A=Eg(t);A&&!l.routeGeometries.has(A.signature)&&l.routeGeometries.set(A.signature,A)}u=Math.max(u,Math.min(1,h/(l.durationSeconds*1e3))),g(),h>=l.durationSeconds*1e3-20&&y("complete").catch(()=>{})}async function C(M={}){if(b().running)return!1;p+=1;let R=p;c="",u=0;let h=t.CarrotVisionReplay?.diagnosticPlayback,S=t.CarrotVisionAr,A=h?.snapshot?.();if(!A?.active||!A?.ready||A.loading)return x("error","준비된 리플레이가 없습니다"),!1;if(typeof S?.subscribeDiagnostics!="function")return x("error","AR 프레임 진단 채널이 없습니다"),!1;let L=Math.max(1,J(M.durationSeconds,60)),P=Math.min(L,Math.max(.1,J(A.duration,L)));if(l={token:R,control:h,initial:A,durationSeconds:P,createdAt:new Date().toISOString(),frames:[],events:[],routeGeometries:new Map,lastRouteProbeKey:"",armed:!1,finishing:!1,playbackEndedAtMs:null,lastEventAt:new Map},x("preparing"),d=S.subscribeDiagnostics(O),h.pause?.(),h.setRate?.(1),h.seek?.(0)!==!0)return E(),l=null,x("error","리플레이 0초 이동에 실패했습니다"),!1;f=n?.(()=>{if(!l||l.token!==R||l.finishing)return;let _=h.snapshot?.()||{};u=Math.max(u,Math.min(1,J(_.currentTime,0)/P)),g(),_.active?(_.ended||J(_.currentTime,0)>=P)&&(l.playbackEndedAtMs===null&&(l.playbackEndedAtMs=i(),h.pause?.()),wu(l).coverage.complete?y("complete").catch(()=>{}):i()-l.playbackEndedAtMs>=2500&&y("incomplete-render-tail").catch(()=>{})):y("replay-closed").catch(()=>{})},100)??null;try{return await h.play?.(),!l||l.token!==R?!1:(x("running"),!0)}catch(_){return E(),await h.restore?.(A),l=null,x("error",_?.message||"리플레이 재생에 실패했습니다"),!1}}async function w(){return b().running?(await y("user-stopped"),!0):!1}async function z(){p+=1,l&&await y("debug-panel-closed",!1),E(),a.clear()}return Object.freeze({start:C,stop:w,snapshot:b,subscribe(M){if(typeof M!="function")throw new TypeError("capture listener must be a function");return a.add(M),M(b()),()=>a.delete(M)},destroy:z})}var Ig=Object.freeze([Object.freeze({id:"copy",label:"복사",payload:e=>e.report()}),Object.freeze({id:"json",label:"JSON",payload:e=>e.json()})]);function Mt(e,t,n,r){let o=e.createElement(t);return n&&(o.className=n),r!==void 0&&(o.textContent=r),o}function _g(e,t,n,r){let o=e?.worker?.renderer||e?.renderer||null,i=Vr();return{badge:n.label,reason:r,gate:vi(e?.composition?.diag),hold:`hold:${e?.hold?.state||"—"}`,track:`trk:${e?.tracking?.state||"—"}[${e?.tracking?.canCreateAnchor?"C":"-"}${e?.tracking?.canPropagateAnchor?"P":"-"}]`,skips:Array.isArray(o?.skips)?o.skips:[],anchor:e?.hold?.sample||null,sign:Le(e?.composition?.signCount,0),anchored:Le(e?.composition?.anchoredCount,0),drawn:dr(e),fixed:`surface ${Co(i)} · canvas ${Si(e)} · ${Mi(e,t)} · worker ${e?.worker?.ready?"ok":"대기"}`}}function bs(e={}){let t=e.target||globalThis,n=e.document||t?.document,r=e.mountRoot;if(!n?.createElement||!r?.appendChild)return null;let o=e.sections||ps,i=e.aggregate||ms({now:()=>t.performance?.now?.()??Date.now()}),a=e.capture||gs({target:t}),s=Mt(n,"div","ar-debug");s.id="carrotArDebugPanel";let u=Mt(n,"div","ar-debug__head"),c=Mt(n,"span","ar-debug__badge"),l=Mt(n,"span","ar-debug__badgeDot"),d=Mt(n,"span",null,"AR");c.append(l,d),u.append(c);let f=Mt(n,"button","ar-debug__action ar-debug__action--capture","60초 진단");f.type="button",f.disabled=!0,f.title="리플레이 0~60초 AR 상태를 자동 수집해 JSON 파일로 저장",f.addEventListener("click",()=>{let h=a.snapshot().running?a.stop():a.start();Promise.resolve(h).catch(S=>t.console?.error?.("[carrot AR debug] capture failed",S))}),u.append(f);let m=Mt(n,"button","ar-debug__action","진단요약");m.type="button",m.disabled=!0,m.title="마지막 60초 진단의 핵심 원인과 대표 시각만 복사",m.addEventListener("click",()=>{let v=a.snapshot().lastResult?.report||"";v&&Ai(t,v).then(h=>{h||t.console?.log?.(v),m.textContent=h?"복사됨":"콘솔출력",t.setTimeout?.(()=>{m.textContent="진단요약"},1200)})}),u.append(m);let p={report:()=>i.report(),json:()=>M()};for(let v of Ig){let h=Mt(n,"button","ar-debug__action",v.label);h.type="button",h.addEventListener("click",()=>{let S=v.payload(p);Ai(t,S).then(A=>{A||t.console?.log?.(S),h.textContent=A?"복사됨":"콘솔출력",t.setTimeout?.(()=>{h.textContent=v.label},1200)})}),u.append(h)}let b=new Map,g=Mt(n,"div","ar-debug__body");for(let v of o){g.append(Mt(n,"div","ar-debug__sectionLabel",v.label));for(let h of v.fields){let S=Mt(n,"div",`ar-debug__row${h.wide?" ar-debug__row--wide":""}`);S.append(Mt(n,"span","ar-debug__key",h.label));let A=Mt(n,"span","ar-debug__value");S.append(A),g.append(S),b.set(h.id,{node:A,field:h})}}let x=Mt(n,"div","ar-debug__reason"),E=Mt(n,"div","ar-debug__foot");E.append(Mt(n,"span",null,"수집중"));let y=Mt(n,"span","ar-debug__footCount","0");E.append(y),s.append(u,g,x,E),r.appendChild(s);let O=null,C=null,w=!1,z=a.subscribe(v=>{let h=Math.round((v.progress||0)*(v.durationSeconds||60));f.dataset.captureState=v.phase,f.disabled=!v.running&&!w,m.disabled=!v.lastResult?.report,v.running?f.textContent=`중지 ${h}/${Math.round(v.durationSeconds)}초`:v.phase==="complete"?f.textContent="다시 진단":v.phase==="warning"?f.textContent="불완전·재시도":v.phase==="error"?f.textContent="진단 재시도":f.textContent="60초 진단",v.error&&(f.title=v.error)});function M(){return JSON.stringify({report:i.report(),status:O,diagnose:C},null,2)}function R(v,h){if(O=v||null,C=h||null,w=h?.replay?.active===!0&&h?.replay?.ready===!0,f.disabled=!a.snapshot().running&&!w,s.hidden)return;let S=ds(v);c.className=`ar-debug__badge ar-debug__value--${S.tone}`,d.textContent=S.label;for(let{node:L,field:P}of b.values()){let _=P.value(v,h);L.textContent=_,L.title=_;let T=P.tone?.(v,h);L.className=`ar-debug__value${T?` ar-debug__value--${T}`:""}`}let A=mu(v,h);x.textContent=A||"",x.hidden=!A,i.observe(_g(v,h,S,A)),y.textContent=`${i.frames}프레임`}return Object.freeze({element:s,update:R,setVisible(v){return s.hidden=v===!1,!s.hidden},report:()=>i.report(),logText:()=>i.report(),json:M,snapshot:()=>({status:O,diagnose:C}),captureStart:v=>a.start(v),captureStop:()=>a.stop(),captureStatus:()=>a.snapshot(),destroy(){z?.(),a.destroy().catch?.(()=>{}),s.remove?.()}})}var Br="vision_ar_debug",Ng=250;function Dg(e=globalThis){if(!(typeof e?.isWebSettingUnlocked=="function"?e.isWebSettingUnlocked(Br):Qo(Br,e)))return!1;if(typeof e?.getWebSettingByKey=="function")return!!e.getWebSettingByKey(Br,!1);let n=e?.CarrotWebSettingsState||{};return Object.prototype.hasOwnProperty.call(n,Br)?!!n[Br]:!!e?.__CARROT_BOOTSTRAP__?.webSettings?.[Br]}function _u(e={}){let t=e.target||globalThis,n=e.document||t?.document||null,r=e.mountRoot||null,o=Number(e.pollMs)>0?Number(e.pollMs):Ng,i=typeof e.isEnabled=="function"?e.isEnabled:()=>Dg(t),a=typeof e.readRuntime=="function"?e.readRuntime:()=>t.CarrotVisionAr,s=null,u=null,c=!1;function l(){if(!s)return;let m=a(),p=null,b=null;try{p=m?.status?.()||null}catch{}try{b=m?.diagnose?.()||null}catch{}s.update(p,b)}function d(){u!==null&&(t.clearInterval?.(u),u=null),s?.destroy(),s=null}function f(){if(!(c&&i()))return s&&d(),!1;if(!s){if(s=bs({target:t,document:n,mountRoot:r}),!s)return!1;l()}return u===null&&(u=t.setInterval?.(()=>{f(),l()},o)??null),!0}return Object.freeze({activate(){return c=!0,f()},deactivate(){return c=!1,d(),!1},refresh:f,isVisible:()=>!!s,logText:()=>s?.logText()||"",json:()=>s?.json()||"",snapshot:()=>s?.snapshot()||null,captureStart:m=>s?.captureStart(m)||Promise.resolve(!1),captureStop:()=>s?.captureStop()||Promise.resolve(!1),captureStatus:()=>s?.captureStatus()||null,destroy(){c=!1,d()}})}var Gr="vision",Pg="carrotStage";var No=null,Ei=null,Lg=new WeakMap,kg=null;function Fg(e){return e.target||globalThis}function zg(e,t){return t.documentRoot||e?.document||null}function jg(e,t){return t.compatibilityRoot?t.compatibilityRoot:zg(e,t)?.getElementById?.(Pg)||null}function Vg(e,t,n){return t.hostRoot||t.host?.root||t.context?.hostRoot||n||null}function Hg(e={}){let t=Fg(e),n=jg(t,e),r=Vg(t,e,n),o=e.driveContentApi||t?.DriveContent,i=e.runtime||t?.CarrotVisionContentRuntime,a=e.renderer||Xo()||t?.DriveVisionFacade,s=e.hud||ao(t)||t?.DriveVisionHudContent;if(!r||typeof o?.create!="function"||typeof i?.setActive!="function"||typeof a?.lifecycle?.resize!="function"||typeof s?.activate!="function")return null;let u=(()=>{try{return new URLSearchParams(t?.location?.search||"").get("ar_bypass_world")==="1"?!0:t?.localStorage?.getItem?.("ar_bypass_world")==="1"}catch{return!1}})();typeof t.__carrotArBypassWorld!="boolean"&&(t.__carrotArBypassWorld=u),typeof t.carrotArBypassWorld!="function"&&(t.carrotArBypassWorld=g=>{if(g===void 0)return t.__carrotArBypassWorld===!0;t.__carrotArBypassWorld=g===!0;try{t.localStorage?.setItem?.("ar_bypass_world",g===!0?"1":"0")}catch{}return t.__carrotArBypassWorld});let c=()=>t.__carrotArBypassWorld===!0,l=oa({target:t,createRuntime:()=>cs(t,{document:t?.document,host:n,diagnosticProbe:!1,bypassWorldAnchor:c,probeDistanceM:40})}),d=_u({target:t,document:t?.document,mountRoot:n||r});(typeof t.CarrotArLog!="object"||t.CarrotArLog===null)&&(t.CarrotArLog=Object.freeze({text:()=>d.logText(),json:()=>d.json(),snapshot:()=>d.snapshot(),capture:g=>d.captureStart(g),stopCapture:()=>d.captureStop(),captureStatus:()=>d.captureStatus()}));let f=null,m=Object.freeze({slot:String(e.context?.slot||e.slot||"primary"),source:String(e.context?.source||"live"),compatibilityRoot:n});function p(g={}){return m=Object.freeze({slot:String(g.slot||g.host?.slot||m.slot),source:String(g.source||g.host?.source||m.source),compatibilityRoot:n}),m}let b=o.create(Gr,{mount(g){if(!g||typeof g!="object")throw new TypeError("Vision content requires a host root");if(n&&g!==n&&n.parentElement!==g){if(typeof g.appendChild!="function")throw new TypeError("Vision content host must support appendChild");g.appendChild(n)}f=g},activate(g={}){let x=p(g);s.activate({...g,host:x,renderRoot:n});let E=i.setActive(!0,g);return a.lifecycle.resize(),l.activateVision(),d.activate(),E},deactivate(g={}){return d.deactivate(),l.deactivateVision(),s.deactivate(g),i.setActive(!1,g)},resize(g){return i.isActive?.()?(a.lifecycle.resize(),s.resize(),l.resize(),!0):!1},status(){let g=t?.CarrotVisionState||{};return{runtime:i.status?.()||{},userActive:!!g.active,available:!!g.available,controlState:String(g.controlState||""),replayActive:!!t?.CarrotVisionReplay?.isActive?.(),hud:s.status(),renderer:a.status(),ar:l.status()}},destroy(){Ei?.content===b&&(Ei.workspace.unregisterContent(Ei.slot,b),Ei=null),d.destroy(),l.destroy(),s.destroy(),i.setActive(!1,{keepWarm:!1,reason:"content destroyed"}),f=null}});return Lg.set(b,{hostContext:()=>m,renderRoot:n,mountedHostRoot:()=>f}),b}function ys(e={}){if(!No){if(No=Hg(e),!No)return null;kg=No}return No}function Nu(e=globalThis,t={}){let n=t.content||ys({...t,target:e});return n?(e.DriveContentVision=n,n):null}var Bg=Object.freeze(["primary","secondary"]),Gg=Object.freeze(["live","replay"]);function vs(e={}){return Object.freeze({id:Gr,labelKey:"web_drive_layout_content_vision",factory(t={}){let n=e.target||globalThis,r=e.renderer||Xo()||Or(n,e.facadeOptions||{}),o=e.hud||ao(n)||so(n,e.hudOptions||{});return!r||!o?null:ys({...e,target:n,context:t,slot:t.slot,renderer:r,hud:o})},supportedSlots:Bg,supportedSources:Gg,singleton:!0})}var gR=vs();var Ti=new WeakMap;function Wg(e={}){let t=e.target||globalThis,n=e.document||t.document,r=e.compatibilityRoot||n?.getElementById("carrotNaviPane")||null,o=e.workspaceRoot||n?.getElementById("carrotDriveWorkspace")||null,i=e.workspace||t.DriveWorkspace?.get?.(o)||null,a=e.runtime||t.DriveCarrotNaviFacade?.content||null,s=e.driveContentApi||t.DriveContent;return{target:t,documentRoot:n,compatibilityRoot:r,workspace:i,slot:e.slot||null,runtime:a,driveContentApi:s,manageWorkspaceRegistration:e.manageWorkspaceRegistration===!0}}function $g(e={}){let t=Wg(e),{compatibilityRoot:n,workspace:r,slot:o,runtime:i,driveContentApi:a,manageWorkspaceRegistration:s}=t;if(!n||!a?.create||!i?.activate)return null;let u,c=null;return u=a.create("carrot-navi",{mount(l){if(!l||typeof l.appendChild!="function")throw new TypeError("Carrot Navi content mount requires a slot host");c=l,l!==n&&n.parentNode!==l&&l.appendChild(n)},activate(l={}){return i.activate(l)},deactivate(l={}){return i.deactivate(l)},resize(l){return i.resize(l)},status(){return{...i.status?.()||{},contentHostId:String(c?.id||"")}},destroy(){s&&r?.unregisterContent?.(o,u),i.deactivate({keepWarm:!1,reason:"content destroyed"}),c=null,Ti.get(t.target)===u&&Ti.delete(t.target)}}),u}function Du(e={}){let t=e.target||globalThis,n=Ti.get(t);if(n)return n;let r=$g(e);return r&&Ti.set(t,r),r}function Wr(e=globalThis,t=null){return e.DriveContentCarrotNavi=t,t}function Pu(e=globalThis,t={}){let n=t.document||e.document,r=t.workspaceRoot||n?.getElementById("carrotDriveWorkspace")||null,o=t.workspaceApi||e.DriveWorkspace,i=t.workspace||o?.get?.(r),a=t.slot||o?.SLOT?.SECONDARY,s=t.compatibilityRoot||n?.getElementById("carrotNaviPane")||null,u=Du({...t,target:e,document:n,compatibilityRoot:s,workspace:i,slot:a,manageWorkspaceRegistration:!0});return u?(u.mount(t.root||s),u.activate({reason:t.reason||"initial TMAP content"}),i?.getContent?.(a)!==u&&i?.registerContent?.(a,u),Wr(e,u)):Wr(e,null)}function Lu(e={}){return function(n={}){return Du({...e,...n})}}var Oi=new WeakMap;function Do(e,t){return typeof e?.getAttribute=="function"?e.getAttribute(t):null}function Ci(e){return e?.disabled===!0||typeof e?.hasAttribute=="function"&&e.hasAttribute("disabled")?!0:String(Do(e,"aria-disabled")||"").toLowerCase()==="true"}function Ug(e,t){let n=Do(e,t);return n!==null&&String(n).toLowerCase()!=="false"}function Yg(e){if(e?.dataset&&Object.prototype.hasOwnProperty.call(e.dataset,"value"))return String(e.dataset.value);let t=Do(e,"data-value");if(t!==null)return t;let n=Do(e,"value");return n!==null?n:e?.value!==void 0&&e.value!==null?String(e.value):null}function Kg(e,t){return e===t?!0:typeof e?.contains=="function"&&e.contains(t)}function qg(e){let t=String(e?.itemSelector||"").trim();if(!t)throw new TypeError("A segmented control itemSelector is required");return Object.freeze({itemSelector:t,selectedAttribute:String(e?.selectedAttribute||"aria-selected"),orientation:e?.orientation==="vertical"?"vertical":"horizontal",activation:e?.activation==="manual"?"manual":"automatic",onActivate:typeof e?.onActivate=="function"?e.onActivate:null})}function Xg(e){if(!e||typeof e!="object"||typeof e.querySelectorAll!="function"||typeof e.addEventListener!="function"||typeof e.removeEventListener!="function")throw new TypeError("A segmented control root element is required")}function ku(e,t={}){Xg(e);let n=Oi.get(e);if(n)return n.sync(),n;let r=qg(t),o=new Map,i=[],a=null,s=!1,u=null;function c(){return Array.from(e.querySelectorAll(r.itemSelector))}function l(M){o.has(M)||o.set(M,Do(M,"tabindex"))}function d(M,R){l(M),M.setAttribute("tabindex",String(R))}function f(M=i){return M.find(R=>Ug(R,r.selectedAttribute))||null}function m({preferSelected:M=!0}={}){i=c();let R=i.filter(S=>!Ci(S)),v=f(i),h=v&&R.includes(v)?v:null;M&&h?a=h:R.includes(a)||(a=h||R[0]||null);for(let S of i)d(S,S===a?0:-1);return i}function p(){let M=c(),R=f(M),v=R?M.indexOf(R):-1;return Object.freeze({itemCount:M.length,selectedIndex:v,selectedValue:R?Yg(R):null,destroyed:s})}function b(){return s||m({preferSelected:!0}),p()}function g(M){return i.find(R=>Kg(R,M?.target))||null}function x(M){a=M;for(let R of i)d(R,R===M?0:-1)}function E(M,R,v){if(!r.onActivate)return;let h=i.indexOf(M);try{r.onActivate(M,h,Object.freeze({source:v,event:R,controller:u}))}finally{s||m({preferSelected:!1})}}function y(M,R){M&&(R?.preventDefault?.(),x(M),typeof M.focus=="function"&&M.focus(),r.activation==="automatic"&&E(M,R,"keyboard"))}function O(M,R){m({preferSelected:!1});let v=i.filter(P=>!Ci(P));if(!v.length)return null;let h=g(M),S=v.includes(h)?h:v.includes(a)?a:v[0],A=v.indexOf(S);return R==="first"?v[0]:R==="last"?v[v.length-1]:v[(A+(R==="previous"?-1:1)+v.length)%v.length]}function C(M){if(s||M?.isComposing||M?.altKey||M?.ctrlKey||M?.metaKey)return;let R=null;if(M.key==="Home"?R="first":M.key==="End"?R="last":r.orientation==="horizontal"&&M.key==="ArrowLeft"?R="previous":r.orientation==="horizontal"&&M.key==="ArrowRight"?R="next":r.orientation==="vertical"&&M.key==="ArrowUp"?R="previous":r.orientation==="vertical"&&M.key==="ArrowDown"&&(R="next"),R){y(O(M,R),M);return}if(r.activation!=="manual"||M.key!=="Enter"&&M.key!==" "&&M.key!=="Spacebar")return;m({preferSelected:!1});let v=g(M);!v||Ci(v)||(M.preventDefault?.(),x(v),E(v,M,"keyboard"))}function w(M){if(s)return;m({preferSelected:!1});let R=g(M);R&&!Ci(R)&&x(R)}function z(){if(s)return!1;s=!0,e.removeEventListener("keydown",C),e.removeEventListener("focusin",w);for(let[M,R]of o)R===null?M.removeAttribute("tabindex"):M.setAttribute("tabindex",R);return o.clear(),i=[],a=null,Oi.get(e)===u&&Oi.delete(e),!0}return u=Object.freeze({sync:b,destroy:z,snapshot:p}),Oi.set(e,u),e.addEventListener("keydown",C),e.addEventListener("focusin",w),b(),u}var Qg=new Set(["primary","secondary","danger"]);function tn(e){return String(e??"").trim()}function Zg(e){if(typeof e!="function")return tn(e);try{return tn(e())}catch{return""}}function Jg(e,t){let n=t?.document??e.environment?.document??e.document??globalThis.document;if(!n||typeof n.createElement!="function")throw new TypeError("createActionGroup requires a document environment");return n}function eb(e){let t=tn(e);return Qg.has(t)?t:"secondary"}function Ss(e){if(!Array.isArray(e))return Object.freeze([]);if(e.length>2)throw new RangeError("State surface action groups support at most 2 actions");let t=new Set,n=[];for(let r of e){let o=r&&typeof r=="object"?r:{},i=tn(o.id),a=Zg(o.label),s=o.onActivate??o.invoke;!i||t.has(i)||!a||typeof s!="function"||(t.add(i),n.push(Object.freeze({id:i,label:a,tone:eb(o.tone??o.kind),disabled:!!o.disabled,onActivate:s})))}return Object.freeze(n)}function Fu(e){return Array.from(new Set(e.flatMap(t=>tn(t).split(/\s+/)).filter(Boolean))).join(" ")}function zu(e={},t={}){let n=e.host;if(!n||typeof n.append!="function")return null;let r=Jg(e,t),o=r.createElement("div");o.setAttribute("role","group"),o.setAttribute("aria-busy","false"),o.dataset.layout="single",o.dataset.sizing="full",o.dataset.pending="false",o.hidden=!0,n.append(o);let i=new Map,a=Object.freeze([]),s=new Map,u=null,c=0,l=!1,d=tn(e.ariaLabel)||"Status actions",f=tn(e.className),m=tn(e.actionClassName),p=tn(e.actionToneClassPrefix),b=typeof e.onPendingChange=="function"?e.onPendingChange:null;function g(){return u?.id||""}function x(v){return Fu(["btn",v.tone==="primary"?"btn--filled":"",v.tone==="danger"?"btn--danger":"","c-action-group__action",`c-action-group__action--${v.tone}`,m,p?`${p}${v.tone}`:""])}function E(){let v=a.length<=1;return Fu(["c-action-group","c-action-group--nowrap",v?"c-action-group--single":"c-action-group--split",v?"c-action-group--full":"c-action-group--equal",f])}function y(){if(l)return;let v=!!u,h=a.length<=1;o.className=E(),o.hidden=a.length===0,o.dataset.layout=h?"single":"split",o.dataset.sizing=h?"full":"equal",o.dataset.pending=String(v),o.setAttribute("aria-label",d),o.setAttribute("aria-busy",String(v));for(let S of a){let A=i.get(S.id).button,L=v||S.disabled;A.className=x(S),A.dataset.actionId=S.id,A.dataset.tone=S.tone,A.textContent=S.label,A.disabled=L,A.tabIndex=L?-1:0,A.setAttribute("aria-disabled",String(L)),A.setAttribute("tabindex",String(A.tabIndex)),L?A.setAttribute("disabled",""):A.removeAttribute("disabled")}b?.(g())}async function O(v){let h=s.get(tn(v));if(l||!h||h.disabled||u)return!1;let S=Object.freeze({id:h.id,generation:++c});u=S,y();try{await h.onActivate()}catch{}finally{if(l||u!==S)return!0;u=null,y()}return!0}function C(v){let h=i.get(v);h&&(h.button.removeEventListener("click",h.listener),h.button.remove(),i.delete(v))}function w(v,h={}){if(l)return!1;let S=Ss(v),A=new Set(S.map(_=>_.id));u&&!A.has(u.id)&&(u=null,c+=1);for(let _ of i.keys())A.has(_)||C(_);for(let _ of S){if(i.has(_.id))continue;let T=r.createElement("button");T.type="button";let I=()=>{O(_.id)};T.addEventListener("click",I),i.set(_.id,{button:T,listener:I})}a=S,s=new Map(a.map(_=>[_.id,_])),h.ariaLabel!=null&&(d=tn(h.ariaLabel)||"Status actions");let L=Array.from(o.children).map(_=>_.dataset.actionId),P=a.map(_=>_.id);if(L.join("\0")!==P.join("\0"))for(let _ of a)o.append(i.get(_.id).button);return y(),!0}function z(v){return l?!1:(d=tn(v)||"Status actions",y(),!0)}function M(){let v=a.map(h=>Object.freeze({id:h.id,label:h.label,tone:h.tone,disabled:h.disabled}));return Object.freeze({actions:Object.freeze(v),pendingActionId:g(),layout:a.length<=1?"single":"split",sizing:a.length<=1?"full":"equal"})}function R(){if(l)return!1;l=!0,u=null,c+=1;for(let v of Array.from(i.keys()))C(v);return a=Object.freeze([]),s=new Map,o.remove(),!0}return Object.freeze({element:o,setActions:w,setAriaLabel:z,activate:O,snapshot:M,destroy:R})}var qt=Object.freeze({EMPTY:"empty",LOADING:"loading",DEGRADED:"degraded",ERROR:"error",OWNERSHIP:"ownership"}),pn=Object.freeze({NEUTRAL:"neutral",INFO:"info",WARNING:"warning",ERROR:"error"}),AR=Object.freeze({PRIMARY:"primary",SECONDARY:"secondary",DANGER:"danger"}),wi=Object.freeze({COVER:"cover",COMPACT:"compact"}),tb=new Set(Object.values(qt)),nb=new Set(Object.values(pn)),rb=new Set(Object.values(wi)),ob=Object.freeze({[qt.EMPTY]:pn.NEUTRAL,[qt.LOADING]:pn.INFO,[qt.DEGRADED]:pn.WARNING,[qt.ERROR]:pn.ERROR,[qt.OWNERSHIP]:pn.WARNING}),Ms=new WeakMap,ju=new WeakSet,ib=0;function fr(e){return String(e??"").trim()}function As(e){if(typeof e!="function")return fr(e);try{return fr(e())}catch{return""}}function Rs(e){return Array.from(new Set(e.flatMap(t=>fr(t).split(/\s+/)).filter(Boolean))).join(" ")}function Vu(e){let t=fr(e);return tb.has(t)?t:qt.EMPTY}function ab(e,t){let n=fr(e);return nb.has(n)?n:ob[t]}function Hu(e){let t=fr(e);return rb.has(t)?t:wi.COVER}function Bu(e){return e&&typeof e=="object"?e.featureLabel??e.label??e.name:e}function sb(e,t){let n=t?.document??e.environment?.document??e.document??globalThis.document;if(!n||typeof n.createElement!="function")throw new TypeError("createStateSurface requires a document environment");return n}function cb(e,t){if(typeof e=="string")return{state:Vu(e),descriptor:t&&typeof t=="object"?t:{}};let n=e&&typeof e=="object"?e:{};return{state:Vu(n.state),descriptor:n}}function Gu(e={},t={}){let n=e.host;if(!n||typeof n.append!="function")return null;let r=Ms.get(n);if(r){let _=e.featureLabel??e.feature;return _!=null&&r.setFeature(_),r}let o=sb(e,t),i=`c-state-surface-${++ib}`,a=fr(e.className),s=Hu(e.variant),u=Bu(e.featureLabel??e.feature),c=null,l=null,d=qt.EMPTY,f=pn.NEUTRAL,m=s,p="",b=!1,g=o.createElement("section");g.className=Rs(["c-state-surface",`c-state-surface--${f}`,`c-state-surface--state-${d}`,`c-state-surface--${m}`,a]),g.hidden=!0,g.setAttribute("aria-hidden","true"),g.setAttribute("aria-busy","false"),g.dataset.state=d,g.dataset.tone=f,g.dataset.variant=m,g.dataset.pending="false";let x=o.createElement("div");x.className="c-state-surface__body";let E=o.createElement("div");E.className="c-state-surface__copy",E.setAttribute("role","status"),E.setAttribute("aria-live","polite"),E.setAttribute("aria-atomic","true");let y=o.createElement("h2");y.id=`${i}-feature`,y.className="c-state-surface__feature";let O=o.createElement("p");O.id=`${i}-title`,O.className="c-state-surface__title";let C=o.createElement("p");C.id=`${i}-description`,C.className="c-state-surface__description",E.append(y,O,C),x.append(E),g.append(x),n.append(g);function w(){let _=d===qt.LOADING||!!p;g.dataset.pending=String(!!p),g.setAttribute("aria-busy",String(_))}let z=zu({host:x,className:"c-state-surface__actions",actionClassName:"c-state-surface__action",actionToneClassPrefix:"c-state-surface__action--",onPendingChange(_){p=_,w()}},{document:o});function M(_,T){let I=T.featureLabel!=null?T.featureLabel:u;return Object.freeze({state:_,featureLabel:As(I),title:As(T.title),description:As(T.description),tone:ab(T.tone,_),variant:Hu(T.variant??s),actions:Ss(T.actions)})}function R(_){d=_.state,f=_.tone,m=_.variant,g.className=Rs(["c-state-surface",`c-state-surface--${f}`,`c-state-surface--state-${d}`,`c-state-surface--${m}`,a]),g.dataset.state=d,g.dataset.tone=f,g.dataset.variant=m,y.textContent=_.featureLabel,y.hidden=!_.featureLabel,O.textContent=_.title,O.hidden=!_.title,C.textContent=_.description,C.hidden=!_.description,_.title||_.featureLabel?(g.setAttribute("aria-labelledby",_.title?O.id:y.id),g.removeAttribute("aria-label")):(g.removeAttribute("aria-labelledby"),g.setAttribute("aria-label","Status")),_.description?g.setAttribute("aria-describedby",C.id):g.removeAttribute("aria-describedby")}function v(_={},T){if(b)return!1;let{state:I,descriptor:k}=cb(_,T),D=M(I,k);return c={...k},l=D,R(D),z.setActions(D.actions,{ariaLabel:`${D.featureLabel||D.title||"Status"} actions`}),g.hidden=!1,g.setAttribute("aria-hidden","false"),w(),!0}function h(){return b||g.hidden?!1:(c=null,l=null,d=qt.EMPTY,f=pn.NEUTRAL,m=s,z.setActions([]),p="",g.hidden=!0,g.setAttribute("aria-hidden","true"),g.dataset.state=d,g.dataset.tone=f,g.dataset.variant=m,g.className=Rs(["c-state-surface",`c-state-surface--${f}`,`c-state-surface--state-${d}`,`c-state-surface--${m}`,a]),w(),!0)}function S(_){return b?!1:(u=Bu(_),g.hidden||!c?!0:v(d,c))}function A(){let _=z.snapshot();return Object.freeze({visible:!b&&!g.hidden,state:l?.state||qt.EMPTY,featureLabel:l?.featureLabel||"",title:l?.title||"",description:l?.description||"",tone:l?.tone||pn.NEUTRAL,variant:l?.variant||s,actions:_.actions,pendingActionId:_.pendingActionId})}function L(){return b?!1:(b=!0,c=null,l=null,p="",z.destroy(),Ms.delete(n),ju.delete(P),g.remove(),!0)}let P=Object.freeze({show:v,hide:h,setFeature:S,snapshot:A,destroy:L});return Ms.set(n,P),ju.add(P),P}var lb="http://www.w3.org/2000/svg";function ub(e,t,n){let r=Object.freeze({anchor:()=>!1,isAnchored:()=>!1,observe:()=>!1,destroy:()=>!1});if(!n||!e||typeof e.addEventListener!="function")return r;let o=t||e.ownerDocument?.defaultView||globalThis,i=()=>Number(o.performance?.now?.()??Date.now()),a=!0,s=Number.NEGATIVE_INFINITY,u=Number.NEGATIVE_INFINITY,c=null,l=!1;function d(){return Math.max(0,(e.scrollHeight||0)-(e.clientHeight||0))}function f(){return d()-(e.scrollTop||0)}function m(){l||i()p());let y=!1;for(let O of x)O&&(c.observe(O),y=!0);return y}function g(){return l?!1:(l=!0,e.removeEventListener?.("scroll",m),c?.disconnect?.(),c=null,!0)}return Object.freeze({anchor:p,isAnchored:()=>a,observe:b,destroy:g})}function Po(e,...t){if(typeof e?.append=="function")e.append(...t);else for(let n of t)e?.appendChild?.(n)}function Et(e,t){return e?.classList?.add(t),e}function db(e){let t=e.createElementNS(lb,"svg");return t.setAttribute("viewBox","0 0 24 40"),t.setAttribute("aria-hidden","true"),t.setAttribute("focusable","false"),t.classList.add("telemetry-forward__ego"),t.innerHTML=['','','','',''].join(""),t}function fb(e){let t=e.createElement("div");t.className="telemetry-forward__tooltip",t.hidden=!0;let n=e.createElement("span");n.className="telemetry-forward__tooltip-icon",n.setAttribute("aria-hidden","true");let r=e.createElement("strong");r.className="telemetry-forward__tooltip-title";let o=e.createElement("span");o.className="telemetry-forward__tooltip-state";let i=e.createElement("dl");return i.className="telemetry-forward__tooltip-rows",Po(t,n,r,o,i),Object.freeze({tooltip:t,icon:n,title:r,state:o,rows:i})}function pb(e){Et(e.root,"telemetry-forward"),Et(e.head,"telemetry-forward__head"),Et(e.legend,"telemetry-forward__legend"),Et(e.viewport,"telemetry-forward__viewport"),Et(e.plot,"telemetry-forward__plot"),Et(e.canvas,"telemetry-forward__canvas"),Et(e.ego,"telemetry-forward__ego"),Et(e.message,"telemetry-forward__message"),Et(e.tooltip,"telemetry-forward__tooltip"),Et(e.tooltipIcon,"telemetry-forward__tooltip-icon"),Et(e.tooltipTitle,"telemetry-forward__tooltip-title"),Et(e.tooltipState,"telemetry-forward__tooltip-state"),Et(e.tooltipRows,"telemetry-forward__tooltip-rows"),Et(e.ego?.querySelector?.(".carrot-replay-sensor__egoMirror"),"telemetry-forward__ego-mirror");for(let t of e.ego?.querySelectorAll?.(".carrot-replay-sensor__egoMirror")||[])Et(t,"telemetry-forward__ego-mirror");for(let t of e.ego?.querySelectorAll?.(".carrot-replay-sensor__egoGlass")||[])Et(t,"telemetry-forward__ego-glass");return e}function mb(e){let t=e.root,n=e.tooltip||t?.querySelector?.(".carrot-replay-sensor__tooltip");return{root:t,head:e.head||t?.querySelector?.(".carrot-replay-sensor__head"),title:e.title||t?.querySelector?.(".carrot-replay-sensor__head strong"),status:e.status||t?.querySelector?.(".carrot-replay-sensor__head span"),legend:e.legend||t?.querySelector?.(".carrot-replay-sensor__legend"),viewport:e.viewport||t?.querySelector?.(".carrot-replay-sensor__viewport"),plot:e.plot||t?.querySelector?.(".carrot-replay-sensor__plot"),canvas:e.canvas||t?.querySelector?.("canvas"),ego:e.ego||t?.querySelector?.(".carrot-replay-sensor__ego"),message:e.message||t?.querySelector?.(".carrot-replay-sensor__message"),tooltip:n,tooltipIcon:e.tooltipIcon||n?.querySelector?.(".carrot-replay-sensor__tooltipIcon"),tooltipTitle:e.tooltipTitle||n?.querySelector?.(".carrot-replay-sensor__tooltipTitle"),tooltipState:e.tooltipState||n?.querySelector?.(".carrot-replay-sensor__tooltipState"),tooltipRows:e.tooltipRows||n?.querySelector?.(".carrot-replay-sensor__tooltipRows")}}function hb(e,t){let n=t.document||e?.ownerDocument||globalThis.document;if(!e||!n?.createElement)return null;let r=n.createElement("div"),o=n.createElement("strong"),i=n.createElement("span");Po(r,o,i);let a=n.createElement("div"),s=n.createElement("div");s.setAttribute("role","region"),s.tabIndex=0;let u=n.createElement("div"),c=n.createElement("canvas"),l=db(n),d=fb(n);Po(u,c,l,d.tooltip),s.append(u);let f=n.createElement("div");return f.setAttribute("role","status"),f.hidden=!0,Po(e,r,a,s,f),{root:e,head:r,title:o,status:i,legend:a,viewport:s,plot:u,canvas:c,ego:l,message:f,tooltip:d.tooltip,tooltipIcon:d.icon,tooltipTitle:d.title,tooltipState:d.state,tooltipRows:d.rows}}function Wu(e={}){let t=pb(e.adopt?mb(e):hb(e.root,e));if(!t?.root||!t.canvas)return null;let n=e.target||e.document?.defaultView||t.root.ownerDocument?.defaultView||globalThis,r=ub(t.viewport,n,e.anchorBottom===!0);r.observe(t.viewport,t.plot);function o(c,l="",d=!1){t.title&&(t.title.textContent=c),t.status&&(t.status.textContent=l,t.status.classList?.toggle("is-warn",d))}function i(c=""){t.message&&(t.message.textContent=c,t.message.hidden=!c)}function a(c=[],l=""){if(!t.legend)return;let d=t.legend.ownerDocument||globalThis.document,f=c.map(m=>{let p=d.createElement("span");p.className="telemetry-forward__legend-item";let b=d.createElement("i");return b.className=`telemetry-forward__glyph telemetry-forward__glyph--${m.shape||"circle"}`,b.style.setProperty("--glyph-color",m.color||"currentColor"),b.setAttribute("aria-hidden","true"),Po(p,b,d.createTextNode(String(m.label||""))),p});t.legend.replaceChildren(...f),l&&t.legend.setAttribute("aria-label",l),r.anchor()}function s(){t.tooltip&&(t.tooltip.hidden=!0)}function u(c={}){if(!t.tooltip||!t.tooltipIcon||!t.tooltipRows)return!1;let l=String(c.shape||"circle");t.tooltip.style.setProperty("--glyph-color",c.color||"currentColor"),t.tooltipIcon.className=`telemetry-forward__tooltip-icon telemetry-forward__glyph telemetry-forward__glyph--${l}`,t.tooltipTitle&&(t.tooltipTitle.textContent=String(c.title||"")),t.tooltipState&&(t.tooltipState.textContent=String(c.state||""),t.tooltipState.classList.toggle("is-lead",c.lead===!0));let d=t.tooltipRows.ownerDocument||globalThis.document,f=[];for(let E of Array.isArray(c.rows)?c.rows:[]){let y=d.createElement("dt");y.textContent=String(E?.label||"");let O=d.createElement("dd");O.textContent=String(E?.value||""),f.push(y,O)}t.tooltipRows.replaceChildren(...f);let m=Math.max(1,Number(c.width)||t.plot?.clientWidth||1),p=Math.max(1,Number(c.height)||t.plot?.clientHeight||1),b=Number(c.x)||0,g=Number(c.y)||0,x=Math.min(110,Math.max(8,m/2));return t.tooltip.style.left=`${Math.max(x,Math.min(m-x,b))}px`,t.tooltip.style.top=`${Math.max(8,Math.min(p-8,g))}px`,t.tooltip.classList.toggle("is-below",c.below??g<128),t.tooltip.hidden=!1,!0}return Object.freeze({elements:Object.freeze(t),setHeader:o,setMessage:i,setLegend:a,showTooltip:u,hideTooltip:s,anchorBottom:r.anchor,isAnchoredToBottom:r.isAnchored,destroy:r.destroy})}var $u=Object.freeze(["lead","vision","front","scc","corner"]),Lo=Object.freeze({vision:Object.freeze({shape:"circle",tone:"vision",labelKey:"replay_sensor_source_vision",label:"Camera"}),front:Object.freeze({shape:"diamond",tone:"track",labelKey:"replay_sensor_source_front",label:"Front radar"}),scc:Object.freeze({shape:"square",tone:"track",labelKey:"replay_sensor_source_scc",label:"SCC radar"}),corner:Object.freeze({shape:"triangle",tone:"track",labelKey:"replay_sensor_source_corner",label:"Corner radar"}),fusion:Object.freeze({shape:"circle",tone:"lead",labelKey:"replay_sensor_source_fusion",label:"Combined sensors"}),lead:Object.freeze({shape:"circle",tone:"lead",labelKey:"replay_sensor_source_lead",label:"Lead"}),unknown:Object.freeze({shape:"circle",tone:"track",labelKey:"replay_sensor_source_unknown",label:"Unidentified"})}),gb=Object.freeze(["front","scc","corner","corner"]);function xs(e,t="unknown"){if(e!=null&&String(e).trim()!==""&&Number.isFinite(Number(e)))return gb[Math.max(0,Math.min(3,Number(e)))]||t;let n=String(e||"").trim().toLowerCase();return["vision","model","camera"].includes(n)?"vision":["front","frontradar","front_radar","radar","live_tracks"].includes(n)?"front":n==="scc"?"scc":["corner","corner235","corner180","corner430"].includes(n)?"corner":n==="fusion"?"fusion":n==="lead"?"lead":Object.prototype.hasOwnProperty.call(Lo,t)?t:"unknown"}function Es(e,t="unknown"){return Lo[xs(e,t)]||Lo.unknown}function Ts(e,t,n="unknown"){let r=Es(e,n);return typeof t=="function"?t(r.labelKey,r.label):r.label}var ws=100,bb=Object.freeze(["circle","square","diamond","triangle"]),yb=Object.freeze(["lead","accent","neutral"]),Cs=12,vb=1.3,Sb=.45,Os=20,Uu=10,Yu=4;function _t(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function Ku(e,t,n,r){let o=_t(e);return o===null?t:Math.max(n,Math.min(r,o))}function qu(e){return typeof e!="string"?null:e.trim()||null}function Mb(e={},t=1){let n=Math.max(1,Math.round(_t(e.width)??1)),r=Math.max(1,Math.round(_t(e.height)??1)),o=Math.max(1,Math.min(3,_t(t)??1));return Object.freeze({width:n,height:r,dpr:o,pixelWidth:Math.max(1,Math.round(n*o)),pixelHeight:Math.max(1,Math.round(r*o))})}function $r(e,t={}){let n=_t(e?.xM),r=_t(e?.yM),o=Math.max(1,_t(t.width)??1),i=Math.max(1,_t(t.height)??1),a=Math.max(1,_t(t.maxDistanceM)??ws);if(n===null||r===null||n<0||n>a||Math.abs(r)>Cs*vb)return null;let s=i*.16,u=Math.max(i*.5,i-46),c=(u-s)/a,l=Math.max(1,o*Sb/Cs);return Object.freeze({x:o/2-r*l,y:u-n*c,xM:n,yM:r})}function Ab(e){let t=[],n=(r,o)=>{for(let[i,a]of(Array.isArray(r)?r:[]).entries()){let s=_t(a?.xM),u=_t(a?.yM);s===null||u===null||t.push(Object.freeze({id:String(a?.id||`${o}:${i}`),kind:o,source:String(a?.source||"unknown"),xM:s,yM:u,relativeSpeedMps:_t(a?.relativeSpeedMps),measured:o==="radar"?a?.measured===!0:null,selected:o==="lead"||a?.selected===!0}))}};return n(e?.leads,"lead"),n(e?.radar,"radar"),Object.freeze(t)}function Xu(e,t){let n=e?.entities??e;return n instanceof Map?n.get(t)??null:!n||typeof n!="object"?null:Object.prototype.hasOwnProperty.call(n,t)?n[t]:null}function Rb(e,t){let n=Xu(t,e.id),r=Xu(t,`${e.kind}:${e.id}`),o={...n&&typeof n=="object"?n:{},...r&&typeof r=="object"?r:{},meta:{...n?.meta&&typeof n.meta=="object"?n.meta:{},...r?.meta&&typeof r.meta=="object"?r.meta:{}}},i=o.selected===void 0?e.selected===!0:o.selected===!0,a=e.kind==="lead"?6:4,s=Ku(o.radiusPx,i?Math.max(7,a):a,2,14),u=yb.includes(o.tone)?o.tone:i||e.kind==="lead"?"lead":"neutral",c=Es(e.source).shape,l=bb.includes(o.shape)?o.shape:c,d=qu(o.label);return Object.freeze({shape:l,tone:u,selected:i,visible:o.visible!==!1,filled:o.filled!==!1,showLabel:o.showLabel??e.kind==="lead",label:d,sourceLabel:qu(o.sourceLabel),radiusPx:s,hitRadiusPx:Ku(o.hitRadiusPx,Math.max(20,s+8),s,48),meta:Object.freeze({...o.meta})})}function Qu(e,t={},n=null){let r=Math.max(1,_t(t.width)??1),o=Math.max(1,_t(t.height)??1),i=Math.max(1,_t(t.maxDistanceM)??ws),a=Ab(e).flatMap(l=>{let d=$r(l,{width:r,height:o,maxDistanceM:i});if(!d)return[];let f=Rb(l,n);return f.visible?[Object.freeze({...l,point:d,screenX:d.x,screenY:d.y,selected:f.selected,hitRadiusPx:f.hitRadiusPx,presentation:f})]:[]}),s=["lanes","leads","radar"].map(l=>String(e?.freshness?.[l]?.state||"missing")),u=s.includes("fresh")?"valid":s.includes("stale")?"stale":"empty",c=Object.freeze(a);return Object.freeze({state:u,width:r,height:o,maxDistanceM:i,ego:Object.freeze({x:r/2,y:Math.max(o*.5,o-46)}),laneOffsetsM:Object.freeze([-1.8,1.8]),entities:c,hitTargets:c})}function Zu(e,t){let n=e.getComputedStyle?.(t)||t?.ownerDocument?.defaultView?.getComputedStyle?.(t)||globalThis.getComputedStyle?.(t),r=o=>String(n?.getPropertyValue?.(o)||"").trim();return Object.freeze({grid:r("--drive-insights-forward-grid"),gridMinor:r("--drive-insights-forward-grid-minor"),gridLabel:r("--drive-insights-forward-grid-label"),gridFont:r("--drive-insights-forward-grid-font"),lane:r("--drive-insights-forward-lane"),lead:r("--drive-insights-forward-lead"),radar:r("--drive-insights-forward-radar"),neutral:r("--drive-insights-forward-neutral"),text:r("--drive-insights-forward-text"),plate:r("--drive-insights-panel")||r("--md-surface")})}function Ju(e,t){return e==="lead"?t.lead:e==="neutral"?t.neutral:t.radar}function xb(e,t,n,r,o){e.beginPath?.(),r==="square"?e.rect?.(t-o,n-o,o*2,o*2):r==="diamond"?(e.moveTo?.(t,n-o*1.3),e.lineTo?.(t+o*1.15,n),e.lineTo?.(t,n+o*1.3),e.lineTo?.(t-o*1.15,n)):r==="triangle"?(e.moveTo?.(t,n-o*1.35),e.lineTo?.(t+o*1.25,n+o*.9),e.lineTo?.(t-o*1.25,n+o*.9)):e.arc?.(t,n,o,0,Math.PI*2),e.closePath?.()}function Eb(e){return e.presentation.label?e.presentation.label:`${e.xM.toFixed(0)} m`}function Tb(e,t,n,r){let{presentation:o,point:i}=t,a=Ju(o.tone,n);if(!a||(xb(e,i.x,i.y,o.shape,o.radiusPx),e.lineJoin="round",n.plate&&(e.lineWidth=3.5,e.strokeStyle=n.plate,e.stroke?.()),o.filled&&(e.fillStyle=a,e.fill?.()),e.lineWidth=2,e.strokeStyle=a,e.stroke?.(),!o.showLabel||!n.text))return;let s=Eb(t);e.font=o.selected?"800 12px system-ui":"600 11px system-ui",e.textBaseline="middle";let u=e.measureText?.(s)?.width??0,c=o.radiusPx+10,l=i.x+c+u+4<=r.width;e.textAlign=l?"left":"right";let d=l?i.x+c:i.x-c,f=Math.max(8,Math.min(r.height-8,i.y));n.plate&&(e.lineWidth=3,e.strokeStyle=n.plate,e.strokeText?.(s,d,f)),e.fillStyle=n.text,e.fillText?.(s,d,f)}function Ob(e,t,n){let{width:r,height:o,maxDistanceM:i}=t;if(n.gridMinor){e.strokeStyle=n.gridMinor,e.lineWidth=1,e.beginPath?.();for(let a=Yu;a<=Cs;a+=Yu)for(let s of[-a,a]){let u=$r({xM:0,yM:s},t);if(!u)continue;let c=Math.round(u.x)+.5;e.moveTo?.(c,0),e.lineTo?.(c,o)}for(let a=Uu;a<=i;a+=Uu){if(a%Os===0)continue;let s=$r({xM:a,yM:0},t);if(!s)continue;let u=Math.round(s.y)+.5;e.moveTo?.(0,u),e.lineTo?.(r,u)}e.stroke?.()}if(n.grid){e.strokeStyle=n.grid,e.lineWidth=1,e.beginPath?.();for(let a=0;a<=i;a+=Os){let s=$r({xM:a,yM:0},t);if(!s)continue;let u=Math.round(s.y)+.5;e.moveTo?.(0,u),e.lineTo?.(r,u)}e.stroke?.()}if(n.gridLabel&&n.gridFont){e.fillStyle=n.gridLabel,e.font=n.gridFont,e.textAlign="left",e.textBaseline="bottom";for(let a=0;a<=i;a+=Os){let s=$r({xM:a,yM:0},t);s&&e.fillText?.(`${a} m`,6,s.y-3)}}}function ed(e,t,n){if(!e)return;let{height:r}=t;if(Ob(e,t,n),!!n.lane){e.strokeStyle=n.lane,e.lineWidth=1.5;for(let o of t.laneOffsetsM){let i=$r({xM:0,yM:o},t);i&&(e.beginPath?.(),e.moveTo?.(i.x,0),e.lineTo?.(i.x,r),e.stroke?.())}}}function Cb(e,t,n,r=null){if(!e)return;let{width:o,height:i}=t;e.clearRect?.(0,0,o,i),r&&typeof e.drawImage=="function"?e.drawImage(r,0,0,r.width,r.height,0,0,o,i):ed(e,t,n);for(let a of[!1,!0])for(let s of t.entities)s.selected===a&&Tb(e,s,n,t)}function td(e={}){let t=e.root,n=e.document||t?.ownerDocument||globalThis.document;if(!t||!n?.createElement||typeof t.append!="function")return null;let r=e.target||n.defaultView||globalThis;t.classList?.add("drive-insights__forward");let o=Wu({root:t,document:n,target:r,anchorBottom:!0});if(!o)return null;let{canvas:i,ego:a}=o.elements,s=i.getContext?.("2d")||null,u=null,c=null,l=null,d=Qu(null,{width:1,height:1}),f=Zu(e,t),m=Number.NEGATIVE_INFINITY,p=n.createElement("canvas"),b=p.getContext?.("2d")||null,g="",x="",E=[],y={x:0,y:0,active:!1},O=null,C=!1;function w(F,H){return typeof e.text=="function"?e.text(F,H):H}function z(F=!1){let H=Number(r.performance?.now?.()??Date.now());return!F&&H-m<1e3||(m=H,f=Zu(e,t)),f}function M(){if(C)return!1;z(!0),g="",x="";let F=w("drive_insights_forward_title","Forward perception");return o.setHeader(F,`${ws} m`),o.setLegend($u.map(H=>{let Y=Lo[H],$=Y.tone==="lead"?"var(--md-primary)":Y.tone==="vision"?"var(--md-info)":"var(--md-outline-var)";return{shape:Y.shape,color:$,label:Ts(H,w)}}),w("replay_sensor_sources","Sensor sources")),i.setAttribute?.("aria-label",w("drive_insights_forward_canvas","Forward driving data")),!0}function R(F,H){let Y=i.getBoundingClientRect?.();if(!Y?.width||!Y?.height)return null;let $=(F-Y.left)*d.width/Y.width,K=(H-Y.top)*d.height/Y.height,Z=null,ee=20;for(let ue of d.hitTargets){let de=Math.hypot($-ue.screenX,K-ue.screenY);de>=Math.min(ee,ue.hitRadiusPx)||(ee=de,Z=ue)}return Z}function v(F){return Ts(F.source,w)}function h(F,H=!1){if(!F)return o.hideTooltip(),!1;O!==null&&r.clearTimeout?.(O),O=null;let Y=F.yM,$=Math.abs(Y),K=[{label:w("replay_sensor_row_distance","Distance"),value:`${F.xM.toFixed(1)} m`},{label:w("replay_sensor_row_lateral","Side"),value:$<.2?w("replay_sensor_side_ahead","dead ahead"):`${Y>0?w("replay_sensor_side_left","left"):w("replay_sensor_side_right","right")} ${$.toFixed(1)} m`}];F.relativeSpeedMps!==null&&K.splice(1,0,{label:w("replay_sensor_row_speed","Rel. speed"),value:`${F.relativeSpeedMps>=0?"+":""}${F.relativeSpeedMps.toFixed(1)} m/s`});let Z=F.kind==="lead"||F.selected;return o.showTooltip({shape:F.presentation.shape,color:Ju(F.presentation.tone,f),title:v(F),state:Z?w("replay_sensor_source_lead","Lead"):F.measured?w("replay_sensor_measured","measured"):w("replay_sensor_unmeasured","estimated"),lead:Z,rows:K,x:F.point.x,y:F.point.y,width:d.width,height:d.height}),H&&typeof r.setTimeout=="function"&&(O=r.setTimeout(()=>{O=null,o.hideTooltip()},2200)),!0}function S(){y.active&&h(R(y.x,y.y))}function A(F,H){if(!b)return null;let Y=[H.pixelWidth,H.pixelHeight,F.maxDistanceM,f.grid,f.gridMinor,f.gridLabel,f.gridFont,f.lane].join("|");return Y===g||(g=Y,p.width!==H.pixelWidth&&(p.width=H.pixelWidth),p.height!==H.pixelHeight&&(p.height=H.pixelHeight),b.setTransform?.(H.dpr,0,0,H.dpr,0,0),b.clearRect?.(0,0,H.width,H.height),ed(b,F,f)),p}function L(){if(C)return!1;z();let F=i.getBoundingClientRect?.()||{},H=Number(F.width)>1&&Number(F.height)>1?F:l||t.getBoundingClientRect?.()||{},Y=Mb(H,r.devicePixelRatio||1);i.width!==Y.pixelWidth&&(i.width=Y.pixelWidth),i.height!==Y.pixelHeight&&(i.height=Y.pixelHeight),s?.setTransform?.(Y.dpr,0,0,Y.dpr,0,0),d=Qu(u,Y,c),t.dataset.state=d.state;let $=`${d.ego.y}px`;a.style.top!==$&&(a.style.top=$);let K=w("drive_insights_forward_title","Forward perception"),Z=`${K}|${d.maxDistanceM}|${d.state}`;return Z!==x&&(x=Z,o.setHeader(K,`${d.maxDistanceM} m`,d.state==="stale")),Cb(s,d,f,A(d,Y)),S(),!0}function P(F,H=null){return C?!1:(u=F&&typeof F=="object"?F:null,c=H&&typeof H=="object"?H:null,L())}function _(F){if(C)return!1;l=F&&typeof F=="object"?F:null;let H=L();return o.anchorBottom(),H}function T(){return d}function I(){return Object.freeze({destroyed:C,state:d.state,entityCount:d.entities.length,selectedCount:d.entities.filter(({selected:F})=>F).length})}function k(){if(C)return!1;C=!0,u=null,c=null,O!==null&&r.clearTimeout?.(O),O=null;for(let[F,H,Y]of E.splice(0))F.removeEventListener?.(H,Y);return o.destroy?.(),t.replaceChildren?.(),!0}let D=o.elements.viewport||i,B=F=>{F.pointerType!=="touch"&&(y.x=F.clientX,y.y=F.clientY,y.active=!0,S())},W=F=>{F.pointerType!=="touch"&&(y.active=!1,o.hideTooltip())},V=F=>{let H=R(F.clientX,F.clientY);if(!H){o.hideTooltip();return}F.pointerType==="touch"&&F.preventDefault?.(),h(H,F.pointerType==="touch")};return D.addEventListener?.("pointermove",B,{passive:!0}),D.addEventListener?.("pointerleave",W,{passive:!0}),D.addEventListener?.("pointerdown",V,{passive:!1}),E.push([D,"pointermove",B],[D,"pointerleave",W],[D,"pointerdown",V]),M(),Object.freeze({render:P,resize:_,syncLabels:M,scene:T,status:I,destroy:k})}var wb=Object.freeze({speed:"info",steering:"primary",acceleration:"success",lead_distance:"warning"});function Ib(e,t){return t?.document||e?.ownerDocument||globalThis.document}function _b(e){return wb[e?.id]||"info"}function nd(e,t,n={}){let r=Ib(e,n);if(!e||!r?.createElement||!Array.isArray(t))return null;e.classList?.add("telemetry-graphs");let o=new Map;for(let i of t){let a=r.createElement("article");a.className="telemetry-graph",a.dataset.telemetryMetric=i.id,a.dataset.telemetryTone=_b(i);let s=r.createElement("header");s.className="telemetry-graph__head";let u=r.createElement("strong");u.textContent=i.label;let c=r.createElement("output"),l=r.createTextNode("--"),d=r.createElement("small");d.textContent=i.unit,c.append(l,d),s.append(u,c);let f=r.createElement("canvas");f.className="telemetry-graph__plot",f.setAttribute("aria-hidden","true");let m=r.createElement("i");m.className="telemetry-graph__cursor telemetry-graph__cursor--live",m.setAttribute("aria-hidden","true"),a.append(s,f,m),e.append(a),o.set(i.id,Object.freeze({card:a,head:s,label:u,value:c,number:l,unit:d,canvas:f,cursor:m}))}return Object.freeze({root:e,cards:o})}var Nb=Object.freeze([Object.freeze({id:"speed",label:"Speed",unit:"km/h",digits:1,minimumSpan:20,value(e){let t=Xt(e?.ego?.speedMps);return t===null?null:t*3.6}}),Object.freeze({id:"steering",label:"Steering",unit:"°",digits:2,minimumSpan:20,value(e){return e?.ego?.steeringAngleDeg}}),Object.freeze({id:"acceleration",label:"Acceleration",unit:"m/s²",digits:2,minimumSpan:2,value(e){return e?.ego?.accelMps2}}),Object.freeze({id:"lead_distance",label:"Lead distance",unit:"m",digits:1,minimumSpan:20,value(e){let t=Array.isArray(e?.leads)?e.leads:[],n=null;for(let r of t){let o=Xt(r?.xM);o!==null&&o>=0&&(n===null||oObject.freeze(t)))}function Pb(e,t){let n="fresh";for(let r of t){let o=String(e?.freshness?.[r]?.state||"missing"),i=Object.hasOwn(Is,o)?o:"missing";Is[i]>Is[n]&&(n=i)}return n}function ad(e){let t=e&&typeof e=="object"&&!Array.isArray(e)?e:{},n=Nb.map(o=>{let i=t[o.id],a=i&&typeof i=="object"&&!Array.isArray(i)?i:{},s=Number.isSafeInteger(a.digits)&&a.digits>=0&&a.digits<=6?a.digits:o.digits;return Object.freeze({...o,label:typeof a.label=="string"&&a.label?a.label:o.label,labelKey:typeof a.labelKey=="string"&&a.labelKey?a.labelKey:`drive_insights_graph_${o.id}`,unit:typeof a.unit=="string"?a.unit:o.unit,digits:s,minimumSpan:Xt(a.minimumSpan)??o.minimumSpan??0,value:typeof a.value=="function"?a.value:o.value})});if(!Array.isArray(t.metricOrder))return n;let r=new Map(t.metricOrder.map((o,i)=>[String(o),i]));return n.sort((o,i)=>(r.get(o.id)??Number.MAX_SAFE_INTEGER)-(r.get(i.id)??Number.MAX_SAFE_INTEGER))}function rd(e,t={}){let n=Array.isArray(e?.samples)?e.samples:[],r=ad(t.presentation).map(m=>{let p=[];for(let E of n){let y=_s(E),O=Ns(E,y),C=Xt(m.value(y));O===null||O<0||C===null||p.push({timestampMs:O,value:C})}p.sort((E,y)=>E.timestampMs-y.timestampMs);let b=p.map(({value:E})=>E),g=b.length?Math.min(...b):null,x=b.length?Math.max(...b):null;if(g!==null&&x!==null){let E=x-g,y=Xt(m.minimumSpan)??0,O=Math.max(y,1e-6);if(Em.length>0),a=o?Pb(o,["ego"]):"missing",s=i?a==="fresh"?"valid":"stale":"empty",u=n.length?Ns(n[0],_s(n[0])):null,c=n.length?Ns(n.at(-1),o):null,l=Xt(e?.startTimestampMs)??u??0,d=Xt(e?.endTimestampMs)??c??l,f=Math.max(0,l);return Object.freeze({state:s,freshness:a,startTimestampMs:f,endTimestampMs:Math.max(f,d),cadenceMs:Math.max(0,Xt(e?.cadenceMs)??0),metrics:Object.freeze(r)})}function Lb(e,t){return e.document||t?.ownerDocument||globalThis.document}function od(e,t,n){return typeof e.text=="function"?e.text(t,n):n}function kb(e,t,n){let r=e.getComputedStyle?.(t)||t?.ownerDocument?.defaultView?.getComputedStyle?.(t)||globalThis.getComputedStyle?.(t);return String(r?.getPropertyValue?.(n)||"").trim()}function Fb(e,t){let n=e.getBoundingClientRect?.()||{},r=Math.max(1,Math.round(Number(n.width||e.clientWidth||1))),o=Math.max(1,Math.round(Number(n.height||e.clientHeight||1))),i=Math.max(1,Math.min(3,Number(t?.devicePixelRatio||1))),a=Math.max(1,Math.round(r*i)),s=Math.max(1,Math.round(o*i));return e.width!==a&&(e.width=a),e.height!==s&&(e.height=s),{width:r,height:o,dpr:i}}var zb=.6,id=.12;function jb(e,t,n){if(t===null||n===null)return null;if(!e)return{minimum:t,maximum:n};let r=Math.min(e.minimum,t),o=Math.max(e.maximum,n),i=n-t,a=o-r;return i>0&&a>i/zb&&(r+=(t-r)*id,o+=(n-o)*id),{minimum:r,maximum:o}}function Vb(e,t,n,r,o,i,a){if(!e)return;let{width:s,height:u,dpr:c}=Fb(t,i);if(e.setTransform?.(c,0,0,c,0,0),e.clearRect?.(0,0,s,u),!o||n.values.length<2||n.minimum===null||n.maximum===null){n.values.length||a?.delete(n.id);return}let l=jb(a?.get(n.id),n.minimum,n.maximum);a?.set(n.id,l);let d=Xt(r?.startTimestampMs)??n.values[0].timestampMs,f=Xt(r?.endTimestampMs)??n.values.at(-1).timestampMs,m=Math.max(1,f-d),p=Math.max(1e-9,l.maximum-l.minimum);e.strokeStyle=o,e.lineWidth=n.id==="speed"?1.8:1.6,e.lineJoin="round",e.lineCap="round",e.beginPath?.(),n.values.forEach((b,g)=>{let x=Math.max(0,Math.min(s,(b.timestampMs-d)/m*s)),E=u-(b.value-l.minimum)/p*Math.max(1,u-4)-2;g===0?e.moveTo?.(x,E):e.lineTo?.(x,E)}),e.stroke?.()}function sd(e={}){let t=e.root,n=Lb(e,t);if(!t||!n?.createElement||typeof t.append!="function")return null;let r=e.target||n.defaultView||globalThis,o=ad(e.presentation),i=nd(t,o.map(E=>({...E,label:od(e,E.labelKey,E.label)})),{document:n});if(!i)return null;let a=new Map(Array.from(i.cards,([E,y])=>[E,{...y,output:y.number,context:y.canvas.getContext?.("2d")||null}])),s=rd(null,{presentation:e.presentation}),u=new Map,c=!1,l=Number.NEGATIVE_INFINITY;t.classList?.add("drive-insights__graph");function d(E=!1){let y=Number(r.performance?.now?.()??Date.now());if(!E&&y-l<1e3)return!1;l=y;for(let O of a.values())O.lineColor=kb(e,O.card,"--graph-color");return!0}for(let E of o){let y=a.get(E.id);y&&y.card.setAttribute?.("aria-label",y.label.textContent)}d(!0);function f(){if(c)return!1;d(),t.dataset.state=s.state;for(let E of s.metrics){let y=a.get(E.id);if(!y)continue;let O=E.current===null?"--":E.current.toFixed(E.digits);y.output.textContent!==O&&(y.output.textContent=O),Vb(y.context,y.canvas,E,s,y.lineColor,r,u)}return!0}function m(E){return c?!1:(s=rd(E,{presentation:e.presentation}),f())}function p(){return f()}function b(){if(c)return!1;for(let E of o){let y=a.get(E.id);y&&(y.label.textContent=od(e,E.labelKey,E.label),y.card.setAttribute?.("aria-label",y.label.textContent),y.unit.textContent=E.unit)}return d(!0),!0}function g(){return Object.freeze({destroyed:c,state:s.state,freshness:s.freshness})}function x(){return c?!1:(c=!0,u.clear(),a.clear(),t.replaceChildren?.(),!0)}return Object.freeze({render:m,resize:p,syncLabels:b,status:g,destroy:x})}var ot=Object.freeze({LIVE:"live",REPLAY:"replay"}),qn=Object.freeze({FRESH:"fresh",STALE:"stale",MISSING:"missing"}),Ur=Object.freeze({cadenceMs:100,windowMs:1e4,maxSamples:200,liveStaleAfterMs:2e3,replaySeekResetThresholdMs:500}),Hb=new Set(["connected","online","open","ready"]),Bb=new Set(Object.values(ot)),Ps=class extends Error{constructor(t,n){super(n),this.name="DriveInsightsHistoryError",this.code=t}};function nn(e,t){throw new Ps(e,t)}function Kn(e,t){return Object.prototype.hasOwnProperty.call(e||{},t)}function Cn(e,t){let n=Number(e);return(!Number.isFinite(n)||n<0)&&nn("INVALID_TIMESTAMP",`${t} must be a finite, non-negative number`),n}function Ii(e,t){let n=Number(e);return(!Number.isFinite(n)||n<=0)&&nn("INVALID_HISTORY_OPTIONS",`${t} must be a finite number greater than zero`),n}function Gb(e,t){let n=Number(e);return(!Number.isSafeInteger(n)||n<=0)&&nn("INVALID_HISTORY_OPTIONS",`${t} must be a positive safe integer`),n}function ud(e={}){let t=Ii(e.cadenceMs??Ur.cadenceMs,"cadenceMs"),n=Ii(e.windowMs??Ur.windowMs,"windowMs"),r=Gb(e.maxSamples??Ur.maxSamples,"maxSamples"),o=Ii(e.liveStaleAfterMs??Ur.liveStaleAfterMs,"liveStaleAfterMs"),i=Ii(e.replaySeekResetThresholdMs??Ur.replaySeekResetThresholdMs,"replaySeekResetThresholdMs");return Object.freeze({cadenceMs:t,windowMs:n,maxSamples:r,liveStaleAfterMs:o,replaySeekResetThresholdMs:i})}function Wb(e){let t=String(e||"").trim().toLowerCase();return Bb.has(t)||nn("INVALID_SOURCE",`unsupported Drive Insights history source: ${String(e)}`),t}function cd(e){return e==null||e===""?null:String(e)}function _i(e){return typeof e=="boolean"?e:Hb.has(String(e||"").trim().toLowerCase())}function ld(e,t="sample"){return(!e||typeof e!="object"||Array.isArray(e))&&nn("INVALID_SAMPLE",`${t} must be a normalized Drive Insights snapshot`),Cn(e.timestampMs,`${t}.timestampMs`),e}function Ds(e,t){return Math.floor(e/t)}function $b(){return typeof globalThis.performance?.now!="function"&&nn("MONOTONIC_CLOCK_UNAVAILABLE","performance.now() is required for live history status"),globalThis.performance.now()}function dd(e,t={}){let n=ud(t),r=Cn(e,"currentTimestampMs"),o=Math.max(0,r-n.windowMs),i=Math.floor((r-o)/n.cadenceMs)+1,a=Math.min(n.maxSamples,i),s=[];for(let u=a-1;u>=0;u-=1)s.push(r-u*n.cadenceMs);return Object.freeze(s)}function Ls(e={}){let t=ud(e),n=typeof e.nowMs=="function"?e.nowMs:$b,r=null,o=null,i=!1,a=null,s=!1,u=null,c=!1,l=!1,d=[],f=null,m=null,p=null,b=null,g=0,x="initial";function E(h){d=[],f=null,m=null,p=null,b=null,g+=1,x=String(h||"manual")}function y(h){o=null,i=!1,a=null,s=!1,u=null,c=!1,l=!1,r=h}function O(h={}){(!h||typeof h!="object"||Array.isArray(h))&&nn("INVALID_CONTEXT","Drive Insights history context must be an object");let S=Kn(h,"source")?Wb(h.source):r;S===null&&nn("INVALID_SOURCE","Drive Insights history source is required");let A=null;r!==null&&r!==S&&(A="source-change"),A?(E(A),y(S)):r===null&&y(S);let L=Kn(h,"routeId"),P=L?cd(h.routeId):o;!A&&r===ot.REPLAY&&i&&L&&o!==P&&(A="replay-route-change",E(A));let _=Kn(h,"connectionState"),T=_?h.connectionState:a,I=Kn(h,"connectionId"),k=I?cd(h.connectionId):u;if(!A&&r===ot.LIVE){let D=s&&_&&!_i(a)&&_i(T)&&l,B=c&&I&&u!==k;(h.reconnected===!0||D||B)&&(A="live-reconnect",E(A))}if(r===ot.REPLAY&&Kn(h,"currentTimestampMs")){let D=Cn(h.currentTimestampMs,"currentTimestampMs");!A&&b!==null&&Math.abs(D-b)>t.replaySeekResetThresholdMs&&(A="replay-seek",E(A)),b=D}return L&&(o=P,i=!0),_&&(a=T,s=!0,_i(T)&&(l=!0)),I&&(u=k,c=!0),Object.freeze({reset:A!==null,reason:A})}function C(){if(f===null)return;let h=Math.max(0,f-t.windowMs);d=d.filter(S=>S.timestampMs>=h),d.length>t.maxSamples&&(d=d.slice(-t.maxSamples))}function w(h,S={}){let A=ld(h),L=O({...S,source:ot.LIVE}),P=Cn(A.timestampMs,"sample.timestampMs"),_=Kn(S,"receivedAtMonotonicMs")?Cn(S.receivedAtMonotonicMs,"receivedAtMonotonicMs"):Cn(n(),"nowMs()");if(m!==null){let T=Ds(m,t.cadenceMs),I=Ds(P,t.cadenceMs);I{let k=ld(T,`samples[${I}]`),D=Cn(k.timestampMs,`samples[${I}].timestampMs`);DA||_.set(Ds(D,t.cadenceMs),k)}),d=[..._.entries()].sort(([T],[I])=>T-I).map(([,T])=>T).slice(-t.maxSamples),f=A,g+=1,Object.freeze({...L,window:M()})}function M(){let h=f,S=h===null?null:Math.max(0,h-t.windowMs);return Object.freeze({startTimestampMs:S,endTimestampMs:h,cadenceMs:t.cadenceMs,samples:Object.freeze([...d])})}function R(h={}){(!h||typeof h!="object"||Array.isArray(h))&&nn("INVALID_CONTEXT","Drive Insights history status options must be an object");let S=d.length?qn.FRESH:qn.MISSING,A=null;if(r===ot.LIVE&&d.length){let L=Kn(h,"nowMonotonicMs")?Cn(h.nowMonotonicMs,"nowMonotonicMs"):Cn(n(),"nowMs()"),P=p===null?Number.NaN:L-p;Number.isFinite(P)&&P>=0&&(A=P),(s&&!_i(a)||A===null||A>=t.liveStaleAfterMs)&&(S=qn.STALE)}return Object.freeze({source:r,routeId:o,connectionState:a,state:S,stale:S===qn.STALE,ageMs:A,sampleCount:d.length,generation:g,lastResetReason:x})}function v(h="manual"){return E(h),M()}return Object.freeze({config:t,setContext:O,pushLive:w,rebuildReplay:z,replayTimestamps(h){return dd(h,t)},window:M,status:R,reset:v})}var NR=Object.freeze({SOURCE:ot,STATE:qn,DEFAULTS:Ur,create:Ls,replayTimestamps:dd});function pr(e,t=0){let n=Number(e);return Number.isFinite(n)&&n>=0?n:t}function fd(e={}){let t=e.target||globalThis,n=e.nowMs||(()=>t.performance?.now?.()??Date.now()),r=e.setTimeout||t.setTimeout?.bind(t),o=e.clearTimeout||t.clearTimeout?.bind(t),i=e.requestIdleCallback||t.requestIdleCallback?.bind(t),a=e.cancelIdleCallback||t.cancelIdleCallback?.bind(t),s=e.onFlush;if(typeof r!="function"||typeof o!="function"||typeof s!="function")return null;let u=null,c=null,l=null,d=null,f=!1,m=!1,p=Math.max(1,pr(e.cadenceMs,100)),b=Math.max(1,pr(e.idleTimeoutMs,12)),g=Math.max(1,pr(e.slowFlushThresholdMs,8)),x=0,E=0,y=0,O=0,C=0;function w(){return u===null?!1:(o(u),u=null,l=null,!0)}function z(){return c===null?!1:(a?.(c),c=null,l=null,!0)}function M(){if(u=null,c=null,l=null,m||!f)return!1;f=!1;let P=pr(n());d=P,E+=1;try{s()}finally{y=Math.max(0,pr(n())-P),O=Math.max(O,y),y>g&&(C+=1)}return!0}function R(){return u=null,m||!f?(l=null,!1):typeof i=="function"&&typeof a=="function"?(c=i(M,{timeout:Math.min(p,b)}),!0):M()}function v(P=p,_={}){if(m)return!1;x+=1,f=!0,p=Math.max(1,pr(P,p));let T=pr(n()),I=_.immediate===!0||d===null?T:Math.max(T,d+p);return c!==null||u!==null&&l!==null&&l<=I||(w(),l=I,u=r(R,Math.max(0,I-T))),!0}function h(){f=!1;let P=w(),_=z();return P||_}function S(){return m||!f?!1:(w(),z(),M())}function A(){return Object.freeze({pending:f,scheduled:u!==null||c!==null,cadenceMs:p,requests:x,flushes:E,lastFlushAtMs:d,lastFlushDurationMs:y,maxFlushDurationMs:O,slowFlushes:C})}function L(){return m?!1:(m=!0,h(),!0)}return Object.freeze({request:v,cancel:h,flush:S,status:A,destroy:L})}var Ni=Object.freeze({graph:100,forward:67});function pd(e={}){return fd({cadenceMs:Ni.graph,...e})}var Ub=1.52,Yb=.5,Kb=Object.freeze(["vision","front","scc","corner","fusion","unknown"]),qb=Object.freeze(["ego","path","lanes","leads","radar","navigation","camera"]),Xb=Object.freeze({ego:Object.freeze({freshMs:500,staleMs:2e3}),path:Object.freeze({freshMs:750,staleMs:3e3}),lanes:Object.freeze({freshMs:750,staleMs:3e3}),leads:Object.freeze({freshMs:750,staleMs:3e3}),radar:Object.freeze({freshMs:750,staleMs:3e3}),navigation:Object.freeze({freshMs:5e3,staleMs:15e3}),camera:Object.freeze({freshMs:1e3,staleMs:3e3})});function gd(e){if(!e||typeof e!="object"||Object.isFrozen(e))return e;for(let t of Object.values(e))gd(t);return Object.freeze(e)}function Pe(e){return typeof e=="number"&&Number.isFinite(e)?e:null}function bd(e){let t=Pe(e);return t!==null&&t>=0&&t<=1?t:null}function Yr(e,t="timestampMs"){let n=Pe(e);if(n===null||n<0)throw new TypeError(`${t} must be a finite non-negative number`);return n}function Qb(e,t,n=!0){let r=Xb[e];if(!r)throw new RangeError(`Unknown Drive Insights freshness domain: ${e}`);let o=Pe(t);return!n||o===null||o<0||o>r.staleMs?Object.freeze({state:"missing",ageMs:null}):Object.freeze({state:o<=r.freshMs?"fresh":"stale",ageMs:o})}function ks(...e){for(let t of e){let n=Pe(t);if(n!==null)return n}return null}function md(...e){for(let t of e){if(typeof t!="string")continue;let n=t.trim();if(n)return n}return null}function Di(e,t=0){return Array.isArray(e)?e[t]:e}function Fs(e,{invertY:t=!0}={}){let n=Array.isArray(e?.x)?e.x:[],r=Array.isArray(e?.y)?e.y:[],o=Array.isArray(e?.z)?e.z:[],i=[],a=Math.min(n.length,r.length);for(let s=0;s=4?t{let i=Fs(r);return i.length?[Object.freeze({side:Zb(r,o,t.length),probability:bd(n[o]??r?.probability??r?.prob),points:i})]:[]}))}function ey(e,t){let n=Array.isArray(e?.leadsV3)?e.leadsV3:[],r=ks(Di(e?.velocity?.x),t);return Object.freeze(n.flatMap((o,i)=>{let a=Pe(Di(o?.x)),s=Pe(Di(o?.y));if(a===null||s===null)return[];let u=bd(o?.confidence??o?.probability??o?.prob);if(u!==null&&u=0?String(t):null}function oy(e){let t=e?.radarState||{},n=[],r=c=>{if(!c||c.status===!1)return;let l=Pe(c?.xM??c?.dRel),d=Pe(c?.yM??c?.yRel);l===null||d===null||n.push({value:c,xM:l,yM:d,trackKey:hd(c?.radarTrackId)})};for(let c of ty)r(t?.[c]);for(let c of ny)for(let l of Array.isArray(t?.[c])?t[c]:[])r(l);let o=new Set(n.map(({trackKey:c})=>c).filter(Boolean)),i=new Set,a=new Set,s=[],u=c=>{a.has(c.dedupeKey)||(a.add(c.dedupeKey),s.push(Object.freeze({id:c.id,source:c.source,xM:c.xM,yM:c.yM,relativeSpeedMps:c.relativeSpeedMps,measured:c.measured,selected:c.selected})))};for(let c of ry(e?.liveTracks)){let l=Pe(c?.xM??c?.dRel),d=Pe(c?.yM??c?.yRel);if(l===null||d===null)continue;let f=hd(c?.trackId),m=f!==null&&o.has(f);m&&i.add(f);let p=js(c?.entitySource??c?.radarSource,"front"),b=s.length;u({id:zs(c?.id??c?.trackId,p,b),source:p,xM:l,yM:d,relativeSpeedMps:Pe(c?.relativeSpeedMps??c?.vRel),measured:typeof c?.measured=="boolean"?c.measured:!!c?.radar,selected:m,dedupeKey:f!==null?`track:${f}`:`liveTracks:${b}`})}for(let c of n){if(c.trackKey!==null&&i.has(c.trackKey))continue;let l=c.value,d=js(l?.entitySource??l?.radarSource,"fusion"),f=s.length;u({id:zs(l?.id??l?.radarTrackId,d,f),source:d,xM:c.xM,yM:c.yM,relativeSpeedMps:Pe(l?.relativeSpeedMps??l?.vRel),measured:typeof l?.measured=="boolean"?l.measured:!!l?.radar,selected:!0,dedupeKey:c.trackKey!==null?`lead:${c.trackKey}`:`lead:${c.xM.toFixed(1)}:${c.yM.toFixed(1)}`})}return Object.freeze(s)}function Vs(e){let t=Pe(e);return t!==null&&t>=0?t:null}function iy(e,t){let n=e?.navigation||t?.navigation||e?.navInstructionCarrot,r=e?.carrotMan||t?.carrotMan||{},o=Vs(n?.distanceM),i=ks(r?.xDistToTurn,r?.xSpdDist),a=o??(i!==null&&i>=0?i:null),s=Vs(n?.speedLimitMps),u=ks(r?.xSpdLimit,r?.nRoadLimitSpeed),c=s??(u!==null&&u>0?u/3.6:null),l=md(n?.maneuverType,n?.turnType,r?.atcType,r?.szTBTMainText),d=Pe(r?.xTurnInfo),f=l||(d!==null&&d!==0?String(d):null);return a!==null&&a>0||c!==null||f!==null||md(n?.mainText,r?.naviPaths)!==null?Object.freeze({distanceM:a,speedLimitMps:c,maneuverType:f}):null}function ay(e,t){let n=t?.modelV2||{},r=t?.lateralPlan||{},o=!!e?.controlsState?.activeLaneLine||(Pe(e?.carState?.useLaneLineSpeed)??0)>0,i=Fs(r?.position);return o&&i.length>2?{points:i,service:"lateralPlan"}:{points:Fs(n?.position),service:"modelV2"}}function mr(e,...t){let n=t.map(r=>Pe(e?.[r])).filter(r=>r!==null&&r>=0);return n.length?Math.max(...n):null}function mn(e){return!!(e&&typeof e=="object")}function Pi({timestampMs:e,hudState:t={},overlayState:n={},serviceAges:r={},cameraFrameTimestampMs:o=null,forceMissing:i=!1}={}){let a=Yr(e),s=t?.carState||{},u=Object.freeze({speedMps:Pe(s?.vEgo),accelMps2:Pe(s?.aEgo),steeringAngleDeg:Pe(s?.steeringAngleDeg)}),c=ay(t,n),l=c.points,d=Jb(n?.modelV2),f=ey(n?.modelV2,u.speedMps),m=oy(n),p=iy(t,n),b=Vs(o),g=!!n?.roadCameraState&&b!==null,x=Object.freeze({available:g,frameTimestampMs:g?b:null}),E={ego:mn(t?.carState),path:mn(n?.[c.service]),lanes:mn(n?.modelV2),leads:mn(n?.modelV2),radar:mn(n?.radarState)||mn(n?.liveTracks),navigation:mn(t?.navigation)||mn(n?.navigation)||mn(t?.navInstructionCarrot)||mn(t?.carrotMan)||mn(n?.carrotMan),camera:x.available},y={ego:mr(r,"carState"),path:mr(r,c.service),lanes:mr(r,"modelV2"),leads:mr(r,"modelV2"),radar:mr(r,...n?.liveTracks?["radarState","liveTracks"]:["radarState"]),navigation:mr(r,"carrotMan","navInstructionCarrot"),camera:mr(r,"roadCameraState")},O={};for(let C of qb)O[C]=Qb(C,y[C],E[C]&&!i);return gd({timestampMs:a,ego:u,path:l,lanes:d,leads:f,radar:m,navigation:p,camera:x,freshness:O})}var sy=Object.freeze(["idle","connecting","connected","disconnected"]);function cy(e){if(!e||typeof e.snapshot!="function"||typeof e.subscribe!="function")throw new TypeError("Drive Insights live source requires a provider with snapshot/subscribe");return e}function vd(e,t){let n=Pe(e?.[t]);return n!==null?n:Pe(e?.liveRuntime)}function ly(e){let t=Pe(e?.timestampMs),n=e?.receivedAtMonotonic||{},r={};for(let o of["carState","modelV2","lateralPlan","radarState","liveTracks","carrotMan","navInstructionCarrot","roadCameraState"]){let i=vd(n,o);r[o]=t!==null&&i!==null&&t>=i?t-i:null}return r}function Hs(e){let t=sy.includes(e?.connectionState)?e.connectionState:"idle",n=typeof e?.routeId=="string"&&e.routeId.trim()?e.routeId.trim():null;return Object.freeze({routeId:n,connectionState:t})}function yd(e){if(!e||typeof e!="object")throw new TypeError("Drive Insights live provider snapshot must be an object");let t=Hs(e),n=e.receivedAtMonotonic||{};return Pi({timestampMs:e.timestampMs,hudState:e.hudState,overlayState:e.overlayState,serviceAges:ly(e),cameraFrameTimestampMs:vd(n,"roadCameraState"),forceMissing:t.connectionState!=="connected"})}function Sd({provider:e}={}){let t=cy(e),n=t.snapshot(),r=yd(n),o=n,i=Hs(n),a=!1,s=new Set,u=new Set,c=t.subscribe(b=>{if(!a){n=b&&typeof b=="object"?b:t.snapshot(),i=Hs(n);for(let g of[...u])g();if(s.size){let g=l();for(let x of[...s])x(g)}}});function l(){return o!==n&&(r=yd(n),o=n),r}function d(b){if(a)throw new Error("Drive Insights live source is destroyed");if(typeof b!="function")throw new TypeError("Drive Insights live listener must be a function");s.add(b);let g=!0;return()=>g?(g=!1,s.delete(b)):!1}function f(b){if(a)throw new Error("Drive Insights live source is destroyed");if(typeof b!="function")throw new TypeError("Drive Insights live update listener must be a function");u.add(b);let g=!0;return()=>g?(g=!1,u.delete(b)):!1}function m(){return i}function p(){return a?!1:(a=!0,s.clear(),u.clear(),typeof c=="function"&&c(),!0)}return Object.freeze({snapshot:l,subscribe:d,subscribeUpdates:f,context:m,destroy:p})}var Bs=Object.freeze(["currentTimestampMs","decodeRecord","records","routeId"]),uy=new Set(["carState","controlsState","deviceState","peripheralState","carrotMan","selfdriveState","gpsLocationExternal","longitudinalPlan","navInstructionCarrot"]),dy=new Set(["modelV2","liveCalibration","roadCameraState","lateralPlan","radarState","carControl","liveDelay","liveTorqueParameters","liveParameters","liveTracks"]);function fy(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("Drive Insights replay source input must be an object");let t=Object.keys(e).sort();if(t.length!==Bs.length||t.some((n,r)=>n!==Bs[r]))throw new TypeError(`Drive Insights replay source input must contain exactly: ${Bs.join(", ")}`);if(!Array.isArray(e.records))throw new TypeError("Drive Insights replay records must be an array");if(typeof e.decodeRecord!="function")throw new TypeError("Drive Insights replay decodeRecord must be a function");if(Yr(e.currentTimestampMs,"currentTimestampMs"),e.routeId!==null&&typeof e.routeId!="string")throw new TypeError("Drive Insights replay routeId must be a string or null");return e}function py(e){let t=-1;for(let n=0;n>1;e[a].timeMs<=t?n=a+1:r=a}let o=n>0?e[n-1]:null,i=na(d)))}function c(){return n}return Object.freeze({snapshot:s,snapshotAt:a,snapshotsAt:u,context:c})}var Ht=Object.freeze({GRAPH:"graph",FORWARD:"forward"}),Gs=new WeakMap,by=new Set(Object.values(Ht));function Ad(e){let t=String(e||"").trim().toLowerCase();return by.has(t)?t:Ht.GRAPH}function Rd(e){return String(e||"").trim().toLowerCase()===ot.REPLAY?ot.REPLAY:ot.LIVE}function hr(e,t,n){return typeof e.getUIText=="function"?e.getUIText(t,n):n}function xd(e,...t){if(typeof e?.append=="function")e.append(...t);else for(let n of t)e?.appendChild?.(n)}function yy(e,t){let n=e.createElement("section");n.className="drive-insights",n.dataset.source=ot.LIVE,n.dataset.view=Ht.GRAPH;let r=e.createElement("div");r.className="c-segmented-control drive-insights__tabs",r.setAttribute("role","tablist"),r.setAttribute("aria-label",hr(t,"web_drive_layout_content_drive_insights","Drive Insights"));let o=e.createElement("div");o.className="drive-insights__views";let i=e.createElement("div");i.className="drive-insights__view drive-insights__view--graph",i.dataset.driveInsightsPanel=Ht.GRAPH,i.setAttribute("role","tabpanel");let a=e.createElement("div");a.className="drive-insights__view drive-insights__view--forward",a.dataset.driveInsightsPanel=Ht.FORWARD,a.setAttribute("role","tabpanel"),a.hidden=!0;let s=e.createElement("div");s.className="drive-insights__state";let u=new Map;for(let[c,l,d]of[[Ht.GRAPH,"drive_insights_graph","Graphs"],[Ht.FORWARD,"drive_insights_forward","Forward"]]){let f=e.createElement("button");f.type="button",f.className="c-segmented-control__item",f.dataset.driveInsightsView=c,f.dataset.value=c,f.setAttribute("role","tab"),f.setAttribute("aria-selected",String(c===Ht.GRAPH)),f.textContent=hr(t,l,d),r.appendChild(f),u.set(c,f)}return xd(o,i,a,s),xd(n,r,o),Object.freeze({root:n,tabs:r,views:o,graph:i,forward:a,state:s,buttons:u})}function vy(e,t){if(t===Ht.GRAPH)return String(e?.freshness?.ego?.state||"missing");let n=["lanes","leads","radar"].map(r=>String(e?.freshness?.[r]?.state||"missing"));return n.includes("fresh")?"fresh":n.includes("stale")?"stale":"missing"}function Sy(e={}){let t=e.target||globalThis,n=e.document||t.document;if(!n?.createElement)return null;let r=e.dom||yy(n,t),o=e.history||Ls({nowMs:()=>Number(t.CarrotDriveLiveStateProvider?.nowMs?.()??t.performance?.now?.()??0)}),i=e.graphRenderer||sd({root:r.graph,target:t,document:n,text:(U,X)=>hr(t,U,X)}),a=e.forwardRenderer||td({root:r.forward,target:t,document:n,text:(U,X)=>hr(t,U,X)}),s=e.stateSurface||Gu({host:r.state,className:"drive-insights__status",featureLabel:()=>hr(t,"web_drive_layout_content_drive_insights","Drive Insights")},{document:n});if(!o||!i||!a||!s)return null;let u=e.setInterval||t.setInterval?.bind(t),c=e.clearInterval||t.clearInterval?.bind(t),l=[],d=!1,f=!1,m=Ad(e.initialView),p=Rd(e.source),b=null,g=null,x=null,E=null,y=null,O=null,C=e.replayInput||null,w=null,z=0,M=null;function R(){return m===Ht.FORWARD?Ni.forward:Ni.graph}let v=e.renderScheduler||pd({target:t,onFlush:()=>_()});if(!v)return null;function h(){s.show(qt.LOADING,{tone:pn.INFO,variant:wi.COVER,title:()=>hr(t,"drive_insights_waiting_title","Waiting for driving data"),description:()=>hr(t,"drive_insights_waiting_detail","Live driving information will appear here when it is available."),actions:[]})}function S(){let U=o.status({nowMonotonicMs:Math.max(0,Number(t.CarrotDriveLiveStateProvider?.nowMs?.()??0))}),X=O?vy(O,m):"missing";!O||U.state===qn.MISSING?h():s.hide(),r.root.dataset.dataState=U.state===qn.STALE?"stale":X}function A(){return f?!1:(m===Ht.GRAPH?i.render(o.window()):a.render(O),S(),!0)}function L(U=b){let X=U?.context?.();return X&&typeof X=="object"?X:{}}function P(U=b?.snapshot?.()){if(!d||p!==ot.LIVE||!U)return!1;let X=L();return O=U,o.pushLive(U,{receivedAtMonotonicMs:Number.isFinite(Number(X.receivedAtMonotonicMs))?Number(X.receivedAtMonotonicMs):Number(U.timestampMs),connectionState:X.connectionState||"connected",connectionId:X.connectionId??null,routeId:X.routeId??null,reconnected:X.reconnected===!0}),z+=1,A()}function _(){if(!d||p!==ot.LIVE)return!1;let U=M||b?.snapshot?.();return M=null,U?P(U):!1}function T(U=null,X={}){return!d||p!==ot.LIVE?!1:(U&&typeof U=="object"&&(M=U),v.request(R(),X))}function I(){if(!b||p!==ot.REPLAY)return!1;let U=L(),X=Number(U.currentTimestampMs??C?.currentTimestampMs??b.snapshot?.()?.timestampMs);if(!Number.isFinite(X)||X<0)return O=null,o.reset("replay-position-missing"),A();let pe=o.replayTimestamps(X),xe=typeof b.snapshotsAt=="function"?b.snapshotsAt(pe):pe.map(Je=>b.snapshotAt?.(Je)).filter(Boolean);return o.rebuildReplay(xe,{currentTimestampMs:X,routeId:U.routeId??C?.routeId??null}),O=b.snapshotAt?.(X)||b.snapshot?.()||null,z+=1,A()}function k(){let U=d&&p===ot.LIVE&&m===Ht.FORWARD;if(U===!!E?.active)return!1;if(!U)return E?.release?.(),E=null,!0;let X=e.activity||t.CarrotDriveDataActivity;return X?.acquire?(E=X.acquire({owner:"drive_insights_forward",tracks:!0}),!0):!1}function D(){v.cancel(),M=null,g?.(),g=null,b?.destroy?.(),b=null,x?.release?.(),x=null,E?.release?.(),E=null,y!==null&&c&&c(y),y=null}function B(){let U=e.activity||t.CarrotDriveDataActivity,X=e.provider||t.CarrotDriveLiveStateProvider;if(!U?.acquire||!X?.snapshot||!X?.subscribe)return h(),!1;if(x=U.acquire({owner:"drive_insights",hud:!0,overlay:!0}),b=(e.createLiveSource||Sd)({provider:X}),!b)return x.release(),x=null,h(),!1;k(),g=typeof b.subscribeUpdates=="function"?b.subscribeUpdates(()=>T()):b.subscribe?.(xe=>T(xe))||null;let pe=b.snapshot?.();return pe?T(pe,{immediate:!0}):h(),u&&(y=u(S,250)),!0}function W(){return!C||(b=(e.createReplaySource||Md)(C),!b)?(h(),!1):I()}function V(){return D(),o.setContext({source:p}),p===ot.LIVE?B():W()}function F(U){if(f)return!1;let X=Ad(U),pe=X!==m;m=X,r.root.dataset.view=m;for(let[xe,Je]of r.buttons){let et=xe===m;Je.setAttribute("aria-selected",String(et)),Je.classList?.toggle("is-selected",et);let ft=xe===Ht.GRAPH?r.graph:r.forward;ft.hidden=!et}return Y.sync(),k(),d&&p===ot.LIVE?T(null,{immediate:!0}):A(),pe}function H(U){let X=U.target?.closest?.("[data-drive-insights-view]");X&&r.tabs.contains?.(X)&&F(X.dataset.driveInsightsView)}let Y=e.segmented||ku(r.tabs,{itemSelector:"[data-drive-insights-view]",selectedAttribute:"aria-selected",activation:"automatic",onActivate(U){F(U?.dataset?.driveInsightsView)}});if(!Y)return null;r.tabs.addEventListener("click",H),l.push([r.tabs,"click",H]),F(m);function $(U={}){if(f)return!1;let X=Rd(U.source||p),pe=X!==p;return p=X,r.root.dataset.source=p,d&&!pe?!1:(d=!0,r.root.dataset.active="true",V(),!0)}function K(){return f||!d?!1:(d=!1,r.root.dataset.active="false",D(),!0)}function Z(U){return f?!1:m===Ht.GRAPH?i.resize(U):a.resize(U)}function ee(U){return f?!1:(C=U&&typeof U=="object"?U:null,d&&p===ot.REPLAY&&V(),!!C)}function ue(){let U=Number(t.CarrotDriveLiveStateProvider?.nowMs?.()??0);return Object.freeze({active:d,destroyed:f,source:p,view:m,generation:z,lastError:w?String(w.message||w):"",history:o.status({nowMonotonicMs:Math.max(0,U)}),graph:i.status(),forward:a.status(),stateSurface:s.snapshot(),renderScheduler:v.status(),leaseActive:!!x?.active,trackLeaseActive:!!E?.active})}function de(){if(f)return!1;K(),f=!0;for(let[U,X,pe]of l.splice(0))U.removeEventListener?.(X,pe);return Y.destroy(),s.destroy(),v.destroy(),i.destroy(),a.destroy(),o.reset("runtime-destroyed"),r.root.remove?.(),Gs.delete(t),!0}return Object.freeze({root:r.root,activate:$,deactivate:K,resize:Z,setView:F,setReplayInput:ee,render:A,status:ue,destroy:de})}function Ws(e={}){let t=e.target||globalThis,n=Gs.get(t);if(n)return n;let r=Sy({...e,target:t});return r&&Gs.set(t,r),r}function Ed(e=globalThis,t={}){let n=Ws({...t,target:e});return e.DriveInsightsRuntime=n,n}var ko="drive_insights",JR=Object.freeze(["primary","secondary"]),ex=Object.freeze(["live","replay"]),Li=new WeakMap;function Td(e){return e.target||globalThis}function My(e={}){let t=Td(e),n=e.driveContentApi||t.DriveContent,r=e.runtime||Ws({...e,target:t});if(typeof n?.create!="function"||!r?.root)return null;let o=null,i=String(e.context?.source||e.source||"live"),a=n.create(ko,{mount(s){if(!s||typeof s.appendChild!="function")throw new TypeError("Drive Insights content requires a slot host");r.root.parentNode!==s&&s.appendChild(r.root),o=s},activate(s={}){return i=String(s.source||i||"live"),r.activate({...s,source:i})},deactivate(s={}){return r.deactivate(s)},resize(s){return r.resize(s)},status(){return{source:i,mountedHostId:String(o?.id||""),runtime:r.status()}},destroy(){r.destroy(),o=null,Li.get(t)===a&&Li.delete(t)}});return a}function Ay(e={}){let t=Td(e),n=Li.get(t);if(n)return n;let r=My({...e,target:t});return r&&Li.set(t,r),r}function Od(e={}){return function(n={}){let r=e.target||globalThis;return Ay({...e,target:r,context:n,source:n.source})}}function $s(e=globalThis,t=null){return e.DriveContentInsights=t,t}var Cd=Object.freeze({driveInsights:!0,replayGraphs:!0,replayForward:!0});var wd="navigation",ux=Object.freeze([Gr,wd,ko]);function Ry(e){let t=e.DriveContent;return typeof t?.create!="function"?null:t.create(ko,{mount(){},activate(){return!0},deactivate(){return!0},resize(){return!1},status(){return{temporarilyDisabled:!0}},destroy(){}})}function xy(e=globalThis,t={}){let n=vs({...t.vision||{},target:e}),r=Lu({...t.navigation||{},target:e}),o={...t.driveInsights||{},target:e},i=Od(o);return Object.freeze({[Gr](a={}){let s=n.factory(a);return s?Nu(e,{content:s}):null},[wd](a={}){let s=r(a);return s?Wr(e,s):null},[ko](a={}){if(!Cd.driveInsights)return $s(e,Ry(e));let s=o.runtime||Ed(e,o);if(!s)return null;o.runtime&&(e.DriveInsightsRuntime=s);let u=i(a);return u?$s(e,u):null}})}function Id(e,t=globalThis,n={}){let r=xy(t,n),o=$c(e,r);return Uc(o,t),o}var Ey="carrot:drivestatechange",_d="liveRuntime",Xn=class extends Error{constructor(t,n){super(n),this.name="LiveStateProviderError",this.code=t}};function ki(e){if(!e||typeof e!="object")return!1;for(let t in e)return!0;return!1}function zn(e,t){let n=e&&typeof e=="object"?e:{},r=t&&typeof t=="object"?t:{};return n===r||!ki(r)?n:ki(n)?{...r,...n}:r}function Kr(e,t){let n=e&&typeof e=="object"?e:{};if(!t||typeof t!="object")return n;let r=null;for(let[o,i]of Object.entries(t))i!=null&&(r||(r={...n}),r[o]=i);return r||n}function Ty(e,t){let n=e&&typeof e=="object"?e:{},r=t&&typeof t=="object"?t:{};return n===r||!ki(r)?n:ki(n)?{...r,...n,leadOne:Kr(r.leadOne,n.leadOne),leadTwo:Kr(r.leadTwo,n.leadTwo),leadLeft:Kr(r.leadLeft,n.leadLeft),leadRight:Kr(r.leadRight,n.leadRight),leadsLeft:Array.isArray(n.leadsLeft)&&n.leadsLeft.length?n.leadsLeft:r.leadsLeft,leadsCenter:Array.isArray(n.leadsCenter)&&n.leadsCenter.length?n.leadsCenter:r.leadsCenter,leadsRight:Array.isArray(n.leadsRight)&&n.leadsRight.length?n.leadsRight:r.leadsRight}:r}function Oy(e,t,n,r){let o=e?.refs;return!!(o&&o.rawHudState===t&&o.rawOverlayState===n&&o.liveServices===r&&o.rawCarState===t?.carState&&o.rawControlsState===t?.controlsState&&o.rawDeviceState===t?.deviceState&&o.rawPeripheralState===t?.peripheralState&&o.rawSelfdriveState===t?.selfdriveState&&o.rawGpsLocationExternal===t?.gpsLocationExternal&&o.rawLongitudinalPlan===t?.longitudinalPlan&&o.rawCarrotMan===t?.carrotMan&&o.rawNavInstructionCarrot===t?.navInstructionCarrot&&o.rawNavRoute===t?.navRoute&&o.rawModelV2===n?.modelV2&&o.rawLiveCalibration===n?.liveCalibration&&o.rawRoadCameraState===n?.roadCameraState&&o.rawRadarState===n?.radarState&&o.rawLateralPlan===n?.lateralPlan&&o.rawCarControl===n?.carControl&&o.rawLiveDelay===n?.liveDelay&&o.rawLiveTorqueParameters===n?.liveTorqueParameters&&o.rawLiveParameters===n?.liveParameters&&o.rawLiveTracks===n?.liveTracks&&o.rawCameraOdometry===n?.cameraOdometry&&o.rawLivePose===n?.livePose&&o.rawCarrotNavi===n?.carrotNavi&&o.liveCarState===r?.carState&&o.liveControlsState===r?.controlsState&&o.liveDeviceState===r?.deviceState&&o.liveSelfdriveState===r?.selfdriveState&&o.liveLongitudinalPlan===r?.longitudinalPlan&&o.liveCarrotMan===r?.carrotMan&&o.liveNavInstructionCarrot===r?.navInstructionCarrot&&o.liveNavRoute===r?.navRoute&&o.liveLateralPlan===r?.lateralPlan&&o.liveRadarState===r?.radarState&&o.liveLiveCalibration===r?.liveCalibration&&o.liveRoadCameraState===r?.roadCameraState)}function Cy(e,t,n){return{rawHudState:e,rawOverlayState:t,liveServices:n,rawCarState:e?.carState,rawControlsState:e?.controlsState,rawDeviceState:e?.deviceState,rawPeripheralState:e?.peripheralState,rawSelfdriveState:e?.selfdriveState,rawGpsLocationExternal:e?.gpsLocationExternal,rawLongitudinalPlan:e?.longitudinalPlan,rawCarrotMan:e?.carrotMan,rawNavInstructionCarrot:e?.navInstructionCarrot,rawNavRoute:e?.navRoute,rawModelV2:t?.modelV2,rawLiveCalibration:t?.liveCalibration,rawRoadCameraState:t?.roadCameraState,rawRadarState:t?.radarState,rawLateralPlan:t?.lateralPlan,rawCarControl:t?.carControl,rawLiveDelay:t?.liveDelay,rawLiveTorqueParameters:t?.liveTorqueParameters,rawLiveParameters:t?.liveParameters,rawLiveTracks:t?.liveTracks,rawCameraOdometry:t?.cameraOdometry,rawLivePose:t?.livePose,rawCarrotNavi:t?.carrotNavi,liveCarState:n?.carState,liveControlsState:n?.controlsState,liveDeviceState:n?.deviceState,liveSelfdriveState:n?.selfdriveState,liveLongitudinalPlan:n?.longitudinalPlan,liveCarrotMan:n?.carrotMan,liveNavInstructionCarrot:n?.navInstructionCarrot,liveNavRoute:n?.navRoute,liveLateralPlan:n?.lateralPlan,liveRadarState:n?.radarState,liveLiveCalibration:n?.liveCalibration,liveRoadCameraState:n?.roadCameraState}}function wy(e,t,n,r=null){if(Oy(r,e,t,n))return r.result;let o=Ty(t?.radarState,n?.radarState),i=Kr(n?.liveCalibration,t?.liveCalibration),a=Kr(n?.roadCameraState,t?.roadCameraState),s={...e,carState:zn(e?.carState,n?.carState),controlsState:zn(e?.controlsState,n?.controlsState),deviceState:zn(e?.deviceState,n?.deviceState),selfdriveState:zn(e?.selfdriveState,n?.selfdriveState),longitudinalPlan:zn(e?.longitudinalPlan,n?.longitudinalPlan),carrotMan:zn(e?.carrotMan,n?.carrotMan),navInstructionCarrot:zn(e?.navInstructionCarrot,n?.navInstructionCarrot),navRoute:zn(e?.navRoute,n?.navRoute),lateralPlan:zn(t?.lateralPlan,n?.lateralPlan),radarState:o},u={...t,liveCalibration:i,roadCameraState:a,radarState:s.radarState,lateralPlan:s.lateralPlan,carrotMan:s.carrotMan},c={brokerServices:n,hudState:s,overlayState:u};return r&&(r.refs=Cy(e,t,n),r.result=c),c}function Iy(e){let t=e?.performance||globalThis.performance;if(!t||typeof t.now!="function")throw new Xn("CLOCK_UNAVAILABLE","performance.now is required for live state");return t.now.bind(t)}function _y(e){let t=[e?.routeId,e?.meta?.routeId,e?.runtime?.routeId,e?.services?.navRoute?.routeId];for(let n of t){let r=String(n??"").trim();if(r)return r}return null}function Ny(e={}){let t=e.target||globalThis,n=typeof e.nowMs=="function"?e.nowMs:Iy(t),r=e.getHudState||(()=>t.CarrotHudState||{}),o=e.getOverlayState||(()=>t.CarrotOverlayState||{}),i=e.getLiveRuntimeState||(()=>t.CarrotLiveRuntimeState||{}),a=e.isReplayActive||(()=>!!t.CarrotVisionReplay?.isActive?.()),s=e.getActivity||(()=>t.CarrotDriveDataActivity||null),u=e.getCompactActive||(()=>!!t.CarrotVisionCompactStateActive),c=new Set,l=Object.create(null),d={refs:null,result:null},f=!1,m=!1,p=Number.NEGATIVE_INFINITY;function b(){let A=Number(n());if(!Number.isFinite(A)||A<0)throw new Xn("INVALID_CLOCK","live state clock must return a finite non-negative number");if(ANumber.isFinite(T)).some(T=>T===A);return u()||L?.ok===!0||_?"connected":s()?.isActive?.()?"connecting":m?"disconnected":"idle"}function E(A){let L=r()||{},P=o()||{},_=i()||{},T=a()?{}:_.services&&typeof _.services=="object"?_.services:{},I=wy(L,P,T,d),k={timestampMs:A,hudState:I.hudState,overlayState:I.overlayState,receivedAtMonotonic:Object.freeze({...l}),connectionState:x(A,_),routeId:_y(_)};return Object.defineProperty(k,"brokerServices",{value:I.brokerServices,enumerable:!1,configurable:!1,writable:!1}),Object.freeze(k)}let y=E(b());p=y.timestampMs;function O(A){if(f)throw new Xn("PROVIDER_DESTROYED",`live state provider cannot ${A} after destroy`)}function C(A){let L=E(A);p=A,y=L;for(let P of Array.from(c))try{P(y)}catch(_){t?.console?.error?.("[drive live state] listener failed",_)}return typeof t?.dispatchEvent=="function"&&typeof t?.CustomEvent=="function"&&t.dispatchEvent(new t.CustomEvent(Ey,{detail:y})),y}function w(A,L={}){return z([A],L)}function z(A,L={}){O("note service receipt");let P=Array.from(new Set((Array.isArray(A)?A:[A]).map(T=>String(T||"").trim()).filter(Boolean)));if(!P.length)throw new Xn("INVALID_SERVICE","live state service name is required");let _=b();if(L?.clear===!0){if(P.includes("*"))for(let T of Object.keys(l))T!==_d&&delete l[T];else for(let T of P)delete l[T];d.refs=null,d.result=null}else{for(let T of P)l[T]=_;m=!0}return C(_)}function M(A={}){O("note live runtime receipt");let L=b(),P=i()||{};return A?.received!==!1&&P.ok===!0&&(l[_d]=L,m=!0),C(L)}function R(){return y}function v(A){if(O("subscribe"),typeof A!="function")throw new Xn("INVALID_LISTENER","live state listener must be a function");c.add(A);let L=!0;return()=>L?(L=!1,c.delete(A)):!1}function h(){return f?!1:(f=!0,c.clear(),S?.(),S=null,d.refs=null,d.result=null,!0)}let S=s()?.subscribe?.(()=>{f||C(b())})||null;return Object.freeze({nowMs:g,noteServiceReceived:w,noteServicesReceived:z,noteLiveRuntimeReceived:M,snapshot:R,subscribe:v,destroy:h})}function Nd(e=globalThis,t={}){let n=e?.CarrotDriveLiveStateProvider;if(n&&typeof n.snapshot=="function"&&typeof n.subscribe=="function")return n;let r=Ny({...t,target:e});return e.CarrotDriveLiveStateProvider=r,r}var Fo=Object.freeze(["hud","overlay","tracks","ar"]),Dd=Object.freeze(["hud","overlay"]),Us="carrot:drivedataactivitychange",qr=class extends Error{constructor(t,n){super(n),this.name="DriveDataActivityError",this.code=t}};function Dy(e={}){if(e==="hud+overlay")return Dd;if(typeof e=="string"&&(e={[e]:!0}),Array.isArray(e)&&(e=Object.fromEntries(e.map(r=>[r,!0]))),!e||typeof e!="object")throw new qr("INVALID_LEASE","drive data lease options must be an object");let n=Fo.some(r=>Object.prototype.hasOwnProperty.call(e,r))?Fo.filter(r=>e[r]===!0):Dd;if(!n.length)throw new qr("EMPTY_LEASE","drive data lease must request at least one channel");return Object.freeze(n)}function Py(e,t){typeof e?.dispatchEvent!="function"||typeof e?.CustomEvent!="function"||e.dispatchEvent(new e.CustomEvent(Us,{detail:t}))}function Ly(e={}){let t=e.target||globalThis,n=String(e.eventName||Us),r=new Map,o=new Set,i=Object.fromEntries(Fo.map(O=>[O,0])),a=0,s=0,u=!1,c=Object.freeze({revision:s,active:!1,leaseCount:0,counts:Object.freeze({...i})});function l(O){if(u)throw new qr("ACTIVITY_DESTROYED",`drive data activity cannot ${O} after destroy`)}function d(){s+=1,c=Object.freeze({revision:s,active:r.size>0,leaseCount:r.size,counts:Object.freeze({...i})});for(let O of Array.from(o))try{O(c)}catch(C){t?.console?.error?.("[drive data activity] listener failed",C)}return n===Us?Py(t,c):typeof t?.dispatchEvent=="function"&&typeof t?.CustomEvent=="function"&&t.dispatchEvent(new t.CustomEvent(n,{detail:c})),c}function f(O){let C=r.get(O);if(!C)return!1;r.delete(O);for(let w of C.channels)i[w]-=1;return d(),!0}function m(O={}){l("acquire");let C=Dy(O),w=`drive-data-${++a}`,z=String(O?.owner||"anonymous"),M=Object.freeze({id:w,owner:z,channels:C});r.set(w,M);for(let v of C)i[v]+=1;d();let R=!1;return Object.freeze({id:w,owner:z,channels:C,get active(){return!R&&r.has(w)},release(){return R?!1:(R=!0,f(w))}})}function p(O){let C=typeof O=="string"?O:O?.id;return C?f(C):!1}function b(O=null){return O==null?r.size>0:Fo.includes(O)?i[O]>0:!1}function g(){return Object.freeze({...i})}function x(){return c}function E(O){if(l("subscribe"),typeof O!="function")throw new qr("INVALID_LISTENER","drive data activity listener must be a function");o.add(O);let C=!0;return()=>C?(C=!1,o.delete(O)):!1}function y(){if(u)return!1;u=!0;let O=r.size>0;r.clear();for(let C of Fo)i[C]=0;return O&&d(),o.clear(),!0}return Object.freeze({acquire:m,release:p,isActive:b,counts:g,snapshot:x,subscribe:E,destroy:y})}function Pd(e=globalThis,t={}){let n=e?.CarrotDriveDataActivity;if(n&&typeof n.acquire=="function"&&typeof n.isActive=="function")return n;let r=Ly({...t,target:e});return e.CarrotDriveDataActivity=r,r}function Qe(e,t,n){return Math.max(t,Math.min(n,e))}function it(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Bt(e){return!!e?.meta?.present}function Fi(e,t,n,r=12){let o=Math.max(0,Math.floor(it(t))),i=Math.max(0,Math.floor(it(n))),a=Qe(Math.floor(it(r,12)),0,255);if(!e||o<1||i<1||e.length=s?{top:s,bottom:u+1}:null}function wn(e){let t=Math.max(0,it(e));if(t>=1e3){let n=t/1e3;return`${n>=10?n.toFixed(0):n.toFixed(1)}km`}return`${Math.round(t)}m`}function Ys(e){let t=Math.max(0,it(e));return t?new Date(Date.now()+t*1e3).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",hour12:!1}):""}function Nt(e,t,n,r,o,i){let a=Math.min(Math.max(0,i),r*.5,o*.5);e.beginPath(),e.moveTo(t+a,n),e.arcTo(t+r,n,t+r,n+o,a),e.arcTo(t+r,n+o,t,n+o,a),e.arcTo(t,n+o,t,n,a),e.arcTo(t,n,t+r,n,a),e.closePath()}var Ld=Object.freeze({DPR_LIMIT:2,TBT_CURRENT_BOTTOM_TRANSPARENT_PX:24,TBT_STACK_OVERLAP_PX:6,clamp:Qe,finite:it,recordPresent:Bt,findAlphaRowBounds:Fi,formatDistance:wn,formatClock:Ys,roundedRect:Nt});function kd(e=globalThis){return e.CarrotNaviOverlayPrimitives=Ld,Ld}function Fd(e){let t=`${e?.nearDirection||""} ${e?.mainText||""}`.toLowerCase();return/유턴|u-?turn/.test(t)?"↶":/왼|left/.test(t)?"↰":/오른|우회|right/.test(t)?"↱":"↑"}var Ks=class{constructor(t){this.canvas=t,this.context=t?.getContext("2d",{alpha:!0})||null,this.images=new Map,this.measureCanvas=null,this.measureContext=null,this.visibleRowCache=new Map,this.nativeImageSession=!1,this.state=null,this.footerState=null,this.displayStatus=null,this.renderRequest=0,this.renderSuspended=!1}setState(t){this.state=t&&typeof t=="object"?t:null,this.requestRender()}setFooterState(t){this.footerState=t&&typeof t=="object"?t:null,this.requestRender()}setStatus(t){this.displayStatus=t&&typeof t=="object"?t:null,this.requestRender()}setImage(t,n,r=0){if(!t||!n)return;this.nativeImageSession=!0;let o=this.images.get(t);if(o&&Number(r){this.renderRequest=0,this.render()}))}renderNow(){return!this.context||this.renderSuspended?!1:(this.renderRequest&&cancelAnimationFrame(this.renderRequest),this.renderRequest=0,this.render(),!0)}image(t){return this.images.get(t)?.source||null}measureVisibleRows(t,n){if(t!=="tbt_current_full"&&t!=="tbt_current_compact"&&t!=="tbt_next")return null;let r=Math.round(it(n?.width||n?.videoWidth)),o=Math.round(it(n?.height||n?.videoHeight));if(r<1||o<1||typeof document>"u"||typeof document.createElement!="function")return null;let i=`${t}:${r}x${o}`,a=this.visibleRowCache.get(i);if(a)return a;try{if(this.measureCanvas||(this.measureCanvas=document.createElement("canvas"),this.measureContext=this.measureCanvas.getContext("2d",{alpha:!0,willReadFrequently:!0})),!this.measureContext)return null;this.measureCanvas.width=r,this.measureCanvas.height=o,this.measureContext.clearRect(0,0,r,o),this.measureContext.drawImage(n,0,0,r,o);let s=this.measureContext.getImageData(0,0,r,o).data,u=Fi(s,r,o);return u&&this.visibleRowCache.set(i,u),u}catch{return null}}snapshot(){return{activeImages:Array.from(this.images.keys()).sort(),nativeImageSession:this.nativeImageSession,hasState:!!this.state,hasFooterRoute:Bt(this.footerState?.route),hasFooterVehicle:Bt(this.footerState?.vehicle),displayStatus:this.displayStatus?.mode||""}}imageGeometry(t,n,r={}){let o=this.images.get(t),i=o?.source;if(!i)return null;let a=it(i.width||i.videoWidth),s=it(i.height||i.videoHeight);if(a<1||s<1||n.width<1||n.height<1)return null;let u=Math.min(n.width/a,n.height/s),c=a*u,l=s*u,d=Qe(it(r.alignX,.5),0,1),f=Qe(it(r.alignY,.5),0,1),m=n.x+(n.width-c)*d,p=n.y+(n.height-l)*f;return{source:i,x:m,y:p,width:c,height:l,visibleRows:o?.visibleRows||null}}drawImage(t,n,r={}){if(!this.context)return null;let o=this.imageGeometry(t,n,r);if(!o)return null;try{return this.context.drawImage(o.source,o.x,o.y,o.width,o.height),o}catch{return null}}drawOutlinedText(t,n,r,o,i={}){if(!this.context||!t)return;let a=this.context;a.save(),a.font=`${i.weight||800} ${Math.max(10,o)}px system-ui, -apple-system, sans-serif`,a.textAlign=i.align||"left",a.textBaseline=i.baseline||"alphabetic",a.lineJoin="round",a.strokeStyle=i.stroke||"rgba(0, 0, 0, 0.88)",a.lineWidth=Math.max(2,o*.13),a.fillStyle=i.color||"#fff";let s=Number(i.maxWidth);Number.isFinite(s)&&s>0?(a.strokeText(String(t),n,r,s),a.fillText(String(t),n,r,s)):(a.strokeText(String(t),n,r),a.fillText(String(t),n,r)),a.restore()}drawGuidanceFallback(t,n,r){let o=this.state?.guidanceCurrent;if(!Bt(o))return null;let i=this.context,a=Math.min(t*.62,330),s=Math.min(n*.22,118);i.save(),Nt(i,r,r,a,s,14),i.fillStyle="rgba(4, 33, 27, 0.88)",i.fill(),i.strokeStyle="rgba(116, 255, 210, 0.28)",i.lineWidth=1,i.stroke(),i.restore(),this.drawOutlinedText(Fd(o),r+18,r+s*.52,Qe(s*.42,30,48)),this.drawOutlinedText(wn(o.distanceM),r+70,r+s*.46,Qe(s*.32,24,38));let u=o.mainText||o.roadName||o.nearDirection;return this.drawOutlinedText(u,r+70,r+s*.78,Qe(s*.16,13,19),{color:"rgba(255,255,255,0.9)",maxWidth:a-84}),{x:r,y:r,width:a,height:s}}drawNextGuidanceFallback(t,n,r,o){let i=this.state?.guidanceNext;if(!Bt(i))return!1;let a=this.context;return a.save(),Nt(a,t,n,r,o,12),a.fillStyle="rgba(8, 14, 20, 0.84)",a.fill(),a.strokeStyle="rgba(255, 255, 255, 0.16)",a.stroke(),a.restore(),this.drawOutlinedText(Fd(i),t+15,n+o*.68,o*.5),this.drawOutlinedText(wn(i.distanceM),t+54,n+o*.43,Qe(o*.28,15,22)),this.drawOutlinedText(i.mainText||i.roadName||i.nearDirection,t+54,n+o*.75,Qe(o*.2,12,16),{color:"rgba(255,255,255,0.8)",maxWidth:r-65}),!0}drawGuidanceStack(t,n,r,o,i=!0){let a=o&&this.image("tbt_current_compact")?"tbt_current_compact":this.image("tbt_current_full")?"tbt_current_full":"tbt_current_compact",s={x:r,y:r,width:Math.min(t*(o?.72:.58),o?350:500),height:Math.min(n*(o?.29:.2),o?160:112)},u=this.drawImage(a,s,{alignX:0,alignY:0})||(i?this.drawGuidanceFallback(t,n,r):null),c=it(u?.source?.height||u?.source?.videoHeight),l=c>0?u.height/c:0,d=Math.min(u?u.width*.58:t*.38,t*.42,230),f={x:u?.x??r,y:0,width:d,height:Math.min(n*.15,82)},m=u?u.y+(u.visibleRows?u.visibleRows.bottom*l:Math.max(0,u.height-24*l)):r,p=this.imageGeometry("tbt_next",f,{alignX:0,alignY:0}),b=it(p?.source?.height||p?.source?.videoHeight),g=b>0?p.height/b:0,x=p?.visibleRows?p.visibleRows.top*g:0;f.y=u?m-x-6:r;let E=this.drawImage("tbt_next",f,{alignX:0,alignY:0});return!E&&i&&this.drawNextGuidanceFallback(f.x,f.y,f.width,f.height),{current:u,next:E}}drawSafetyFallback(t,n,r){let o=this.state?.speed;if(!Bt(o)||!o.roadLimitValid&&!o.sectionActive&&!o.sdiPresent)return;let i=this.context,a=Qe(Math.min(t,n)*.055,24,38),s=r+a,u=n*.66;if(o.sectionActive){let l=Math.min(t*.36,230),d=Math.min(n*.2,104),f=u-a-9;i.save(),Nt(i,r,f,l,d,14),i.fillStyle="rgba(7, 12, 18, 0.88)",i.fill(),i.strokeStyle=o.sectionOffRoute?"#ff9b45":"rgba(255,255,255,0.18)",i.stroke(),Nt(i,r+10,f+d-14,l-20,5,3),i.fillStyle="rgba(255,255,255,0.16)",i.fill();let m=Qe(it(o.sectionProgress),0,1);m>0&&(Nt(i,r+10,f+d-14,(l-20)*m,5,3),i.fillStyle=o.sectionSuspended?"#ffb54a":"#47d79a",i.fill()),i.restore();let p=o.sectionSuspended?"구간단속 일시정지":o.sectionOffRoute?"구간 이탈":"구간단속",b=r+a*2+12;this.drawOutlinedText(p,b,f+31,13,{color:"rgba(255,255,255,.82)",maxWidth:l-a*2-22}),this.drawOutlinedText(`평균 ${Math.round(it(o.sectionAverageKph))} · ${wn(o.sectionRemainingDistanceM)}`,b,f+58,14,{maxWidth:l-a*2-22})}let c=o.roadLimitKph||o.sdiSpeedLimitKph||o.sectionSpeedLimitKph;c&&(i.save(),i.beginPath(),i.arc(s,u,a,0,Math.PI*2),i.fillStyle="#fff",i.fill(),i.lineWidth=Math.max(5,a*.18),i.strokeStyle="#ef3340",i.stroke(),i.restore(),this.drawOutlinedText(String(c),s,u+a*.25,a*.8,{align:"center",color:"#12151a",stroke:"rgba(255,255,255,0)"}),o.sdiPresent&&o.sdiDistanceM>0&&this.drawOutlinedText(wn(o.sdiDistanceM),s,u+a+23,15,{align:"center"}))}drawTrafficFallback(t,n){let r=this.state?.trafficSignal;if(!Bt(r)||!r.visible)return;let o=[[r.redValid,r.redOn,r.redRemainSec,"#ff4b55","●"],[r.leftValid,r.leftOn,r.leftRemainSec,"#43df83","←"],[r.greenValid,r.greenOn,r.greenRemainSec,"#43df83","↑"],[r.rightValid,r.rightOn,r.rightRemainSec,"#43df83","→"],[r.uturnValid,r.uturnOn,r.uturnRemainSec,"#43df83","↶"]].filter(d=>d[0]);if(!o.length)return;let i=this.context,a=o.length*38+18,s=t-n-a,u=n;i.save(),Nt(i,s,u,a,50,14),i.fillStyle="rgba(7, 12, 18, 0.86)",i.fill(),o.forEach((d,f)=>{let m=s+28+f*38;i.beginPath(),i.arc(m,u+18,10,0,Math.PI*2),i.fillStyle=d[1]?d[3]:"rgba(255,255,255,0.16)",i.fill(),this.drawOutlinedText(d[4],m,u+23,13,{align:"center",color:"#fff",stroke:"rgba(0,0,0,.55)"}),d[2]>0&&this.drawOutlinedText(String(d[2]),m,u+43,12,{align:"center"})}),i.restore();let c=r.uiCounterValid?r.uiCounterRemainSec:0,l=[r.distanceM>0?wn(r.distanceM):"",c>0?`${c}초`:""].filter(Boolean).join(" · ");l&&this.drawOutlinedText(l,t-n,u+68,13,{align:"right",color:"rgba(255,255,255,.82)"})}drawLaneFallback(t,n){let r=Bt(this.state?.laneCurrent)?this.state.laneCurrent:Array.isArray(this.state?.laneAhead)?this.state.laneAhead.find(Bt):null;if(!r||!r.visible||r.count<1)return!1;let o=this.context,i=Qe(Math.round(it(r.count)),1,8),a=Math.min(t*.48,300),s=Math.min(n*.17,92),u=(t-a)*.5,c=n-s-8,l=4,d=(a-20-l*(i-1))/i;o.save(),Nt(o,u,c,a,s,13),o.fillStyle="rgba(5, 9, 14, 0.78)",o.fill();for(let f=0;f0,p=u+10+f*(d+l);Nt(o,p,c+12,d,s-30,7),o.fillStyle=m?"rgba(73, 218, 157, 0.82)":"rgba(255,255,255,0.13)",o.fill(),this.drawOutlinedText("↑",p+d*.5,c+s*.57,Qe(d*.72,15,28),{align:"center"})}return o.restore(),r.distanceM>0&&this.drawOutlinedText(wn(r.distanceM),t*.5,c+s-5,12,{align:"center"}),!0}drawCrossroadFallback(t,n,r){let o=this.state?.crossroad;if(!Bt(o)||!o.visible)return!1;let i=Math.min(t*.28,160),a=50,s=t-r-i,u=n*.2,c=this.context;return c.save(),Nt(c,s,u,i,a,13),c.fillStyle="rgba(13, 19, 27, .88)",c.fill(),c.strokeStyle="rgba(103, 190, 255, .45)",c.stroke(),c.restore(),this.drawOutlinedText("교차로",s+12,u+21,14,{color:"rgba(255,255,255,.72)"}),this.drawOutlinedText(wn(o.distanceM),s+12,u+42,18,{maxWidth:i-24}),!0}drawCrossroadOverlay(t,n,r,o,i=!0){let a=["crossroad_expanded","crossroad_minimized"];for(let s of a){if(!this.image(s))continue;let c=s==="crossroad_expanded"?{x:t*(o?.46:.42),y:Math.max(r,n*(o?.2:.16)),width:Math.max(1,t*(o?.54:.58)-r),height:n*(o?.58:.62)}:{x:t*.7,y:Math.max(r,n*.16),width:Math.max(1,t*.3-r),height:n*.48},l=this.drawImage(s,c,{alignX:1,alignY:.5});if(l)return{name:s,bounds:l}}return i&&this.drawCrossroadFallback(t,n,r),null}drawNavigationStatus(t,n,r,o=!0){if(o&&this.state?.navigationStatus?.offRoute){let p=Math.min(t*.38,220),b=(t-p)*.5,g=this.context;g.save(),Nt(g,b,r,p,38,19),g.fillStyle="rgba(151, 72, 14, .9)",g.fill(),g.restore(),this.drawOutlinedText("경로 이탈 · 재탐색 중",t*.5,r+25,14,{align:"center"})}let i=this.displayStatus;if(!i?.mode||i.mode==="live")return;let a={disconnected:["내비 연결 끊김","TMAP 수신을 기다리는 중"],stalled:["지도 영상 멈춤","수신 복구를 시도하는 중"],waiting:["지도 영상 대기 중","첫 화면을 기다리는 중"]},[s,u]=a[i.mode]||[String(i.title||"내비 상태 확인"),String(i.detail||"")],c=Math.min(t*.56,330),l=92,d=(t-c)*.5,f=(n-l)*.5,m=this.context;m.save(),Nt(m,d,f,c,l,16),m.fillStyle="rgba(5, 9, 14, .9)",m.fill(),m.strokeStyle=i.mode==="stalled"?"#ffb34d":"rgba(255,255,255,.24)",m.stroke(),m.restore(),this.drawOutlinedText(s,t*.5,f+38,20,{align:"center",color:i.mode==="stalled"?"#ffbd68":"#fff"}),this.drawOutlinedText(u,t*.5,f+66,13,{align:"center",color:"rgba(255,255,255,.68)"})}drawRouteProgress(t,n,r){let o=this.state?.route;if(!Bt(o)||it(o.totalDistanceM)<=0)return;let i=Math.min(t*.42,260),a=Qe(it(o.movedDistanceM)/it(o.totalDistanceM),0,1),s=this.context;s.save(),Nt(s,r,n-7,i,3,2),s.fillStyle="rgba(255,255,255,.2)",s.fill(),a>0&&(Nt(s,r,n-7,i*a,3,2),s.fillStyle="#4ad89c",s.fill()),s.restore()}render(){let t=this.context,n=this.canvas;if(!t||!n)return;let r=n.getBoundingClientRect(),o=Math.max(1,Math.round(r.width)),i=Math.max(1,Math.round(r.height)),a=Qe(window.devicePixelRatio||1,1,2),s=Math.max(1,Math.round(o*a)),u=Math.max(1,Math.round(i*a));(n.width!==s||n.height!==u)&&(n.width=s,n.height=u),t.setTransform(a,0,0,a,0,0),t.clearRect(0,0,o,i);let c=Qe(o*.022,9,16),l=Qe(o*.015,8,14),d=Qe(i*.015,6,10),f=this.nativeImageSession,m=o<520;if(this.drawGuidanceStack(o,i,0,m,!f),!this.drawImage("traffic_signal",{x:o-l-Math.min(o*.32,230),y:l,width:Math.min(o*.32,230),height:Math.min(i*.17,98)},{alignX:1,alignY:0})&&!f&&this.drawTrafficFallback(o,c),this.drawCrossroadOverlay(o,i,l,m,!f),!m){let A=o*.5;this.drawImage("center_tbt_icon",{x:A-112,y:i*.16,width:92,height:92},{alignX:1}),this.drawImage("center_tbt_text",{x:A-12,y:i*.17,width:Math.min(o*.3,220),height:78},{alignX:0}),this.drawImage("center_tbt_fee",{x:A-90,y:i*.33,width:180,height:58})}let b=this.drawImage("lane_top",{x:o*.23,y:i*.3,width:o*.54,height:Math.min(i*.15,86)}),g=["safety_primary","safety_secondary","safety_section"].find(A=>this.image(A));!(g&&this.drawImage(g,{x:l,y:i*.55,width:Math.min(o*.25,130),height:Math.min(i*.23,112)},{alignX:0}))&&!f&&this.drawSafetyFallback(o,i,c);let E=Math.min(o*(m?.54:.46),270),y=Math.min(i*.18,96),O={x:(o-E)*.5,y:i-y-d,width:E,height:y},C=this.drawImage("lane_bottom",O);!b&&!C&&!f&&this.drawLaneFallback(o,i);let w=this.footerState?.route,z=C?.x??O.x,M=C?C.x+C.width:O.x+O.width;if(Bt(w)){let A=w.remainingTimeSec>0?Math.max(1,Math.round(w.remainingTimeSec/60)):0,L=Ys(w.remainingTimeSec),P=l,_=Math.max(0,z-P-l);if(_>=70){let T=[L,A?`${A}분`:""].filter(Boolean).join(" · ");this.drawOutlinedText(wn(w.remainingDistanceM),P,i-d-25,Qe(o*.032,16,25),{maxWidth:_}),T&&this.drawOutlinedText(T,P,i-d,Qe(o*.027,14,21),{maxWidth:_})}}f||this.drawRouteProgress(o,i,c);let R=this.footerState?.vehicle,v=R?.roadName,h=o-l,S=Math.max(0,h-M-l);Bt(R)&&v&&S>=70&&this.drawOutlinedText(v,h,i-d,Qe(o*.028,13,20),{align:"right",maxWidth:S}),this.drawNavigationStatus(o,i,c,!f)}};function qs(e){return new Ks(e)}var zd=Object.freeze({findAlphaRowBounds:Fi,create:qs});function jd(e=globalThis){return e.CarrotNaviOverlay=zd,zd}function Xs(e){return!!e?.meta?.present}function Vd(e,t){if(!e||typeof e!="object")return"";let n=e.meta||{},r=Math.max(0,Number(n.sequence)||0),o=Math.max(0,Number(n.sourceTimestampMillis)||0);return[r,o,...t.map(i=>String(e[i]??""))].join(":")}function Qs(){let e=null,t="",n=null,r="";function o(l){let d=l?.navigationStatus;return Xs(d)&&!d.guidanceActive&&!d.routePresent}function i(l){let d=l?.route,f=Vd(d,["remainingDistanceM","remainingTimeSec"]);o(l)?(e=null,t=""):Xs(d)&&(!e||f!==t)&&(e={meta:{...d.meta||{}},remainingDistanceM:Math.max(0,Number(d.remainingDistanceM)||0),remainingTimeSec:Math.max(0,Number(d.remainingTimeSec)||0)},t=f)}function a(l){let d=l?.vehicle,f=String(d?.roadName||"").trim(),m=Vd(d,["roadName"]);o(l)?(n=null,r=""):Xs(d)&&f&&(!n||m!==r)&&(n={meta:{...d.meta||{}},roadName:f},r=m)}function s(){return{route:e,vehicle:n}}function u(l){return i(l),a(l),s()}function c(){e=null,t="",n=null,r=""}return Object.freeze({update:u,reset:c,snapshot:s})}var Hd=Object.freeze({create:Qs});function Bd(e=globalThis){return e.CarrotNaviFooterState=Hd,Hd}var jy=220;function Zs(e,t={}){if(!e)return null;let n=Math.max(0,Number(t.clearGraceMs)||jy),r=Qs(t)||null,o=new Map,i=new Map,a=new Map,s=null,u=!1,c=null,l=!1,d=0;function f(h,S){return{name:String(h||""),sequence:Math.max(0,Number(S)||0)}}function m(h,S,A=d){return A===d&&o.get(h)===S}function p(h,S){if(!h)return!1;let A=o.get(h);return A!==void 0&&S{i.delete(L),m(L,P,_)&&(x(L),a.set(L,{name:L,clear:!0,sequence:P,sourceTimestampMillis:Math.max(0,Number(A)||0)}))},n);return i.set(L,T),!0}async function O(h){if(!(h?.buffer instanceof ArrayBuffer))return!1;let{name:S,sequence:A}=f(h.name,h.sequence);if(!p(S,A))return!1;let L=d,P=new Blob([h.buffer],{type:String(h.mime||"image/png")});try{if(typeof globalThis.createImageBitmap=="function"){let T=await globalThis.createImageBitmap(P);return m(S,A,L)?E(S,T,A,h.sourceTimestampMillis):(T.close?.(),!1)}if(typeof globalThis.Image!="function"||!globalThis.URL?.createObjectURL)return!1;let _=globalThis.URL.createObjectURL(P);return await new Promise(T=>{let I=new globalThis.Image;I.onload=()=>{if(globalThis.URL.revokeObjectURL(_),!m(S,A,L)){T(!1);return}T(E(S,I,A,h.sourceTimestampMillis))},I.onerror=()=>{globalThis.URL.revokeObjectURL(_),T(!1)},I.src=_})}catch{return!1}}function C(h){s=h&&typeof h=="object"?h:null,u=!0,c=r?.update(s)||{route:null,vehicle:null},l=!0}function w(){if(!a.size&&!u&&!l)return!1;let h=Array.from(a.values());return a.clear(),h.length&&e.applyBatch(h),u&&(e.setState(s),s=null,u=!1),l&&(e.setFooterState?.(c),c=null,l=!1),e.renderNow(),!0}function z(){r?.reset(),c=null,l=!1}function M(){for(let h of a.values())h.source?.close?.();a.clear()}function R(){d+=1,g(),M(),o.clear(),e.clearImages(),e.renderNow()}function v(){d+=1,g(),M(),o.clear(),s=null,u=!1,z(),e.reset(),e.renderNow()}return Object.freeze({present:E,clear:y,decode:O,setState:C,flush:w,resetImages:R,reset:v})}var Gd=Object.freeze({create:Zs});function Wd(e=globalThis){return e.CarrotNaviOverlayStore=Gd,Gd}var Vy=["idle","connecting","buffering","live","recovering","busy"],Ud=Object.freeze(Vy),Hy=new Set(Ud);function Js(e={}){let t=e.target||globalThis,n=e.now||(()=>t.performance.now()),r="idle",o="",i=n();function a(){return{phase:r,reason:o,changedAt:i,ageMs:Math.max(0,Math.round(n()-i))}}function s(u,c=""){let l=String(u||"");if(!Hy.has(l))throw new Error(`Invalid Carrot Navi phase: ${l}`);let d=String(c||"").slice(0,128);if(r===l&&o===d)return!1;let f=r;r=l,o=d,i=n();let m=a();return e.onChange?.({...m,previous:f}),t.dispatchEvent?.(new t.CustomEvent("carrot:navigationphasechange",{detail:{...m,previous:f}})),!0}return Object.freeze({transition:s,snapshot:a})}var $d=Object.freeze({PHASES:Ud,create:Js});function Yd(e=globalThis){return e.CarrotNaviLifecycle=$d,$d}function ec(e={}){let t=e.target||globalThis,n=e.pane,r=e.canvas,o=e.video,i=e.overlayCanvas,a=e.overlayStore,s=r?.getContext?.("2d",{alpha:!1})||null,c=(e.createStagingCanvas||(()=>{let y=t.document?.createElement?.("canvas");return y?(y.width=1,y.height=1,y):typeof t.OffscreenCanvas=="function"?new t.OffscreenCanvas(1,1):null}))(),l=c?.getContext?.("2d",{alpha:!1})||null;if(!n||!r||!o||!i||!a||!s||!c||!l)return null;let d=!1,f=!1,m=0;function p(){if(!d||o.readyState<2||o.videoWidth<1||o.videoHeight<1)return!1;let y=n.getBoundingClientRect(),O=Math.min(2,Math.max(1,t.devicePixelRatio||1)),C=y.width>0?y.width:o.videoWidth,w=y.height>0?y.height:o.videoHeight,z=Math.max(1,Math.round(C*O)),M=Math.max(1,Math.round(w*O));c.width!==z&&(c.width=z),c.height!==M&&(c.height=M);let R=Math.max(z/o.videoWidth,M/o.videoHeight),v=z/R,h=M/R;try{a.flush(),l.drawImage(o,Math.max(0,(o.videoWidth-v)/2),Math.max(0,(o.videoHeight-h)/2),v,h,0,0,z,M),i.width>1&&i.height>1&&l.drawImage(i,0,0,i.width,i.height,0,0,z,M),r.width!==z&&(r.width=z),r.height!==M&&(r.height=M),s.drawImage(c,0,0,z,M)}catch{return!1}return f=!0,m=t.performance.now(),e.onFrame?.(m),!0}function b(y){d=!!y,o.hidden=!1,r.hidden=!1}function g(y={}){m=0,y.preserveFrame||(f=!1)}function x(y,O=t.performance.now()){return m>0&&O-m<=Math.max(0,Number(y)||0)}function E(){return{active:d,hasFrame:f,lastFrameAt:m,canvasVisible:!r.hidden}}for(let y of["loadeddata","playing","timeupdate"])o.addEventListener(y,p);return Object.freeze({render:p,setActive:b,invalidate:g,fresh:x,snapshot:E})}var Kd=Object.freeze({create:ec});function qd(e=globalThis){return e.CarrotNaviCompositor=Kd,Kd}var Qn='video/mp4; codecs="avc1.42E01E"';function Qd(e=Qn,t=globalThis){for(let n of[t.ManagedMediaSource,t.MediaSource]){if(typeof n!="function")continue;let r=n.isTypeSupported||t.MediaSource?.isTypeSupported;try{if(typeof r=="function"&&r.call(n,e))return n}catch{}}return null}function Zd(e=Qn,t=globalThis){return!!Qd(e,t)}function tc(e,t={}){if(!e)return null;let n=t.target||globalThis,r=null,o=null,i="",a=[],s=!1,u=0,c=0,l=0,d=!1,f=!1,m="",p={mime:"",initCount:0,segmentCount:0,frameCount:0,keyframeCount:0,lastSequence:0,lastSourceTimestampMillis:0,lastDuration:0,lastSegmentAt:0,clearCount:0,lastClearReason:"",lastClearAt:0};function b(h=Qn){return Zd(h,n)}function g(h){let S=e.error;m=String(h?.message||S?.message||(S?.code?`HTMLMediaElement error ${S.code}`:h||"Carrot Navi MSE playback error")),t.onError?.(m)}function x(){typeof e.requestVideoFrameCallback!="function"||u||(u=e.requestVideoFrameCallback(()=>{u=0,t.onFrame?.(),x()}))}function E(){if(!e.buffered?.length)return;let h=e.buffered.length-1,S=e.buffered.start(h),A=e.buffered.end(h),L=Number(e.currentTime),P=Number.isFinite(L)?A-L:Number.POSITIVE_INFINITY;if(d)if(!Number.isFinite(L)||L4){try{e.currentTime=Math.max(S,A-.55)}catch{}e.playbackRate=1}else P>1.2?e.playbackRate=1.05:P>.85?e.playbackRate=1.02:P<.7&&e.playbackRate!==1&&(e.playbackRate=1);else{if(l<2)return;try{e.currentTime=Math.max(S,A-.55)}catch{}d=!0,e.playbackRate=1}e.paused&&e.play().catch(()=>{}),x()}function y(){if(!o||o.updating||r?.readyState!=="open")return;if(o.buffered.length&&a.length<=2){let S=o.buffered.length-1,A=o.buffered.start(0),L=o.buffered.end(S),P=Number(e.currentTime),_=Math.min(L-5,Number.isFinite(P)?P-3:0);if(!s&&_>A+.5){s=!0;try{o.remove(0,_);return}catch{s=!1}}}let h=a.shift();if(h)try{o.appendBuffer(h.bytes),h.media&&(l+=1)}catch(S){g(S)}}function O(){s=!1,E(),y()}function C(){if(u&&typeof e.cancelVideoFrameCallback=="function")try{e.cancelVideoFrameCallback(u)}catch{}u=0;try{e.pause()}catch{}if(e.playbackRate=1,o){o.removeEventListener("updateend",O),o.removeEventListener("error",g);try{o.updating&&o.abort()}catch{}}o=null,r=null,a=[],s=!1,c=0,l=0,d=!1,f=!1,m="",p.lastSegmentAt=0;try{e.srcObject=null}catch{}e.removeAttribute("src");try{e.load()}catch{}i&&n.URL.revokeObjectURL(i),i=""}function w(h,S=Qn){C();let A=String(S||Qn),L=Qd(A,n);if(!L)return g(new Error(`Unsupported Carrot Navi media type: ${A||"unknown"}`)),!1;let P=new L;return r=P,m="",p.mime=A,p.initCount+=1,a.push({bytes:new Uint8Array(h),media:!1}),P.addEventListener("sourceopen",()=>{if(!(r!==P||P.readyState!=="open"||o))try{o=P.addSourceBuffer(A),o.addEventListener("updateend",O),o.addEventListener("error",g),y()}catch(_){g(_)}}),e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.disableRemotePlayback=!0,i=n.URL.createObjectURL(P),e.src=i,!0}function z(h,S={}){if(!r)return!1;let A=!!S.keyframe;if(f){if(!A)return!1;f=!1}return a.length>=12&&(m="Carrot Navi MSE queue overflow",a=a.filter(L=>!L.media),f=!A,f)?!1:(c+=1,p.segmentCount+=1,p.frameCount+=Math.max(1,Number(S.frameCount)||1),p.keyframeCount+=Math.max(0,Number(S.keyframeCount)||(A?1:0)),p.lastSequence=Math.max(0,Number(S.sourceSequence??S.sequence)||0),p.lastSourceTimestampMillis=Math.max(0,Number(S.sourceTimestampMillis)||0),p.lastDuration=Math.max(0,Number(S.durationMs??S.duration)||0),p.lastSegmentAt=n.performance.now(),a.push({bytes:new Uint8Array(h),media:!0,keyframe:A}),y(),!0)}function M(h="cleared"){p.clearCount+=1,p.lastClearReason=String(h).slice(0,64),p.lastClearAt=n.performance.now(),p.lastSegmentAt=0}function R(){let h=[],S=e.buffered;if(!S)return h;for(let A=Math.max(0,S.length-2);AZd(e)});function Jd(e=globalThis){return e.CarrotNaviMse=Xd,Xd}var By="carrotNaviSession",Gy="carrot_navi_accepted",zo="carrot_navi_busy",tf="carrot_navi_replaced";var Wy="navigation.media.worker";function $y(e,t){let n=e.resolveAssetUrl||(o=>globalThis.CarrotAssetUrl.resolve(o)),r=String(n(Wy)||"");if(!r)throw new Error("Carrot Navi media worker asset URL is empty");return r}function nc(e={}){let t=e.target||globalThis,n=String(e.statePath||"/ws/carrot_navi/state"),r=String(e.mediaPath||"/ws/carrot_navi/media"),o=$y(e,t),i=Math.max(100,Number(e.reconnectMs)||500),a=String(t.CarrotStreamIdentity?.clientId||`carrot-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`),s=!1,u=!1,c="",l=!0,d=!1,f=null,m=null,p=null,b=0;function g(_,T=!1){let I=new t.URL(_,t.location.href);return I.protocol=t.location.protocol==="https:"?"wss:":"ws:",I.searchParams.set("client_id",a),T&&I.searchParams.set("takeover","1"),I.href}function x(){return{active:s,ownershipBlocked:u,ownershipCode:c,takeoverArmed:l,stateAccepted:d,stateSocketState:f?.readyState??-1,mediaSocketState:m?.readyState??-1,stateOpen:f?.readyState===t.WebSocket.OPEN,mediaOpen:m?.readyState===t.WebSocket.OPEN,workerActive:!!p}}function E(){e.onConnectionChange?.(x())}function y(_){if(_)try{_.close()}catch{}}function O(){return p||(p=new Worker(o),p.addEventListener("message",_=>e.onWorkerMessage?.(_.data||{})),p.addEventListener("error",_=>e.onError?.(_.message||"Carrot Navi worker error")),p.postMessage({type:"configure"}),p)}function C(_=zo){let T=String(_||zo),I=!u||c!==T;u=!0,c=T,l=!1,d=!1,t.clearTimeout(b),b=0;let k=f,D=m;f=null,m=null,y(k),y(D),p?.postMessage({type:"reset-media"}),I&&e.onOwnershipBusy?.(T),E()}function w(_,T,I){if(typeof _!="string")return!1;try{let k=JSON.parse(_);return k?.type!==By?!1:k.status==="busy"?(C(k.code||zo),!0):(k.status!=="accepted"||k.code!==Gy||!(I==="state"?f===T:m===T)||(u=!1,c="",I==="state"&&(d=!0,v()),E()),!0)}catch{return!1}}function z(_,T,I){let k=I==="state";if(k?f===T:m===T){if(k?(f=null,d=!1):m=null,_.code===4409||_.code===4401){C(_.code===4401?tf:zo);return}k&&s&&e.onStateDisconnected?.(),E(),M()}}function M(){t.clearTimeout(b),b=0,!(!s||u)&&(b=t.setTimeout(()=>{b=0,h()},i))}function R(){if(!s||u||f)return;d=!1;let _=new t.WebSocket(g(n,l));f=_,_.addEventListener("open",()=>{f===_&&(l=!1,E())}),_.addEventListener("message",T=>{if(!w(T.data,_,"state")&&typeof T.data=="string")try{let I=JSON.parse(T.data);I?.type==="carrotNaviState"&&I.state&&e.onState?.(I.state)}catch{}}),_.addEventListener("close",T=>z(T,_,"state")),_.addEventListener("error",()=>y(_))}function v(){if(!s||u||!d||m)return;let _=O(),T=new t.WebSocket(g(r,!1));T.binaryType="arraybuffer",m=T,T.addEventListener("open",()=>{m===T&&E()}),T.addEventListener("message",I=>{w(I.data,T,"media")||!(I.data instanceof ArrayBuffer)||p!==_||_.postMessage({type:"media",buffer:I.data},[I.data])}),T.addEventListener("close",I=>z(I,T,"media")),T.addEventListener("error",()=>y(T))}function h(){!s||u||(R(),d&&v())}function S(){s||(s=!0),h(),E()}function A(){if(!s||u)return;let _=m;m=null,y(_),p?.postMessage({type:"reset-media"}),M(),E()}function L(){let _=f,T=m;f=null,m=null,d=!1,y(_),y(T),u=!1,c="",l=!0,t.clearTimeout(b),b=0,s&&h(),E()}function P(){s=!1,u=!1,c="",l=!1,d=!1,t.clearTimeout(b),b=0;let _=f,T=m;f=null,m=null,y(_),y(T),p&&(p.postMessage({type:"reset"}),p.terminate(),p=null),E()}return Object.freeze({start:S,stop:P,recoverMedia:A,requestOwnershipTakeover:L,snapshot:x})}var ef=Object.freeze({SESSION_BUSY_CODE:zo,SESSION_REPLACED_CODE:tf,create:nc});function nf(e=globalThis){return e.CarrotNaviTransport=ef,ef}var of=Object.freeze({mapStaleMs:1900,stateStaleMs:3500,disconnectGraceMs:1500,sourceSuspendGraceMs:6e3,mediaFreshMs:1600});function rc(e={}){let t=e.transport,n=e.mse,r=e.compositor;if(!t||!n||!r)return null;let o=e.now||(()=>globalThis.performance.now()),i=Object.freeze({...of,...e.thresholds||{}}),a=!1,s=!1,u=0,c=0,l=!1,d=0;function f(O,C=o()){let w=O?.connected===!0,z=O?.navigationStatus;l=!!(z?.guidanceActive||z?.routePresent),a=!0,u=C,w?(s=!0,c=0,d=0):((s||!c)&&(c=C),s=!1,l&&!d&&(d=C),l||(d=0))}function m(O=o()){(s||!c)&&(c=O),s=!1,l&&!d&&(d=O)}function p(){a=!1,s=!1,u=0,c=0,l=!1,d=0}function b(O=o()){let C=u>0?Math.max(0,Math.round(O-u)):null,w=c>0?Math.max(0,Math.round(O-c)):null,z=d>0?Math.max(0,Math.round(O-d)):null,M=a&&C!==null&&C<=i.stateStaleMs;return{seen:a,connected:s,routeActive:l,suspended:!s&&l,fresh:M,ageMs:C,disconnectedForMs:w,suspendedForMs:z}}function g(O=o(),C=n.snapshot()){let w=Number(C?.media?.lastSegmentAt)||0;return w>0&&O-w<=i.mediaFreshMs}function x(O=o()){let C=b(O);return!C.seen||!C.fresh?!1:C.connected?!0:C.routeActive&&C.suspendedForMs!==null&&C.suspendedForMs<=i.sourceSuspendGraceMs}function E(O=o()){if(!r.snapshot().hasFrame||!r.fresh(i.mapStaleMs,O))return!1;let w=b(O);return w.seen?w.connected?w.fresh:w.disconnectedForMs!==null&&w.disconnectedForMs<=i.disconnectGraceMs:!0}function y(O="",C=o()){let w=b(C),z=t.snapshot(),M=n.snapshot(),R=r.snapshot();return{ready:E(C),source:w.fresh&&w.connected,transport:z.mediaOpen&&g(C,M),decoder:M.mse.readyState==="open"&&!M.error&&!O,presentation:R.hasFrame&&r.fresh(i.mapStaleMs,C)}}return Object.freeze({recordState:f,recordDisconnect:m,reset:p,sourceSnapshot:b,mediaFresh:g,mapReady:E,sourceAvailable:x,snapshot:y,thresholds:i})}var rf=Object.freeze({DEFAULT_THRESHOLDS:of,create:rc});function af(e=globalThis){return e.CarrotNaviHealth=rf,rf}function oc(e={}){let t=e.target||globalThis,n=e.workspaceRuntime||t.DriveWorkspaceRuntime,r=e.workspace,o=e.overlay,i=n?.shell;if(!r||!i||n.root!==r)return null;function a(s=i.snapshot()){return{active:s.active,ratio:s.ratio,orientation:s.orientation,mode:s.mode,area1Content:n.contentForSlot(s.area1Slot),compactStage:s.compactPrimary}}return t.addEventListener("drive:workspacelayoutchange",s=>{if(s?.detail?.workspaceId!==String(r.id||""))return;let u=a(s.detail);t.dispatchEvent(new t.CustomEvent("carrot:navigationlayoutchange",{detail:u})),e.onLayout?.(u)}),t.addEventListener("drive:workspaceresizestart",s=>{s?.detail?.workspaceId===String(r.id||"")&&(o?.setRenderSuspended?.(!0),t.dispatchEvent(new t.CustomEvent("carrot:navigationresizestart")))}),t.addEventListener("drive:workspaceresizeend",s=>{s?.detail?.workspaceId===String(r.id||"")&&(o?.setRenderSuspended?.(!1),t.dispatchEvent(new t.CustomEvent("carrot:navigationresizeend")))}),Object.freeze({applyGeometry:i.applyGeometry,snapshot(){let s=i.snapshot();return{...a(s),ratios:s.ratios}}})}var sf=Object.freeze({create:oc});function cf(e=globalThis){return e.CarrotNaviSplit=sf,sf}var lf=new WeakMap,Xr=Object.freeze({});function Uy(e={}){let t=e.target||globalThis,n=e.document||t.document,r=e.workspace||n?.getElementById("carrotDriveWorkspace"),o=e.stage||n?.getElementById("carrotStage"),i=e.root||e.pane||n?.getElementById("carrotNaviPane"),a=e.divider||n?.getElementById("carrotNaviDivider"),s=e.canvas||n?.getElementById("carrotNaviCanvas"),u=e.video||n?.getElementById("carrotNaviVideo"),c=e.overlayCanvas||n?.getElementById("carrotNaviOverlayCanvas"),l=e.statusElement||n?.getElementById("carrotNaviStatus"),d=e.layoutSpec||t.CarrotDriveLayoutSpec,f=e.workspaceRuntime||t.DriveWorkspaceRuntime,m=e.workspaceApi||t.DriveWorkspace;if(!r||!o||!i||!a||!s||!u||!c||!d)return Xr;let p=(e.createOverlay||qs)(c),b=(e.createOverlayStore||Zs)(p),g=(e.createLifecycle||Js)({target:t}),x=(e.createSplit||oc)({target:t,workspaceRuntime:f,workspace:r,stage:o,pane:i,divider:a,overlay:p});if(!p||!b||!g||!x)return Xr;let E=540,y=240,O=300,C=480,w=3e3,z=5e3,M=2e3,R=1e3,v=8,h=!1,S=!1,A=0,L=0,P="",_="",T="",I=!1,k=!1,D=!1,B=!1,W=0,V=e.contentActive===void 0?!0:!!e.contentActive,F=!1,H=(e.createCompositor||ec)({target:t,pane:i,canvas:s,video:u,overlayCanvas:c,overlayStore:b,onFrame:te}),Y=(e.createMse||tc)(u,{target:t,onFrame:()=>H?.render(),onError:an});if(!H||!Y)return Xr;let $=(e.createTransport||nc)({target:t,resolveAssetUrl:e.resolveAssetUrl,onState:Re,onStateDisconnected:mt,onWorkerMessage:Ge,onError:an,onConnectionChange:Ke,onOwnershipBusy:Ce});if(!$)return Xr;let K=(e.createHealth||rc)({transport:$,mse:Y,compositor:H,now:()=>t.performance.now()});if(!K)return Xr;let Z=e.introApi||t.DriveContentIntro,ee=Z?.create?.({host:i,className:"carrot-navi-pane__intro",feature:{id:d.CONTENT.NAVIGATION,label:()=>He("web_drive_layout_content_navigation","Carrot Navi")}}),ue=Z?.STATUS,de=e.stateSurfaceApi||t.CarrotUI?.stateSurface,ye=de?.create?.({host:i,className:"carrot-navi-pane__ownershipNotice",featureLabel:()=>He("web_drive_layout_content_navigation","Carrot Navi")});if(!ee||!ue||!ye)return Xr;function U(){return Y.supported()?"mse":""}function X(){let q=t.visualViewport;return{width:Math.round(q?.width||t.innerWidth||0),height:Math.round(q?.height||t.innerHeight||0)}}function pe(q=X()){let oe=f?.viewportOrientation?.();return oe||(q.height>=q.width?m.ORIENTATION.VERTICAL:m.ORIENTATION.HORIZONTAL)}async function xe(q=!1){let oe=t.performance.now();if(B||!q&&D&&oe-W=O&&Se>=C:be>=E&&Se>=y,Zt=V&&S&&wt()&&Ne&&typeof t.Worker=="function"&&!!U();return Zt&&xe(),Zt&&D&&k}function ft(){return(V||F)&&D&&k&&typeof t.Worker=="function"&&!!U()}function He(q,oe){return typeof t.getUIText=="function"?t.getUIText(q,oe):oe}function wt(q=x.snapshot()){if(!q.active)return!1;if(q.mode===d.MODE.SPLIT)return!0;let oe=q.area1Content===d.CONTENT.NAVIGATION;return q.mode===d.MODE.AREA_1?oe:!oe}function pt(){let q=x.snapshot(),oe=H.snapshot(),be=$.snapshot();if(!wt(q)||oe.hasFrame)return ee.hide(),ye.hide(),!1;if(be.ownershipBlocked)return ee.hide(),ye.show(de.STATE.OWNERSHIP,{tone:de.TONE.NEUTRAL,title:He("drive_stream_busy","Active on another device"),actions:[{id:"takeover",label:He("drive_stream_use_here","Use here"),tone:de.ACTION_KIND.PRIMARY,onActivate:()=>Gt("busy action")}]}),!0;ye.hide();let Se;return typeof t.Worker!="function"||!U()?Se={kind:ue.UNSUPPORTED,message:He("drive_content_status_unsupported","Not supported"),description:He("carrot_navi_intro_unsupported_detail","This browser cannot start the navigation video pipeline.")}:D&&!k?Se={kind:ue.UNAVAILABLE,message:He("drive_content_status_unavailable","Unavailable"),description:He("carrot_navi_intro_unavailable_detail","The stream remains stopped for the current device state.")}:T?Se={kind:ue.RECOVERING,message:He("drive_content_status_recovering","Recovering"),description:He("carrot_navi_intro_recovering_detail","The screen will return automatically after recovery.")}:Se={kind:ue.PREPARING,message:He("drive_content_status_preparing","Preparing"),description:He("carrot_navi_intro_preparing_detail","The navigation screen will appear here automatically when it is ready.")},ee.setStatus(Se),!0}function on(q,oe){if(!l||!wt())return;let be={waiting:["carrot_navi_waiting_video","지도 영상 대기 중"],disconnected:["carrot_navi_disconnected","내비 연결 끊김 · 재연결 중"],stalled:["carrot_navi_map_stalled","지도 영상 멈춤 · 복구 중"]},[Se,Ne]=be[q]||["",oe||"내비 상태 확인 중"];l.textContent=oe||(typeof t.getUIText=="function"?t.getUIText(Se,Ne):Ne),l.dataset.tone=q==="stalled"?"warning":q,l.hidden=!1}function Vn(q=t.performance.now(),oe=!1){if(!l||!wt()||oe){l&&(l.hidden=!0);return}let be=K.sourceSnapshot(q),Se=H.snapshot();be.seen&&!be.connected?on("disconnected"):Se.hasFrame&&!H.fresh(K.thresholds.mapStaleMs,q)?on("stalled"):!Se.hasFrame||T?on("waiting",T?"지도 디코더 복구 중":""):(l.hidden=!0,delete l.dataset.tone)}function an(q){T=String(q?.message||q||"Carrot Navi decode error"),h&&g.transition("recovering",T),on("waiting","지도 디코더 복구 중"),ge(T,120),nt()}function te(){t.clearTimeout(L),L=0,P="",T="",g.transition("live","frame presented"),l&&(l.hidden=!0),tt()}function Re(q){K.recordState(q),b.setState(q),tt()}function mt(){K.recordDisconnect(),tt()}function Ce(q){t.clearTimeout(L),L=0,P="",Y.destroy(),H.invalidate(),b.reset(),Ie(),T="",g.transition("busy",String(q||"carrot_navi_busy")),tt(),nt()}function Ke(q){if(!h)return;if(q.ownershipBlocked){g.transition("busy",q.ownershipCode||"carrot_navi_busy"),tt();return}let oe=g.snapshot().phase;!q.mediaOpen&&oe==="live"?g.transition("recovering","media socket closed"):(q.mediaOpen||q.stateOpen)&&oe==="idle"&&g.transition("connecting","socket connected")}function Ge(q={}){if(q.type==="overlay-image"&&q.bitmap){b.present(q.name,q.bitmap,q.sequence,q.sourceTimestampMillis);return}if(q.type==="overlay-bytes"){b.decode(q);return}if(q.type==="overlay-clear"){b.clear(q.name,q.sequence,q.sourceTimestampMillis);return}if(q.type==="overlay-reset"){b.resetImages();return}if(q.type!=="overlay-error"){if(q.type==="pipeline"){_=String(q.mode||"");return}if(q.type==="mse-init"&&q.segment instanceof ArrayBuffer){g.transition("buffering","MSE initialization"),Y.start(q.segment,String(q.mime||Qn));return}if(q.type==="mse-segment"&&q.segment instanceof ArrayBuffer){g.snapshot().phase!=="live"&&g.transition("buffering","MSE segment received"),Y.append(q.segment,q);return}if(q.type==="clear"){H.invalidate({preserveFrame:!0}),Y.markClear(q.reason),g.transition("recovering",String(q.reason||"media cleared")),tt(),nt();return}q.type==="error"&&an(q.message||"decode error")}}function tt(){let q=t.performance.now();Vn(q,pt())}function ge(q,oe=0){if(!h||$.snapshot().ownershipBlocked||(P=String(q||"Carrot Navi media recovery").slice(0,128),g.transition("recovering",P),L))return;let be=t.performance.now(),Se=A>0?Math.max(0,A+z-be):0,Ne=Math.max(0,Number(oe)||0,Se);L=t.setTimeout(()=>{L=0,h&&(A=t.performance.now(),T=P||"Carrot Navi media recovery",P="",Y.destroy(),$.recoverMedia(),on("waiting"),nt())},Ne)}function Nn(q=t.performance.now()){let oe=H.snapshot();!h||$.snapshot().ownershipBlocked||!oe.hasFrame||H.fresh(K.thresholds.mapStaleMs,q)||!K.mediaFresh(q)||oe.lastFrameAt<=0||q-oe.lastFrameAt{let oe=q?.detail?.key;(Array.isArray(q?.detail?.keys)?q.detail.keys:[oe]).some(Se=>d.settingKeys.includes(Se))&&ht()}),n.addEventListener("visibilitychange",ht),t.addEventListener("carrot:languagechange",tt),t.visualViewport&&t.visualViewport.addEventListener("resize",ht,{passive:!0}),typeof t.ResizeObserver=="function"&&new t.ResizeObserver(ht).observe(r),new t.MutationObserver(ht).observe(o,{attributes:!0,attributeFilter:["class"]}),t.setInterval(()=>{ht(),tt(),Nn()},500),t.setInterval(()=>{nt()},M),ht(),Object.freeze({refresh:ht,requestOwnershipTakeover:Gt,setContentActive:Rt,resize:Zn,status(){let q=x.snapshot(),oe=It();return{enabled:!0,contentActive:V,contentKeepWarm:F,streamGateAllowed:k,streamGateKnown:D,streamGatePending:B,environmentActive:h,layoutVisible:S,splitOrientation:q.orientation,splitActive:q.active,splitRatio:q.ratio,splitMode:q.mode,splitArea1Content:q.area1Content,intro:ee.snapshot(),ownershipNotice:ye.snapshot(),mapReady:K.mapReady(),phase:g.snapshot(),health:oe.health,sourceState:oe.sourceState,overlay:oe.overlay,decoderMode:oe.decoderMode,mediaPipeline:_,pipelineVersion:v,secureContext:t.isSecureContext,decodeError:oe.decodeError,ownership:oe.ownership,media:oe.media,mse:oe.mse}}})}function Yy(e={}){let t=e.target||globalThis,n=lf.get(t);if(n)return n;let r=Uy(e);return r&&typeof r.setContentActive=="function"&&lf.set(t,r),r}function uf(e=globalThis,t={}){let n=Yy({...t,target:e});return e.CarrotNaviWeb=n,n}var Ky=Object.freeze(["refresh","requestOwnershipTakeover","setContentActive","resize","status"]);function qy(e){if(!e||Ky.some(o=>typeof e[o]!="function"))return null;let t=Object.freeze({refresh(){return e.refresh()},requestOwnershipTakeover(o){return e.requestOwnershipTakeover(o)}}),n=Object.freeze({activate(o={}){return e.setContentActive(!0,o)},deactivate(o={}){return e.setContentActive(!1,o)},resize(o){return e.resize(o)},status(){return e.status()}});function r(){return{ready:!0,implementation:"CarrotNaviWeb",boundaries:["lifecycle","content"],runtime:e.status()}}return Object.freeze({lifecycle:t,content:n,status:r})}function df(e=globalThis,t=e.CarrotNaviWeb){let n=qy(t);return e.DriveCarrotNaviFacade=n,n}function ic(e=globalThis){return kd(e),jd(e),Bd(e),Wd(e),Yd(e),qd(e),Jd(e),nf(e),af(e),cf(e),e}function ff(e=globalThis,t={}){ic(e);let n=uf(e,t.runtime||t),r=df(e,n),o=null;return r&&t.compatibilityContent!==!1?o=Pu(e,{...t.content,runtime:r.content}):t.compatibilityContent!==!1&&Wr(e,null),Object.freeze({runtime:n,facade:r,content:o})}function Xy(e={}){let t=e.stage||null,n=e.replayViewport||null,r=e.video||null,o=typeof e.getReplay=="function"?e.getReplay:()=>globalThis.CarrotVisionReplay;if(!t||!r)return null;function i(){let m=o();return m&&typeof m=="object"?m:null}function a(){return!!i()?.isActive?.()}function s(){return!!i()?.isReady?.()}function u(m){return a()?(i()?.reportRenderable?.(!!m),!0):!1}function c(){return a()?String(i()?.videoSourceKey?.()||""):""}function l(){return!!(a()&&i()?.shouldHoldFrameDuringSeek?.())}function d(){return t.classList.contains("is-replay")&&n?n:t}function f(m){if(a()){let b=Number(r.currentTime);if(Number.isFinite(b)&&b>=0)return b*1e3}let p=Number(m);return Number.isFinite(p)?p:0}return Object.freeze({isActive:a,isReady:s,reportRenderable:u,videoSourceKey:c,shouldHoldFrameDuringSeek:l,getRenderViewport:d,temporalNowMs:f})}var pf=Object.freeze({create:Xy});function mf(e=globalThis){return e.DriveVisionReplayRenderBridge=pf,pf}function Qy(e={}){let t=e.isReplayActive,n=e.isStageVisible,r=e.cancelScheduledRender,o=e.resetFrameTemporalState,i=e.resetReplayState,a=e.mergePendingRenderState,s=e.flushScheduledRender,u=e.notifyPresentedFrame;if(typeof t!="function"||typeof n!="function"||typeof r!="function"||typeof o!="function"||typeof i!="function"||typeof a!="function"||typeof s!="function"||typeof u!="function")return null;function c(d={}){if(!t()||!n())return!1;let f=!!d.force,m=d.resetTemporal===!0,p=d.overlayDirty!==!1,b=d.hudDirty!==!1;return(f||m||p||b)&&(r(),m&&o(),a({force:f,overlayDirty:p,hudDirty:b}),s()),u({source:"replay",mediaTime:Number.isFinite(Number(d.mediaTime))?Number(d.mediaTime):null,reason:String(d.reason||"replay video frame"),discontinuity:m,discontinuityReason:m?String(d.discontinuityReason||"replay-seek"):null}),!0}function l(){i()}return Object.freeze({renderVideoFrame:c,resetTemporalState:l})}var hf=Object.freeze({create:Qy});function gf(e=globalThis){return e.DriveVisionReplayRenderController=hf,hf}function yf(e={}){let t=new Set,n=typeof e.reportError=="function"?e.reportError:()=>{},r=0,o=null;function i(u){if(typeof u!="function")throw new TypeError("presented-frame listener must be a function");t.add(u);let c=!0;return()=>c?(c=!1,t.delete(u)):!1}function a(u={}){let c=u?.source==="replay"?"replay":"live";o=Object.freeze({...u,source:c,sequence:++r});for(let l of[...t])try{l(o)}catch(d){n(d)}return o}function s(){return Object.freeze({listeners:t.size,sequence:r,last:o})}return Object.freeze({subscribe:i,publish:a,status:s})}var bf=new WeakMap;function ac(e=globalThis){let t=bf.get(e);if(t)return t;let n=yf({reportError(r){e?.console?.error?.("[drive vision] presented-frame listener failed",r)}});return bf.set(e,n),e.DriveVisionPresentedFrames=n,n}var dE=Object.freeze({create:yf,install:ac});function Qr(e,t,n){return Math.min(n,Math.max(t,e))}function Dt(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Qt(e,t=0){let n=Dt(e,t);return n>0?n:t}function lc(e,t,n,r){let o=Math.max(0,n-e),i=Math.max(0,r-t);return Object.freeze({left:e,top:t,right:n,bottom:r,width:o,height:i,centerX:e+o/2,centerY:t+i/2})}function Zy(e,t){return lc(0,0,Math.max(0,e),Math.max(0,t))}function cc(e,t,n){let r=Math.max(0,t),o=Math.max(0,n),i=Dt(e?.left??e?.x,0),a=Dt(e?.top??e?.y,0),s=Dt(e?.right,i+Dt(e?.width,r)),u=Dt(e?.bottom,a+Dt(e?.height,o)),c=Qr(Math.min(i,s),0,r),l=Qr(Math.max(i,s),0,r),d=Qr(Math.min(a,u),0,o),f=Qr(Math.max(a,u),0,o);return l-c>=2&&f-d>=2?lc(c,d,l,f):Zy(r,o)}function Jy(e,t,n,r,o){let i=Qt(e,n),a=Qt(t,r),s=Math.max(Qt(o?.scale,1),.01),u=Dt(o?.tx,0),c=Dt(o?.ty,0);return cc({left:u,top:c,right:u+i*s,bottom:c+a*s},n,r)}function ev(e,t){if(!t||t===e)return Object.freeze({left:0,top:0});let n=e.getBoundingClientRect?.(),r=t.getBoundingClientRect?.();return Object.freeze(n&&r?{left:Dt(r.left,0)-Dt(n.left,0),top:Dt(r.top,0)-Dt(n.top,0)}:{left:Dt(t.offsetLeft,0),top:Dt(t.offsetTop,0)})}function tv(e){return[e.left,e.top,e.width,e.height,e.render.left,e.render.top,e.render.width,e.render.height,e.stageWidth,e.stageHeight].map(t=>Math.round(t*100)/100).join(",")}function nv(e={}){let t=e.target||globalThis,n=e.stage,r=e.card;if(!n)return null;let o="",i="",a="",s=null;function u(){r&&(r.style.removeProperty("--carrot-hud-left"),r.style.removeProperty("--carrot-hud-bottom")),o="",i=""}function c(){n.style.removeProperty("--carrot-viewport-left"),n.style.removeProperty("--carrot-viewport-top"),n.style.removeProperty("--carrot-viewport-width"),n.style.removeProperty("--carrot-viewport-height")}function l(){u(),c(),a="",s=null}function d(b={}){let g=b.renderViewport||n,x=Qt(b.stageWidth,Qt(n.clientWidth,0)),E=Qt(b.stageHeight,Qt(n.clientHeight,0)),y=Qt(b.renderWidth,Qt(g?.clientWidth,x)),O=Qt(b.renderHeight,Qt(g?.clientHeight,E));if(!x||!E||!y||!O)return null;let C=b.viewportRect?cc(b.viewportRect,y,O):Jy(b.sourceWidth,b.sourceHeight,y,O,b.transform),w=ev(n,g),z=lc(w.left,w.top,w.left+y,w.top+O),M=cc({left:w.left+C.left,top:w.top+C.top,right:w.left+C.right,bottom:w.top+C.bottom},x,E);return Object.freeze({...M,local:C,render:z,stageWidth:x,stageHeight:E,sourceWidth:Qt(b.sourceWidth,y),sourceHeight:Qt(b.sourceHeight,O)})}function f(b={}){let g=d(b);if(!g)return null;s=g;let x=tv(g);if(a!==x&&(a=x,n.style.setProperty("--carrot-viewport-left",`${Math.round(g.left)}px`),n.style.setProperty("--carrot-viewport-top",`${Math.round(g.top)}px`),n.style.setProperty("--carrot-viewport-width",`${Math.round(g.width)}px`),n.style.setProperty("--carrot-viewport-height",`${Math.round(g.height)}px`),typeof t.dispatchEvent=="function"&&typeof t.CustomEvent=="function"&&t.dispatchEvent(new t.CustomEvent("carrot:viewportlayout",{detail:g}))),r)if(!t.CarrotLayout?.isWide?.())(o!==""||i!=="")&&u();else{let E=`${Math.round(Qr(g.stageWidth*.028,16,28))}px`,y=`${Math.round(Qr(g.stageHeight*.038,20,30))}px`;o!==E&&(o=E,r.style.setProperty("--carrot-hud-left",E)),i!==y&&(i=y,r.style.setProperty("--carrot-hud-bottom",y))}return g}function m(){return s}function p(){return Object.freeze({viewportSignature:a,viewport:s,hudLeft:o,hudBottom:i})}return Object.freeze({apply:f,current:m,reset:l,resolve:d,status:p})}var sc=Object.freeze({create:nv});function vf(e=globalThis){return e.DriveVisionViewport=sc,e.DriveVisionHudLayout=sc,sc}function rv(e={}){let t=e.context;if(!t)return null;function n(i,a){t.clearRect(0,0,i,a)}function r(){}function o(){return{}}return Object.freeze({clear:n,reset:r,status:o})}var Sf=Object.freeze({create:rv});function Mf(e=globalThis){return e.DriveVisionHudCanvas=Sf,Sf}var Tt=Object.freeze({UNKNOWN:"unknown",LANELESS:"laneless",ARMED:"armed",ACTIVE:"active"});function uc(e){return e==null?null:!!e}function ov(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function Zr(e={}){let t=uc(e.requested),n=uc(e.planned),r=uc(e.controlled),o=n??r??!1,i=Tt.UNKNOWN;return t===!1?i=Tt.LANELESS:r===!0?i=Tt.ACTIVE:r===!1?i=t===!0||n===!0?Tt.ARMED:Tt.LANELESS:n===!0?i=Tt.ACTIVE:t===!0?i=Tt.ARMED:n===!1&&(i=Tt.LANELESS),Object.freeze({requested:t,planned:n,controlled:r,pathActive:o===!0,presentation:i})}function gr(e={}){let t=ov(e.carState?.useLaneLineSpeed);return Zr({requested:t==null?null:t>0,planned:e.lateralPlan?.useLaneLines,controlled:e.controlsState?.activeLaneLine})}var hE=Object.freeze({PRESENTATION:Tt,resolveFields:Zr,resolveState:gr});function jn(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function iv(e,t="",n=0){return e==null?`-${t}`:`${e.toFixed(n)}${t}`}function av(e,t){let n=String(e||"").split("/").pop().trim().toUpperCase();if(!n)return"-";if(n!=="H264")return n;let o=/profile-level-id=([0-9a-fA-F]{6})/.exec(String(t||""))?.[1]?.slice(0,2)?.toLowerCase()||"",i=o==="42"?"Baseline":o==="4d"?"Main":o==="64"?"High":"";return i?`${n} ${i}`:n}function sv(e){return!!e?.carControl?.longActive}function cv(e){return gr(e).pathActive}function Af(e){if(!e?.active)return{visible:!1,tone:"offline",title:"VISION OFFLINE",glance:""};let t=e.network||{},n=e.inbound||{},r=e.video||{},o=String(t.resolutionLabel||"").trim()||"-",i=jn(t.bitrateMbps),a=jn(n.framesPerSecond),s=jn(t.rttMs),u=jn(t.lossPct),c=jn(t.jitterMs),l=jn(n.freezeCount),d=jn(n.framesDecoded),f=jn(n.framesReceived),m=jn(r.readyState),p=e.connectionState==="connecting"||e.iceConnectionState==="checking"||e.iceConnectionState==="disconnected",b=f!=null&&f>0&&d!=null&&d<=0||l!=null&&l>0&&m!=null&&m<3,g=u!=null&&u>=.5||c!=null&&c>=30||s!=null&&s>=150,x=iv(i,"Mbps",i!=null&&i<10?2:1),E=a==null?"-fps":`${Math.round(a)}fps`,y=s==null?"-ms":`${Math.round(s)}ms`,O=c==null?"-ms":`${Math.round(c)}ms`,C=u==null?"-%":`${u.toFixed(u>=10?0:1)}%`,w=av(e.codec,e.codecParams),z=String(t.protocol||"-").toUpperCase(),M=String(t.localCandidateType||"-"),R=String(t.remoteCandidateType||"-"),v="normal",h="VISION OK",S=`${o} | ${E} | ${x} | ${y}`;if(e.error)v="offline",h="VISION OFFLINE",S="OFFLINE | stats unavailable";else if(p)v="reconnecting",h="VISION RECONNECTING",S="RECONNECTING | waiting stream";else if(b)v="stall",h="VISION STALL",S=`STALL | decode ${d??"-"} | recv ${f??"-"}`;else if(g){v="degraded",h="VISION DEGRADED";let A=[];u!=null&&u>=.5&&A.push(`loss ${C}`),s!=null&&s>=150&&A.push(`RTT ${y}`),c!=null&&c>=30&&A.push(`jitter ${O}`),S=`DEGRADED | ${A.slice(0,2).join(" | ")}`}return{visible:!0,tone:v,title:h,glance:S,video:`${o} | ${E}`,codec:w,bitrate:x,rtt:y,jitter:O,loss:C,freeze:l==null?"-":String(Math.round(l)),path:`${z} ${M} -> ${R}`}}function lv(e){return Af(e).glance||""}var Jr=Object.freeze({isLongActive:sv,isLaneMode:cv,resolveLaneModeState:gr,buildRtcPerf:Af,formatRtcPerfLabel:lv});function Rf(e=globalThis){return e.DriveVisionHudModel=Jr,Jr}var uv=600,dv=12,fv=8e3,pv=1400,mv="(min-aspect-ratio: 13/10), (horizontal-viewport-segments: 2), (vertical-viewport-segments: 2), (min-width: 640px) and (min-height: 650px)";function hv(e={}){let t=e.model||Jr;if(!t?.buildRtcPerf)return null;let n=e.window||globalThis.window||globalThis,r=e.document||n.document||globalThis.document;if(!r)return null;let o=e.root||r,i=U=>o.querySelector?.(`#${U}`)||r.getElementById(U),a=i("carrotRtcPerfHud"),s=i("carrotRtcPerfGlance"),u=i("carrotRtcPerfGlanceText"),c=i("carrotRtcPerfSummary"),l=i("carrotRtcPerfTitle"),d=i("carrotRtcPerfVideo"),f=i("carrotRtcPerfCodec"),m=i("carrotRtcPerfBitrate"),p=i("carrotRtcPerfRtt"),b=i("carrotRtcPerfJitter"),g=i("carrotRtcPerfLoss"),x=i("carrotRtcPerfFreeze"),E=i("carrotRtcPerfPath"),y=i("carrotRtcPerfHoldTarget"),O=i("carrotRtcPerfCloseBtn"),C=i("carrotRtcPerfLogBtn"),w=typeof e.isActive=="function"?e.isActive:()=>!0,z=typeof e.isReplayActive=="function"?e.isReplayActive:()=>!1,M=typeof e.showToast=="function"?e.showToast:()=>{},R=!1,v=null,h=null,S=null,A=0,L=0,P=null;function _(){return t.buildRtcPerf(n.CarrotRtcPerf)}function T(){return!!(n.CarrotLayout?.isWide?.()??n.matchMedia(mv).matches)}function I(){v!=null&&(n.clearTimeout(v),v=null)}function k(U){I(),!(!R||U!=="normal")&&(v=n.setTimeout(()=>{D(!1)},fv))}function D(U){let X=_(),pe=!!(U&&X.visible&&T());if(R=pe,c&&(c.hidden=!pe),!pe){I();return}k(X.tone)}function B(){D(!1)}function W(){if(!a||!s||!u)return;if(z()){a.hidden=!0,B();return}let U=_();if(a.hidden=!U.visible,s.dataset.tone=U.tone,u.textContent=U.glance||U.title,!U.visible||!T()){B();return}c&&(c.dataset.tone=U.tone),l&&(l.textContent=U.title),d&&(d.textContent=U.video),f&&(f.textContent=U.codec),m&&(m.textContent=U.bitrate),p&&(p.textContent=U.rtt),b&&(b.textContent=U.jitter),g&&(g.textContent=U.loss),x&&(x.textContent=U.freeze),E&&(E.textContent=U.path),R&&v==null?k(U.tone):R&&U.tone!=="normal"&&I()}function V(){T()||B()}function F(){h!=null&&(n.clearTimeout(h),h=null),S=null,y?.classList.remove("is-holding")}function H(U){U.stopPropagation(),F(),!(!w()||!T())&&(S=U.pointerId,A=U.clientX,L=U.clientY,y.classList.add("is-holding"),y.setPointerCapture?.(U.pointerId),h=n.setTimeout(()=>{h=null,y.classList.remove("is-holding"),D(!R)},uv))}function Y(U){S===U.pointerId&&Math.hypot(U.clientX-A,U.clientY-L)>dv&&F()}function $(U){U.preventDefault(),U.stopPropagation()}function K(U){U.stopPropagation(),B()}async function Z(U){U.stopPropagation();let X=C.textContent;C.disabled=!0,C.textContent="SEND";try{if(!n.CarrotVisionDiag?.uploadDiscord)throw new Error("diagnostic upload unavailable");await n.CarrotVisionDiag.uploadDiscord(),C.textContent="SENT",M("Carrot Vision log sent to Discord",{duration:2600})}catch(pe){C.textContent="FAIL",M(`Discord upload failed: ${pe?.message||pe}`,{tone:"error",duration:4200})}finally{P!=null&&n.clearTimeout(P),P=n.setTimeout(()=>{P=null,C.disabled=!1,C.textContent=X},pv)}}function ee(U){R&&(c?.contains(U.target)||y?.contains(U.target)||B())}function ue(){!y||!c||(y.addEventListener("pointerdown",H),y.addEventListener("pointermove",Y),["pointerup","pointercancel","lostpointercapture"].forEach(U=>{y.addEventListener(U,F)}),y.addEventListener("click",$),O?.addEventListener("click",K),C?.addEventListener("click",Z),r.addEventListener("pointerdown",ee,!0))}function de(){B(),F(),P!=null&&(n.clearTimeout(P),P=null),!(!y||!c)&&(y.removeEventListener("pointerdown",H),y.removeEventListener("pointermove",Y),["pointerup","pointercancel","lostpointercapture"].forEach(U=>{y.removeEventListener(U,F)}),y.removeEventListener("click",$),O?.removeEventListener("click",K),C?.removeEventListener("click",Z),r.removeEventListener("pointerdown",ee,!0))}function ye(){return Object.freeze({available:T(),visible:!!(a&&!a.hidden),summaryOpen:R})}return ue(),Object.freeze({sync:W,close:B,layoutChanged:V,destroy:de,status:ye})}var xf=Object.freeze({create:hv});function Ef(e=globalThis){return e.DriveVisionRtcPerfHud=xf,xf}function dc(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function gv(e,t=0){if(!Array.isArray(e))return t;for(let n of e){let r=Number(n);if(Number.isFinite(r))return r}return t}function bv(e={}){let t=e.hudModel||Jr;if(!t?.isLaneMode||!t?.isLongActive)return null;function n(r,o,i={}){let s=t.resolveLaneModeState?.(o)?.pathActive??t.isLaneMode(o),u=r?.modelV2||null,l=(r?.lateralPlan||null)?.position,d=Array.isArray(l?.x)&&l.x.length>2,f={model:u,pathData:s&&d?l:u?.position||null,pathSource:s&&d?"lateralPlan":"modelV2",laneMode:s},m=dc(s?i.ShowPathModeLane:i.ShowPathMode,0),p=dc(s?i.ShowPathColorLane:i.ShowPathColor,13),b=!t.isLongActive(r);if(b)p=dc(i.ShowPathColorCruiseOff,19);else if(p>=20){let x=r?.radarState?.leadOne||{},E=gv(o?.longitudinalPlan?.accels,0);p=13,x.status&&(Math.abs(E)<.5?p=12:E>=.5?p=11:p=10)}let g={mode:m,colorIndex:p,paletteIndex:p%10,emphasisStroke:p>=10||!!o?.carState?.brakeLights,strokeColor:o?.carState?.brakeLights?"rgba(255, 76, 76, 0.96)":"rgba(255, 255, 255, 0.92)",isCruiseOff:b,laneMode:s};return{selectedPath:f,pathStyle:g}}return Object.freeze({resolve:n})}var Tf=Object.freeze({create:bv});function Of(e=globalThis){return e.DriveVisionRoadOverlayPolicy=Tf,Tf}var fc="default",Cf="lane",wf="road-edge";function br(e,t,n){return Math.min(n,Math.max(t,e))}function Ee(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function yv(e={}){let t=e.projectPoint,n=e.projectPointPrecise,r=Ee(e.maxDrawDistance,100),o=typeof e.isFullDetailActive=="function"?e.isFullDetailActive:()=>!1;if(typeof t!="function"||typeof n!="function")return null;let i,a,s=null,u=33;function c(T){let I=Number(T);Number.isFinite(I)&&(u=s===null?33:Math.max(0,I-s),s=I),i={pathLengthIdx:new WeakMap,ribbon:new WeakMap,verticalRibbon:new WeakMap,pathZ:new WeakMap,pathY:new WeakMap}}function l(){a=new Map,s=null,u=33}function d(T,I){if(!I||typeof I!="object")return null;let k=T.get(I);return k||(k=new Map,T.set(I,k)),k}function f(T,I){if(o())return 1;let k=Ee(T,0),D=Ee(I,r);return D<=36?1:k>=Math.min(D*.72,62)?3:k>=Math.min(D*.44,34)?2:1}function m(T,I,k=fc){let D=f(T,I);if(D===1&&o())return 1;let B=Ee(T,0);return k===wf?B>=64?Math.min(D+2,5):B>=40?Math.min(D+1,4):D:k===Cf&&B>=58?Math.min(D+1,4):D}function p(T,I,k,D,B=fc){if(I<0)return;let W=0,V=-1;for(;W<=I;)D(W),V=W,W+=m(T[W],k,B);V!==I&&D(I)}function b(T,I="side"){return T===wf?I==="center"?1.12:1.22:T===Cf?I==="center"?1.06:1.12:1}function g(T,I,k){let D=Ee(T,0),B=Math.max(52,Math.min(Ee(I,r),r));if(D<=16)return 0;let W=br((D-16)/Math.max(1,B-16),0,1);return k*W}function x(T,I,k,D=.34){if(!Array.isArray(T)||T.length<3)return T;let B=null;for(let W=1;W({x:Z.x,y:Z.y}))),B[W].x=H.x+($-H.x)*V,B[W].y=H.y+(K-H.y)*V}return B||T}function E(T,I){let k=Number(T),D=Number(I);return!Number.isFinite(D)||D<=0?1:!Number.isFinite(k)||k<=0?0:k>=250?1:1-Math.exp(-k/D)}function y(T,I,k){let D=k.x-I.x,B=k.y-I.y,W=Math.sqrt(Math.hypot(D,B));return T+Math.max(W,1e-4)}function O(T,I,k,D,B){let V=y(0,T,I),F=y(V,I,k),H=y(F,k,D),Y=V+(F-V)*B,$=(U,X,pe,xe)=>{let Je=xe-pe;if(!(Math.abs(Je)>1e-9))return{x:U.x,y:U.y};let et=(Y-pe)/Je;return{x:U.x+(X.x-U.x)*et,y:U.y+(X.y-U.y)*et}},K=$(T,I,0,V),Z=$(I,k,V,F),ee=$(k,D,F,H),ue=$(K,Z,0,F),de=$(Z,ee,V,H),ye=$(ue,de,V,F);return{x:br(ye.x,Math.min(I.x,k.x),Math.max(I.x,k.x)),y:br(ye.y,Math.min(I.y,k.y),Math.max(I.y,k.y))}}function C(T,I=4){let k=Math.max(1,Math.round(I));if(!Array.isArray(T)||T.length<2||k===1)return T;let D=W=>T[br(W,0,T.length-1)],B=[T[0]];for(let W=0;W({x:B.x,y:B.y}));let D=br(k,0,1);return I.map((B,W)=>({x:T[W].x+(B.x-T[W].x)*D,y:T[W].y+(B.y-T[W].y)*D}))}function z(T,I,k){if(!T||!I?.polygon?.length)return I;let D=E(u,k),B=a.get(T),W=w(B?.left,I.left,D),V=w(B?.right,I.right,D),F=w(B?.center,I.center,D),H={left:W,right:V,center:F,polygon:W.length>=2&&V.length>=2?W.concat([...V].reverse()):[]};return a.set(T,H),H}function M(T,I){let k=d(i.pathLengthIdx,T),D=Number.isFinite(Number(I))?Math.round(Number(I)*100):"default";if(k?.has(D))return k.get(D);let B=Array.isArray(T?.x)?T.x:[],W=0;for(let V=1;VI);V+=1)W=V;return k?.set(D,W),W}function R(T,I,k,D,B,W=!1,V=0,F=fc){let H=d(i.ribbon,I),Y=[Math.round(Ee(k,0)*1e3),Math.round(Ee(D,0)*1e3),Math.round(Ee(B,r)*100),W?1:0,Math.round(Ee(V,0)*1e3),F].join("|");if(H?.has(Y))return H.get(Y);let $=Array.isArray(I?.x)?I.x:[],K=Array.isArray(I?.y)?I.y:[],Z=Array.isArray(I?.z)?I.z:[],ee=[],ue=[],de=[],ye=[],U=M(I,B);p($,U,B,an=>{let te=Ee($[an],NaN);if(!Number.isFinite(te)||te<0)return;let Re=Ee(K[an],0)+V,mt=Ee(Z[an],0)+D,Ce=n(T,te,Re-k,mt),Ke=n(T,te,Re+k,mt),Ge=n(T,te,Re,mt);!Ce||!Ke||!Ge||!W&&de.length&&Ge.y>de[de.length-1].y||(ee.push(Ce),ue.push(Ke),de.push(Ge),ye.push(te))},F);let X=Ee(B,r),pe=b(F,"side"),xe=b(F,"center"),Je=x(ee,ye,X,.34*pe),et=x(ue,ye,X,.34*pe),ft=x(de,ye,X,.24*xe),He=o(),wt=He?C(Je):Je,pt=He?C(et):et,on=He?C(ft):ft,Vn={left:wt,right:pt,center:on,polygon:wt.length>=2&&pt.length>=2?wt.concat([...pt].reverse()):[]};return H?.set(Y,Vn),Vn}function v(T,I,k,D,B,W){let V=d(i.verticalRibbon,I),F=[Math.round(Ee(k,0)*1e3),Math.round(Ee(D,0)*1e3),Math.round(Ee(B,0)*1e3),Math.round(Ee(W,r)*100)].join("|");if(V?.has(F))return V.get(F);let H=Array.isArray(I?.x)?I.x:[],Y=Array.isArray(I?.y)?I.y:[],$=Array.isArray(I?.z)?I.z:[],K=[],Z=[],ee=[],ue=M(I,W);p(H,ue,W,pe=>{let xe=Ee(H[pe],NaN);if(!Number.isFinite(xe)||xe<0)return;let Je=Ee(Y[pe],0)+k,et=Ee($[pe],0),ft=t(T,xe,Je,et+D),He=t(T,xe,Je,et+B);!ft||!He||K.length&&ft.y>K[K.length-1].y||(K.push(ft),Z.push(He),ee.push(xe))});let de=Ee(W,r),ye=x(K,ee,de,.34),U=x(Z,ee,de,.34),X=ye.length>=2&&U.length>=2?ye.concat([...U].reverse()):[];return V?.set(F,X),X}function h(T,I,k,D){if(!Array.isArray(T)||!Array.isArray(I)||T.length<2||I.length<2||T.length!==I.length)return[];let B=[],W=[];for(let V=0;VF&&W({}),r=typeof e.isPerformanceActive=="function"?e.isPerformanceActive:()=>!1,o=e.paletteColor,i=e.rgba,a=e.getCachedGradient,s=e.geometry||{},u=In(e.pathZOffset,1.22),c=In(e.maxDrawDistance,100);if(!t||typeof o!="function"||typeof i!="function"||typeof a!="function"||typeof s.drawPolygon!="function"||typeof s.drawPolyline!="function"||typeof s.buildRibbon!="function"||typeof s.smoothRibbon!="function"||typeof s.buildBandPolygon!="function"||typeof s.getSceneMaxDistance!="function"||typeof s.getPathMaxDistance!="function"||typeof s.getPathLengthIndex!="function")return null;function l(C,w,z,M){if(!Array.isArray(C)||C.length<3||C.length!==w.length)return;let R=o(z.paletteIndex),v=z.emphasisStroke?z.strokeColor:"";for(let h=0;h{let h=t.createLinearGradient(0,w,0,w*.32);return h.addColorStop(0,i(C,M)),h.addColorStop(.55,i(C,R)),h.addColorStop(1,i(C,0)),h})}function m(C,w,z){if(!C.polygon.length)return;let M=o(w.paletteIndex);if(w.mode===0){s.drawPolygon(C.polygon,i(M,.42),w.emphasisStroke?w.strokeColor:"",w.emphasisStroke?2:0);return}let R=d(w),v=r()?{type:"vertical-gradient",color:M,bottomAlpha:R.solidAlpha,midAlpha:R.midAlpha}:f(M,z,w);s.drawPolygon(C.polygon,v,w.emphasisStroke?w.strokeColor:"",w.emphasisStroke?1.7:0)}function p(C,w){if(!C.center.length)return;let z={1:[14,11],2:[10,8],3:[26,12],4:[18,10,5,10],5:[30,12],6:[12,7],7:[20,8,4,8],8:[8,6]},M=o(w.paletteIndex),R=z[w.mode]||z[1],v=R.reduce((S,A)=>S+A,0),h=-(performance.now()/120%v);s.drawPolyline(C.center,i(M,.78),5.5,R,h),w.emphasisStroke&&s.drawPolyline(C.center,w.strokeColor,1.6)}function b(C,w){let z=w.mode===9?3:w.mode===10?4:w.mode===11?5:6;l(C.left,C.right,w,z)}function g(C,w){let z=o(w.paletteIndex),M=[];(w.mode===13||w.mode===14)&&(M.push(s.buildBandPolygon(C.left,C.right,0,.18)),M.push(s.buildBandPolygon(C.left,C.right,.82,1))),(w.mode===13||w.mode===15)&&M.push(s.buildBandPolygon(C.left,C.right,.38,.62));for(let R of M)s.drawPolygon(R,i(z,.34),w.emphasisStroke?w.strokeColor:"",w.emphasisStroke?1.4:0)}function x(){return .9*yr(In(n().ShowPathWidth,100)/100,.1,2)}function E(C,w,z,M,R,v){if(!C||!Array.isArray(C.x)||!C.x.length)return;let h=s.getSceneMaxDistance(w,z),S=s.buildRibbon(M,C,x(),u,s.getPathMaxDistance(h),!1),A=s.smoothRibbon(`path:${v?.laneMode?"lane":"model"}:${v?.mode??0}`,S,110);if(!(A.polygon.length<3)&&(m(A,v,R),v.mode!==0)){if(v.mode>=13&&v.mode<=15){g(A,v);return}if(v.mode>=9){b(A,v);return}p(A,v)}}function y(C,w,z,M){let R=Array.isArray(C?.laneLines)?C.laneLines:[],v=Array.isArray(C?.laneLineProbs)?C.laneLineProbs:[];if(!R.length)return;let h=In(z?.carState?.leftLaneLine,0),S=In(z?.carState?.rightLaneLine,0),A=s.getSceneMaxDistance(C,w),L=s.getPathLengthIndex(R[0],A);for(let P=0;P=.02?_:_>=.003?yr(_*6,.02,.12):0;if(T<=0)continue;let I=P===1&&Math.floor(h/10)===2,k=P===2&&Math.floor(S/10)===2,D=I||k?{r:255,g:217,b:94}:{r:255,g:255,b:255},W=Math.max(I||k?.025:.01,.025*T)*1.4,V=_>=.02?yr(T,.12,.7):yr(T*3,.16,.26),F=_>=.02?.2:.24,H=In(R[P]?.x?.[L],c),Y=s.buildRibbon(M,R[P],W,0,H,!1,0,Nf),$=s.smoothRibbon(`lane:${P}`,Y,140);if(s.drawPolygon($.polygon,`rgba(${D.r},${D.g},${D.b},${V.toFixed(3)})`,`rgba(${D.r},${D.g},${D.b},${F.toFixed(3)})`,1),P===1&&h%10===4||P===2&&S%10===4){let K=P===1?-.3:.3,Z=s.buildRibbon(M,R[P],W,0,H,!1,K,Nf),ee=s.smoothRibbon(`lane:${P}:double:${K}`,Z,140);s.drawPolygon(ee.polygon,`rgba(${D.r},${D.g},${D.b},${V.toFixed(3)})`,`rgba(${D.r},${D.g},${D.b},${F.toFixed(3)})`,1)}}}function O(C,w,z){let M=Array.isArray(C?.roadEdges)?C.roadEdges:[],R=Array.isArray(C?.roadEdgeStds)?C.roadEdgeStds:[];if(!M.length)return;let v=s.getSceneMaxDistance(C,w),h=s.getPathLengthIndex(M[0],v);for(let S=0;S0&&rn(e?.dRel,1/0)({}),n=rn(e.pathZOffset,1.22),r=e.geometry||{},o=e.ui||{};if(typeof r.buildVerticalRibbon!="function"||typeof r.drawPolygon!="function"||typeof r.samplePathY!="function"||typeof r.interpolate!="function"||typeof r.projectPoint!="function"||typeof r.drawPolyline!="function"||typeof o.getScale!="function"||typeof o.displayDistance!="function"||typeof o.clampTextAnchor!="function"||typeof o.drawText!="function")return null;function i(s,u,c,l){if(!s||!Array.isArray(s.x)||s.x.length<2)return;let d=u?.radarState||{},f=c?.carState||{},m=u?.lateralPlan||{},p=rn(f?.vEgo,rn(f?.vEgoCluster,0)),b=rn(m?.laneChangeState,0),g=rn(m?.laneChangeDirection,0),x=!!f?.leftBlindspot,E=!!f?.rightBlindspot,y=!x&&b===1&&g===1&&Lf(d?.leadLeft,p),O=!E&&b===1&&g===2&&Lf(d?.leadRight,p);if(!x&&!E&&!y&&!O)return;let C="rgba(255, 215, 0, 0.48)",w="rgba(255, 215, 0, 0.84)",z="rgba(0, 204, 0, 0.44)",M="rgba(0, 204, 0, 0.80)",R=(v,h,S)=>{let A=r.buildVerticalRibbon(l,s,v,1.15,.6,40);A.length<8||r.drawPolygon(A,h,S,1.2)};x?R(-1.7,C,w):y&&R(-1.7,z,M),E?R(1.7,C,w):O&&R(1.7,z,M)}function a(s,u,c,l,d){if(rn(t().ShowPathEnd,0)<=0)return;let f=rn(u?.desiredDistance,0);if(!Number.isFinite(f)||f<=0)return;let m=Array.isArray(s?.x)?s.x:[];if(m.length<2)return;let p=rn(m[m.length-1],0);if(!p||f>p)return;let b=r.samplePathY(s,f),g=r.interpolate(f,m,Array.isArray(s?.z)?s.z:[]);if(!Number.isFinite(b)||!Number.isFinite(g))return;let x=r.projectPoint(c,f,b-1,g+n),E=r.projectPoint(c,f,b+1,g+n);if(!x||!E)return;let y=o.getScale(l,d);r.drawPolyline([x,E],"rgba(255,255,255,0.92)",Math.max(3*y,1.6));let O=`${o.displayDistance(f).toFixed(1)}(${rn(u?.tFollow,0).toFixed(2)})`,C=Math.max(20*y,12),w=o.clampTextAnchor({x:E.x+10,y:E.y-4},O,C,l,d);o.drawText(O,w.x,w.y,{fontSize:C,fontWeight:800,align:"left",strokeWidth:Math.max(3.4*y,1.8)})}return Object.freeze({drawBlindspotBarriers:i,drawProjectedTfMarker:a})}var kf=Object.freeze({create:Mv});function Ff(e=globalThis){return e.DriveVisionRoadOverlayAuxRenderer=kf,kf}function Pt(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function pc(e={}){let t=typeof e.text=="function"?e.text:(c,l)=>l;function n(c){let l=Array.isArray(c?.leadsV3)?c.leadsV3[0]:null,d=Pt(l?.prob,0),f=Pt(l?.x?.[0],0);return d>.5&&f>0?Math.max(0,f-1.52):0}function r(c,l){let d=l?.longitudinalPlan||{},f=c?.carrotMan||l?.carrotMan||{},m=l?.carState||{},p=Pt(d?.xState,Pt(f?.xState,-1)),b=Pt(d?.trafficState,Pt(f?.trafficState,-1)),g=!!l?.controlsState?.enabled,x=Pt(m?.vEgo,Pt(m?.vEgoCluster,0)),E=!!m?.brakeHoldActive,y=Pt(m?.softHoldActive,0)>0,O=Pt(m?.carrotCruise,0)>0;return E||y||O?{text:E?"AUTOHOLD":y?"SOFTHOLD":"CARROT",xState:p,showDistanceBadge:!1}:g?p===3||p===5?{text:x<1?b>=1e3?"Signal Error":"Signal Ready":"Signal slowing",xState:p,showDistanceBadge:!1}:p===4?{text:t("e2e_driving","E2E driving"),xState:p,showDistanceBadge:!1}:p===0||p===1||p===2?{text:"",xState:p,showDistanceBadge:!0}:{text:"",xState:p,showDistanceBadge:!1}:{text:"",xState:p,showDistanceBadge:!0}}function o(c){return c===0?"#ffffff":c===1?"#b0b0b0":"#23d55d"}function i(c){let l=c?.carState||{};return l?.brakeHoldActive?"AUTOHOLD":Pt(l?.softHoldActive,0)>0?"SOFTHOLD":Pt(l?.carrotCruise,0)>0?"CARROT":""}function a(c){let l=c&&typeof c=="object"?c:{},d=[...Array.isArray(l.leadsLeft)?l.leadsLeft:[],...Array.isArray(l.leadsRight)?l.leadsRight:[],...Array.isArray(l.leadsCenter)?l.leadsCenter:[]];if(d.length)return d;let f=[];return l.leadOne?.status&&f.push(l.leadOne),l.leadTwo?.status&&f.push(l.leadTwo),f}function s(c){let d=(Array.isArray(c?.laneLines)?c.laneLines:[])[2];return Array.isArray(d?.x)&&Array.isArray(d?.z)&&d.x.length&&d.z.length?d:c?.position||null}function u(c,l){let d=c?.leadTwo||null,f=!!d?.status&&!!d?.radar&&Pt(d?.dRel,0)>Pt(c?.leadOne?.dRel,0)+3,m=Pt(l?.longitudinalPlanSource,0)===2?2:1;return{lead:d,valid:f,status:m}}return Object.freeze({getPrimaryVisionDistance:n,resolveLeadState:r,getDistanceBadgeTextColor:o,getPathStatusText:i,getRadarTracks:a,getRadarProjectionLine:s,resolveLeadTwo:u})}var zf=Object.freeze({create:pc});function jf(e=globalThis){return e.DriveVisionRoadOverlayLeadModel=zf,zf}var Vf=1500;function Av(e,t,n){return Math.min(n,Math.max(t,e))}function Lt(e,t=0){let n=Number(e);return Number.isFinite(n)?n:t}function Rv(e={}){let t=e.context,n=e.model||pc(e.modelOptions),r=typeof e.getParams=="function"?e.getParams:()=>({}),o=typeof e.isMetricDisplay=="function"?e.isMetricDisplay:()=>!0,i=typeof e.displayDistance=="function"?e.displayDistance:R=>Number(R),a=e.baseCamera||{width:1928,height:1208},s=String(e.fontFamily||"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"),u=e.projection||{},c=e.geometry||{},l=e.ui||{},d=e.temporal||{};if(!t||!n?.resolveLeadState||typeof u.projectLeadBox!="function"||typeof u.projectLeadTwoBox!="function"||typeof u.projectPathEndAnchorBox!="function"||typeof u.samplePathZ!="function"||typeof u.projectPointPrecise!="function"||typeof c.drawPolyline!="function"||typeof c.drawPolygon!="function"||typeof c.circlePolygon!="function"||typeof l.getScale!="function"||typeof l.getBadgeOffsets!="function"||typeof l.getVisibleRect!="function"||typeof l.fillRoundedRect!="function"||typeof l.strokeRoundedRect!="function"||typeof l.drawText!="function"||typeof d.now!="function"||typeof d.resetLeadSlot!="function"||typeof d.resetLeadTwo!="function")return null;let f,m;function p(){f={lastValidMs:0,box:null,strokeColor:null,isLeadScc:!1,radarDist:0,visionDist:0,badgeTextColor:"#ffffff"},m={lastCameraFrameId:NaN,lastModelFrameId:NaN,lastSourceWidth:NaN,lastSourceHeight:NaN}}function b(R=d.now()){return!f.box||R-Lt(f.lastValidMs,0)>=Vf?null:f.box}function g(R,v,h,S){let A=Lt(R,NaN),L=Lt(v,NaN),P=Lt(h,NaN),_=Lt(S,NaN),T=m,I=Number.isFinite(T.lastSourceWidth)&&Number.isFinite(T.lastSourceHeight)&&(Math.abs(T.lastSourceWidth-A)>.5||Math.abs(T.lastSourceHeight-L)>.5),k=Number.isFinite(T.lastCameraFrameId)&&Number.isFinite(_)&&_{let X=B*.62,pe=Math.max(52*F,16*F+de.length*X),xe=ye-pe*.5;l.fillRoundedRect(t,xe,V,pe,D,k.radius,U),t.save(),t.font=`800 ${B}px ${s}`,t.textAlign="center",t.textBaseline="middle",t.lineJoin="round",t.strokeStyle="rgba(0,0,0,0.82)",t.fillStyle=A,t.lineWidth=k.strokeWidth,t.strokeText(de,ye,V+D*.54),t.fillText(de,ye,V+D*.54),t.restore()},Y=S?"rgba(255,0,0,0.92)":"rgba(255,175,3,0.92)",$="rgba(0,0,255,0.92)",K=R.centerX-k.dx,Z=R.centerX+k.dx,ee=v<10?v.toFixed(1):v.toFixed(0),ue=h<10?h.toFixed(1):h.toFixed(0);v>0&&h>0?(H(ee,K,Y),H(ue,Z,$)):v>0?H(ee,K,Y):h>0&&H(ue,Z,$)}function O(R,v,h,S,A,L,P){if(!R?.rect||!v)return;let _=l.getScale(h,S),T=l.getBadgeOffsets(h,S),I=l.getVisibleRect(h,S,A,L,P),k=Math.min(R.centerY+T.textBaselineOffset,Math.max(I.top+6*_,I.bottom-6*_));l.drawText(v,R.centerX,k,{fontSize:Math.max(50*_,22),fontWeight:900,fillStyle:"#ffffff",strokeStyle:"rgba(0,0,0,0.88)",strokeWidth:Math.max(4*_,2.2),align:"center",baseline:"bottom"})}function C(R,v,h,S,A){if(!R||!v)return;let L=l.getScale(S,A),P=Math.max(40*L,35*L*String(v).length),_=Math.max(42*L,20),T=R.x-P*.5,I=R.y-35*L;l.fillRoundedRect(t,T,I,P,_,Math.max(15*L,7),h),l.drawText(String(v),R.x,R.y,{fontSize:Math.max(40*L,18),fontWeight:900,strokeWidth:Math.max(4.2*L,2.2)})}function w(R,v,h,S,A,L=null){let P=n.getPathStatusText(v);if(!P)return;let _=L||u.projectPathEndAnchorBox(R,h,S,A);if(!_)return;let T=l.getScale(S,A),I=Math.max(50*T,22),k=Av(_.centerY+60*T,I+8*T,A-10*T);l.drawText(P,_.centerX,k,{fontSize:I,fontWeight:900,fillStyle:"#ffffff",strokeStyle:"rgba(0,0,0,0.88)",strokeWidth:Math.max(4*T,2.2),align:"center",baseline:"bottom"})}function z(R,v,h,S,A){let L=r(),P=Lt(L.ShowRadarInfo,0);if(P<=0)return;let _=n.getRadarProjectionLine(v);if(!_)return;let T=Lt(L.RadarLatFactor,0)/100,I=o();for(let k of n.getRadarTracks(R)){let D=Lt(k?.dRel,0);if(!Number.isFinite(D)||D<=2.5)continue;let B=Lt(k?.yRel,0),W=u.samplePathZ(_,D)-.61,V=u.projectPointPrecise(h,D,-B,W);if(!V)continue;let F=Lt(k?.vLeadK,Lt(k?.vRel,0)),H=Lt(k?.vLat,0),Y=Math.sqrt(F*F+H*H),$=F>=0?Y:-Y,K=!!k?.radar,Z=Lt(k?.modelProb,0);if(Y>3){let ee=Math.max(2,D+F*T),ue=B+H*T,de=Math.abs(F)>3?u.projectPointPrecise(h,ee,-ue,W):null;if(de){let X=$>=0?"rgba(35,213,93,0.94)":"rgba(255,59,48,0.94)",pe=l.getScale(S,A);c.drawPolyline([V,de],X,Math.max(3*pe,1.6)),c.drawPolygon(c.circlePolygon(de.x,de.y,Math.max(10*pe,5)),X)}let ye="rgba(255,59,48,0.96)";K?Math.abs(Z-.01)<.001?ye="rgba(35,213,93,0.96)":$>0&&(ye="rgba(255,167,38,0.96)"):ye="rgba(61,123,255,0.96)";let U=$*(I?3.6:2.2369363);if(C(V,U.toFixed(0),ye,S,A),P>=2){let X=l.getScale(S,A);l.drawText(i(Lt(k?.yRel,0)).toFixed(1),V.x,V.y-40*X,{fontSize:Math.max(30*X,15),fontWeight:900,strokeWidth:Math.max(3.8*X,2)}),l.drawText(i(D).toFixed(1),V.x,V.y+30*X,{fontSize:Math.max(30*X,15),fontWeight:900,strokeWidth:Math.max(3.8*X,2)})}}else if(P>=3){let ee=l.getScale(S,A);l.drawText("*",V.x,V.y,{fontSize:Math.max(40*ee,18),fontWeight:900,strokeWidth:Math.max(4.2*ee,2.2)})}}}function M(R,v,h,S,A,L,P,_,T){let I=v?.radarState||{},k=R?.position||null,D=n.resolveLeadState(v,h),B=v?.roadCameraState||null,W=n.resolveLeadTwo(I,h?.longitudinalPlan||{});g(A,L,R?.frameId,B?.frameId);let V=u.projectLeadBox(I?.leadOne,k,S,A,L,0,P,_,T,{includeDistanceBadge:D?.showDistanceBadge!==!1,includeStateText:!!D?.text}),F=d.now(),H=null;if(V){let Y=V.radarTrackId<1,$=V.radarDetected?Y?"rgba(255,0,0,0.96)":"rgba(255,175,3,0.96)":"rgba(0,0,255,0.96)";if(E(V,!0),x(V,$,"rgba(0,0,0,0.20)",!0),f.lastValidMs=F,f.box=V,f.strokeColor=$,f.isLeadScc=Y,D?.showDistanceBadge!==!1){let K=I?.leadOne?.radar?Math.max(0,Lt(I?.leadOne?.dRel,0)):0,Z=n.getPrimaryVisionDistance(R);if(f.radarDist=K,f.visionDist=Z,K>0||Z>0){let ee=n.getDistanceBadgeTextColor(D?.xState);f.badgeTextColor=ee,y(V,K,Z,Y,ee,A,L,P,_,T)}}D?.text&&O(V,D.text,A,L,P,_,T),H=V}else if(f.box&&F-f.lastValidMs0||Y.visionDist>0)&&y(Y.box,Y.radarDist,Y.visionDist,Y.isLeadScc,Y.badgeTextColor,A,L,P,_,T),D?.text&&O(Y.box,D.text,A,L,P,_,T),H=Y.box}else f.box=null;if(W.valid){let Y=u.projectLeadTwoBox(W.lead,k,S,A,L,P,_,T);Y&&(E(Y,!1),x(Y,"rgba(218,111,37,0.96)",W.status===2?"rgba(255,0,0,0.20)":"rgba(0,0,0,0.20)",!1))}else d.resetLeadSlot(1),d.resetLeadTwo();w(k,h,S,A,L,H),z(I,R,S,A,L)}return p(),Object.freeze({draw:M,reset:p,getHeldBox:b})}var Hf=Object.freeze({create:Rv});function Bf(e=globalThis){return e.DriveVisionRoadOverlayLeadRenderer=Hf,Hf}var Ot=Object.freeze({INACTIVE:"inactive",SUSPENDED:"suspended",WAITING:"waiting",RUNNING:"running"}),gn=Object.freeze({VISIBLE:"visible",HIDDEN:"hidden",FROZEN:"frozen"}),_n=Object.freeze({UNKNOWN:"unknown",REACHABLE:"reachable",UNREACHABLE:"unreachable"}),hn=Object.freeze({IDLE:"idle",CONNECTING:"connecting",CONNECTED:"connected",RECOVERING:"recovering",BLOCKED:"blocked"}),Oe=Object.freeze({USER_START:"user-start",USER_STOP:"user-stop",PAGE_HIDDEN:"page-hidden",PAGE_FROZEN:"page-frozen",PAGE_VISIBLE:"page-visible",PAGE_RESTORED:"page-restored",WINDOW_FOCUS:"window-focus",SOURCE_AVAILABLE:"source-available",SOURCE_UNAVAILABLE:"source-unavailable",NETWORK_REACHABLE:"network-reachable",NETWORK_UNREACHABLE:"network-unreachable",CONNECT_BEGIN:"connect-begin",CONNECT_SUCCESS:"connect-success",CONNECT_FAILURE:"connect-failure",CONNECT_ABORTED:"connect-aborted",CONNECTION_LOST:"connection-lost",OWNERSHIP_BLOCKED:"ownership-blocked",OWNERSHIP_RELEASED:"ownership-released",DISCONNECT_COMPLETE:"disconnect-complete"}),bn=Object.freeze({ENSURE_RUNNING:"ensure-running",ENSURE_SUSPENDED:"ensure-suspended",ENSURE_STOPPED:"ensure-stopped",SCHEDULE_RECOVERY:"schedule-recovery"}),xv=new Set(Object.values(Oe)),Ev=new Set(Object.values(gn)),Tv=new Set(Object.values(_n)),Ov=new Set(Object.values(hn));function Wf(e){return e.requested?e.page!==gn.VISIBLE?Ot.SUSPENDED:!e.sourceAvailable||e.network===_n.UNREACHABLE?Ot.WAITING:Ot.RUNNING:Ot.INACTIVE}function Gf(e){return e===Ot.RUNNING?bn.ENSURE_RUNNING:e===Ot.INACTIVE?bn.ENSURE_STOPPED:bn.ENSURE_SUSPENDED}function Cv(e){return Ev.has(e)?e:gn.VISIBLE}function wv(e){return Tv.has(e)?e:_n.UNKNOWN}function Iv(e){return Ov.has(e)?e:hn.IDLE}function $f(e){return Object.freeze({requested:!!e.requested,page:Cv(e.page),sourceAvailable:e.sourceAvailable!==!1,network:wv(e.network),desired:e.desired,phase:Iv(e.phase),revision:Math.max(0,Number.parseInt(e.revision,10)||0)})}function Uf(e={}){let t={requested:!1,page:gn.VISIBLE,sourceAvailable:!0,network:_n.UNKNOWN,phase:hn.IDLE,revision:0,...e};return t.desired=Wf(t),$f(t)}function _v(e,t){return e.requested!==t.requested||e.page!==t.page||e.sourceAvailable!==t.sourceAvailable||e.network!==t.network||e.desired!==t.desired||e.phase!==t.phase}function Nv(e,t){let n=Uf(e),r=typeof t=="string"?t:t?.type;if(!xv.has(r))throw new TypeError(`Unknown Carrot Vision session event: ${String(r)}`);let o={...n},i=null;switch(r){case Oe.USER_START:o.requested=!0;break;case Oe.USER_STOP:o.requested=!1;break;case Oe.PAGE_HIDDEN:o.page=gn.HIDDEN;break;case Oe.PAGE_FROZEN:o.page=gn.FROZEN;break;case Oe.PAGE_VISIBLE:case Oe.PAGE_RESTORED:case Oe.WINDOW_FOCUS:o.page=gn.VISIBLE;break;case Oe.SOURCE_AVAILABLE:o.sourceAvailable=!0;break;case Oe.SOURCE_UNAVAILABLE:o.sourceAvailable=!1;break;case Oe.NETWORK_REACHABLE:o.network=_n.REACHABLE;break;case Oe.NETWORK_UNREACHABLE:o.network=_n.UNREACHABLE;break;case Oe.CONNECT_BEGIN:o.phase=hn.CONNECTING;break;case Oe.CONNECT_SUCCESS:o.phase=hn.CONNECTED,n.desired!==Ot.RUNNING&&(i=Gf(n.desired));break;case Oe.CONNECT_FAILURE:case Oe.CONNECTION_LOST:o.phase=n.desired===Ot.RUNNING?hn.RECOVERING:hn.IDLE,n.desired===Ot.RUNNING&&(i=bn.SCHEDULE_RECOVERY);break;case Oe.CONNECT_ABORTED:case Oe.DISCONNECT_COMPLETE:o.phase=hn.IDLE;break;case Oe.OWNERSHIP_BLOCKED:o.phase=hn.BLOCKED;break;case Oe.OWNERSHIP_RELEASED:o.phase=hn.IDLE,n.desired===Ot.RUNNING&&(i=bn.ENSURE_RUNNING);break;default:break}o.desired=Wf(o);let a=[];n.desired!==o.desired?a.push(Gf(o.desired)):i&&a.push(i);let s=_v(n,o);return o.revision=s?n.revision+1:n.revision,Object.freeze({changed:s,state:$f(o),effects:Object.freeze(a)})}var mc=Object.freeze({desired:Ot,page:gn,network:_n,phase:hn,event:Oe,effect:bn,createState:Uf,reduce:Nv});function Yf(e=globalThis){return e?(e.DriveVisionSessionPolicy||(e.DriveVisionSessionPolicy=mc),e.DriveVisionSessionPolicy):mc}var Kf=mc;var Dv=Object.freeze({[Ot.INACTIVE]:bn.ENSURE_STOPPED,[Ot.SUSPENDED]:bn.ENSURE_SUSPENDED,[Ot.WAITING]:bn.ENSURE_SUSPENDED,[Ot.RUNNING]:bn.ENSURE_RUNNING});function Pv(e){if(typeof queueMicrotask=="function"){queueMicrotask(e);return}Promise.resolve().then(e)}function Lv(e,t=!1){return e===gn.FROZEN?Oe.PAGE_FROZEN:e===gn.HIDDEN?Oe.PAGE_HIDDEN:t?Oe.PAGE_RESTORED:Oe.PAGE_VISIBLE}function kv(e){return e===_n.REACHABLE?Oe.NETWORK_REACHABLE:e===_n.UNREACHABLE?Oe.NETWORK_UNREACHABLE:null}function Fv(e,t){return Object.freeze({...e||{},...t||{},reasons:Object.freeze([...(e?.reasons||[]).filter(Boolean),...(t?.reasons||[]).filter(Boolean),t?.reason].filter(Boolean)),freshSession:!!(e?.freshSession||t?.freshSession)})}function zv(e={}){let t=e.policy||Kf,n=e.handlers||{},r=typeof e.schedule=="function"?e.schedule:Pv,o=typeof e.onTransition=="function"?e.onTransition:null,i=typeof e.onEffect=="function"?e.onEffect:null,a=typeof e.onError=="function"?e.onError:null,s=t.createState(e.initialState||{}),u=null,c=!1,l=!1,d=!1,f=[];function m(){if(c||l||u)return;let w=f;f=[],w.forEach(z=>z(s))}async function p(){if(l||d){m();return}l=!0;try{for(;u&&!d;){let w=u;u=null;let z=n[w.effect];if(i?.(w),typeof z=="function")try{await z(Object.freeze({effect:w.effect,detail:w.detail,state:s,revision:w.revision}))}catch(M){a?.(M,w)}}}finally{l=!1,u&&!d&&b(),m()}}function b(){c||l||d||(c=!0,r(()=>{c=!1,p()}))}function g(w,z={}){if(!w||d)return;let M=u?.effect===w?u.detail:null;u=Object.freeze({effect:w,detail:Fv(M,z),revision:s.revision}),b()}function x(w,z={}){if(d)return Object.freeze({changed:!1,state:s,effects:Object.freeze([])});let M=typeof w=="string"?w:w?.type,R=t.reduce(s,w),v=s;s=R.state,o?.(Object.freeze({type:M,previous:v,...R,detail:z}));let h=M===Oe.PAGE_RESTORED;return R.effects.forEach(S=>{g(S,{...z,event:M,freshSession:!!(z.freshSession||h)})}),R}function E(w={},z={}){if(Object.prototype.hasOwnProperty.call(w,"requested")){let M=!!w.requested;M!==s.requested&&x(M?Oe.USER_START:Oe.USER_STOP,z)}if(Object.prototype.hasOwnProperty.call(w,"page")){let M=w.page;(M!==s.page||z.restored===!0)&&x(Lv(M,z.restored===!0),z)}if(Object.prototype.hasOwnProperty.call(w,"sourceAvailable")){let M=w.sourceAvailable!==!1;M!==s.sourceAvailable&&x(M?Oe.SOURCE_AVAILABLE:Oe.SOURCE_UNAVAILABLE,z)}if(Object.prototype.hasOwnProperty.call(w,"network")){let M=w.network,R=kv(M);R&&M!==s.network&&x(R,z)}return s}function y(w={}){g(Dv[s.desired],{...w,event:"reconcile"})}function O(){return!c&&!l&&!u?Promise.resolve(s):new Promise(w=>f.push(w))}function C(){d=!0,u=null,m()}return Object.freeze({dispatch:x,updateInputs:E,reconcile:y,whenIdle:O,destroy:C,snapshot:()=>s,status:()=>Object.freeze({state:s,scheduled:c,processing:l,pendingEffect:u?.effect||null,destroyed:d})})}var qf=Object.freeze({create:zv});function Xf(e=globalThis){return e?(e.DriveVisionLifecycleController||(e.DriveVisionLifecycleController=qf),e.DriveVisionLifecycleController):qf}var Zf="vision-connection-stale",jo=class extends Error{constructor(t="Carrot Vision connection attempt is no longer current"){super(t),this.name="AbortError",this.code=Zf}};function jv(e){return typeof e=="function"?e():typeof AbortController=="function"?new AbortController:null}function Vv(e,t){if(!(!e||e.signal?.aborted))try{e.abort(new jo(t))}catch{try{e.abort()}catch{}}}function Hv(e={}){let t=e.abortControllerFactory,n=typeof e.now=="function"?e.now:()=>Date.now(),r=0,o=null,i=null,a="idle",s="";function u(g){return!!(g&&o===g&&g.generation===r&&g.signal?.aborted!==!0)}function c(g,x=""){if(!u(g))throw new jo(x||"Carrot Vision connection attempt was superseded");return g}function l(g="connection cancelled",x=null){if(x&&o!==x)return!1;let E=i,y=!!o;return r+=1,o=null,i=null,a="idle",s=String(g||"connection cancelled"),Vv(E,s),y}function d(g={}){l(g.supersedeReason||"connection superseded"),r+=1;let x=jv(t),E=Object.freeze({generation:r,attemptId:String(g.attemptId||""),signal:x?.signal||null,startedAtMs:n()});return o=E,i=x,a="connecting",s="",E}function f(g){return c(g),a="active",!0}function m(g,x={}){return!(!u(g)||x.generation!=null&&Number(x.generation)!==g.generation||x.attemptId!=null&&String(x.attemptId)!==g.attemptId)}function p(g,x){return!u(g)||typeof x!="function"?!1:(x(g),!0)}function b(){return Object.freeze({generation:r,phase:a,active:!!o,attemptId:o?.attemptId||"",startedAtMs:o?.startedAtMs||0,aborted:!!o?.signal?.aborted,lastCancelReason:s})}return Object.freeze({begin:d,cancel:l,assertCurrent:c,isCurrent:u,markActive:f,matches:m,runIfCurrent:p,current:()=>o,snapshot:b})}var Qf=Object.freeze({abortCode:Zf,AbortError:jo,create:Hv});function Jf(e=globalThis){return e?(e.DriveVisionConnectionTransactions||(e.DriveVisionConnectionTransactions=Qf),e.DriveVisionConnectionTransactions):Qf}var eo=Object.freeze({DISABLED:"disabled",CHECKING:"checking",REACHABLE:"reachable",WAITING:"waiting"}),Bv=Object.freeze([300,600,1200,2400,4e3]);function Gv(e,t){return setTimeout(e,t)}function Wv(e){clearTimeout(e)}function hc(e,t){let n=Number(e);return Number.isFinite(n)&&n>=0?n:t}function $v(e){return Object.freeze({enabled:e.enabled,state:e.state,reachable:e.reachable,generation:e.generation,failureCount:e.failureCount,inFlight:e.inFlight,queueScheduled:e.queueScheduled,nextCheckAtMs:e.nextCheckAtMs,lastSuccessAtMs:e.lastSuccessAtMs,lastFailureAtMs:e.lastFailureAtMs,lastReason:e.lastReason,lastError:e.lastError,browserOnlineHint:e.browserOnlineHint,originClassification:e.originClassification})}function Uv(e={}){if(typeof e.probe!="function")throw new TypeError("Carrot Vision network recovery requires a probe function");let t=e.probe,n=typeof e.schedule=="function"?e.schedule:Gv,r=typeof e.cancel=="function"?e.cancel:Wv,o=typeof e.now=="function"?e.now:Date.now,i=typeof e.onState=="function"?e.onState:null,a=hc(e.healthyIntervalMs,12e3),s=hc(e.probeTimeoutMs,1500),u=Array.isArray(e.backoffMs)&&e.backoffMs.length?Object.freeze(e.backoffMs.map(D=>hc(D,500))):Bv,c=e.AbortControllerImpl||globalThis.AbortController,l=!1,d=eo.DISABLED,f=null,m=0,p=0,b=null,g=null,x=null,E=null,y=null,O=null,C=null,w="",z="",M=null,R="not-checked";function v(){return $v({enabled:l,state:d,reachable:f,generation:m,failureCount:p,inFlight:!!x,queueScheduled:b!==null,nextCheckAtMs:y,lastSuccessAtMs:O,lastFailureAtMs:C,lastReason:w,lastError:z,browserOnlineHint:M,originClassification:R})}function h(D,B={}){d=D,B.reason&&(w=String(B.reason));let W=v();return i?.(W,Object.freeze({...B})),W}function S(){b!==null&&r(b),b=null,y=null}function A(){g!==null&&r(g),g=null}function L(D,B,W=!1){if(!l)return!1;S();let V=Math.max(0,Number(D)||0);return y=o()+V,W&&h(eo.WAITING,{reason:B,delayMs:V}),b=n(()=>{b=null,y=null,P(B)},V),!0}async function P(D="network check"){if(!l)return!1;if(x)return x;S();let B=++m,W=f===!0;E=typeof c=="function"?new c:null;let V=E?.signal;h(eo.CHECKING,{reason:D,retainedReachability:W}),s>0&&E&&(g=n(()=>{g=null;try{E?.abort(new DOMException("Server reachability probe timed out","TimeoutError"))}catch{E?.abort()}},s));let F=(async()=>{try{let H=await t(Object.freeze({signal:V,generation:B,reason:D}));if(!l||B!==m)return!1;if(H===!1||H?.ok===!1)throw new Error(H?.error||"Server reachability probe failed");return A(),f=!0,p=0,O=o(),z="",R="current-origin-reachable",h(eo.REACHABLE,{reason:D}),L(a,"scheduled server reachability check"),!0}catch(H){if(A(),!l||B!==m||V?.aborted&&H?.name==="AbortError")return!1;f=!1,p+=1,C=o(),z=String(H?.message||H||"Server reachability probe failed"),R=p>=3?"possible-origin-address-change-or-hotspot-route":"current-origin-unreachable";let Y=u[Math.min(p-1,u.length-1)];return L(Y,D,!0),!1}finally{B===m&&(A(),E=null,x=null)}})();return x=F,F}function _(D,B={}){let W=!!D;return W===l?(W&&B.force===!0&&T(B.reason||"forced network check"),v()):(l=W,l?(f=!1,p=0,R="not-checked",P(B.reason||"network recovery enabled"),v()):(m+=1,S(),A(),E?.abort(),E=null,x=null,f=null,p=0,z="",R="not-checked",h(eo.DISABLED,{reason:B.reason||"network recovery disabled"})))}function T(D="network hint"){return l?(S(),P(D)):Promise.resolve(!1)}function I(D,B="browser network hint"){return M=typeof D=="boolean"?D:null,T(B)}function k(){_(!1,{reason:"network recovery destroyed"})}return Object.freeze({setEnabled:_,requestCheck:T,noteBrowserHint:I,reportTransportFailure:T,snapshot:v,destroy:k})}var ep=Object.freeze({state:eo,create:Uv});function tp(e=globalThis){return e?(e.DriveVisionNetworkRecovery||(e.DriveVisionNetworkRecovery=ep),e.DriveVisionNetworkRecovery):ep}var vr="/shared-assets",np=`${vr}/icons_mici/carrot_wheel_org.png`,gc=`${vr}/icons_mici/carrot_wheel_lane.png`,rp=`${vr}/icons_mici/settings/network/wifi_strength_full.png`,op=`${vr}/images/speed_bg.png`,ip=`${vr}/images/traffic_red.png`,ap=`${vr}/images/traffic_green.png`,sp=`${vr}/fonts/KaiGenGothicKR-Bold.ttf`;var cp="carrot-hud-overlay-style",Yv=` @font-face{ font-family:"CarrotClusterHud"; - src:url("${rp}") format("truetype"); + src:url("${sp}") format("truetype"); font-display:swap; font-style:normal; font-weight:900; @@ -113,12 +113,13 @@ html:not([data-carrot-mini-hud="1"]) #carrotMiniHud { display:none !important; } .chud-tlight-halo{opacity:.28} .chud-tlight-dot{stroke:rgba(255,255,255,.85);stroke-width:3} -/* LFA 당근 — 클러스터 동작: 활성 풀컬러 / 비활성 회색 + 조향각 회전 */ -.chud-lfa{position:relative;display:flex;align-items:center;justify-content:center} -/* 레인 날개(폭 2x)가 뜰 때만 그 오버행(각 변 휠 절반)을 패딩으로 예약 → - * 옆 위젯과 겹치거나 좌측으로 삐져나가지 않는다(휠 위치는 중앙 유지). */ -.chud-lfa.has-lane{padding-inline:clamp(14px,2.8cqw,28px)} -.chud-lfa-img{position:relative;z-index:1;height:clamp(28px,5.6cqw,56px);width:clamp(28px,5.6cqw,56px);display:block;object-fit:contain; +/* LFA 아이콘의 flex 점유 폭은 모드와 무관하게 휠 크기로 고정한다. + * 2x 레인 날개는 absolute overflow로만 그려 옆 Wi-Fi/시계가 움직이지 않는다. */ +.chud-lfa{position:relative;display:flex;align-items:center;justify-content:center; + --chud-lfa-size:clamp(28px,5.6cqw,56px);--chud-lfa-lane-width:clamp(56px,11.2cqw,112px); + --chud-lfa-armed-opacity:.48;--chud-lfa-active-opacity:.78; + width:var(--chud-lfa-size);height:var(--chud-lfa-size);flex:0 0 auto} +.chud-lfa-img{position:relative;z-index:1;height:var(--chud-lfa-size);width:var(--chud-lfa-size);display:block;object-fit:contain; transform-origin:50% 50%;transition:transform .12s linear,filter .2s,opacity .2s; filter:drop-shadow(0 2px 5px rgba(0,0,0,.55))} .chud-lfa:not(.is-active) .chud-lfa-img{opacity:.5;filter:grayscale(.7) drop-shadow(0 2px 5px rgba(0,0,0,.55))} @@ -126,13 +127,17 @@ html:not([data-carrot-mini-hud="1"]) #carrotMiniHud { display:none !important; } * 휠 뒤에 깔리고 좌우로 삐져나온다. 색=배경(활성 초록/비활성 muted), 모양=mask(JS가 URL 주입). */ .chud-lfa-lane{position:absolute;left:50%;top:50%; transform:translate(-50%,-56%);pointer-events:none;z-index:0; - width:clamp(56px,11.2cqw,112px);height:clamp(28px,5.6cqw,56px); - background-color:var(--chud-muted); + width:var(--chud-lfa-lane-width);height:var(--chud-lfa-size); + background-color:var(--chud-muted);opacity:0;visibility:hidden; -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; - filter:drop-shadow(0 2px 5px rgba(0,0,0,.5))} -.chud-lfa.is-active .chud-lfa-lane{background-color:var(--chud-carrot)} + filter:drop-shadow(0 2px 5px rgba(0,0,0,.5)); + transition:opacity .18s ease-out,background-color .18s ease-out,visibility 0s linear .18s} +.chud-lfa.has-lane .chud-lfa-lane{opacity:var(--chud-lfa-armed-opacity);visibility:visible;transition-delay:0s} +.chud-lfa.is-lane-active .chud-lfa-lane{opacity:var(--chud-lfa-active-opacity)} +.chud-lfa.is-lane-active.is-active .chud-lfa-lane{background-color:var(--chud-carrot);opacity:1} +@media (prefers-reduced-motion:reduce){.chud-lfa-lane{transition:none}} /* WiFi */ .chud-wifi{height:clamp(24px,4.8cqw,48px);width:clamp(24px,4.8cqw,48px);display:block;color:#fff; @@ -190,9 +195,7 @@ html:not([data-carrot-mini-hud="1"]) #carrotMiniHud { display:none !important; } * 커진 결과가 다른 존을 침범하면 layout.js가 낮은 우선순위부터 제거한다. */ @container chud (max-width:520px){ .chud-gauge,.chud-level{width:clamp(44px,16cqw,64px)} - .chud-lfa-img{width:clamp(32px,12cqw,46px);height:clamp(32px,12cqw,46px)} - .chud-lfa-lane{width:clamp(64px,24cqw,92px);height:clamp(32px,12cqw,46px)} - .chud-lfa.has-lane{padding-inline:clamp(16px,6cqw,23px)} + .chud-lfa{--chud-lfa-size:clamp(32px,12cqw,46px);--chud-lfa-lane-width:clamp(64px,24cqw,92px)} .chud-wifi{width:clamp(28px,10cqw,40px);height:clamp(28px,10cqw,40px)} .chud-clock{font-size:clamp(28px,10cqw,40px);height:clamp(28px,10cqw,40px)} .chud-limit{width:clamp(52px,16cqw,68px)} @@ -201,4 +204,4 @@ html:not([data-carrot-mini-hud="1"]) #carrotMiniHud { display:none !important; } .chud-turn{width:clamp(132px,42cqw,200px)} .chud-speed{width:clamp(188px,68cqw,208px)} } -`;function ip(e){if(!e||e.getElementById(op))return;let t=e.createElement("style");t.id=op,t.textContent=Gv,(e.head||e.documentElement).appendChild(t)}function pc(e){if(!e||e.hasAttribute?.("hidden"))return null;let t=e.getBoundingClientRect?.();return!t||t.width<=0||t.height<=0?null:t}function Wv(e,t,n=8){return!e||!t?!1:e.leftt.left&&e.topt.top}function $v(e,t){return!e||!t?!1:e.leftt.right||e.bottom>t.bottom}function ap(e,t={}){if(!e)return"";let n=[],r=a=>{n.push(a),e.dataset.shed=n.join(" ")};e.dataset.shed="";let o=pc(e);if(!o)return"";let i=(a,s)=>{let u=pc(t[a]);return $v(u,o)||s.some(c=>Wv(u,pc(t[c])))};return i("bottomRight",["bottomLeft","topRight"])&&r("p5"),i("topRight",["topLeft","bottomLeft","bottomRight"])&&r("p4"),i("topLeft",["topRight","bottomLeft"])&&r("p3"),i("topLeft",["topRight","bottomLeft"])&&r("p2"),i("topLeft",["topRight","bottomLeft"])&&r("p1"),e.dataset.shed}function sp(e,t,n=globalThis){if(!e||typeof t!="function")return null;let r=0,o=!1;function i(){r=0,o||t()}function a(){o||r||(typeof n.requestAnimationFrame=="function"?r=n.requestAnimationFrame(i):r=n.setTimeout?.(i,0)||0)}let s=n.ResizeObserver,u=typeof s=="function"?new s(a):null;u?.observe(e);let c=n.document?.fonts;c?.ready?.then(a).catch?.(()=>{}),c?.addEventListener?.("loadingdone",a);for(let d of e.querySelectorAll?.("img")||[])d.complete||d.addEventListener("load",a,{once:!0});a();function l(){o||(o=!0,u?.disconnect(),c?.removeEventListener?.("loadingdone",a),r&&typeof n.cancelAnimationFrame=="function"?n.cancelAnimationFrame(r):r&&n.clearTimeout?.(r),r=0)}return Object.freeze({destroy:l,schedule:a})}var ze=Object.freeze({white:"#ffffff",ink:"#0d1116",muted:"#96a0ac",carrot:"#14bc68",blue:"#2684ff",amber:"#f4ac36",override:"#b87018",limit:"#de4840",stroke:"#05090c"}),cp=Object.freeze({1:"#00ff00",2:"#ffa500",3:"#ffffff",4:"#ff0000"}),_E=Object.freeze({speedPanel:150,topIcon:24,clock:18,limitSign:46}),NE=Object.freeze({speedPanel:0,limitSign:1,clock:2,lfa:3,wifi:3,gauges:4,tpms:5});var Uv="http://www.w3.org/2000/svg";function ae(e,t,n={},r=[]){let o=e.createElementNS(Uv,t);for(let i in n)n[i]!=null&&o.setAttribute(i,String(n[i]));for(let i of r)i&&o.appendChild(i);return o}function lt(e,t,n={},r=[]){let o=e.createElement(t);if(n.class&&(o.className=n.class),n.text!=null&&(o.textContent=String(n.text)),n.attrs)for(let i in n.attrs)o.setAttribute(i,String(n.attrs[i]));for(let i of r)i&&o.appendChild(i);return o}function Ve(e,t){let n=t==null?"":String(t);e&&e.textContent!==n&&(e.textContent=n)}function Li(e,t){e?.toggleAttribute?.("hidden",!!t)}var Yv=.35,Kv="0 270 384 140",lp=85.2,up=351,qv=249.2,dp=339,Xv=297.68,fp=389.856,pp=356,mc=379.6,Qv=181,mp=351,hp=28,gp=331.6,bp=319,yp=291.8,vp=41.6,Sp=24;function Mp(e,{uri:t,crop:n,centerX:r}){let i=ae(e,"svg",{class:"chud-speed-traffic",x:r-17,y:269,width:34,height:34,viewBox:n,preserveAspectRatio:"xMidYMid meet"});return i.append(ae(e,"image",{href:t,x:0,y:0,width:256,height:256})),i}function Ap(e){let t=ae(e,"svg",{class:"chud-speed",viewBox:Kv,role:"img","aria-label":"속도"}),n=ae(e,"image",{class:"chud-speed-bg-image",href:ep,x:18,y:295,width:304,height:113.6,opacity:235/255,preserveAspectRatio:"none"}),r=lp-38,o=Mp(e,{uri:tp,crop:"72 7 52 52",centerX:r}),i=Mp(e,{uri:np,crop:"132 7 52 52",centerX:r}),a=ae(e,"text",{class:"chud-t-speed",x:lp,y:up,"font-size":89.6,"text-anchor":"middle"}),s=ae(e,"text",{class:"chud-t-set",x:qv,y:dp,"font-size":46.4,"text-anchor":"middle"}),u=ae(e,"text",{class:"chud-t-gap",x:Xv,y:fp,"font-size":28,"text-anchor":"middle"}),c=ae(e,"rect",{class:"chud-gear-box",x:pp-22.5,y:mc-29,width:45,height:58,rx:8}),l=ae(e,"text",{class:"chud-t-gear",x:pp,y:mc,"font-size":48,"text-anchor":"middle"}),d=ae(e,"text",{class:"chud-t-ev",x:Qv,y:mp,"font-size":hp,"text-anchor":"middle"}),f=ae(e,"text",{class:"chud-t-override-label",x:gp,y:yp,"font-size":Sp,"text-anchor":"middle"}),p=ae(e,"text",{class:"chud-t-override",x:gp,y:bp,"font-size":vp,"text-anchor":"middle"});t.append(n,o,i,a,s,u,c,l,d,f,p);function m(x,E,y){x.setAttribute("font-size",String(y)),x.setAttribute("y",String(E+Yv*y))}let b=null;function g(x={}){let E=Number(x.speed),y=Number.isFinite(E)?String(Math.max(0,Math.round(E))):"0";m(a,up,y.length<=2?89.6:89.6*.86),Ve(a,y);let O=x.setSpeed!=null&&x.setSpeed!=="";m(s,dp,46.4),Ve(s,O?x.setSpeed:"--"),s.classList.toggle("is-muted",!O);let C=x.gap!=null&&x.gap!=="";m(u,fp,28),Ve(u,C?x.gap:"--"),u.classList.toggle("is-muted",!C);let w=x.gear!=null&&x.gear!=="";m(l,mc,48),Ve(l,w?x.gear:"--"),l.classList.toggle("is-muted",!w),c.classList.toggle("is-muted",!w);let z=Number(x.trafficState);o.style.display=z===1?"":"none",i.style.display=z===2?"":"none";let M=x.evActive===!0;d.style.display=M?"":"none",M&&(m(d,mp,hp),Ve(d,"EV"));let R=x.cruiseOverride,v=R!=null?Number(R.kph):null,h=Number.isFinite(v)&&v>0;h&&(b={kph:Math.round(v),label:R.label||"",mode:R.mode});let S=b!=null;if(p.style.display=S?"":"none",f.style.display=S?"":"none",S){let A=h?b.mode===1?ze.carrot:b.mode===2?ze.override:ze.white:ze.muted;m(p,bp,vp),Ve(p,String(b.kph)),p.style.fill=A,m(f,yp,Sp),Ve(f,b.label),f.style.fill=A}}return{el:t,update:g}}var Zv=.35;function Rp(e){let t=ae(e,"svg",{class:"chud-limit",viewBox:"0 0 84 84",role:"img","aria-label":"제한속도"}),n=ae(e,"text",{class:"chud-limit-num",x:42,y:42,"font-size":42,"text-anchor":"middle"});t.append(ae(e,"circle",{cx:42,cy:42,r:42,fill:"var(--chud-limit)"}),ae(e,"circle",{cx:42,cy:42,r:36,fill:"#fff"}),n);function r(o={}){let i=Number(o.speedLimit),a=Number(o.speed)>0||o.lfaActive===!0,s=Number.isFinite(i)&&i>0&&a;if(Li(t,!s),!s)return;let u=String(Math.round(i)),c=u.length<=2?42:36;n.setAttribute("font-size",String(c)),n.setAttribute("y",String(42+Zv*c)),Ve(n,u)}return{el:t,update:r}}var Jv=85.2,e0=Jv-38,t0=e0+34*.5,n0=16,hc=t0+n0,r0=10,gc=46,xp=271,Ep=30,o0=8,bc=21,i0=xp+Ep/2,a0=.35,s0=Object.freeze({1:"eco",2:"safe",3:"normal",4:"sport"}),c0=Object.freeze({eco:{ko:"연비",en:"Eco",zh:"经济"},safe:{ko:"안전",en:"Safe",zh:"安全"},normal:{ko:"일반",en:"Normal",zh:"标准"},sport:{ko:"고속",en:"Sport",zh:"运动"}}),l0=/[ᄀ-ᇿ㄰-㆏가-힯 -ヿ㐀-鿿＀-￯]/;function u0(e){return String(e?.documentElement?.lang||"en").toLowerCase().split(/[-_]/)[0]||"en"}function d0(e,t,n){let r=s0[e],o=u0(t),i=n?.CarrotTranslations?.driveModes||{},a=i[o]||i.en||{},s=c0[r]||{};return a[r]||s[o]||s.en||""}function f0(e){let t=0;for(let n of e)t+=l0.test(n)?1:.56;return t*bc}function Tp(e){let t=e.defaultView||(typeof globalThis=="object"?globalThis:null),n=ae(e,"rect",{class:"chud-drive-mode-box",x:hc,y:xp,width:gc,height:Ep,rx:o0}),r=ae(e,"text",{class:"chud-drive-mode-label",x:hc+gc/2,y:i0+a0*bc,"font-size":bc,"text-anchor":"middle"}),o=ae(e,"g",{class:"chud-drive-mode",role:"img"},[n,r]),i=null,a="",s=!1;function u(l){let d=Math.max(gc,Math.round(l+r0*2));n.setAttribute("width",d),r.setAttribute("x",hc+d/2)}function c(l={}){let d=Number(l.drivingMode),f=d===1||d===2||d===3||d===4;if(o.style.display=f?"":"none",!f){i=null;return}d!==i&&(i=d,n.style.fill=cp[d]);let p=d0(d,e,t);if(p!==a&&(a=p,Ve(r,p),o.setAttribute("aria-label",p),u(f0(p)),s=!0),s&&typeof r.getComputedTextLength=="function"){let m=0;try{m=r.getComputedTextLength()}catch{}m>0&&(u(m),s=!1)}}return c(),{el:o,update:c}}function Op(e){let t=lt(e,"div",{class:"chud-clock",attrs:{role:"timer","aria-label":"시계"}}),n=0;function r(){let s=new Date,u=c=>String(c).padStart(2,"0");return`${u(s.getHours())}:${u(s.getMinutes())}:${u(s.getSeconds())}`}function o(s={}){s.clock?Ve(t,s.clock):Ve(t,r())}function i(){n||(o(),n=setInterval(()=>{(!t.textContent||t.dataset.local!=="0")&&o()},1e3),t.dataset.local="1")}function a(){n&&(clearInterval(n),n=0)}return{el:t,update:o,start:i,stop:a}}var yc="--°C";function p0(e){if(e==null||e==="")return yc;let t=Number(e);return Number.isFinite(t)?`${t.toFixed(1)}°C`:yc}function Cp(e){let t=lt(e,"div",{class:"chud-devtemp",text:yc,attrs:{role:"status","aria-label":"CPU 온도"}});function n(r={}){Ve(t,p0(r.cpuTemp))}return{el:t,update:n}}function wp(e){let t=ae(e,"svg",{class:"chud-wifi",viewBox:"0 0 48 48",role:"img","aria-label":"네트워크"});t.append(ae(e,"image",{href:Jf,x:0,y:0,width:48,height:48,preserveAspectRatio:"none"}));function n(r={}){t.style.opacity=r.networkConnected===!1?"0.51":"1"}return{el:t,update:n}}function Ip(e){let t=lt(e,"span",{class:"chud-lfa",attrs:{role:"img","aria-label":"LFA"}}),n=lt(e,"span",{class:"chud-lfa-lane",attrs:{"aria-hidden":"true"}}),r=lt(e,"img",{class:"chud-lfa-img",attrs:{alt:"LFA",src:Zf}});n.style.webkitMaskImage=`url("${fc}")`,n.style.maskImage=`url("${fc}")`,t.append(n,r);function o(i={}){t.classList.toggle("is-active",i.lfaActive!==!1);let a=i.activeLaneLine===!0;t.classList.toggle("has-lane",a),n.style.display=a?"":"none";let s=Number(i.steerAngle);Number.isFinite(s)&&(r.style.transform=`rotate(${(-s).toFixed(1)}deg)`)}return{el:t,update:o}}var Sc=88,Pp=186,ki=(Sc+Pp)/2,_p=3,vc=90,Np=184,Dp=56,m0=16,h0=64,g0=201,b0=0;function Fi(e,{label:t,ariaLabel:n}){let r=ae(e,"svg",{class:"chud-gauge",viewBox:"0 47 62 169",role:"img","aria-label":n||t}),o=`chud-gauge-clip-${++b0}`,i=ae(e,"defs",{},[ae(e,"clipPath",{id:o},[ae(e,"rect",{x:_p,y:vc,width:Dp,height:Np-vc,rx:m0})])]),a=ae(e,"rect",{class:"chud-gauge-frame",x:1,y:Sc,width:60,height:Pp-Sc,rx:18}),s=ae(e,"line",{class:"chud-gauge-mid",x1:1,y1:ki,x2:61,y2:ki}),u=ae(e,"rect",{class:"chud-gauge-fill",x:_p,width:Dp,"clip-path":`url(#${o})`}),c=ae(e,"text",{class:"chud-gauge-value",x:31,y:h0,"font-size":20,"text-anchor":"middle","dominant-baseline":"central"}),l=ae(e,"text",{class:"chud-gauge-label",x:31,y:g0,"font-size":20,"text-anchor":"middle","dominant-baseline":"central",fill:"#fff"});Ve(l,t),r.append(i,a,u,s,c,l);function d(f={}){let m=f.ratio!=null&&Number.isFinite(Number(f.ratio))?Math.max(-1,Math.min(1,Number(f.ratio))):0,b=f.color||"#96a0ac",g=(Np-vc)/2,x=Math.abs(m)*g;u.setAttribute("y",m>=0?ki-x:ki),u.setAttribute("height",x),u.setAttribute("fill",x<.5?"transparent":b),c.setAttribute("fill",b),Ve(c,f.text==null?"--":f.text)}return{el:r,update:d}}var y0=5;function Lp(e){let t=Fi(e,{label:"accel",ariaLabel:"가속도"});function n(r={}){let o=r.accel;if(o==null||!Number.isFinite(Number(o))){t.update({ratio:0,color:ze.muted,text:"--"});return}let i=Number(o),a=i/y0,s=i>.02?ze.carrot:i<-.02?ze.limit:ze.muted;t.update({ratio:a,color:s,text:`${i>=0?"+":""}${i.toFixed(2)}`})}return{el:t.el,update:n}}function kp(e){let t=Fi(e,{label:"steer",ariaLabel:"조향출력"});function n(r={}){let o=r.steerOutput;if(o==null||!Number.isFinite(Number(o))){t.update({ratio:0,color:ze.muted,text:"--"});return}let i=Math.max(-1,Math.min(1,Number(o))),a=i>.01?ze.blue:i<-.01?ze.amber:ze.muted;t.update({ratio:i,color:a,text:`${i>=0?"+":""}${Math.round(i*100)}%`})}return{el:t.el,update:n}}function Fp(e,t){let n=t==="left",r=n?60:220,o=(a,s)=>`${r+(n?-a:a)} ${40+s}`,i=[`M ${o(-36,-16)}`,`L ${o(12,-16)}`,`L ${o(12,-38)}`,`L ${o(60,0)}`,`L ${o(12,38)}`,`L ${o(12,16)}`,`L ${o(-36,16)} Z`].join(" ");return ae(e,"path",{class:`chud-blinker chud-blinker--${t}`,d:i})}function zp(e){let t=ae(e,"svg",{class:"chud-turn",viewBox:"0 0 280 80",role:"img","aria-label":"방향지시등"}),n=Fp(e,"left"),r=Fp(e,"right");t.append(n,r);function o(i={}){let a=i.leftBlinker===!0,s=i.rightBlinker===!0;t.style.display=a||s?"":"none",n.style.display=a?"":"none",r.style.display=s?"":"none"}return{el:t,update:o}}var zi=248,Fo=346;function Mc(e,{valueKey:t,label:n,normalColor:r=ze.carrot,lowColor:o=ze.limit,lowThreshold:i=.15,ariaLabel:a=n,hideWhenUnavailable:s=!1}){let u=ae(e,"svg",{class:"chud-level",viewBox:"0 216 62 156",role:"img","aria-label":a}),c=ae(e,"rect",{class:"chud-level-frame",x:1,y:zi,width:60,height:Fo-zi,rx:18}),l=ae(e,"rect",{class:"chud-level-fill",x:9,y:Fo-8,width:44,height:0,rx:13}),d=ae(e,"text",{class:"chud-level-value",x:31,y:zi-16,"font-size":20,"text-anchor":"middle","dominant-baseline":"central"}),f=ae(e,"text",{class:"chud-level-label",x:31,y:Fo+15,"font-size":20,"text-anchor":"middle","dominant-baseline":"central"});Ve(f,n),u.append(c,l,d,f);function p(m={}){let b=m[t],g=Number(b),E=b!=null&&b!==""&&Number.isFinite(g)&&g>=0&&g<=1&&(!s||g>0);if(s&&(Li(u,!E),!E))return;let y=E?Math.max(0,Math.min(1,g)):0,O=y*(Fo-zi-16),C=E?y<=i?o:r:ze.muted;l.setAttribute("y",Fo-8-O),l.setAttribute("height",O),l.setAttribute("fill",C),d.setAttribute("fill",C),Ve(d,E?`${Math.round(y*100)}%`:"--%")}return{el:u,update:p}}var v0=31;function jp(e){let t=ae(e,"svg",{class:"chud-tpms",viewBox:"0 0 80 68",role:"img","aria-label":"Tire pressure"}),n=32.5,r=17,o=ae(e,"g",{class:"chud-tpms-car"},[ae(e,"rect",{x:n,y:r,width:15,height:34,rx:5}),ae(e,"rect",{x:n+3,y:r+5,width:9,height:10,rx:3}),ae(e,"rect",{x:30,y:22,width:3,height:8,rx:1.2}),ae(e,"rect",{x:47,y:22,width:3,height:8,rx:1.2}),ae(e,"rect",{x:30,y:38,width:3,height:8,rx:1.2}),ae(e,"rect",{x:47,y:38,width:3,height:8,rx:1.2})]),a=Object.fromEntries(Object.entries({fl:[10,20],fr:[70,20],rl:[10,48],rr:[70,48]}).map(([u,[c,l]])=>[u,ae(e,"text",{class:"chud-tpms-value",x:c,y:l,"font-size":16,"text-anchor":"middle","dominant-baseline":"central"})]));t.append(o,a.fl,a.fr,a.rl,a.rr);function s(u={}){let c=u.tpms&&typeof u.tpms=="object"?u.tpms:{};for(let[l,d]of Object.entries(a)){let f=Number(c[l]),p=Number.isFinite(f)&&f>=5&&f<=100;d.setAttribute("fill",p?f0&&t<250?t:null}function Vp(e){let t=Ot(e);return t!=null&&t>=0&&t<=1?t:null}function ji(e){let t=Ot(e);return t!=null&&t>=5&&t<=100?t:null}function Rc(e){let t=Ot(e);return t===1||t===2?t:0}function xc(e){let t=Ot(e);return t===1||t===2||t===3||t===4?t:null}function S0(e){let t=String(e||"").trim().toLowerCase(),n={park:"P",reverse:"R",neutral:"N",drive:"D",sport:"S",low:"L"};return t?n[t]||t.slice(0,2).toUpperCase():null}function M0(e){if(!e||typeof e!="object")return null;let t={fl:ji(e.fl),fr:ji(e.fr),rl:ji(e.rl),rr:ji(e.rr)};return Object.values(t).some(n=>n!=null)?t:null}function Ec(e){if(!e||typeof e!="object")return null;let t=Ot(e.kph);return t==null||t<=0?null:{kph:t,label:e.label==null?"":String(e.label),mode:Ot(e.mode)??0}}var A0=2500;function R0(e={}){let t=Ot(e.holdMs),n=t!=null&&t>=0?t:A0,r=null,o=null,i=null,a=null;function s(){r=null,o=null,i=null,a=null}function u(l,d={}){let f=Ec(l),p=Ot(d.clockMs),m=String(d.clockKey||"live");if(d.active===!1||p==null)return s(),d.active===!1?null:f;if((a!==m||i!=null&&p=0&&b<=n?r:(r=null,o=null,null)}function c(){return Object.freeze({held:r?{...r}:null,lastSeenMs:o,lastClockMs:i,clockKey:a,holdMs:n})}return Object.freeze({update:u,reset:s,status:c})}function x0(e={},t={}){return{...e,evActive:t.evActive===!0,activeLaneLine:t.activeLaneLine==null?null:t.activeLaneLine===!0,cruiseOverride:Ec(t.cruiseOverride),trafficState:Rc(t.trafficState??e.trafficState),drivingMode:xc(t.drivingMode??e.drivingMode)}}function E0(e={}){let t=Ec(e.cruiseOverride);return[e.evActive===!0?1:0,e.activeLaneLine==null?"-":e.activeLaneLine===!0?1:0,t?.kph??"-",t?.label??"-",t?.mode??"-",xc(e.drivingMode)??"-"].join(":")}var T0=Object.freeze({cam:"cam:n",section:"section:n",bump:"bump:n",police:"police:n",waze:"waze:n",road:"road:n",atc:"turn:n",atc2:"turn:n",hda:"cam:v",route:"route:v",gas:"gas:v",vturn:"turn:c",model:"turn:c",turn:"turn:c"});function O0(e){let t=String(e||"").trim().toLowerCase();return t?t.endsWith(":n")||t.endsWith(":v")||t.endsWith(":c")?t:T0[t]||t.slice(0,8):"apply"}function Tc(e={}){let t=e.carState||{},n=e.controlsState||{},r=t.cruiseState||{};if(r.available===!1)return null;let o=[t.vCruiseCluster,t.vCruise,n.vCruiseCluster,n.vCruise];for(let i of o){let a=Hp(i);if(a!=null)return a}for(let i of[r.speedCluster,r.speed]){let a=Ot(i);if(a!=null&&a>.1&&a<70)return a*3.6}return null}function Bp(e={},t=Tc(e)){if(Hp(t)==null)return!1;let n=Ac(e.selfdriveState?.enabled);if(n!=null)return n;let r=Ac(e.controlsState?.enabled);return r??e.carState?.cruiseState?.available!==!1}function Gp(e={}){let t=Tc(e);if(!Bp(e,t))return null;let n=Ot(e.longitudinalPlan?.cruiseTarget);if(n!=null&&n>t+.5)return{kph:n,label:"eco",mode:1};let r=Ot(e.carrotMan?.desiredSpeed);return r!=null&&r>0&&r<200&&r0?Math.round(a):null,u=!!t.evModeValid&&!!t.evModeActive,c=n.activeLaneLine==null?null:!!n.activeLaneLine,l=Ac(o.latActive);return{gear:i,gearStep:s,evActive:u,activeLaneLine:c,cruiseOverride:Gp(e),trafficState:Wp(e),drivingMode:xc(e.longitudinalPlan?.myDrivingMode),lfaActive:l??!!(r.enabled??n.enabled),steeringAngleDeg:Ot(t.steeringAngleDeg??o.actuators?.steeringAngleDeg),aEgo:Ot(t.aEgo??o.actuators?.accel),steerOutput:Ot(n.lateralOutput??n.torqueState?.lateralOutput??n.lateralControlState?.torqueState?.output),leftBlinker:!!t.leftBlinker,rightBlinker:!!t.rightBlinker,fuelGauge:Vp(t.fuelGauge),ureaGauge:Vp(t.ureaGauge),tpms:M0(t.tpms)}}var Oc=Object.freeze({deriveVehicleHudPayload:C0,deriveCruiseOverride:Gp,createCruiseOverrideHold:R0,resolveTrafficState:Wp,resolveCruiseKph:Tc,isCruiseDisplayVisible:Bp,withVehicleHudFields:x0,vehicleHudSignature:E0});function Qr(e,t){return Object.prototype.hasOwnProperty.call(e||{},t)}function w0(e={}){let t=e.carState||{},n=e.controlsState||{},r=e.longitudinalPlan||{},o=e.carrotMan||{},i=e.selfdriveState||{},a=e.carControl||{};return{services:{carState:Qr(e,"carState"),controlsState:Qr(e,"controlsState"),longitudinalPlan:Qr(e,"longitudinalPlan"),carrotMan:Qr(e,"carrotMan"),selfdriveState:Qr(e,"selfdriveState"),carControl:Qr(e,"carControl")},carState:{vEgoCluster:t.vEgoCluster??null,vCruiseCluster:t.vCruiseCluster??null,vCruise:t.vCruise??null,evModeValid:t.evModeValid??null,evModeActive:t.evModeActive??null,gearShifter:t.gearShifter??null},controlsState:{enabled:n.enabled??null,vCruiseCluster:n.vCruiseCluster??null,activeLaneLine:n.activeLaneLine??null},longitudinalPlan:{cruiseTarget:r.cruiseTarget??null,trafficState:r.trafficState??null},carrotMan:{desiredSpeed:o.desiredSpeed??null,desiredSource:o.desiredSource??null,trafficState:o.trafficState??null,xSpdType:o.xSpdType??null,xSpdLimit:o.xSpdLimit??null,xSpdDist:o.xSpdDist??null,xSpdCountDown:o.xSpdCountDown??null},selfdriveState:{enabled:i.enabled??null},carControl:{latActive:a.latActive??null}}}function I0(e){let t=e.CarrotVisionReplay?.status?.()||{};return{active:t.active===!0,ready:t.ready===!0,loading:t.loading===!0,route:t.route??null,segment:t.segment??null,currentTime:Number.isFinite(Number(t.currentTime))?Number(t.currentTime):null,paused:t.paused!==!1,services:Object.keys(t.services||{}).sort()}}function yr(e,t,n={}){if(!t)return{present:!1};let r=null;try{r=e.getComputedStyle?.(t)||e.document?.defaultView?.getComputedStyle?.(t)||null}catch{}let o=t.getBoundingClientRect?.(),i={present:!0,hidden:t.hidden===!0,display:r?.display??null,visibility:r?.visibility??null,opacity:r?.opacity??null};return o&&(i.rect={x:Math.round(Number(o.x)||0),y:Math.round(Number(o.y)||0),width:Math.round(Number(o.width)||0),height:Math.round(Number(o.height)||0)}),n.text===!0&&(i.text=String(t.textContent||"").trim().slice(0,80)),i}function $p(e=globalThis,t=e.CarrotHudOverlay){function n(){let i=e.CarrotHudState||{},a=t?.root||e.document?.querySelector?.("[data-carrot-hud='overlay']")||null,s=e.document?.getElementById?.("carrotStage")||null,u=a?.querySelectorAll?.(".chud-speed-traffic")||[];return{version:1,capturedAt:new Date().toISOString(),replay:{...I0(e),hudToggleOn:s?.classList?.contains?.("is-replay-hud-visible")??null},source:w0(i),derived:e.CarrotHudDataBridge?.deriveVehicleHudPayload?.(i)||null,presentation:{overlay:t?.status?.()||null,content:e.DriveVisionHudContent?.status?.()||null},dom:{root:yr(e,a),ev:yr(e,a?.querySelector?.(".chud-t-ev"),{text:!0}),lane:yr(e,a?.querySelector?.(".chud-lfa-lane")),cruiseOverride:yr(e,a?.querySelector?.(".chud-t-override"),{text:!0}),cruiseOverrideLabel:yr(e,a?.querySelector?.(".chud-t-override-label"),{text:!0}),trafficRed:yr(e,u[0]),trafficGreen:yr(e,u[1])}}}function r(){return JSON.stringify(n(),null,2)}async function o(){let i=r();try{let a=e.navigator?.clipboard;if(typeof a?.writeText!="function")throw new Error("Clipboard API unavailable");return await a.writeText(i),{copied:!0,length:i.length}}catch{return e.console?.log?.(i),{copied:!1,length:i.length,text:i}}}return Object.freeze({snapshot:n,text:r,copy:o})}var Vi=new WeakMap;typeof globalThis=="object"&&(globalThis.CarrotHudDataBridge=Oc);function At(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function _0(e={}){let t=e.isMetric!==!1,n=d=>d==null?null:Math.round(t?d:d*.621371),r=At(e.vEgoKph??e.speed),o=At(e.vSetKph??e.setSpeed),i=At(e.tfGap??e.gap),a=At(e.speedLimitKph??e.limit),s=At(e.gearStep),u=s!=null&&s>0?String(Math.round(s)):e.gear==null?null:String(e.gear).trim().toUpperCase().slice(0,2),c=e.cruiseOverride&&typeof e.cruiseOverride=="object"?e.cruiseOverride:null,l=c!=null?At(c.kph):null;return{speed:n(r),setSpeed:o!=null&&o>0?n(o):null,gap:i!=null&&i>0?Math.round(i):null,gear:u,speedLimit:a!=null&&a>0?n(a):null,evActive:e.evActive===!0,activeLaneLine:e.activeLaneLine===!0,cruiseOverride:l!=null&&l>0?{kph:n(l),label:c.label==null?"":String(c.label),mode:At(c.mode)??0}:null,drivingMode:At(e.drivingMode),lfaActive:e.latActive??e.lfaActive,steerAngle:At(e.steeringAngleDeg),accel:At(e.aEgo??e.accel),steerOutput:At(e.steerOutput),leftBlinker:e.leftBlinker===!0,rightBlinker:e.rightBlinker===!0,fuelGauge:At(e.fuelGauge),ureaGauge:At(e.ureaGauge),tpms:e.tpms&&typeof e.tpms=="object"?e.tpms:null,trafficState:At(e.trafficState),networkConnected:e.networkConnected,clock:e.clock,cpuTemp:At(e.cpuTempMaxC??e.cpuTempC)}}function N0(e){ip(e);let t=lt(e,"div",{class:"chud",attrs:{"data-carrot-hud":"overlay"}}),n=Ip(e),r=wp(e),o=Op(e),i=Rp(e),a=Ap(e),s=Tp(e);a.el.appendChild(s.el);let u=Lp(e),c=kp(e),l=Mc(e,{valueKey:"fuelGauge",label:"fuel",ariaLabel:"Fuel or battery level",hideWhenUnavailable:!0}),d=Mc(e,{valueKey:"ureaGauge",label:"DEF",normalColor:ze.blue,lowColor:ze.amber,ariaLabel:"Diesel exhaust fluid level",hideWhenUnavailable:!0}),f=jp(e),p=zp(e),m=Cp(e),b=lt(e,"div",{class:"chud-zone chud-zone--tl"},[lt(e,"div",{class:"chud-row"},[n.el,r.el,o.el]),i.el]),g=lt(e,"div",{class:"chud-zone chud-zone--tc"},[p.el]),x=lt(e,"div",{class:"chud-zone chud-zone--tr"},[lt(e,"div",{class:"chud-gauge-column"},[u.el,l.el]),lt(e,"div",{class:"chud-gauge-column"},[c.el,d.el])]),E=lt(e,"div",{class:"chud-zone chud-zone--bl"},[a.el]),y=lt(e,"div",{class:"chud-zone chud-zone--br"},[f.el]),O=lt(e,"div",{class:"chud-corner chud-corner--bl"},[m.el]);t.append(O,b,g,x,E,y);let C={topLeft:b,topCenter:p.el,topRight:x,bottomLeft:E,bottomRight:y},w=[n,r,o,i,a,s,u,c,l,d,f,p,m],z=new Set,M="",R=null,v=!1,h=!1,S=null;function A(){let F=h||!v||z.size>0;return t.hidden=F,t.inert=F,t.classList.toggle("is-hud-suppressed",F),F?(t.setAttribute("aria-hidden","true"),o.stop()):(t.removeAttribute("aria-hidden"),o.start()),!F}function L(){ap(t,C)}function P(){R?R.schedule():L()}function _(F){if(h||!F)return!1;let H=_0(F);S=H;for(let $ of w)$.update(H);let Y=[H.speedLimit!=null&&H.speedLimit>0,H.leftBlinker,H.rightBlinker,H.activeLaneLine,H.fuelGauge!=null&&H.fuelGauge>0&&H.fuelGauge<=1,H.ureaGauge!=null&&H.ureaGauge>0&&H.ureaGauge<=1].join(":");return M!==Y&&(M=Y,P()),!0}function T(F){if(h)return!1;let H=At(F?.width),Y=At(F?.height);return H>0&&Y>0?(P(),!0):!1}function I(F){return h?!1:(R||(R=sp(t,L,F)),R?.schedule(),!!R)}function k(){if(h)return!1;let F=!v;return v=!0,A(),P(),F}function D(){if(h)return!1;let F=v;return v=!1,A(),F}function B(F,H){if(h)return!1;let Y=String(F||"external");return H?z.add(Y):z.delete(Y),A()}function W(){return Object.freeze({active:v,destroyed:h,visible:!t.hidden,suppressions:Object.freeze(Array.from(z)),data:S})}function V(){return h?!1:(v=!1,h=!0,z.clear(),R?.destroy?.(),R=null,A(),t.remove?.(),!0)}return A(),{root:t,update:_,relayout:T,activate:k,deactivate:D,setSuppressed:B,status:W,destroy:V,startClock:()=>o.start(),stopClock:()=>o.stop(),startLayout:I}}function Cc(e=globalThis,t={}){if(Vi.has(e))return Vi.get(e);e.CarrotHudDataBridge=Oc;let n=t.document||e.document;if(!n)return null;let r=t.stage||n.getElementById?.("carrotStage");if(!r){if(!e.__carrotHudDeferred){e.__carrotHudDeferred=!0;let s=()=>{e.__carrotHudDeferred=!1,Cc(e,t)};n.readyState==="loading"?n.addEventListener("DOMContentLoaded",s,{once:!0}):e.setTimeout?.(s,0)}return null}let o=N0(n);r.appendChild(o.root),o.startLayout(e),o.update({});let i=s=>o.relayout(s.detail);e.addEventListener?.("carrot:viewportlayout",i,{passive:!0});let a=o.destroy;return o.destroy=()=>{e.removeEventListener?.("carrot:viewportlayout",i);let s=a();return s&&(Vi.delete(e),e.CarrotHudOverlay===o&&(e.CarrotHudOverlay=null),e.CarrotHudDebug&&(e.CarrotHudDebug=null)),s},e.CarrotHudOverlay=o,e.CarrotHudDebug=$p(e,o),Vi.set(e,o),e.DriveVisionHudContent?.syncPresentation?.(),o}var Up=new WeakMap;function Yp(e=globalThis,t={}){let n=Up.get(e);if(n)return n;let r=oo(e,t.hudContent||{});if(!r)return null;let o=Object.freeze({hudContent:r,presentedFrames:rc(e),replayRenderBridge:uf(e),replayRenderController:ff(e),hudLayout:hf(e),hudCanvas:bf(e),hudModel:vf(e),rtcPerfHud:Mf(e),roadOverlayPolicy:Rf(e),roadOverlayProjection:Of(e),roadOverlayGeometryRenderer:If(e),roadOverlayAuxRenderer:Df(e),roadOverlayLeadModel:Lf(e),roadOverlayLeadRenderer:zf(e),sessionPolicy:Gf(e),sessionController:Uf(e),connectionTransactions:qf(e),networkRecovery:Qf(e)});Up.set(e,o);try{Cc(e,t.hudOverlay||{})}catch(i){e.console?.error?.("[carrot hud overlay] install failed",i)}return o}var Ze=globalThis,qp=Yi(Nc);Id(Ze);Cd(Ze);Lc(Ze);tl(Ze);var Xp=Td(qp,Ze),Qp=Kc({registry:Xp,contentDefaults:qp.defaults,settingDefaults:()=>Ze.CarrotWebSettingDefaults||{}});qc(Qp,Ze);Yp(Ze);nc(Ze);var Kp=!1,Zr=null,D0="carrot:driveplatformready";function Zp(){return!!(typeof Ze.HomeDrive?.refresh=="function"&&Ze.DriveContentIntro?.create&&Ze.document?.getElementById("carrotDriveWorkspace")&&Ze.document?.getElementById("carrotStage")&&Ze.document?.getElementById("carrotNaviPane"))}function wc(){if(Kp)return!0;if(!Zp())return!1;try{let e=xr(Ze);Zr||=ol(Ze,{registry:Xp,layoutSpec:Qp,syncOnCreate:!1});let t=cf(Ze,{compatibilityContent:!1,runtime:{workspaceRuntime:Zr}});if(!e||!Zr||!t.runtime||!t.facade)throw new Error("Drive platform finalization dependencies are unavailable");Zr.sync();let n=Zr.shell.getContent("primary"),r=Zr.shell.getContent("secondary");if(!n||!r)throw new Error("Drive workspace content assignments are unavailable");return Kp=!0,!0}catch(e){return Ze.console?.error?.("[drive] platform finalization failed",e),!1}}Ze.addEventListener(D0,wc,{once:!0});Ze.document?.readyState==="loading"?Ze.document.addEventListener("DOMContentLoaded",()=>{!wc()&&!Zp()&&Ze.console?.error?.("[drive] platform finalization failed",new Error("Drive platform finalization dependencies are unavailable"))},{once:!0}):wc();})(); +`;function lp(e){if(!e||e.getElementById(cp))return;let t=e.createElement("style");t.id=cp,t.textContent=Yv,(e.head||e.documentElement).appendChild(t)}function bc(e){if(!e||e.hasAttribute?.("hidden"))return null;let t=e.getBoundingClientRect?.();return!t||t.width<=0||t.height<=0?null:t}function Kv(e,t,n=8){return!e||!t?!1:e.leftt.left&&e.topt.top}function qv(e,t){return!e||!t?!1:e.leftt.right||e.bottom>t.bottom}function up(e,t={}){if(!e)return"";let n=[],r=a=>{n.push(a),e.dataset.shed=n.join(" ")};e.dataset.shed="";let o=bc(e);if(!o)return"";let i=(a,s)=>{let u=bc(t[a]);return qv(u,o)||s.some(c=>Kv(u,bc(t[c])))};return i("bottomRight",["bottomLeft","topRight"])&&r("p5"),i("topRight",["topLeft","bottomLeft","bottomRight"])&&r("p4"),i("topLeft",["topRight","bottomLeft"])&&r("p3"),i("topLeft",["topRight","bottomLeft"])&&r("p2"),i("topLeft",["topRight","bottomLeft"])&&r("p1"),e.dataset.shed}function dp(e,t,n=globalThis){if(!e||typeof t!="function")return null;let r=0,o=!1;function i(){r=0,o||t()}function a(){o||r||(typeof n.requestAnimationFrame=="function"?r=n.requestAnimationFrame(i):r=n.setTimeout?.(i,0)||0)}let s=n.ResizeObserver,u=typeof s=="function"?new s(a):null;u?.observe(e);let c=n.document?.fonts;c?.ready?.then(a).catch?.(()=>{}),c?.addEventListener?.("loadingdone",a);for(let d of e.querySelectorAll?.("img")||[])d.complete||d.addEventListener("load",a,{once:!0});a();function l(){o||(o=!0,u?.disconnect(),c?.removeEventListener?.("loadingdone",a),r&&typeof n.cancelAnimationFrame=="function"?n.cancelAnimationFrame(r):r&&n.clearTimeout?.(r),r=0)}return Object.freeze({destroy:l,schedule:a})}var ze=Object.freeze({white:"#ffffff",ink:"#0d1116",muted:"#96a0ac",carrot:"#14bc68",blue:"#2684ff",amber:"#f4ac36",override:"#b87018",limit:"#de4840",stroke:"#05090c"}),fp=Object.freeze({1:"#00ff00",2:"#ffa500",3:"#ffffff",4:"#ff0000"}),zE=Object.freeze({speedPanel:150,topIcon:24,clock:18,limitSign:46}),jE=Object.freeze({speedPanel:0,limitSign:1,clock:2,lfa:3,wifi:3,gauges:4,tpms:5});var Xv="http://www.w3.org/2000/svg";function ae(e,t,n={},r=[]){let o=e.createElementNS(Xv,t);for(let i in n)n[i]!=null&&o.setAttribute(i,String(n[i]));for(let i of r)i&&o.appendChild(i);return o}function lt(e,t,n={},r=[]){let o=e.createElement(t);if(n.class&&(o.className=n.class),n.text!=null&&(o.textContent=String(n.text)),n.attrs)for(let i in n.attrs)o.setAttribute(i,String(n.attrs[i]));for(let i of r)i&&o.appendChild(i);return o}function Ve(e,t){let n=t==null?"":String(t);e&&e.textContent!==n&&(e.textContent=n)}function zi(e,t){e?.toggleAttribute?.("hidden",!!t)}var Qv=.35,Zv="0 270 384 140",pp=85.2,mp=351,Jv=249.2,hp=339,e0=297.68,gp=389.856,bp=356,yc=379.6,t0=181,yp=351,vp=28,Sp=331.6,Mp=319,Ap=291.8,Rp=41.6,xp=24;function Ep(e,{uri:t,crop:n,centerX:r}){let i=ae(e,"svg",{class:"chud-speed-traffic",x:r-17,y:269,width:34,height:34,viewBox:n,preserveAspectRatio:"xMidYMid meet"});return i.append(ae(e,"image",{href:t,x:0,y:0,width:256,height:256})),i}function Tp(e){let t=ae(e,"svg",{class:"chud-speed",viewBox:Zv,role:"img","aria-label":"속도"}),n=ae(e,"image",{class:"chud-speed-bg-image",href:op,x:18,y:295,width:304,height:113.6,opacity:235/255,preserveAspectRatio:"none"}),r=pp-38,o=Ep(e,{uri:ip,crop:"72 7 52 52",centerX:r}),i=Ep(e,{uri:ap,crop:"132 7 52 52",centerX:r}),a=ae(e,"text",{class:"chud-t-speed",x:pp,y:mp,"font-size":89.6,"text-anchor":"middle"}),s=ae(e,"text",{class:"chud-t-set",x:Jv,y:hp,"font-size":46.4,"text-anchor":"middle"}),u=ae(e,"text",{class:"chud-t-gap",x:e0,y:gp,"font-size":28,"text-anchor":"middle"}),c=ae(e,"rect",{class:"chud-gear-box",x:bp-22.5,y:yc-29,width:45,height:58,rx:8}),l=ae(e,"text",{class:"chud-t-gear",x:bp,y:yc,"font-size":48,"text-anchor":"middle"}),d=ae(e,"text",{class:"chud-t-ev",x:t0,y:yp,"font-size":vp,"text-anchor":"middle"}),f=ae(e,"text",{class:"chud-t-override-label",x:Sp,y:Ap,"font-size":xp,"text-anchor":"middle"}),m=ae(e,"text",{class:"chud-t-override",x:Sp,y:Mp,"font-size":Rp,"text-anchor":"middle"});t.append(n,o,i,a,s,u,c,l,d,f,m);function p(x,E,y){x.setAttribute("font-size",String(y)),x.setAttribute("y",String(E+Qv*y))}let b=null;function g(x={}){let E=Number(x.speed),y=Number.isFinite(E)?String(Math.max(0,Math.round(E))):"0";p(a,mp,y.length<=2?89.6:89.6*.86),Ve(a,y);let O=x.setSpeed!=null&&x.setSpeed!=="";p(s,hp,46.4),Ve(s,O?x.setSpeed:"--"),s.classList.toggle("is-muted",!O);let C=x.gap!=null&&x.gap!=="";p(u,gp,28),Ve(u,C?x.gap:"--"),u.classList.toggle("is-muted",!C);let w=x.gear!=null&&x.gear!=="";p(l,yc,48),Ve(l,w?x.gear:"--"),l.classList.toggle("is-muted",!w),c.classList.toggle("is-muted",!w);let z=Number(x.trafficState);o.style.display=z===1?"":"none",i.style.display=z===2?"":"none";let M=x.evActive===!0;d.style.display=M?"":"none",M&&(p(d,yp,vp),Ve(d,"EV"));let R=x.cruiseOverride,v=R!=null?Number(R.kph):null,h=Number.isFinite(v)&&v>0;h&&(b={kph:Math.round(v),label:R.label||"",mode:R.mode});let S=b!=null;if(m.style.display=S?"":"none",f.style.display=S?"":"none",S){let A=h?b.mode===1?ze.carrot:b.mode===2?ze.override:ze.white:ze.muted;p(m,Mp,Rp),Ve(m,String(b.kph)),m.style.fill=A,p(f,Ap,xp),Ve(f,b.label),f.style.fill=A}}return{el:t,update:g}}var n0=.35;function Op(e){let t=ae(e,"svg",{class:"chud-limit",viewBox:"0 0 84 84",role:"img","aria-label":"제한속도"}),n=ae(e,"text",{class:"chud-limit-num",x:42,y:42,"font-size":42,"text-anchor":"middle"});t.append(ae(e,"circle",{cx:42,cy:42,r:42,fill:"var(--chud-limit)"}),ae(e,"circle",{cx:42,cy:42,r:36,fill:"#fff"}),n);function r(o={}){let i=Number(o.speedLimit),a=Number(o.speed)>0||o.lfaActive===!0,s=Number.isFinite(i)&&i>0&&a;if(zi(t,!s),!s)return;let u=String(Math.round(i)),c=u.length<=2?42:36;n.setAttribute("font-size",String(c)),n.setAttribute("y",String(42+n0*c)),Ve(n,u)}return{el:t,update:r}}var r0=85.2,o0=r0-38,i0=o0+34*.5,a0=16,vc=i0+a0,s0=10,Sc=46,Cp=271,wp=30,c0=8,Mc=21,l0=Cp+wp/2,u0=.35,d0=Object.freeze({1:"eco",2:"safe",3:"normal",4:"sport"}),f0=Object.freeze({eco:{ko:"연비",en:"Eco",zh:"经济"},safe:{ko:"안전",en:"Safe",zh:"安全"},normal:{ko:"일반",en:"Normal",zh:"标准"},sport:{ko:"고속",en:"Sport",zh:"运动"}}),p0=/[ᄀ-ᇿ㄰-㆏가-힯 -ヿ㐀-鿿＀-￯]/;function m0(e){return String(e?.documentElement?.lang||"en").toLowerCase().split(/[-_]/)[0]||"en"}function h0(e,t,n){let r=d0[e],o=m0(t),i=n?.CarrotTranslations?.driveModes||{},a=i[o]||i.en||{},s=f0[r]||{};return a[r]||s[o]||s.en||""}function g0(e){let t=0;for(let n of e)t+=p0.test(n)?1:.56;return t*Mc}function Ip(e){let t=e.defaultView||(typeof globalThis=="object"?globalThis:null),n=ae(e,"rect",{class:"chud-drive-mode-box",x:vc,y:Cp,width:Sc,height:wp,rx:c0}),r=ae(e,"text",{class:"chud-drive-mode-label",x:vc+Sc/2,y:l0+u0*Mc,"font-size":Mc,"text-anchor":"middle"}),o=ae(e,"g",{class:"chud-drive-mode",role:"img"},[n,r]),i=null,a="",s=!1;function u(l){let d=Math.max(Sc,Math.round(l+s0*2));n.setAttribute("width",d),r.setAttribute("x",vc+d/2)}function c(l={}){let d=Number(l.drivingMode),f=d===1||d===2||d===3||d===4;if(o.style.display=f?"":"none",!f){i=null;return}d!==i&&(i=d,n.style.fill=fp[d]);let m=h0(d,e,t);if(m!==a&&(a=m,Ve(r,m),o.setAttribute("aria-label",m),u(g0(m)),s=!0),s&&typeof r.getComputedTextLength=="function"){let p=0;try{p=r.getComputedTextLength()}catch{}p>0&&(u(p),s=!1)}}return c(),{el:o,update:c}}function _p(e){let t=lt(e,"div",{class:"chud-clock",attrs:{role:"timer","aria-label":"시계"}}),n=0;function r(){let s=new Date,u=c=>String(c).padStart(2,"0");return`${u(s.getHours())}:${u(s.getMinutes())}:${u(s.getSeconds())}`}function o(s={}){s.clock?Ve(t,s.clock):Ve(t,r())}function i(){n||(o(),n=setInterval(()=>{(!t.textContent||t.dataset.local!=="0")&&o()},1e3),t.dataset.local="1")}function a(){n&&(clearInterval(n),n=0)}return{el:t,update:o,start:i,stop:a}}var Ac="--°C";function b0(e){if(e==null||e==="")return Ac;let t=Number(e);return Number.isFinite(t)?`${t.toFixed(1)}°C`:Ac}function Np(e){let t=lt(e,"div",{class:"chud-devtemp",text:Ac,attrs:{role:"status","aria-label":"CPU 온도"}});function n(r={}){Ve(t,b0(r.cpuTemp))}return{el:t,update:n}}function Dp(e){let t=ae(e,"svg",{class:"chud-wifi",viewBox:"0 0 48 48",role:"img","aria-label":"네트워크"});t.append(ae(e,"image",{href:rp,x:0,y:0,width:48,height:48,preserveAspectRatio:"none"}));function n(r={}){t.style.opacity=r.networkConnected===!1?"0.51":"1"}return{el:t,update:n}}function Pp(e){let t=lt(e,"span",{class:"chud-lfa",attrs:{role:"img","aria-label":"LFA"}}),n=lt(e,"span",{class:"chud-lfa-lane",attrs:{"aria-hidden":"true"}}),r=lt(e,"img",{class:"chud-lfa-img",attrs:{alt:"LFA",src:np}});n.style.webkitMaskImage=`url("${gc}")`,n.style.maskImage=`url("${gc}")`,t.append(n,r);function o(i={}){t.classList.toggle("is-active",i.lfaActive!==!1);let a=i.laneModePresentation||(i.activeLaneLine===!0?Tt.ACTIVE:Tt.LANELESS),s=a===Tt.ARMED||a===Tt.ACTIVE;t.classList.toggle("has-lane",s),t.classList.toggle("is-lane-armed",a===Tt.ARMED),t.classList.toggle("is-lane-active",a===Tt.ACTIVE),t.setAttribute("data-lane-state",a);let u=Number(i.steerAngle);Number.isFinite(u)&&(r.style.transform=`rotate(${(-u).toFixed(1)}deg)`)}return{el:t,update:o}}var xc=88,zp=186,ji=(xc+zp)/2,Lp=3,Rc=90,kp=184,Fp=56,y0=16,v0=64,S0=201,M0=0;function Vi(e,{label:t,ariaLabel:n}){let r=ae(e,"svg",{class:"chud-gauge",viewBox:"0 47 62 169",role:"img","aria-label":n||t}),o=`chud-gauge-clip-${++M0}`,i=ae(e,"defs",{},[ae(e,"clipPath",{id:o},[ae(e,"rect",{x:Lp,y:Rc,width:Fp,height:kp-Rc,rx:y0})])]),a=ae(e,"rect",{class:"chud-gauge-frame",x:1,y:xc,width:60,height:zp-xc,rx:18}),s=ae(e,"line",{class:"chud-gauge-mid",x1:1,y1:ji,x2:61,y2:ji}),u=ae(e,"rect",{class:"chud-gauge-fill",x:Lp,width:Fp,"clip-path":`url(#${o})`}),c=ae(e,"text",{class:"chud-gauge-value",x:31,y:v0,"font-size":20,"text-anchor":"middle","dominant-baseline":"central"}),l=ae(e,"text",{class:"chud-gauge-label",x:31,y:S0,"font-size":20,"text-anchor":"middle","dominant-baseline":"central",fill:"#fff"});Ve(l,t),r.append(i,a,u,s,c,l);function d(f={}){let p=f.ratio!=null&&Number.isFinite(Number(f.ratio))?Math.max(-1,Math.min(1,Number(f.ratio))):0,b=f.color||"#96a0ac",g=(kp-Rc)/2,x=Math.abs(p)*g;u.setAttribute("y",p>=0?ji-x:ji),u.setAttribute("height",x),u.setAttribute("fill",x<.5?"transparent":b),c.setAttribute("fill",b),Ve(c,f.text==null?"--":f.text)}return{el:r,update:d}}var A0=5;function jp(e){let t=Vi(e,{label:"accel",ariaLabel:"가속도"});function n(r={}){let o=r.accel;if(o==null||!Number.isFinite(Number(o))){t.update({ratio:0,color:ze.muted,text:"--"});return}let i=Number(o),a=i/A0,s=i>.02?ze.carrot:i<-.02?ze.limit:ze.muted;t.update({ratio:a,color:s,text:`${i>=0?"+":""}${i.toFixed(2)}`})}return{el:t.el,update:n}}function Vp(e){let t=Vi(e,{label:"steer",ariaLabel:"조향출력"});function n(r={}){let o=r.steerOutput;if(o==null||!Number.isFinite(Number(o))){t.update({ratio:0,color:ze.muted,text:"--"});return}let i=Math.max(-1,Math.min(1,Number(o))),a=i>.01?ze.blue:i<-.01?ze.amber:ze.muted;t.update({ratio:i,color:a,text:`${i>=0?"+":""}${Math.round(i*100)}%`})}return{el:t.el,update:n}}function Hp(e,t){let n=t==="left",r=n?60:220,o=(a,s)=>`${r+(n?-a:a)} ${40+s}`,i=[`M ${o(-36,-16)}`,`L ${o(12,-16)}`,`L ${o(12,-38)}`,`L ${o(60,0)}`,`L ${o(12,38)}`,`L ${o(12,16)}`,`L ${o(-36,16)} Z`].join(" ");return ae(e,"path",{class:`chud-blinker chud-blinker--${t}`,d:i})}function Bp(e){let t=ae(e,"svg",{class:"chud-turn",viewBox:"0 0 280 80",role:"img","aria-label":"방향지시등"}),n=Hp(e,"left"),r=Hp(e,"right");t.append(n,r);function o(i={}){let a=i.leftBlinker===!0,s=i.rightBlinker===!0;t.style.display=a||s?"":"none",n.style.display=a?"":"none",r.style.display=s?"":"none"}return{el:t,update:o}}var Hi=248,Vo=346;function Ec(e,{valueKey:t,label:n,normalColor:r=ze.carrot,lowColor:o=ze.limit,lowThreshold:i=.15,ariaLabel:a=n,hideWhenUnavailable:s=!1}){let u=ae(e,"svg",{class:"chud-level",viewBox:"0 216 62 156",role:"img","aria-label":a}),c=ae(e,"rect",{class:"chud-level-frame",x:1,y:Hi,width:60,height:Vo-Hi,rx:18}),l=ae(e,"rect",{class:"chud-level-fill",x:9,y:Vo-8,width:44,height:0,rx:13}),d=ae(e,"text",{class:"chud-level-value",x:31,y:Hi-16,"font-size":20,"text-anchor":"middle","dominant-baseline":"central"}),f=ae(e,"text",{class:"chud-level-label",x:31,y:Vo+15,"font-size":20,"text-anchor":"middle","dominant-baseline":"central"});Ve(f,n),u.append(c,l,d,f);function m(p={}){let b=p[t],g=Number(b),E=b!=null&&b!==""&&Number.isFinite(g)&&g>=0&&g<=1&&(!s||g>0);if(s&&(zi(u,!E),!E))return;let y=E?Math.max(0,Math.min(1,g)):0,O=y*(Vo-Hi-16),C=E?y<=i?o:r:ze.muted;l.setAttribute("y",Vo-8-O),l.setAttribute("height",O),l.setAttribute("fill",C),d.setAttribute("fill",C),Ve(d,E?`${Math.round(y*100)}%`:"--%")}return{el:u,update:m}}var R0=31;function Gp(e){let t=ae(e,"svg",{class:"chud-tpms",viewBox:"0 0 80 68",role:"img","aria-label":"Tire pressure"}),n=32.5,r=17,o=ae(e,"g",{class:"chud-tpms-car"},[ae(e,"rect",{x:n,y:r,width:15,height:34,rx:5}),ae(e,"rect",{x:n+3,y:r+5,width:9,height:10,rx:3}),ae(e,"rect",{x:30,y:22,width:3,height:8,rx:1.2}),ae(e,"rect",{x:47,y:22,width:3,height:8,rx:1.2}),ae(e,"rect",{x:30,y:38,width:3,height:8,rx:1.2}),ae(e,"rect",{x:47,y:38,width:3,height:8,rx:1.2})]),a=Object.fromEntries(Object.entries({fl:[10,20],fr:[70,20],rl:[10,48],rr:[70,48]}).map(([u,[c,l]])=>[u,ae(e,"text",{class:"chud-tpms-value",x:c,y:l,"font-size":16,"text-anchor":"middle","dominant-baseline":"central"})]));t.append(o,a.fl,a.fr,a.rl,a.rr);function s(u={}){let c=u.tpms&&typeof u.tpms=="object"?u.tpms:{};for(let[l,d]of Object.entries(a)){let f=Number(c[l]),m=Number.isFinite(f)&&f>=5&&f<=100;d.setAttribute("fill",m?f0&&t<250?t:null}function Wp(e){let t=Ct(e);return t!=null&&t>=0&&t<=1?t:null}function Bi(e){let t=Ct(e);return t!=null&&t>=5&&t<=100?t:null}function Oc(e){let t=Ct(e);return t===1||t===2?t:0}function Cc(e){let t=Ct(e);return t===1||t===2||t===3||t===4?t:null}function x0(e){let t=String(e||"").trim().toLowerCase(),n={park:"P",reverse:"R",neutral:"N",drive:"D",sport:"S",low:"L"};return t?n[t]||t.slice(0,2).toUpperCase():null}function E0(e){if(!e||typeof e!="object")return null;let t={fl:Bi(e.fl),fr:Bi(e.fr),rl:Bi(e.rl),rr:Bi(e.rr)};return Object.values(t).some(n=>n!=null)?t:null}function wc(e){if(!e||typeof e!="object")return null;let t=Ct(e.kph);return t==null||t<=0?null:{kph:t,label:e.label==null?"":String(e.label),mode:Ct(e.mode)??0}}var T0=2500;function O0(e={}){let t=Ct(e.holdMs),n=t!=null&&t>=0?t:T0,r=null,o=null,i=null,a=null;function s(){r=null,o=null,i=null,a=null}function u(l,d={}){let f=wc(l),m=Ct(d.clockMs),p=String(d.clockKey||"live");if(d.active===!1||m==null)return s(),d.active===!1?null:f;if((a!==p||i!=null&&m=0&&b<=n?r:(r=null,o=null,null)}function c(){return Object.freeze({held:r?{...r}:null,lastSeenMs:o,lastClockMs:i,clockKey:a,holdMs:n})}return Object.freeze({update:u,reset:s,status:c})}function C0(e={},t={}){let n=Zr({requested:t.laneModeRequested,planned:t.laneModePlanned,controlled:t.activeLaneLine});return{...e,evActive:t.evActive===!0,activeLaneLine:n.controlled,laneModeRequested:n.requested,laneModePlanned:n.planned,laneModePresentation:n.presentation,cruiseOverride:wc(t.cruiseOverride),trafficState:Oc(t.trafficState??e.trafficState),drivingMode:Cc(t.drivingMode??e.drivingMode)}}function w0(e={}){let t=wc(e.cruiseOverride);return[e.evActive===!0?1:0,e.activeLaneLine==null?"-":e.activeLaneLine===!0?1:0,e.laneModeRequested==null?"-":e.laneModeRequested===!0?1:0,e.laneModePlanned==null?"-":e.laneModePlanned===!0?1:0,e.laneModePresentation??"-",t?.kph??"-",t?.label??"-",t?.mode??"-",Cc(e.drivingMode)??"-"].join(":")}var I0=Object.freeze({cam:"cam:n",section:"section:n",bump:"bump:n",police:"police:n",waze:"waze:n",road:"road:n",atc:"turn:n",atc2:"turn:n",hda:"cam:v",route:"route:v",gas:"gas:v",vturn:"turn:c",model:"turn:c",turn:"turn:c"});function _0(e){let t=String(e||"").trim().toLowerCase();return t?t.endsWith(":n")||t.endsWith(":v")||t.endsWith(":c")?t:I0[t]||t.slice(0,8):"apply"}function Ic(e={}){let t=e.carState||{},n=e.controlsState||{},r=t.cruiseState||{};if(r.available===!1)return null;let o=[t.vCruiseCluster,t.vCruise,n.vCruiseCluster,n.vCruise];for(let i of o){let a=$p(i);if(a!=null)return a}for(let i of[r.speedCluster,r.speed]){let a=Ct(i);if(a!=null&&a>.1&&a<70)return a*3.6}return null}function Up(e={},t=Ic(e)){if($p(t)==null)return!1;let n=Tc(e.selfdriveState?.enabled);if(n!=null)return n;let r=Tc(e.controlsState?.enabled);return r??e.carState?.cruiseState?.available!==!1}function Yp(e={}){let t=Ic(e);if(!Up(e,t))return null;let n=Ct(e.longitudinalPlan?.cruiseTarget);if(n!=null&&n>t+.5)return{kph:n,label:"eco",mode:1};let r=Ct(e.carrotMan?.desiredSpeed);return r!=null&&r>0&&r<200&&r0?Math.round(a):null,u=!!t.evModeValid&&!!t.evModeActive,c=gr(e),l=Tc(o.latActive);return{gear:i,gearStep:s,evActive:u,activeLaneLine:c.controlled,laneModeRequested:c.requested,laneModePlanned:c.planned,laneModePresentation:c.presentation,cruiseOverride:Yp(e),trafficState:Kp(e),drivingMode:Cc(e.longitudinalPlan?.myDrivingMode),lfaActive:l??!!(r.enabled??n.enabled),steeringAngleDeg:Ct(t.steeringAngleDeg??o.actuators?.steeringAngleDeg),aEgo:Ct(t.aEgo??o.actuators?.accel),steerOutput:Ct(n.lateralOutput??n.torqueState?.lateralOutput??n.lateralControlState?.torqueState?.output),leftBlinker:!!t.leftBlinker,rightBlinker:!!t.rightBlinker,fuelGauge:Wp(t.fuelGauge),ureaGauge:Wp(t.ureaGauge),tpms:E0(t.tpms)}}var _c=Object.freeze({deriveVehicleHudPayload:N0,resolveLaneModeState:gr,deriveCruiseOverride:Yp,createCruiseOverrideHold:O0,resolveTrafficState:Kp,resolveCruiseKph:Ic,isCruiseDisplayVisible:Up,withVehicleHudFields:C0,vehicleHudSignature:w0});function Sr(e,t){return Object.prototype.hasOwnProperty.call(e||{},t)}function D0(e={}){let t=e.carState||{},n=e.controlsState||{},r=e.lateralPlan||{},o=e.longitudinalPlan||{},i=e.carrotMan||{},a=e.selfdriveState||{},s=e.carControl||{};return{services:{carState:Sr(e,"carState"),controlsState:Sr(e,"controlsState"),lateralPlan:Sr(e,"lateralPlan"),longitudinalPlan:Sr(e,"longitudinalPlan"),carrotMan:Sr(e,"carrotMan"),selfdriveState:Sr(e,"selfdriveState"),carControl:Sr(e,"carControl")},carState:{vEgoCluster:t.vEgoCluster??null,vCruiseCluster:t.vCruiseCluster??null,vCruise:t.vCruise??null,evModeValid:t.evModeValid??null,evModeActive:t.evModeActive??null,gearShifter:t.gearShifter??null,useLaneLineSpeed:t.useLaneLineSpeed??null},controlsState:{enabled:n.enabled??null,vCruiseCluster:n.vCruiseCluster??null,activeLaneLine:n.activeLaneLine??null},lateralPlan:{useLaneLines:r.useLaneLines??null},longitudinalPlan:{cruiseTarget:o.cruiseTarget??null,trafficState:o.trafficState??null},carrotMan:{desiredSpeed:i.desiredSpeed??null,desiredSource:i.desiredSource??null,trafficState:i.trafficState??null,xSpdType:i.xSpdType??null,xSpdLimit:i.xSpdLimit??null,xSpdDist:i.xSpdDist??null,xSpdCountDown:i.xSpdCountDown??null},selfdriveState:{enabled:a.enabled??null},carControl:{latActive:s.latActive??null}}}function P0(e){let t=e.CarrotVisionReplay?.status?.()||{};return{active:t.active===!0,ready:t.ready===!0,loading:t.loading===!0,route:t.route??null,segment:t.segment??null,currentTime:Number.isFinite(Number(t.currentTime))?Number(t.currentTime):null,paused:t.paused!==!1,services:Object.keys(t.services||{}).sort()}}function Mr(e,t,n={}){if(!t)return{present:!1};let r=null;try{r=e.getComputedStyle?.(t)||e.document?.defaultView?.getComputedStyle?.(t)||null}catch{}let o=t.getBoundingClientRect?.(),i={present:!0,hidden:t.hidden===!0,display:r?.display??null,visibility:r?.visibility??null,opacity:r?.opacity??null};return o&&(i.rect={x:Math.round(Number(o.x)||0),y:Math.round(Number(o.y)||0),width:Math.round(Number(o.width)||0),height:Math.round(Number(o.height)||0)}),n.text===!0&&(i.text=String(t.textContent||"").trim().slice(0,80)),i}function qp(e=globalThis,t=e.CarrotHudOverlay){function n(){let i=e.CarrotHudState||{},a=t?.root||e.document?.querySelector?.("[data-carrot-hud='overlay']")||null,s=e.document?.getElementById?.("carrotStage")||null,u=a?.querySelectorAll?.(".chud-speed-traffic")||[];return{version:1,capturedAt:new Date().toISOString(),replay:{...P0(e),hudToggleOn:s?.classList?.contains?.("is-replay-hud-visible")??null},source:D0(i),derived:e.CarrotHudDataBridge?.deriveVehicleHudPayload?.(i)||null,presentation:{overlay:t?.status?.()||null,content:e.DriveVisionHudContent?.status?.()||null},dom:{root:Mr(e,a),ev:Mr(e,a?.querySelector?.(".chud-t-ev"),{text:!0}),lane:Mr(e,a?.querySelector?.(".chud-lfa-lane")),cruiseOverride:Mr(e,a?.querySelector?.(".chud-t-override"),{text:!0}),cruiseOverrideLabel:Mr(e,a?.querySelector?.(".chud-t-override-label"),{text:!0}),trafficRed:Mr(e,u[0]),trafficGreen:Mr(e,u[1])}}}function r(){return JSON.stringify(n(),null,2)}async function o(){let i=r();try{let a=e.navigator?.clipboard;if(typeof a?.writeText!="function")throw new Error("Clipboard API unavailable");return await a.writeText(i),{copied:!0,length:i.length}}catch{return e.console?.log?.(i),{copied:!1,length:i.length,text:i}}}return Object.freeze({snapshot:n,text:r,copy:o})}var Gi=new WeakMap;typeof globalThis=="object"&&(globalThis.CarrotHudDataBridge=_c);function At(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function L0(e={}){let t=e.isMetric!==!1,n=f=>f==null?null:Math.round(t?f:f*.621371),r=At(e.vEgoKph??e.speed),o=At(e.vSetKph??e.setSpeed),i=At(e.tfGap??e.gap),a=At(e.speedLimitKph??e.limit),s=At(e.gearStep),u=s!=null&&s>0?String(Math.round(s)):e.gear==null?null:String(e.gear).trim().toUpperCase().slice(0,2),c=e.cruiseOverride&&typeof e.cruiseOverride=="object"?e.cruiseOverride:null,l=c!=null?At(c.kph):null,d=Zr({requested:e.laneModeRequested,planned:e.laneModePlanned,controlled:e.activeLaneLine});return{speed:n(r),setSpeed:o!=null&&o>0?n(o):null,gap:i!=null&&i>0?Math.round(i):null,gear:u,speedLimit:a!=null&&a>0?n(a):null,evActive:e.evActive===!0,activeLaneLine:d.controlled,laneModeRequested:d.requested,laneModePlanned:d.planned,laneModePresentation:d.presentation,cruiseOverride:l!=null&&l>0?{kph:n(l),label:c.label==null?"":String(c.label),mode:At(c.mode)??0}:null,drivingMode:At(e.drivingMode),lfaActive:e.latActive??e.lfaActive,steerAngle:At(e.steeringAngleDeg),accel:At(e.aEgo??e.accel),steerOutput:At(e.steerOutput),leftBlinker:e.leftBlinker===!0,rightBlinker:e.rightBlinker===!0,fuelGauge:At(e.fuelGauge),ureaGauge:At(e.ureaGauge),tpms:e.tpms&&typeof e.tpms=="object"?e.tpms:null,trafficState:At(e.trafficState),networkConnected:e.networkConnected,clock:e.clock,cpuTemp:At(e.cpuTempMaxC??e.cpuTempC)}}function k0(e){lp(e);let t=lt(e,"div",{class:"chud",attrs:{"data-carrot-hud":"overlay"}}),n=Pp(e),r=Dp(e),o=_p(e),i=Op(e),a=Tp(e),s=Ip(e);a.el.appendChild(s.el);let u=jp(e),c=Vp(e),l=Ec(e,{valueKey:"fuelGauge",label:"fuel",ariaLabel:"Fuel or battery level",hideWhenUnavailable:!0}),d=Ec(e,{valueKey:"ureaGauge",label:"DEF",normalColor:ze.blue,lowColor:ze.amber,ariaLabel:"Diesel exhaust fluid level",hideWhenUnavailable:!0}),f=Gp(e),m=Bp(e),p=Np(e),b=lt(e,"div",{class:"chud-zone chud-zone--tl"},[lt(e,"div",{class:"chud-row"},[n.el,r.el,o.el]),i.el]),g=lt(e,"div",{class:"chud-zone chud-zone--tc"},[m.el]),x=lt(e,"div",{class:"chud-zone chud-zone--tr"},[lt(e,"div",{class:"chud-gauge-column"},[u.el,l.el]),lt(e,"div",{class:"chud-gauge-column"},[c.el,d.el])]),E=lt(e,"div",{class:"chud-zone chud-zone--bl"},[a.el]),y=lt(e,"div",{class:"chud-zone chud-zone--br"},[f.el]),O=lt(e,"div",{class:"chud-corner chud-corner--bl"},[p.el]);t.append(O,b,g,x,E,y);let C={topLeft:b,topCenter:m.el,topRight:x,bottomLeft:E,bottomRight:y},w=[n,r,o,i,a,s,u,c,l,d,f,m,p],z=new Set,M="",R=null,v=!1,h=!1,S=null;function A(){let F=h||!v||z.size>0;return t.hidden=F,t.inert=F,t.classList.toggle("is-hud-suppressed",F),F?(t.setAttribute("aria-hidden","true"),o.stop()):(t.removeAttribute("aria-hidden"),o.start()),!F}function L(){up(t,C)}function P(){R?R.schedule():L()}function _(F){if(h||!F)return!1;let H=L0(F);S=H;for(let $ of w)$.update(H);let Y=[H.speedLimit!=null&&H.speedLimit>0,H.leftBlinker,H.rightBlinker,H.fuelGauge!=null&&H.fuelGauge>0&&H.fuelGauge<=1,H.ureaGauge!=null&&H.ureaGauge>0&&H.ureaGauge<=1].join(":");return M!==Y&&(M=Y,P()),!0}function T(F){if(h)return!1;let H=At(F?.width),Y=At(F?.height);return H>0&&Y>0?(P(),!0):!1}function I(F){return h?!1:(R||(R=dp(t,L,F)),R?.schedule(),!!R)}function k(){if(h)return!1;let F=!v;return v=!0,A(),P(),F}function D(){if(h)return!1;let F=v;return v=!1,A(),F}function B(F,H){if(h)return!1;let Y=String(F||"external");return H?z.add(Y):z.delete(Y),A()}function W(){return Object.freeze({active:v,destroyed:h,visible:!t.hidden,suppressions:Object.freeze(Array.from(z)),data:S})}function V(){return h?!1:(v=!1,h=!0,z.clear(),R?.destroy?.(),R=null,A(),t.remove?.(),!0)}return A(),{root:t,update:_,relayout:T,activate:k,deactivate:D,setSuppressed:B,status:W,destroy:V,startClock:()=>o.start(),stopClock:()=>o.stop(),startLayout:I}}function Nc(e=globalThis,t={}){if(Gi.has(e))return Gi.get(e);e.CarrotHudDataBridge=_c;let n=t.document||e.document;if(!n)return null;let r=t.stage||n.getElementById?.("carrotStage");if(!r){if(!e.__carrotHudDeferred){e.__carrotHudDeferred=!0;let s=()=>{e.__carrotHudDeferred=!1,Nc(e,t)};n.readyState==="loading"?n.addEventListener("DOMContentLoaded",s,{once:!0}):e.setTimeout?.(s,0)}return null}let o=k0(n);r.appendChild(o.root),o.startLayout(e),o.update({});let i=s=>o.relayout(s.detail);e.addEventListener?.("carrot:viewportlayout",i,{passive:!0});let a=o.destroy;return o.destroy=()=>{e.removeEventListener?.("carrot:viewportlayout",i);let s=a();return s&&(Gi.delete(e),e.CarrotHudOverlay===o&&(e.CarrotHudOverlay=null),e.CarrotHudDebug&&(e.CarrotHudDebug=null)),s},e.CarrotHudOverlay=o,e.CarrotHudDebug=qp(e,o),Gi.set(e,o),e.DriveVisionHudContent?.syncPresentation?.(),o}var Xp=new WeakMap;function Qp(e=globalThis,t={}){let n=Xp.get(e);if(n)return n;let r=so(e,t.hudContent||{});if(!r)return null;let o=Object.freeze({hudContent:r,presentedFrames:ac(e),replayRenderBridge:mf(e),replayRenderController:gf(e),hudLayout:vf(e),hudCanvas:Mf(e),hudModel:Rf(e),rtcPerfHud:Ef(e),roadOverlayPolicy:Of(e),roadOverlayProjection:_f(e),roadOverlayGeometryRenderer:Pf(e),roadOverlayAuxRenderer:Ff(e),roadOverlayLeadModel:jf(e),roadOverlayLeadRenderer:Bf(e),sessionPolicy:Yf(e),sessionController:Xf(e),connectionTransactions:Jf(e),networkRecovery:tp(e)});Xp.set(e,o);try{Nc(e,t.hudOverlay||{})}catch(i){e.console?.error?.("[carrot hud overlay] install failed",i)}return o}var Ze=globalThis,Jp=Xi(kc);Pd(Ze);Nd(Ze);jc(Ze);il(Ze);var em=Id(Jp,Ze),tm=Zc({registry:em,contentDefaults:Jp.defaults,settingDefaults:()=>Ze.CarrotWebSettingDefaults||{}});Jc(tm,Ze);Qp(Ze);ic(Ze);var Zp=!1,to=null,F0="carrot:driveplatformready";function nm(){return!!(typeof Ze.HomeDrive?.refresh=="function"&&Ze.DriveContentIntro?.create&&Ze.document?.getElementById("carrotDriveWorkspace")&&Ze.document?.getElementById("carrotStage")&&Ze.document?.getElementById("carrotNaviPane"))}function Dc(){if(Zp)return!0;if(!nm())return!1;try{let e=Or(Ze);to||=cl(Ze,{registry:em,layoutSpec:tm,syncOnCreate:!1});let t=ff(Ze,{compatibilityContent:!1,runtime:{workspaceRuntime:to}});if(!e||!to||!t.runtime||!t.facade)throw new Error("Drive platform finalization dependencies are unavailable");to.sync();let n=to.shell.getContent("primary"),r=to.shell.getContent("secondary");if(!n||!r)throw new Error("Drive workspace content assignments are unavailable");return Zp=!0,!0}catch(e){return Ze.console?.error?.("[drive] platform finalization failed",e),!1}}Ze.addEventListener(F0,Dc,{once:!0});Ze.document?.readyState==="loading"?Ze.document.addEventListener("DOMContentLoaded",()=>{!Dc()&&!nm()&&Ze.console?.error?.("[drive] platform finalization failed",new Error("Drive platform finalization dependencies are unavailable"))},{once:!0}):Dc();})(); diff --git a/openpilot/selfdrive/carrot/web/js/generated/settings.js b/openpilot/selfdrive/carrot/web/js/generated/settings.js index a06cf3bcd2..cc134d55d0 100644 --- a/openpilot/selfdrive/carrot/web/js/generated/settings.js +++ b/openpilot/selfdrive/carrot/web/js/generated/settings.js @@ -1,6 +1,6 @@ /* @generated by web/build.mjs; edit web/src/entries/settings.js instead. */ -(()=>{var Hn="/api/settings/snapshot",Fn="/api/setting_favorites",Un="/api/setting_profiles",Vn="/api/setting_popular_values";function we(t,e){return typeof t?.getJson!="function"?Promise.reject(new Error("Settings API client is unavailable")):t.getJson(e)}function yt(t){return function(){return we(t,Hn)}}function _t(t){return Object.freeze({loadFavorites:()=>we(t,Fn),loadProfiles:()=>we(t,Un),loadPopular:()=>we(t,Vn)})}function wt(t){let e=[],n=new Set;return(Array.isArray(t)?t:[]).forEach(r=>{let s=String(r||"").trim();!s||n.has(s)||(n.add(s),e.push(s))}),e}function St(t){return(Array.isArray(t)?t:[]).filter(e=>e&&e.id&&e.name&&e.values).map(e=>({...e,values:{...e.values||{}},meta:{...e.meta||{}}}))}function qn(t){let e=t?.popular_values;return{carKey:String(t?.car_key||""),fetchedAt:Number(t?.fetched_at||0),values:e&&typeof e=="object"&&!Array.isArray(e)?{...e}:{}}}function vt(t={}){let e={loaded:!1,promise:null,version:0,names:[]},n={loaded:!1,promise:null,version:0,profiles:[]},r={loaded:!1,promise:null,version:0,carKey:"",fetchedAt:0,values:{}};function s({state:f,force:h,loader:b,apply:w,current:S,fallback:T}){if(!h&&f.loaded)return Promise.resolve(S());if(f.promise)return f.promise;let P=f.loaded,C=f.version,D=Promise.resolve().then(()=>{if(typeof b!="function")throw new Error("Settings resource loader is unavailable");return b()}).then(H=>f.version===C?w(H):S()).catch(()=>f.version!==C||f.loaded||P?S():T()).finally(()=>{f.promise===D&&(f.promise=null)});return f.promise=D,D}function i(f){return e.names=wt(f),e.loaded=!0,e.version+=1,e.names}function a(f=!1){return s({state:e,force:f,loader:t.loadFavorites,apply:h=>i(h?.favorites||[]),current:()=>e.names,fallback:()=>i([])})}function o(f){return n.profiles=St(f),n.loaded=!0,n.version+=1,n.profiles}function l(f=!1){return s({state:n,force:f,loader:t.loadProfiles,apply:h=>o(h?.profiles||[]),current:()=>n.profiles,fallback:()=>o([])})}function c(f){let h=qn(f);return r.carKey=h.carKey,r.fetchedAt=h.fetchedAt,r.values=h.values,r.loaded=!0,r.version+=1,r.values}function u(f=!1){return s({state:r,force:f,loader:t.loadPopular,apply:c,current:()=>r.values,fallback:()=>c({})})}function p(f){i(f?.favorites||[]),o(f?.profiles||[]),c(f?.popular||{})}let g=Object.freeze({load:a,replace:i,normalize:wt,get:()=>e.names,get loaded(){return e.loaded}}),k=Object.freeze({load:l,replace:o,normalize:St,get:()=>n.profiles,get loaded(){return n.loaded}}),m=Object.freeze({load:u,replace:c,getValue(f){let h=r.values?.[String(f||"")];return h&&typeof h=="object"?h:null},getState(){return{carKey:r.carKey,fetchedAt:r.fetchedAt,values:r.values}},get loaded(){return r.loaded}});return Object.freeze({favorites:g,profiles:k,popular:m,hydrateSnapshot:p})}function Zn(t){if(!t||!Array.isArray(t.categories)||!t.categories.length)return t;let e=new Map;Object.values(t.items_by_group||{}).forEach(s=>{(s||[]).forEach(i=>{i?.name&&e.set(i.name,i)})});let n=[],r={};return t.categories.forEach(s=>{(s.groups||[]).forEach(i=>{n.push({group:i.id,ko:i.ko,en:i.en,zh:i.zh,count:i.count,category:s.id});let a=[];(i.sections||[]).forEach(o=>{let l={id:o.id,ko:o.ko,en:o.en,zh:o.zh};(o.items||[]).forEach(c=>{let u=e.get(c);u&&a.push({...u,__section:l})})}),r[i.id]=a})}),t.groups=n,t.items_by_group=r,t}function At(){let t=null,e=null;function n(s,i=null){if(!s||typeof s!="object")throw new TypeError("Settings catalog must be an object");return t===s&&e===i?{catalog:t,changed:!1}:(t=Zn(s),e=i,{catalog:t,changed:!0})}function r(){return t}return Object.freeze({commit:n,peek:r})}var V=Object.freeze({favoritesGroup:"__setting_favorites__",profilesDivider:"__setting_profiles_divider__",profileGroupPrefix:"__setting_profile__:",categoryDividerPrefix:"__setting_category__:"});function fe(t,e="en"){return t?e==="zh"?t.zh||t.en||t.ko||"":e==="ko"?t.ko||t.en||t.zh||"":t.en||t.ko||t.zh||"":""}function Se(t,e,n,r="",s="en"){return t?s==="zh"?t[`c${n.slice(1)}`]||t[n]||t[e]||r:s==="ko"?t[e]||t[n]||r:t[n]||t[e]||r:r}function He(t={}){let e=t.catalog||null,n=Array.isArray(t.favorites)?t.favorites:[],r=Array.isArray(t.profiles)?t.profiles:[],s=t.language||"en",i={favorites:t.labels?.favorites||"Favorites",profiles:t.labels?.profiles||"Profiles"},a=e?.groups||[],o=e?.items_by_group||{},l=new Map;a.forEach((d,x)=>{l.has(d?.group)||l.set(d?.group,{entry:d,index:x})});let c=new Map,u=new Map;Object.entries(o).forEach(([d,x])=>{let _=new Map;(x||[]).forEach((N,G)=>{N?.name&&(c.has(N.name)||c.set(N.name,{group:d,item:N}),_.has(N.name)||_.set(N.name,G))}),u.set(d,_)});let p=new Map;r.forEach(d=>{let x=String(d?.id||"");p.has(x)||p.set(x,d)});function g(d){return V.profileGroupPrefix+String(d||"")}function k(d){return String(d||"").startsWith(V.profileGroupPrefix)}function m(d){return k(d)?String(d).slice(V.profileGroupPrefix.length):""}function f(d){return p.get(String(d||""))||null}function h(d){return f(m(d))}function b(d){return c.get(String(d||"").trim())||null}function w(){return n.map(b).filter(Boolean)}function S(d){return Object.keys(d?.values||{}).map(b).filter(Boolean).sort((x,_)=>{let N=l.get(x.group)?.index??9999,G=l.get(_.group)?.index??9999;if(N!==G)return N-G;let Y=u.get(x.group)?.get(x.item.name)??9999,J=u.get(_.group)?.get(_.item.name)??9999;return Y!==J?Y-J:String(x.item.name).localeCompare(String(_.item.name))})}function T(){return w().map(d=>d.item.name).filter(Boolean)}function P(){let d=[{group:V.favoritesGroup,count:w().length,virtual:!0}],x=e?.categories;return Array.isArray(x)&&x.length?x.forEach(_=>{d.push({group:V.categoryDividerPrefix+(_.id||""),label:fe(_,s),divider:!0,virtual:!0}),(_.groups||[]).forEach(N=>{d.push({group:N.id,ko:N.ko,en:N.en,zh:N.zh,count:N.count,category:_.id})})}):d.push(...a),r.length&&(d.push({group:V.profilesDivider,label:i.profiles,divider:!0,virtual:!0}),r.forEach(_=>{d.push({group:g(_.id),count:S(_).length,label:_.name,profile:_,virtual:!0})})),d}function C(d){if(d===V.favoritesGroup)return w();let x=h(d);return x?S(x):(o[d]||[]).map(_=>({group:d,item:_}))}function D(d){if(d===V.favoritesGroup)return{group:d,egroup:"Favorites",count:w().length,virtual:!0};let x=h(d);return x?{group:d,egroup:x.name,count:S(x).length,profile:x,virtual:!0}:l.get(d)?.entry||null}function H(d){if(d===V.favoritesGroup)return i.favorites;let x=h(d);if(x)return x.name;let _=D(d);return _?_.ko||_.en||_.zh?fe(_,s):s==="zh"?_.cgroup||_.egroup||_.group:s==="ko"?_.group||_.egroup||d:_.egroup||_.group||d:d}function y(d,x){let _=H(d),N=x?.__section?fe(x.__section,s):"";return!N||N===_?_:`${_} > ${N}`}function L({source:d,profile:x=null,group:_,item:N,sourceLabels:G}){let Y=H(_),J=y(_,N),_e=Se(N,"title","etitle","",s),E=Se(N,"descr","edescr","",s),A=d==="profile"&&x?.id,I=A?String(x.name||""):"",j=A?G.profile:G.carrot,R=A?`${I} / ${J}`:J;return{source:A?"profile":"carrot",sourceLabel:j,profileId:A?x.id:"",profileName:I,group:A?g(x.id):_,originalGroup:_,groupLabel:Y,contextGroupLabel:J,contextLabel:R,name:N.name,title:_e,descr:E,haystack:[j,I,Y,J,N.name,_e,E].join(` -`).toLowerCase()}}function $(d={}){let x={carrot:d.carrot||"CarrotPilot",profile:d.profile||"Profile"},_=[];return a.forEach(N=>{let G=N.group;(o[G]||[]).forEach(Y=>{_.push(L({source:"carrot",group:G,item:Y,sourceLabels:x}))})}),r.forEach(N=>{S(N).forEach(G=>{_.push(L({source:"profile",profile:N,group:G.group,item:G.item,sourceLabels:x}))})}),_}return Object.freeze({profileGroup:g,isProfileGroup:k,profileIdFromGroup:m,getProfileById:f,getProfileByGroup:h,findItemByName:b,getFavoriteEntries:w,getProfileEntries:S,getValidFavoriteNames:T,getGroupsForDisplay:P,getItemEntriesForGroup:C,getGroupMeta:D,getGroupLabel:H,getItemContextLabel:y,buildSearchEntries:$})}function Et(){let t=null;function e(r={}){let s=r.labels?.favorites||"Favorites",i=r.labels?.profiles||"Profiles";if(t?.catalog===r.catalog&&t.favorites===r.favorites&&t.profiles===r.profiles&&t.language===r.language&&t.favoritesLabel===s&&t.profilesLabel===i)return t.model;let a=He(r);return t={catalog:r.catalog,favorites:r.favorites,profiles:r.profiles,language:r.language,favoritesLabel:s,profilesLabel:i,model:a},a}function n(){t=null}return Object.freeze({get:e,clear:n})}function Tt(t={}){let e=t.snapshotStore||null,n=t.getPreparedCatalog,r=t.loadLegacyCatalog,s=t.loadLegacyAuxiliary,i=t.commitCatalog,a=null;function o(u){if(!u||typeof u!="object")throw new Error("Settings catalog preparation failed");return u}function l(u){return!u?.settings||typeof i!="function"?null:o(i(u.settings,u))}function c(u={}){let p=u.force===!0;if(a)return a;let g=typeof n=="function"?n():null;if(!p&&g)return Promise.resolve({catalog:g,source:"memory"});let m=(async()=>{let f=null;if(typeof e?.load=="function")try{f=await e.load({force:p})}catch{}if(f?.settings)return{catalog:l(f),source:"snapshot"};if(typeof r!="function")throw new Error("Legacy settings catalog loader is unavailable");let h=Promise.resolve();if(typeof s=="function")try{h=Promise.resolve(s(p)).catch(()=>null)}catch{h=Promise.resolve()}let b=await r(),w=o(i(b,null));return await h,{catalog:w,source:"legacy"}})().finally(()=>{a===m&&(a=null)});return a=m,m}return Object.freeze({prepare:c,primeSnapshot:l,get pending(){return!!a}})}function qe(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var oe=qe();function Pt(t){oe=t}var ie={exec:()=>null};function pe(t){let e=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),s=e[r];return s||(s=t(r),e[r]=s),s}}function z(t,e=""){let n=typeof t=="string"?t:t.source,r={replace:(s,i)=>{let a=typeof i=="string"?i:i.source;return a=a.replace(F.caret,"$1"),n=n.replace(s,a),r},getRegex:()=>new RegExp(n,e)};return r}var Kn=((t="")=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:pe(t=>new RegExp(`^ {0,${t}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:pe(t=>new RegExp(`^ {0,${t}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:pe(t=>new RegExp(`^ {0,${t}}(?:\`\`\`|~~~)`)),headingBeginRegex:pe(t=>new RegExp(`^ {0,${t}}#`)),htmlBeginRegex:pe(t=>new RegExp(`^ {0,${t}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:pe(t=>new RegExp(`^ {0,${t}}>`))},Xn=/^(?:[ \t]*(?:\n|$))+/,Wn=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Qn=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,be=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Yn=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Ze=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Lt=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,jt=z(Lt).replace(/bull/g,Ze).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Jn=z(Lt).replace(/bull/g,Ze).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Ke=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,er=/^[^\n]+/,Xe=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,tr=z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",Xe).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),nr=z(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,Ze).getRegex(),$e="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",We=/|$))/,rr=z("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",We).replace("tag",$e).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Mt=t=>z(Ke).replace("hr",be).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~~~)[^\\n]*\\n").replace("list",t).replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",$e).getRegex(),sr=Mt(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),ir=Mt(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),ar=z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",ir).getRegex(),Qe={blockquote:ar,code:Wn,def:tr,fences:Qn,heading:Yn,hr:be,html:rr,lheading:jt,list:nr,newline:Xn,paragraph:sr,table:ie,text:er},$t=z("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",be).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~~~)[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",$e).getRegex(),or={...Qe,lheading:Jn,table:$t,paragraph:z(Ke).replace("hr",be).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",$t).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~~~)[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",$e).getRegex()},lr={...Qe,html:z(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",We).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:ie,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:z(Ke).replace("hr",be).replace("heading",` *#{1,6} *[^ +(()=>{var Hn="/api/settings/snapshot",Fn="/api/setting_favorites",Un="/api/setting_profiles",Vn="/api/setting_popular_values";function we(t,e){return typeof t?.getJson!="function"?Promise.reject(new Error("Settings API client is unavailable")):t.getJson(e)}function yt(t){return function(){return we(t,Hn)}}function _t(t){return Object.freeze({loadFavorites:()=>we(t,Fn),loadProfiles:()=>we(t,Un),loadPopular:()=>we(t,Vn)})}function wt(t){let e=[],n=new Set;return(Array.isArray(t)?t:[]).forEach(r=>{let s=String(r||"").trim();!s||n.has(s)||(n.add(s),e.push(s))}),e}function St(t){return(Array.isArray(t)?t:[]).filter(e=>e&&e.id&&e.name&&e.values).map(e=>({...e,values:{...e.values||{}},meta:{...e.meta||{}}}))}function qn(t){let e=t?.popular_values;return{carKey:String(t?.car_key||""),fetchedAt:Number(t?.fetched_at||0),values:e&&typeof e=="object"&&!Array.isArray(e)?{...e}:{}}}function vt(t={}){let e={loaded:!1,promise:null,version:0,names:[]},n={loaded:!1,promise:null,version:0,profiles:[]},r={loaded:!1,promise:null,version:0,carKey:"",fetchedAt:0,values:{}};function s({state:f,force:h,loader:m,apply:w,current:S,fallback:T}){if(!h&&f.loaded)return Promise.resolve(S());if(f.promise)return f.promise;let P=f.loaded,C=f.version,D=Promise.resolve().then(()=>{if(typeof m!="function")throw new Error("Settings resource loader is unavailable");return m()}).then(H=>f.version===C?w(H):S()).catch(()=>f.version!==C||f.loaded||P?S():T()).finally(()=>{f.promise===D&&(f.promise=null)});return f.promise=D,D}function i(f){return e.names=wt(f),e.loaded=!0,e.version+=1,e.names}function a(f=!1){return s({state:e,force:f,loader:t.loadFavorites,apply:h=>i(h?.favorites||[]),current:()=>e.names,fallback:()=>i([])})}function o(f){return n.profiles=St(f),n.loaded=!0,n.version+=1,n.profiles}function l(f=!1){return s({state:n,force:f,loader:t.loadProfiles,apply:h=>o(h?.profiles||[]),current:()=>n.profiles,fallback:()=>o([])})}function c(f){let h=qn(f);return r.carKey=h.carKey,r.fetchedAt=h.fetchedAt,r.values=h.values,r.loaded=!0,r.version+=1,r.values}function u(f=!1){return s({state:r,force:f,loader:t.loadPopular,apply:c,current:()=>r.values,fallback:()=>c({})})}function p(f){i(f?.favorites||[]),o(f?.profiles||[]),c(f?.popular||{})}let g=Object.freeze({load:a,replace:i,normalize:wt,get:()=>e.names,get loaded(){return e.loaded}}),k=Object.freeze({load:l,replace:o,normalize:St,get:()=>n.profiles,get loaded(){return n.loaded}}),b=Object.freeze({load:u,replace:c,getValue(f){let h=r.values?.[String(f||"")];return h&&typeof h=="object"?h:null},getState(){return{carKey:r.carKey,fetchedAt:r.fetchedAt,values:r.values}},get loaded(){return r.loaded}});return Object.freeze({favorites:g,profiles:k,popular:b,hydrateSnapshot:p})}function Zn(t){if(!t||!Array.isArray(t.categories)||!t.categories.length)return t;let e=new Map;Object.values(t.items_by_group||{}).forEach(s=>{(s||[]).forEach(i=>{i?.name&&e.set(i.name,i)})});let n=[],r={};return t.categories.forEach(s=>{(s.groups||[]).forEach(i=>{n.push({group:i.id,ko:i.ko,en:i.en,zh:i.zh,count:i.count,category:s.id});let a=[];(i.sections||[]).forEach(o=>{let l={id:o.id,ko:o.ko,en:o.en,zh:o.zh};(o.items||[]).forEach(c=>{let u=e.get(c);u&&a.push({...u,__section:l})})}),r[i.id]=a})}),t.groups=n,t.items_by_group=r,t}function At(){let t=null,e=null;function n(s,i=null){if(!s||typeof s!="object")throw new TypeError("Settings catalog must be an object");return t===s&&e===i?{catalog:t,changed:!1}:(t=Zn(s),e=i,{catalog:t,changed:!0})}function r(){return t}return Object.freeze({commit:n,peek:r})}var V=Object.freeze({favoritesGroup:"__setting_favorites__",profilesDivider:"__setting_profiles_divider__",profileGroupPrefix:"__setting_profile__:",categoryDividerPrefix:"__setting_category__:"});function fe(t,e="en"){return t?e==="zh"?t.zh||t.en||t.ko||"":e==="ko"?t.ko||t.en||t.zh||"":t.en||t.ko||t.zh||"":""}function Se(t,e,n,r="",s="en"){return t?s==="zh"?t[`c${n.slice(1)}`]||t[n]||t[e]||r:s==="ko"?t[e]||t[n]||r:t[n]||t[e]||r:r}function He(t={}){let e=t.catalog||null,n=Array.isArray(t.favorites)?t.favorites:[],r=Array.isArray(t.profiles)?t.profiles:[],s=t.language||"en",i={favorites:t.labels?.favorites||"Favorites",profiles:t.labels?.profiles||"Profiles"},a=e?.groups||[],o=e?.items_by_group||{},l=new Map;a.forEach((d,x)=>{l.has(d?.group)||l.set(d?.group,{entry:d,index:x})});let c=new Map,u=new Map;Object.entries(o).forEach(([d,x])=>{let _=new Map;(x||[]).forEach((N,G)=>{N?.name&&(c.has(N.name)||c.set(N.name,{group:d,item:N}),_.has(N.name)||_.set(N.name,G))}),u.set(d,_)});let p=new Map;r.forEach(d=>{let x=String(d?.id||"");p.has(x)||p.set(x,d)});function g(d){return V.profileGroupPrefix+String(d||"")}function k(d){return String(d||"").startsWith(V.profileGroupPrefix)}function b(d){return k(d)?String(d).slice(V.profileGroupPrefix.length):""}function f(d){return p.get(String(d||""))||null}function h(d){return f(b(d))}function m(d){return c.get(String(d||"").trim())||null}function w(){return n.map(m).filter(Boolean)}function S(d){return Object.keys(d?.values||{}).map(m).filter(Boolean).sort((x,_)=>{let N=l.get(x.group)?.index??9999,G=l.get(_.group)?.index??9999;if(N!==G)return N-G;let Y=u.get(x.group)?.get(x.item.name)??9999,J=u.get(_.group)?.get(_.item.name)??9999;return Y!==J?Y-J:String(x.item.name).localeCompare(String(_.item.name))})}function T(){return w().map(d=>d.item.name).filter(Boolean)}function P(){let d=[{group:V.favoritesGroup,count:w().length,virtual:!0}],x=e?.categories;return Array.isArray(x)&&x.length?x.forEach(_=>{d.push({group:V.categoryDividerPrefix+(_.id||""),label:fe(_,s),divider:!0,virtual:!0}),(_.groups||[]).forEach(N=>{d.push({group:N.id,ko:N.ko,en:N.en,zh:N.zh,count:N.count,category:_.id})})}):d.push(...a),r.length&&(d.push({group:V.profilesDivider,label:i.profiles,divider:!0,virtual:!0}),r.forEach(_=>{d.push({group:g(_.id),count:S(_).length,label:_.name,profile:_,virtual:!0})})),d}function C(d){if(d===V.favoritesGroup)return w();let x=h(d);return x?S(x):(o[d]||[]).map(_=>({group:d,item:_}))}function D(d){if(d===V.favoritesGroup)return{group:d,egroup:"Favorites",count:w().length,virtual:!0};let x=h(d);return x?{group:d,egroup:x.name,count:S(x).length,profile:x,virtual:!0}:l.get(d)?.entry||null}function H(d){if(d===V.favoritesGroup)return i.favorites;let x=h(d);if(x)return x.name;let _=D(d);return _?_.ko||_.en||_.zh?fe(_,s):s==="zh"?_.cgroup||_.egroup||_.group:s==="ko"?_.group||_.egroup||d:_.egroup||_.group||d:d}function y(d,x){let _=H(d),N=x?.__section?fe(x.__section,s):"";return!N||N===_?_:`${_} > ${N}`}function L({source:d,profile:x=null,group:_,item:N,sourceLabels:G}){let Y=H(_),J=y(_,N),_e=Se(N,"title","etitle","",s),E=Se(N,"descr","edescr","",s),A=d==="profile"&&x?.id,I=A?String(x.name||""):"",j=A?G.profile:G.carrot,R=A?`${I} / ${J}`:J;return{source:A?"profile":"carrot",sourceLabel:j,profileId:A?x.id:"",profileName:I,group:A?g(x.id):_,originalGroup:_,groupLabel:Y,contextGroupLabel:J,contextLabel:R,name:N.name,title:_e,descr:E,haystack:[j,I,Y,J,N.name,_e,E].join(` +`).toLowerCase()}}function $(d={}){let x={carrot:d.carrot||"CarrotPilot",profile:d.profile||"Profile"},_=[];return a.forEach(N=>{let G=N.group;(o[G]||[]).forEach(Y=>{_.push(L({source:"carrot",group:G,item:Y,sourceLabels:x}))})}),r.forEach(N=>{S(N).forEach(G=>{_.push(L({source:"profile",profile:N,group:G.group,item:G.item,sourceLabels:x}))})}),_}return Object.freeze({profileGroup:g,isProfileGroup:k,profileIdFromGroup:b,getProfileById:f,getProfileByGroup:h,findItemByName:m,getFavoriteEntries:w,getProfileEntries:S,getValidFavoriteNames:T,getGroupsForDisplay:P,getItemEntriesForGroup:C,getGroupMeta:D,getGroupLabel:H,getItemContextLabel:y,buildSearchEntries:$})}function Et(){let t=null;function e(r={}){let s=r.labels?.favorites||"Favorites",i=r.labels?.profiles||"Profiles";if(t?.catalog===r.catalog&&t.favorites===r.favorites&&t.profiles===r.profiles&&t.language===r.language&&t.favoritesLabel===s&&t.profilesLabel===i)return t.model;let a=He(r);return t={catalog:r.catalog,favorites:r.favorites,profiles:r.profiles,language:r.language,favoritesLabel:s,profilesLabel:i,model:a},a}function n(){t=null}return Object.freeze({get:e,clear:n})}function Tt(t={}){let e=t.snapshotStore||null,n=t.getPreparedCatalog,r=t.loadLegacyCatalog,s=t.loadLegacyAuxiliary,i=t.commitCatalog,a=null;function o(u){if(!u||typeof u!="object")throw new Error("Settings catalog preparation failed");return u}function l(u){return!u?.settings||typeof i!="function"?null:o(i(u.settings,u))}function c(u={}){let p=u.force===!0;if(a)return a;let g=typeof n=="function"?n():null;if(!p&&g)return Promise.resolve({catalog:g,source:"memory"});let b=(async()=>{let f=null;if(typeof e?.load=="function")try{f=await e.load({force:p})}catch{}if(f?.settings)return{catalog:l(f),source:"snapshot"};if(typeof r!="function")throw new Error("Legacy settings catalog loader is unavailable");let h=Promise.resolve();if(typeof s=="function")try{h=Promise.resolve(s(p)).catch(()=>null)}catch{h=Promise.resolve()}let m=await r(),w=o(i(m,null));return await h,{catalog:w,source:"legacy"}})().finally(()=>{a===b&&(a=null)});return a=b,b}return Object.freeze({prepare:c,primeSnapshot:l,get pending(){return!!a}})}function qe(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var oe=qe();function Pt(t){oe=t}var ie={exec:()=>null};function pe(t){let e=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),s=e[r];return s||(s=t(r),e[r]=s),s}}function z(t,e=""){let n=typeof t=="string"?t:t.source,r={replace:(s,i)=>{let a=typeof i=="string"?i:i.source;return a=a.replace(F.caret,"$1"),n=n.replace(s,a),r},getRegex:()=>new RegExp(n,e)};return r}var Kn=((t="")=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:pe(t=>new RegExp(`^ {0,${t}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:pe(t=>new RegExp(`^ {0,${t}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:pe(t=>new RegExp(`^ {0,${t}}(?:\`\`\`|~~~)`)),headingBeginRegex:pe(t=>new RegExp(`^ {0,${t}}#`)),htmlBeginRegex:pe(t=>new RegExp(`^ {0,${t}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:pe(t=>new RegExp(`^ {0,${t}}>`))},Xn=/^(?:[ \t]*(?:\n|$))+/,Wn=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Qn=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,be=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Yn=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Ze=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Lt=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,jt=z(Lt).replace(/bull/g,Ze).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Jn=z(Lt).replace(/bull/g,Ze).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Ke=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,er=/^[^\n]+/,Xe=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,tr=z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",Xe).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),nr=z(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,Ze).getRegex(),$e="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",We=/|$))/,rr=z("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",We).replace("tag",$e).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Mt=t=>z(Ke).replace("hr",be).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~~~)[^\\n]*\\n").replace("list",t).replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",$e).getRegex(),sr=Mt(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),ir=Mt(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),ar=z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",ir).getRegex(),Qe={blockquote:ar,code:Wn,def:tr,fences:Qn,heading:Yn,hr:be,html:rr,lheading:jt,list:nr,newline:Xn,paragraph:sr,table:ie,text:er},$t=z("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",be).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~~~)[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",$e).getRegex(),or={...Qe,lheading:Jn,table:$t,paragraph:z(Ke).replace("hr",be).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",$t).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~~~)[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",$e).getRegex()},lr={...Qe,html:z(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",We).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:ie,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:z(Ke).replace("hr",be).replace("heading",` *#{1,6} *[^ ]`).replace("lheading",jt).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},cr=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ur=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Dt=/^( {2,}|\\)\n(?!\s*$)/,pr=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Kn?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Gt=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,mr=z(Gt,"u").replace(/punct/g,he).getRegex(),br=z(Gt,"u").replace(/punct/g,Bt).getRegex(),Ht="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",xr=z(Ht,"gu").replace(/notPunctSpace/g,Ye).replace(/punctSpace/g,Ne).replace(/punct/g,he).getRegex(),kr=z(Ht,"gu").replace(/notPunctSpace/g,fr).replace(/punctSpace/g,gr).replace(/punct/g,Bt).getRegex(),yr=z("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Ye).replace(/punctSpace/g,Ne).replace(/punct/g,he).getRegex(),_r=z(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,he).getRegex(),wr="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Sr=z(wr,"gu").replace(/notPunctSpace/g,Ye).replace(/punctSpace/g,Ne).replace(/punct/g,he).getRegex(),vr=z(/\\(punct)/,"gu").replace(/punct/g,he).getRegex(),Ar=z(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Er=z(We).replace("(?:-->|$)","-->").getRegex(),Tr=z("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Er).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Ae=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,$r=z(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",Ae).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Ft=z(/^!?\[(label)\]\[(ref)\]/).replace("label",Ae).replace("ref",Xe).getRegex(),Ut=z(/^!?\[(ref)\](?:\[\])?/).replace("ref",Xe).getRegex(),Nr=z("reflink|nolink(?!\\()","g").replace("reflink",Ft).replace("nolink",Ut).getRegex(),Nt=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Je={_backpedal:ie,anyPunctuation:vr,autolink:Ar,blockSkip:dr,br:Dt,code:ur,del:ie,delLDelim:ie,delRDelim:ie,emStrongLDelim:mr,emStrongRDelimAst:xr,emStrongRDelimUnd:yr,escape:cr,link:$r,nolink:Ut,punctuation:hr,reflink:Ft,reflinkSearch:Nr,tag:Tr,text:pr,url:ie},Cr={...Je,link:z(/^!?\[(label)\]\((.*?)\)/).replace("label",Ae).getRegex(),reflink:z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Ae).getRegex()},Fe={...Je,emStrongRDelimAst:kr,emStrongLDelim:br,delLDelim:_r,delRDelim:Sr,url:z(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Nt).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:z(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},Ct=t=>zr[t];function X(t,e){if(e){if(F.escapeTest.test(t))return t.replace(F.escapeReplace,Ct)}else if(F.escapeTestNoEncode.test(t))return t.replace(F.escapeReplaceNoEncode,Ct);return t}function Rt(t){try{t=encodeURI(t).replace(F.percentDecode,"%")}catch{return null}return t}function zt(t,e){let n=t.replace(F.findPipe,(i,a,o)=>{let l=!1,c=a;for(;--c>=0&&o[c]==="\\";)l=!l;return l?"|":" |"}),r=n.split(F.splitPipe),s=0;if(r[0].trim()||r.shift(),r.length>0&&!r.at(-1)?.trim()&&r.pop(),e)if(r.length>e)r.splice(e);else for(;r.length=0&&F.blankLine.test(e[n]);)n--;return e.length-n<=2?t:e.slice(0,n+1).join(` `)}function Ir(t,e){if(t.indexOf(e[1])===-1)return-1;let n=0;for(let r=0;r0?-2:-1}function Or(t,e=0){let n=e,r="";for(let s of t)if(s===" "){let i=4-n%4;r+=" ".repeat(i),n+=i}else r+=s,n++;return r}function Ot(t,e,n,r,s){let i=e.href,a=e.title||null,o=t[1].replace(s.other.outputLinkReplace,"$1");r.state.inLink=!0;let l={type:t[0].charAt(0)==="!"?"image":"link",raw:n,href:i,title:a,text:o,tokens:r.inlineTokens(o)};return r.state.inLink=!1,l}function Pr(t,e,n){let r=t.match(n.other.indentCodeCompensation);if(r===null)return e;let s=r[1];return e.split(` @@ -13,19 +13,19 @@ `),u=c.replace(this.rules.other.blockquoteSetextReplace,` $1`).replace(this.rules.other.blockquoteSetextReplace2,"");r=r?`${r} ${c}`:c,s=s?`${s} -${u}`:u;let p=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(u,i,!0),this.lexer.state.top=p,n.length===0)break;let g=i.at(-1);if(g?.type==="code")break;if(g?.type==="blockquote"){let k=g,m=k.raw+` +${u}`:u;let p=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(u,i,!0),this.lexer.state.top=p,n.length===0)break;let g=i.at(-1);if(g?.type==="code")break;if(g?.type==="blockquote"){let k=g,b=k.raw+` `+n.join(` -`),f=this.blockquote(m);i[i.length-1]=f,r=r.substring(0,r.length-k.raw.length)+f.raw,s=s.substring(0,s.length-k.text.length)+f.text;break}else if(g?.type==="list"){let k=g,m=k.raw+` +`),f=this.blockquote(b);i[i.length-1]=f,r=r.substring(0,r.length-k.raw.length)+f.raw,s=s.substring(0,s.length-k.text.length)+f.text;break}else if(g?.type==="list"){let k=g,b=k.raw+` `+n.join(` -`),f=this.list(m);i[i.length-1]=f,r=r.substring(0,r.length-g.raw.length)+f.raw,s=s.substring(0,s.length-k.raw.length)+f.raw,n=m.substring(i.at(-1).raw.length).split(` +`),f=this.list(b);i[i.length-1]=f,r=r.substring(0,r.length-g.raw.length)+f.raw,s=s.substring(0,s.length-k.raw.length)+f.raw,n=b.substring(i.at(-1).raw.length).split(` `);continue}}return{type:"blockquote",raw:r,tokens:i,text:s}}}list(t){let e=this.rules.block.list.exec(t);if(e){let n=e[1].trim(),r=n.length>1,s={type:"list",raw:"",ordered:r,start:r?+n.slice(0,-1):"",loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:"[*+-]");let i=this.rules.other.listItemRegex(n),a=!1;for(;t;){let l=!1,c="",u="";if(!(e=i.exec(t))||this.rules.block.hr.test(t))break;c=e[0],t=t.substring(c.length);let p=Or(e[2].split(` `,1)[0],e[1].length),g=t.split(` -`,1)[0],k=!p.trim(),m=0;if(this.options.pedantic?(m=2,u=p.trimStart()):k?m=e[1].length+1:(m=p.search(this.rules.other.nonSpaceChar),m=m>4?1:m,u=p.slice(m),m+=e[1].length),k&&this.rules.other.blankLine.test(g)&&(c+=g+` -`,t=t.substring(g.length+1),l=!0),!l){let f=this.rules.other.nextBulletRegex(m),h=this.rules.other.hrRegex(m),b=this.rules.other.fencesBeginRegex(m),w=this.rules.other.headingBeginRegex(m),S=this.rules.other.htmlBeginRegex(m),T=this.rules.other.blockquoteBeginRegex(m);for(;t;){let P=t.split(` -`,1)[0],C;if(g=P,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting," "),C=g):C=g.replace(this.rules.other.tabCharGlobal," "),b.test(g)||w.test(g)||S.test(g)||T.test(g)||f.test(g)||h.test(g))break;if(C.search(this.rules.other.nonSpaceChar)>=m||!g.trim())u+=` -`+C.slice(m);else{if(k||p.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||b.test(p)||w.test(p)||h.test(p))break;u+=` +`,1)[0],k=!p.trim(),b=0;if(this.options.pedantic?(b=2,u=p.trimStart()):k?b=e[1].length+1:(b=p.search(this.rules.other.nonSpaceChar),b=b>4?1:b,u=p.slice(b),b+=e[1].length),k&&this.rules.other.blankLine.test(g)&&(c+=g+` +`,t=t.substring(g.length+1),l=!0),!l){let f=this.rules.other.nextBulletRegex(b),h=this.rules.other.hrRegex(b),m=this.rules.other.fencesBeginRegex(b),w=this.rules.other.headingBeginRegex(b),S=this.rules.other.htmlBeginRegex(b),T=this.rules.other.blockquoteBeginRegex(b);for(;t;){let P=t.split(` +`,1)[0],C;if(g=P,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting," "),C=g):C=g.replace(this.rules.other.tabCharGlobal," "),m.test(g)||w.test(g)||S.test(g)||T.test(g)||f.test(g)||h.test(g))break;if(C.search(this.rules.other.nonSpaceChar)>=b||!g.trim())u+=` +`+C.slice(b);else{if(k||p.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||m.test(p)||w.test(p)||h.test(p))break;u+=` `+g}k=!g.trim(),c+=P+` -`,t=t.substring(P.length+1),p=C.slice(m)}}s.loose||(a?s.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(a=!0)),s.items.push({type:"list_item",raw:c,task:!!this.options.gfm&&this.rules.other.listIsTask.test(u),loose:!1,text:u,tokens:[]}),s.raw+=c}let o=s.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;s.raw=s.raw.trimEnd();for(let l of s.items){this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]);let c=l.tokens[0];if(l.task&&(c?.type==="text"||c?.type==="paragraph")){l.text=l.text.replace(this.rules.other.listReplaceTask,""),c.raw=c.raw.replace(this.rules.other.listReplaceTask,""),c.text=c.text.replace(this.rules.other.listReplaceTask,"");for(let p=this.lexer.inlineQueue.length-1;p>=0;p--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[p].src)){this.lexer.inlineQueue[p].src=this.lexer.inlineQueue[p].src.replace(this.rules.other.listReplaceTask,"");break}let u=this.rules.other.listTaskCheckbox.exec(l.raw);if(u){let p={type:"checkbox",raw:u[0]+" ",checked:u[0]!=="[ ]"};l.checked=p.checked,s.loose?l.tokens[0]&&["paragraph","text"].includes(l.tokens[0].type)&&"tokens"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=p.raw+l.tokens[0].raw,l.tokens[0].text=p.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(p)):l.tokens.unshift({type:"paragraph",raw:p.raw,text:p.raw,tokens:[p]}):l.tokens.unshift(p)}}else l.task&&(l.task=!1);if(!s.loose){let u=l.tokens.filter(g=>g.type==="space"),p=u.length>0&&u.some(g=>this.rules.other.anyLine.test(g.raw));s.loose=p}}if(s.loose)for(let l of s.items){l.loose=!0;for(let c of l.tokens)c.type==="text"&&(c.type="paragraph")}return s}}html(t){let e=this.rules.block.html.exec(t);if(e){let n=It(e[0]);return{type:"html",block:!0,raw:n,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:n}}}def(t){let e=this.rules.block.def.exec(t);if(e){let n=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",s=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:ne(e[0],` +`,t=t.substring(P.length+1),p=C.slice(b)}}s.loose||(a?s.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(a=!0)),s.items.push({type:"list_item",raw:c,task:!!this.options.gfm&&this.rules.other.listIsTask.test(u),loose:!1,text:u,tokens:[]}),s.raw+=c}let o=s.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;s.raw=s.raw.trimEnd();for(let l of s.items){this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]);let c=l.tokens[0];if(l.task&&(c?.type==="text"||c?.type==="paragraph")){l.text=l.text.replace(this.rules.other.listReplaceTask,""),c.raw=c.raw.replace(this.rules.other.listReplaceTask,""),c.text=c.text.replace(this.rules.other.listReplaceTask,"");for(let p=this.lexer.inlineQueue.length-1;p>=0;p--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[p].src)){this.lexer.inlineQueue[p].src=this.lexer.inlineQueue[p].src.replace(this.rules.other.listReplaceTask,"");break}let u=this.rules.other.listTaskCheckbox.exec(l.raw);if(u){let p={type:"checkbox",raw:u[0]+" ",checked:u[0]!=="[ ]"};l.checked=p.checked,s.loose?l.tokens[0]&&["paragraph","text"].includes(l.tokens[0].type)&&"tokens"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=p.raw+l.tokens[0].raw,l.tokens[0].text=p.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(p)):l.tokens.unshift({type:"paragraph",raw:p.raw,text:p.raw,tokens:[p]}):l.tokens.unshift(p)}}else l.task&&(l.task=!1);if(!s.loose){let u=l.tokens.filter(g=>g.type==="space"),p=u.length>0&&u.some(g=>this.rules.other.anyLine.test(g.raw));s.loose=p}}if(s.loose)for(let l of s.items){l.loose=!0;for(let c of l.tokens)c.type==="text"&&(c.type="paragraph")}return s}}html(t){let e=this.rules.block.html.exec(t);if(e){let n=It(e[0]);return{type:"html",block:!0,raw:n,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:n}}}def(t){let e=this.rules.block.def.exec(t);if(e){let n=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",s=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:ne(e[0],` `),href:r,title:s}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let n=zt(e[1]),r=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),s=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` `):[],i={type:"table",raw:ne(e[0],` `),header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?i.align.push("right"):this.rules.other.tableAlignCenter.test(a)?i.align.push("center"):this.rules.other.tableAlignLeft.test(a)?i.align.push("left"):i.align.push(null);for(let a=0;a({text:o,tokens:this.lexer.inline(o),header:!1,align:i.align[l]})));return i}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e){let n=e[1].trim();return{type:"heading",raw:ne(e[0],` @@ -65,18 +65,18 @@ ${t} `}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${X(t,!0)}`}br(t){return"
"}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:n}){let r=this.parser.parseInline(n),s=Rt(t);if(s===null)return r;t=s;let i='
",i}image({href:t,title:e,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let s=Rt(t);if(s===null)return X(n);t=s;let i=`${X(n)}{let a=s[i].flat(1/0);n=n.concat(this.walkTokens(a,e))}):s.tokens&&(n=n.concat(this.walkTokens(s.tokens,e)))}}return n}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(s=>{if(!s.name)throw new Error("extension name required");if("renderer"in s){let i=e.renderers[s.name];i?e.renderers[s.name]=function(...a){let o=s.renderer.apply(this,a);return o===!1&&(o=i.apply(this,a)),o}:e.renderers[s.name]=s.renderer}if("tokenizer"in s){if(!s.level||s.level!=="block"&&s.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let i=e[s.level];i?i.unshift(s.tokenizer):e[s.level]=[s.tokenizer],s.start&&(s.level==="block"?e.startBlock?e.startBlock.push(s.start):e.startBlock=[s.start]:s.level==="inline"&&(e.startInline?e.startInline.push(s.start):e.startInline=[s.start]))}"childTokens"in s&&s.childTokens&&(e.childTokens[s.name]=s.childTokens)}),r.extensions=e),n.renderer){let s=this.defaults.renderer||new Te(this.defaults);for(let i in n.renderer){if(!(i in s))throw new Error(`renderer '${i}' does not exist`);if(["options","parser"].includes(i))continue;let a=i,o=n.renderer[a],l=s[a];s[a]=(...c)=>{let u=o.apply(s,c);return u===!1&&(u=l.apply(s,c)),u||""}}r.renderer=s}if(n.tokenizer){let s=this.defaults.tokenizer||new Ee(this.defaults);for(let i in n.tokenizer){if(!(i in s))throw new Error(`tokenizer '${i}' does not exist`);if(["options","rules","lexer"].includes(i))continue;let a=i,o=n.tokenizer[a],l=s[a];s[a]=(...c)=>{let u=o.apply(s,c);return u===!1&&(u=l.apply(s,c)),u}}r.tokenizer=s}if(n.hooks){let s=this.defaults.hooks||new me;for(let i in n.hooks){if(!(i in s))throw new Error(`hook '${i}' does not exist`);if(["options","block"].includes(i))continue;let a=i,o=n.hooks[a],l=s[a];me.passThroughHooks.has(i)?s[a]=c=>{if(this.defaults.async&&me.passThroughHooksRespectAsync.has(i))return(async()=>{let p=await o.call(s,c);return l.call(s,p)})();let u=o.call(s,c);return l.call(s,u)}:s[a]=(...c)=>{if(this.defaults.async)return(async()=>{let p=await o.apply(s,c);return p===!1&&(p=await l.apply(s,c)),p})();let u=o.apply(s,c);return u===!1&&(u=l.apply(s,c)),u}}r.hooks=s}if(n.walkTokens){let s=this.defaults.walkTokens,i=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(i.call(this,a)),s&&(o=o.concat(s.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return q.lex(t,e??this.defaults)}parser(t,e){return Z.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let r={...n},s={...this.defaults,...r},i=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&r.async===!1)return i(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return i(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return i(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=t),s.async)return(async()=>{let a=s.hooks?await s.hooks.preprocess(e):e,o=await(s.hooks?await s.hooks.provideLexer(t):t?q.lex:q.lexInline)(a,s),l=s.hooks?await s.hooks.processAllTokens(o):o;s.walkTokens&&await Promise.all(this.walkTokens(l,s.walkTokens));let c=await(s.hooks?await s.hooks.provideParser(t):t?Z.parse:Z.parseInline)(l,s);return s.hooks?await s.hooks.postprocess(c):c})().catch(i);try{s.hooks&&(e=s.hooks.preprocess(e));let a=(s.hooks?s.hooks.provideLexer(t):t?q.lex:q.lexInline)(e,s);s.hooks&&(a=s.hooks.processAllTokens(a)),s.walkTokens&&this.walkTokens(a,s.walkTokens);let o=(s.hooks?s.hooks.provideParser(t):t?Z.parse:Z.parseInline)(a,s);return s.hooks&&(o=s.hooks.postprocess(o)),o}catch(a){return i(a)}}}onError(t,e){return n=>{if(n.message+=` Please report this to https://github.com/markedjs/marked.`,t){let r="

An error occurred:

"+X(n.message+"",!0)+"
";return e?Promise.resolve(r):r}if(e)return Promise.reject(n);throw n}}},ae=new Lr;function O(t,e){return ae.parse(t,e)}O.options=O.setOptions=function(t){return ae.setOptions(t),O.defaults=ae.defaults,Pt(O.defaults),O};O.getDefaults=qe;O.defaults=oe;O.use=function(...t){return ae.use(...t),O.defaults=ae.defaults,Pt(O.defaults),O};O.walkTokens=function(t,e){return ae.walkTokens(t,e)};O.parseInline=ae.parseInline;O.Parser=Z;O.parser=Z.parse;O.Renderer=Te;O.TextRenderer=et;O.Lexer=q;O.lexer=q.lex;O.Tokenizer=Ee;O.Hooks=me;O.parse=O;var Ps=O.options,Ls=O.setOptions,js=O.use,Ms=O.walkTokens,Ds=O.parseInline;var Bs=Z.parse,Gs=q.lex;var jr=new Set(["http:","https:"]),Mr=new Set(["NOTE","TIP","IMPORTANT","WARNING","CAUTION"]),Dr=6e4,Br=2e3,Gr=12,U=class extends Error{constructor(e){super(e),this.name="SettingDocumentationParseError"}};function tt(t){let e=String(t||"").trim();if(e.startsWith("#")&&/^#[A-Za-z][A-Za-z0-9_.:-]*$/.test(e))return e;try{let n=new URL(e);return jr.has(n.protocol)?n.href:""}catch{return""}}function nt(t){return Array.isArray(t)?(t.forEach(nt),Object.freeze(t)):t&&typeof t=="object"?(Object.values(t).forEach(nt),Object.freeze(t)):t}function Hr(){return{nodes:0}}function rt(t,e){if(t.nodes+=1,t.nodes>Br)throw new U("Markdown contains too many nodes");if(e>Gr)throw new U("Markdown nesting is too deep")}function te(t,e,n){return Array.isArray(t)?t.map(r=>{switch(rt(e,n),r.type){case"text":case"escape":{let s=te(r.tokens,e,n+1);return{type:"text",text:s.length?"":String(r.text||""),children:s}}case"strong":case"em":case"del":return{type:r.type,children:te(r.tokens,e,n+1)};case"codespan":return{type:"code",text:String(r.text||"")};case"br":return{type:"break"};case"link":{let s=tt(r.href);if(!s)throw new U("Markdown contains an unsafe link");return{type:"link",href:s,title:r.title==null?"":String(r.title),children:te(r.tokens,e,n+1)}}case"image":{let s=tt(r.href),i=String(r.text||"").trim();if(!s)throw new U("Markdown contains an unsafe image URL");if(!i)throw new U("Markdown image alt text is required");return{type:"image",href:s,alt:i,title:r.title==null?"":String(r.title)}}default:throw new U(`Unsupported inline Markdown node: ${r.type}`)}}):[]}function Fr(t,e,n){let r=String(t.raw||t.text||"").trim(),s=/^\s*
([^<]*)<\/summary>\s*([\s\S]*?)\s*<\/details>$/i.exec(r);if(!s)throw new U("Only simple details/summary HTML is supported");let i=O.Lexer.lexInline(s[2],{gfm:!0}),a=O.lexer(s[3],{gfm:!0});return{type:"details",open:!!s[1],summary:te(i,e,n+1),children:Ce(a,e,n+1)}}function Ce(t,e,n){if(!Array.isArray(t))return[];let r=[];return t.forEach(s=>{if(s.type!=="space")switch(rt(e,n),s.type){case"heading":if(!Number.isInteger(s.depth)||s.depth<1||s.depth>6)throw new U("Markdown heading depth is invalid");r.push({type:"heading",depth:s.depth,children:te(s.tokens,e,n+1)});break;case"paragraph":r.push({type:"paragraph",children:te(s.tokens,e,n+1)});break;case"text":r.push({type:"paragraph",children:te(s.tokens,e,n+1)});break;case"list":r.push({type:"list",ordered:!!s.ordered,start:s.ordered&&Number.isFinite(Number(s.start))?Number(s.start):1,items:(s.items||[]).map(i=>(rt(e,n+1),{type:"list_item",task:!!i.task,checked:i.checked===!0,children:Ce(i.tokens,e,n+2)}))});break;case"table":{let i=Array.isArray(s.header)?s.header.length:0;if(i<1||i>3)throw new U("Markdown tables must contain one to three columns");if(!Array.isArray(s.rows)||s.rows.length>100)throw new U("Markdown table contains too many rows");r.push({type:"table",align:(s.align||[]).map(a=>a||""),header:s.header.map(a=>te(a.tokens,e,n+1)),rows:s.rows.map(a=>{if(!Array.isArray(a)||a.length!==i)throw new U("Markdown table rows must have a consistent width");return a.map(o=>te(o.tokens,e,n+1))})});break}case"blockquote":{let i=/^\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\](?:\n|$)/.exec(String(s.text||"")),a=i&&Mr.has(i[1])?i[1].toLowerCase():"",o=Ce(s.tokens,e,n+1);if(a&&o[0]?.type==="paragraph"){let l=o[0],c=l.children?.[0];c?.type==="text"&&(c.text=c.text.replace(/^\[![A-Z]+\]\s*/,""),!c.text&&!c.children?.length&&l.children.shift()),l.children.length||(o=o.slice(1))}r.push({type:"callout",tone:a||"note",children:o});break}case"code":r.push({type:"code_block",language:String(s.lang||"").slice(0,32),text:String(s.text||"")});break;case"hr":r.push({type:"separator"});break;case"html":r.push(Fr(s,e,n));break;default:throw new U(`Unsupported block Markdown node: ${s.type}`)}}),r}function st(t){let e=String(t||"").replaceAll(`\r `,` -`);if(e.length>Dr)throw new U("Markdown is too large");let n=Hr(),r=O.lexer(e,{gfm:!0,breaks:!1});return nt(Ce(r,n,0))}function it(t){return tt(t)}var Ur=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Vr=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);function re(t){return new TextEncoder().encode(String(t??""))}function W(t,e){return t>>>e|t<<32-e}function at(t){let e=t instanceof Uint8Array?t:re(t),n=e.length*8,r=Math.ceil((e.length+9)/64)*64,s=new Uint8Array(r);s.set(e),s[e.length]=128;let i=new DataView(s.buffer);i.setUint32(r-8,Math.floor(n/4294967296),!1),i.setUint32(r-4,n>>>0,!1);let a=new Uint32Array(Vr),o=new Uint32Array(64);for(let l=0;l>>3,P=W(S,17)^W(S,19)^S>>>10;o[b]=o[b-16]+T+o[b-7]+P>>>0}let[c,u,p,g,k,m,f,h]=a;for(let b=0;b<64;b+=1){let w=W(k,6)^W(k,11)^W(k,25),S=k&m^~k&f,T=h+w+S+Ur[b]+o[b]>>>0,P=W(c,2)^W(c,13)^W(c,22),C=c&u^c&p^u&p,D=P+C>>>0;h=f,f=m,m=k,k=g+T>>>0,g=p,p=u,u=c,c=T+D>>>0}a[0]=a[0]+c>>>0,a[1]=a[1]+u>>>0,a[2]=a[2]+p>>>0,a[3]=a[3]+g>>>0,a[4]=a[4]+k>>>0,a[5]=a[5]+m>>>0,a[6]=a[6]+f>>>0,a[7]=a[7]+h>>>0}return Array.from(a,l=>l.toString(16).padStart(8,"0")).join("")}function Re(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(Re).join(",")}]`:`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Re(t[n])}`).join(",")}}`}var Ie="https://raw.githubusercontent.com/wiki/ajouatom/openpilot/Settings-Catalog.json",qr=new Set(["ko","en","zh"]),lt=/^[A-Za-z][A-Za-z0-9_]*$/,ze=/^[a-f0-9]{64}$/,Vt=/^[a-f0-9]{7,40}$/,qt=/^(?:KO|EN|ZH)-[^\u0000-\u001f<>:"/\\|?*#%]+\.md$/u,Zt=new Set(["current","needs_review"]),Zr=new Set(["schemaVersion","catalogCommit","wikiCommit","generatedAt","locales","pages","settings","review","contentHash"]),Kr=3e4,Xr=8e3,Jt=1e6,en=512e3,tn=12,Wr=125e4,nn=1,Qr="carrot.settings.wiki-docs.v1",ct=class extends Error{constructor(e,n="invalid"){super(e),this.name="PublishedSettingDocumentationError",this.code=n}};function v(t,e){throw new ct(t,e)}function rn(t){let e=String(t||"").trim().toLowerCase();return qr.has(e)?e:"en"}function se(t,e,n){(!t||typeof t!="object"||Array.isArray(t))&&v(`${n} must be an object`);let r=Object.keys(t).filter(s=>!e.has(s));r.length&&v(`${n} contains unknown properties: ${r.join(", ")}`)}function Yr(t,e){se(t,new Set(["hash","bytes"]),`page ${e}`),ze.test(t.hash)||v(`page ${e} has an invalid hash`),(!Number.isInteger(t.bytes)||t.bytes<1||t.bytes>en)&&v(`page ${e} has an invalid byte size`)}function Jr(t){se(t,Zr,"settings index"),t.schemaVersion!==1&&v("unsupported settings index schema"),Vt.test(t.catalogCommit||"")||v("settings index catalogCommit is invalid"),t.wikiCommit!=null&&!Vt.test(t.wikiCommit)&&v("settings index wikiCommit is invalid"),Number.isFinite(Date.parse(t.generatedAt||""))||v("settings index generatedAt is invalid"),ze.test(t.contentHash||"")||v("settings index contentHash is invalid"),(!Array.isArray(t.locales)||t.locales.length<2||t.locales.length>3)&&v("settings index locales are invalid");let e=t.locales.map(rn);(new Set(e).size!==e.length||!e.includes("ko")||!e.includes("en"))&&v("settings index must contain unique ko and en locales"),t.locales.some((l,c)=>l!==e[c])&&v("settings index locale is unsupported"),se(t.pages,new Set(Object.keys(t.pages||{})),"settings index pages");let n=Object.keys(t.pages);(!n.length||n.length>2e3)&&v("settings index page count is invalid"),n.forEach(l=>{l!=="Settings-Catalog.md"&&!qt.test(l)&&v(`unsafe published page name: ${l}`),Yr(t.pages[l],l)}),se(t.settings,new Set(Object.keys(t.settings||{})),"settings index settings");let r=Object.keys(t.settings);(!r.length||r.length>5e3)&&v("settings index setting count is invalid"),r.forEach(l=>{lt.test(l)||v(`invalid setting parameter: ${l}`);let c=t.settings[l];se(c,new Set(["group","semanticHash","reviewStatus","locales"]),`setting ${l}`),lt.test(c.group||"")||v(`setting ${l} has an invalid group`),ze.test(c.semanticHash||"")||v(`setting ${l} has an invalid semantic hash`),Zt.has(c.reviewStatus)||v(`setting ${l} has an invalid review status`),se(c.locales,new Set(e),`setting ${l} locales`),(Object.keys(c.locales).length!==e.length||e.some(u=>!c.locales[u]))&&v(`setting ${l} must provide every index locale`),Object.entries(c.locales).forEach(([u,p])=>{e.includes(u)||v(`setting ${l} has an unsupported locale`),se(p,new Set(["page","anchor","factsHash","reviewStatus"]),`setting ${l}/${u}`),(!qt.test(p.page||"")||!t.pages[p.page])&&v(`setting ${l}/${u} references an unknown page`),p.anchor!==l&&v(`setting ${l}/${u} has a mismatched anchor`),ze.test(p.factsHash||"")||v(`setting ${l}/${u} has an invalid facts hash`),Zt.has(p.reviewStatus)||v(`setting ${l}/${u} has an invalid review status`)})}),se(t.review,new Set(["current","needs_review"]),"settings index review");let s=Number(t.review.current),i=Number(t.review.needs_review);(!Number.isInteger(s)||!Number.isInteger(i)||s<0||i<0||s+i!==r.length)&&v("settings index review totals are invalid");let a={...t};return delete a.contentHash,at(Re(a))!==t.contentHash&&v("settings index content hash does not match","hash"),Object.freeze(t)}function Kt(t,e=Jt){let n=String(t||"");re(n).byteLength>e&&v("settings index is too large","capacity");let r;try{r=JSON.parse(n)}catch{v("settings index is not valid JSON")}return Jr(r)}function ge(t,e,n){let r=[];return t.forEach((s,i)=>{s===e&&r.push(i)}),r.length!==1&&v(`${n} marker must appear exactly once`),r[0]}function es(t,e){let r=String(t||"").replaceAll(`\r +`);if(e.length>Dr)throw new U("Markdown is too large");let n=Hr(),r=O.lexer(e,{gfm:!0,breaks:!1});return nt(Ce(r,n,0))}function it(t){return tt(t)}var Ur=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),Vr=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]);function re(t){return new TextEncoder().encode(String(t??""))}function W(t,e){return t>>>e|t<<32-e}function at(t){let e=t instanceof Uint8Array?t:re(t),n=e.length*8,r=Math.ceil((e.length+9)/64)*64,s=new Uint8Array(r);s.set(e),s[e.length]=128;let i=new DataView(s.buffer);i.setUint32(r-8,Math.floor(n/4294967296),!1),i.setUint32(r-4,n>>>0,!1);let a=new Uint32Array(Vr),o=new Uint32Array(64);for(let l=0;l>>3,P=W(S,17)^W(S,19)^S>>>10;o[m]=o[m-16]+T+o[m-7]+P>>>0}let[c,u,p,g,k,b,f,h]=a;for(let m=0;m<64;m+=1){let w=W(k,6)^W(k,11)^W(k,25),S=k&b^~k&f,T=h+w+S+Ur[m]+o[m]>>>0,P=W(c,2)^W(c,13)^W(c,22),C=c&u^c&p^u&p,D=P+C>>>0;h=f,f=b,b=k,k=g+T>>>0,g=p,p=u,u=c,c=T+D>>>0}a[0]=a[0]+c>>>0,a[1]=a[1]+u>>>0,a[2]=a[2]+p>>>0,a[3]=a[3]+g>>>0,a[4]=a[4]+k>>>0,a[5]=a[5]+b>>>0,a[6]=a[6]+f>>>0,a[7]=a[7]+h>>>0}return Array.from(a,l=>l.toString(16).padStart(8,"0")).join("")}function Re(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(Re).join(",")}]`:`{${Object.keys(t).sort().map(n=>`${JSON.stringify(n)}:${Re(t[n])}`).join(",")}}`}var Ie="https://raw.githubusercontent.com/wiki/ajouatom/openpilot/Settings-Catalog.json",qr=new Set(["ko","en","zh"]),lt=/^[A-Za-z][A-Za-z0-9_]*$/,ze=/^[a-f0-9]{64}$/,Vt=/^[a-f0-9]{7,40}$/,qt=/^(?:KO|EN|ZH)-[^\u0000-\u001f<>:"/\\|?*#%]+\.md$/u,Zt=new Set(["current","needs_review"]),Zr=new Set(["schemaVersion","catalogCommit","wikiCommit","generatedAt","locales","pages","settings","review","contentHash"]),Kr=3e4,Xr=8e3,Jt=1e6,en=512e3,tn=12,Wr=125e4,nn=1,Qr="carrot.settings.wiki-docs.v1",ct=class extends Error{constructor(e,n="invalid"){super(e),this.name="PublishedSettingDocumentationError",this.code=n}};function v(t,e){throw new ct(t,e)}function rn(t){let e=String(t||"").trim().toLowerCase();return qr.has(e)?e:"en"}function se(t,e,n){(!t||typeof t!="object"||Array.isArray(t))&&v(`${n} must be an object`);let r=Object.keys(t).filter(s=>!e.has(s));r.length&&v(`${n} contains unknown properties: ${r.join(", ")}`)}function Yr(t,e){se(t,new Set(["hash","bytes"]),`page ${e}`),ze.test(t.hash)||v(`page ${e} has an invalid hash`),(!Number.isInteger(t.bytes)||t.bytes<1||t.bytes>en)&&v(`page ${e} has an invalid byte size`)}function Jr(t){se(t,Zr,"settings index"),t.schemaVersion!==1&&v("unsupported settings index schema"),Vt.test(t.catalogCommit||"")||v("settings index catalogCommit is invalid"),t.wikiCommit!=null&&!Vt.test(t.wikiCommit)&&v("settings index wikiCommit is invalid"),Number.isFinite(Date.parse(t.generatedAt||""))||v("settings index generatedAt is invalid"),ze.test(t.contentHash||"")||v("settings index contentHash is invalid"),(!Array.isArray(t.locales)||t.locales.length<2||t.locales.length>3)&&v("settings index locales are invalid");let e=t.locales.map(rn);(new Set(e).size!==e.length||!e.includes("ko")||!e.includes("en"))&&v("settings index must contain unique ko and en locales"),t.locales.some((l,c)=>l!==e[c])&&v("settings index locale is unsupported"),se(t.pages,new Set(Object.keys(t.pages||{})),"settings index pages");let n=Object.keys(t.pages);(!n.length||n.length>2e3)&&v("settings index page count is invalid"),n.forEach(l=>{l!=="Settings-Catalog.md"&&!qt.test(l)&&v(`unsafe published page name: ${l}`),Yr(t.pages[l],l)}),se(t.settings,new Set(Object.keys(t.settings||{})),"settings index settings");let r=Object.keys(t.settings);(!r.length||r.length>5e3)&&v("settings index setting count is invalid"),r.forEach(l=>{lt.test(l)||v(`invalid setting parameter: ${l}`);let c=t.settings[l];se(c,new Set(["group","semanticHash","reviewStatus","locales"]),`setting ${l}`),lt.test(c.group||"")||v(`setting ${l} has an invalid group`),ze.test(c.semanticHash||"")||v(`setting ${l} has an invalid semantic hash`),Zt.has(c.reviewStatus)||v(`setting ${l} has an invalid review status`),se(c.locales,new Set(e),`setting ${l} locales`),(Object.keys(c.locales).length!==e.length||e.some(u=>!c.locales[u]))&&v(`setting ${l} must provide every index locale`),Object.entries(c.locales).forEach(([u,p])=>{e.includes(u)||v(`setting ${l} has an unsupported locale`),se(p,new Set(["page","anchor","factsHash","reviewStatus"]),`setting ${l}/${u}`),(!qt.test(p.page||"")||!t.pages[p.page])&&v(`setting ${l}/${u} references an unknown page`),p.anchor!==l&&v(`setting ${l}/${u} has a mismatched anchor`),ze.test(p.factsHash||"")||v(`setting ${l}/${u} has an invalid facts hash`),Zt.has(p.reviewStatus)||v(`setting ${l}/${u} has an invalid review status`)})}),se(t.review,new Set(["current","needs_review"]),"settings index review");let s=Number(t.review.current),i=Number(t.review.needs_review);(!Number.isInteger(s)||!Number.isInteger(i)||s<0||i<0||s+i!==r.length)&&v("settings index review totals are invalid");let a={...t};return delete a.contentHash,at(Re(a))!==t.contentHash&&v("settings index content hash does not match","hash"),Object.freeze(t)}function Kt(t,e=Jt){let n=String(t||"");re(n).byteLength>e&&v("settings index is too large","capacity");let r;try{r=JSON.parse(n)}catch{v("settings index is not valid JSON")}return Jr(r)}function ge(t,e,n){let r=[];return t.forEach((s,i)=>{s===e&&r.push(i)}),r.length!==1&&v(`${n} marker must appear exactly once`),r[0]}function es(t,e){let r=String(t||"").replaceAll(`\r `,` `).split(` -`),s=/^$/.exec(r[0]||"");s||v("published page header is invalid"),(s[1]!==e.language||s[2]!==e.group||s[3]!==e.param)&&v("published page locale, group, or parameter does not match the index");let i=e.param,a=ge(r,``,`${i} begin`),o=ge(r,``,`${i} end`);o<=a&&v(`${i} setting markers are out of order`);let l=r.slice(a+1,o),c=ge(l,``,`${i} auto begin`),u=ge(l,``,`${i} auto end`),p=ge(l,``,`${i} manual begin`),g=ge(l,``,`${i} manual end`);cC.startsWith("$/.exec(k[0]);m||v(`${i} automatic source metadata is invalid`),(m[1]!==e.factsHash||m[2]!==e.semanticHash||m[3]!==e.reviewStatus)&&v(`${i} automatic source metadata does not match the index`),l.includes(``)||v(`${i} anchor is missing`);let f=[],h=[],b=null,w=[];l.forEach(C=>{let D=/^$/.exec(C),H=/^$/.exec(C);if(D){b&&v(`${i} contains nested sections`),b=D[1].toLowerCase(),w=[];return}if(H){b!==H[1].toLowerCase()&&v(`${i} section markers are unbalanced`);let y=w.join(` -`).trim();y||v(`${i} contains an empty section`),h.push(Object.freeze({kind:b,markdown:y,ast:st(y)})),b=null,w=[];return}C===``||/^$/.test(C)||(f.push(C),b&&w.push(C))}),b&&v(`${i} contains an unclosed section`);let S=h.map(C=>C.kind),T=["overview","behavior","usage","reference"];(S[0]!=="overview"||new Set(S).size!==S.length||S.some((C,D)=>T.indexOf(C)<=(D?T.indexOf(S[D-1]):-1)))&&v(`${i} sections are missing, duplicated, or out of order`);let P=f.join(` +`),s=/^$/.exec(r[0]||"");s||v("published page header is invalid"),(s[1]!==e.language||s[2]!==e.group||s[3]!==e.param)&&v("published page locale, group, or parameter does not match the index");let i=e.param,a=ge(r,``,`${i} begin`),o=ge(r,``,`${i} end`);o<=a&&v(`${i} setting markers are out of order`);let l=r.slice(a+1,o),c=ge(l,``,`${i} auto begin`),u=ge(l,``,`${i} auto end`),p=ge(l,``,`${i} manual begin`),g=ge(l,``,`${i} manual end`);cC.startsWith("$/.exec(k[0]);b||v(`${i} automatic source metadata is invalid`),(b[1]!==e.factsHash||b[2]!==e.semanticHash||b[3]!==e.reviewStatus)&&v(`${i} automatic source metadata does not match the index`),l.includes(``)||v(`${i} anchor is missing`);let f=[],h=[],m=null,w=[];l.forEach(C=>{let D=/^$/.exec(C),H=/^$/.exec(C);if(D){m&&v(`${i} contains nested sections`),m=D[1].toLowerCase(),w=[];return}if(H){m!==H[1].toLowerCase()&&v(`${i} section markers are unbalanced`);let y=w.join(` +`).trim();y||v(`${i} contains an empty section`),h.push(Object.freeze({kind:m,markdown:y,ast:st(y)})),m=null,w=[];return}C===``||/^$/.test(C)||(f.push(C),m&&w.push(C))}),m&&v(`${i} contains an unclosed section`);let S=h.map(C=>C.kind),T=["overview","behavior","usage","reference"];(S[0]!=="overview"||new Set(S).size!==S.length||S.some((C,D)=>T.indexOf(C)<=(D?T.indexOf(S[D-1]):-1)))&&v(`${i} sections are missing, duplicated, or out of order`);let P=f.join(` `).replace(/\n{3,}/g,` -`).trim();return P||v(`${i} has no visible documentation`),Object.freeze({markdown:P,ast:st(P),sections:Object.freeze(h)})}function Xt(){if(typeof DOMException=="function")return new DOMException("The operation was aborted","AbortError");let t=new Error("The operation was aborted");return t.name="AbortError",t}function Wt(t,e){return e?e.aborted?Promise.reject(Xt()):new Promise((n,r)=>{let s=()=>r(Xt());e.addEventListener("abort",s,{once:!0}),t.then(n,r).finally(()=>e.removeEventListener("abort",s))}):t}async function ts(t,e){let n=Number(t.headers?.get?.("content-length"));if(Number.isFinite(n)&&n>e&&v("published response is too large","capacity"),!t.body?.getReader){let l=await t.text();return re(l).byteLength>e&&v("published response is too large","capacity"),l}let r=t.body.getReader(),s=[],i=0;for(;;){let{done:l,value:c}=await r.read();if(l)break;i+=c.byteLength,i>e&&(await r.cancel(),v("published response is too large","capacity")),s.push(c)}let a=new Uint8Array(i),o=0;s.forEach(l=>{a.set(l,o),o+=l.byteLength});try{return new TextDecoder("utf-8",{fatal:!0}).decode(a)}catch{v("published response must be UTF-8")}}function Qt(t,e,n){let r=t.settings[e];if(!r)return null;let s=r.locales[n]?n:r.locales.en?"en":null;if(!s)return null;let i=r.locales[s];return Object.freeze({param:e,language:s,group:r.group,semanticHash:r.semanticHash,reviewStatus:i.reviewStatus,page:i.page,anchor:i.anchor,factsHash:i.factsHash,pageHash:t.pages[i.page].hash,pageBytes:t.pages[i.page].bytes})}function ns(t,e,n,r,s){return Object.freeze({ok:!0,available:!0,name:e.param,source:e.page.replace(/\.md$/i,""),anchor:e.anchor,language_requested:r,language_resolved:e.language,fallback:r!==e.language,markdown:n.markdown,ast:n.ast,sections:n.sections,content_source:s,catalog_hash:t.contentHash,catalog_commit:t.catalogCommit,wiki_commit:t.wikiCommit||"",review_status:e.reviewStatus})}function ot(){return{version:nn,catalogs:[]}}function Yt(t,e,n){try{let r=t?.getItem?.(e);if(!r||re(r).byteLength>n)return ot();let s=JSON.parse(r);return s?.version!==nn||!Array.isArray(s.catalogs)?ot():s}catch{return ot()}}function rs(t,e){t.catalogs=t.catalogs.filter(r=>typeof r?.indexText=="string"&&r.pages&&typeof r.pages=="object").sort((r,s)=>Number(s.savedAt||0)-Number(r.savedAt||0)).slice(0,2),t.catalogs.forEach(r=>{let s=Object.entries(r.pages).sort(([,i],[,a])=>Number(a.savedAt||0)-Number(i.savedAt||0)).slice(0,tn);r.pages=Object.fromEntries(s)});let n=JSON.stringify(t);for(;re(n).byteLength>e;){let r=t.catalogs.flatMap(s=>Object.entries(s.pages).map(([i,a])=>({catalog:s,page:i,savedAt:Number(a.savedAt||0)}))).sort((s,i)=>s.savedAt-i.savedAt);if(!r.length)return null;delete r[0].catalog.pages[r[0].page],t.catalogs=t.catalogs.filter(s=>Object.keys(s.pages).length),n=JSON.stringify(t)}return n}function ss(t,e,n,r){try{let s=rs(n,r);s&&t?.setItem?.(e,s)}catch{}}function sn(t={}){let e=t.fetchImpl||globalThis.fetch,n=t.clock||(()=>globalThis.performance?.now?.()??Date.now()),r=null;try{r=globalThis.localStorage}catch{}let s=t.storage===void 0?r:t.storage,i=t.now||Date.now,a=t.indexUrl||Ie,o=t.storageKey||Qr,l=t.indexTtlMs||Kr,c=t.requestTimeoutMs||Xr,u=t.maxIndexBytes||Jt,p=t.maxPageBytes||en,g=t.maxMemoryPages||tn,k=t.maxStorageBytes||Wr,m=a.slice(0,a.lastIndexOf("/")+1),f=new Map,h=new Set,b=new Map,w=new Map,S=null,T={loadCount:0,requestCount:0,responseBytes:0,unavailableCount:0,networkErrorCount:0,lastLoadMs:0,lastParseMs:0,lastContentSource:"",updatedAt:0};function P(E){let A=Number(n())-Number(E);return Number.isFinite(A)&&A>0?A:0}function C(){return Object.freeze({...T,errorRate:T.loadCount?T.unavailableCount/T.loadCount:0})}function D(E,A){if(f.has(E))return f.get(E);let I=A().finally(()=>{f.get(E)===I&&f.delete(E)});return f.set(E,I),I}async function H(E,A){typeof e!="function"&&v("published documentation fetch is unavailable","network"),T.requestCount+=1;let I=new AbortController;h.add(I);let j=setTimeout(()=>I.abort(),c);try{let R=await e(E,{cache:"no-store",credentials:"omit",referrerPolicy:"no-referrer",signal:I.signal});R.ok||v(`published documentation request failed: HTTP ${R.status}`,"network");let B=await ts(R,A);return T.responseBytes+=re(B).byteLength,B}catch(R){throw T.networkErrorCount+=1,R}finally{clearTimeout(j),h.delete(I)}}function y(E,A,I,j){let R=n();try{return x(E,A,I,j)}finally{T.lastParseMs=P(R)}}function L(){return S&&S.expiresAt>i()?Promise.resolve(S):D("index",async()=>{let E=Math.floor(i()/Math.max(1,l)),A=a.includes("?")?"&":"?",I=await H(`${a}${A}v=${E}`,u);return S={index:Kt(I,u),text:I,expiresAt:i()+l},S})}function $(E,A){for(b.delete(E),b.set(E,A);b.size>g;)b.delete(b.keys().next().value)}function d(E,A,I){let j=Yt(s,o,k),R=j.catalogs.find(B=>B.hash===E.index.contentHash);R||(R={hash:E.index.contentHash,indexText:E.text,savedAt:i(),pages:{}},j.catalogs.unshift(R)),R.indexText=E.text,R.savedAt=i(),R.pages[A.page]={text:I,savedAt:i()},ss(s,o,j,k)}function x(E,A,I,j){let R=re(I);(R.byteLength!==A.pageBytes||R.byteLength>p)&&v(`published page ${A.page} byte size does not match`,"hash"),at(R)!==A.pageHash&&v(`published page ${A.page} hash does not match`,"hash");let B=es(I,A);return ns(E.index,A,B,A.requestedLanguage,j)}function _(E,A){let I=`${E.index.contentHash}:${A.page}`,j=b.get(I);return j?($(I,j),Promise.resolve(y(E,A,j,"published-memory"))):D(`page:${I}`,async()=>{let B=encodeURIComponent(A.page),K=`${m}${B}?catalog=${E.index.contentHash}`,ee=await H(K,Math.min(p,A.pageBytes+1));return y(E,A,ee,"published"),$(I,ee),d(E,A,ee),ee}).then(B=>y(E,A,B,"published"))}async function N(E,A){let j=[...Yt(s,o,k).catalogs].sort((R,B)=>Number(B.savedAt||0)-Number(R.savedAt||0));for(let R of j)try{let B=Kt(R.indexText,u),K=Qt(B,E,A),ee=K&&R.pages?.[K.page];if(!K||typeof ee?.text!="string")continue;let ue={index:B,text:R.indexText,expiresAt:0};return y(ue,{...K,requestedLanguage:A},ee.text,"published-cache")}catch{}return null}function G(E,A){return Object.freeze({available:!1,name:E,language_requested:A,content_source:"published-unavailable"})}async function Y(E,A){try{let j=await L(),R=Qt(j.index,E,A);if(!R)return G(E,A);let B={...R,requestedLanguage:A};return await _(j,B)}catch{}return await N(E,A)||G(E,A)}function J(E,A,I={}){let j=String(E||"").trim(),R=rn(A);if(!lt.test(j))return Promise.resolve(Object.freeze({available:!1,name:j,language_requested:R}));let B=`${R}:${j}`,K=w.get(B);if(K&&K.expiresAt>i())return Wt(K.promise,I.signal);let ee=n();T.loadCount+=1;let ue=Y(j,R).catch(()=>G(j,R)).then(Ge=>(T.lastLoadMs=P(ee),T.lastContentSource=String(Ge?.content_source||""),T.updatedAt=Number(i())||0,Ge?.available||(T.unavailableCount+=1),Ge));return w.set(B,{promise:ue,expiresAt:i()+l}),ue.catch(()=>{w.get(B)?.promise===ue&&w.delete(B)}),Wt(ue,I.signal)}function _e(){h.forEach(E=>E.abort()),h.clear(),f.clear(),b.clear(),w.clear(),S=null}return Object.freeze({load:J,clear:_e,diagnostics:C})}var is=new Set(["ko","en","zh"]),as=Ie;function an(t){let e=String(t||"").trim().toLowerCase();return is.has(e)?e:"en"}function on(){return as}function ln(t={}){let e=String(t.indexUrl||Ie),n=sn({fetchImpl:t.fetchImpl,storage:t.storage,now:t.now,indexUrl:e,indexTtlMs:t.indexTtlMs,requestTimeoutMs:t.requestTimeoutMs,maxIndexBytes:t.maxIndexBytes,maxPageBytes:t.maxPageBytes,maxMemoryPages:t.maxMemoryPages,maxStorageBytes:t.maxStorageBytes,clock:t.clock});function r(...a){return n.load(...a)}function s(){n.clear()}function i(){return{...n.diagnostics(),channel:"wiki",indexUrl:e}}return Object.freeze({load:r,clear:s,diagnostics:i})}var Oe=Object.freeze([Object.freeze({id:"description",labelKey:"setting_context_description",labelFallback:"Description",emptyKey:"setting_context_description_empty",emptyFallback:"No detailed description is available yet."}),Object.freeze({id:"popular",labelKey:"setting_context_popular",labelFallback:"Popular",emptyKey:"setting_context_popular_empty",emptyFallback:"No popular-value data is available yet."}),Object.freeze({id:"history",labelKey:"setting_context_history",labelFallback:"History",emptyKey:"setting_context_history_empty",emptyFallback:"No changes have been recorded yet."})]),le=Object.freeze(Oe.map(t=>t.id)),os=0,ut=3,un=10;function ls(t,e,n){let r=String(e??"");return Object.entries(n||{}).forEach(([s,i])=>{r=r.replaceAll(`{${s}}`,String(i))}),r}function cn(t){return Oe.find(e=>e.id===t)||Oe[0]}function cs(t,e){let n=Math.max(0,Number(t)||0);try{return new Intl.NumberFormat(e||void 0,{maximumFractionDigits:0}).format(n)}catch{return String(Math.round(n))}}function pt(t,e,n=le.length){let r=Math.max(1,Number(n)||1),s=Math.max(0,Math.min(r-1,Number(t)||0));return e==="ArrowRight"?(s+1)%r:e==="ArrowLeft"?(s-1+r)%r:e==="Home"?0:e==="End"?r-1:s}function pn(t={}){let e=t.document||globalThis.document;if(!e?.createElement)throw new TypeError("A document is required");let n=typeof t.text=="function"?t.text:ls,r=String(t.locale||"").trim()||void 0,s=`setting-context-${++os}`,i=e.createElement("section");i.className="setting-context",i.setAttribute("aria-label",n("setting_context_aria","Setting information"));let a=e.createElement("div");a.className="setting-context__tabs c-segmented-control",a.setAttribute("role","tablist"),a.setAttribute("aria-label",n("setting_context_tabs_aria","Setting information sections"));let o=new Map,l=new Map,c=new Map;function u(y,L=!1){let $=le.includes(y)?y:le[0];return le.forEach(d=>{let x=d===$,_=o.get(d),N=l.get(d);_.setAttribute("aria-selected",String(x)),_.tabIndex=x?0:-1,N.hidden=!x}),L&&o.get($)?.focus(),i.dataset.activePanel=$,$}Oe.forEach((y,L)=>{let $=e.createElement("button");$.type="button",$.className="setting-context__tab c-segmented-control__item",$.id=`${s}-tab-${y.id}`,$.setAttribute("role","tab"),$.setAttribute("aria-controls",`${s}-panel-${y.id}`),$.setAttribute("aria-selected",String(L===0)),$.tabIndex=L===0?0:-1;let d=e.createElement("span");if(d.className="setting-context__tab-label",d.textContent=n(y.labelKey,y.labelFallback),$.appendChild(d),y.id==="history"){let N=e.createElement("span");N.className="setting-context__tab-count",N.textContent="0",N.setAttribute("aria-label",n("setting_context_history_count","{n} changes",{n:0})),$.appendChild(N)}let x=e.createElement("div");x.className=`setting-context__panel setting-context__panel--${y.id}`,x.id=`${s}-panel-${y.id}`,x.setAttribute("role","tabpanel"),x.setAttribute("aria-labelledby",$.id),x.setAttribute("aria-live","polite"),x.hidden=L!==0;let _=e.createElement("div");_.className="setting-context__content",x.appendChild(_),$.addEventListener("click",()=>u(y.id)),$.addEventListener("keydown",N=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(N.key))return;N.preventDefault();let G=le.indexOf(y.id);u(le[pt(G,N.key)],!0)}),o.set(y.id,$),l.set(y.id,x),c.set(y.id,_),a.appendChild($),i.appendChild(x)}),i.prepend(a);let p=e.createElement("dialog");p.className="setting-context__history-dialog",p.setAttribute("aria-labelledby",`${s}-history-title`);let g=e.createElement("header");g.className="setting-context__dialog-header";let k=e.createElement("h3");k.id=`${s}-history-title`,k.textContent=n("setting_context_history_all_title","All change history");let m=e.createElement("button");m.type="button",m.className="setting-context__dialog-close",m.textContent="×",m.setAttribute("aria-label",n("close","Close"));let f=e.createElement("div");f.className="setting-context__dialog-body",g.append(k,m),p.append(g,f),i.appendChild(p);let h=null;function b(){typeof p.close=="function"&&p.open?p.close():p.removeAttribute("open"),h?.focus()}m.addEventListener("click",b),p.addEventListener("cancel",y=>{y.preventDefault(),b()}),p.addEventListener("click",y=>{y.target===p&&b()});function w(y){let L=o.get("history")?.querySelector(".setting-context__tab-count");if(!L)return;let $=cs(y,r);L.textContent=$,L.setAttribute("aria-label",n("setting_context_history_count","{n} changes",{n:$}))}function S(y,L,$){let d=e.createElement("div");d.className=`setting-context__state setting-context__state--${$}`;let x=e.createElement("strong");return x.textContent=L||n(cn(y).emptyKey,cn(y).emptyFallback),d.appendChild(x),d}function T(y,L,$={}){if(!c.has(y))throw new RangeError(`Unknown setting context panel: ${y}`);let d=c.get(y),x=$.state||"ready";d.replaceChildren(L),d.dataset.state=x,l.get(y).setAttribute("aria-busy",String(x==="loading")),y==="history"&&$.count!==void 0&&w($.count)}function P(y,L=""){T(y,S(y,L||n("setting_context_loading","Loading..."),"loading"),{state:"loading",...y==="history"?{count:0}:{}})}function C(y,L=""){T(y,S(y,L,"empty"),{state:"empty",...y==="history"?{count:0}:{}})}function D(y,L,$={}){if(!L){C(y,$.emptyMessage||"");return}T(y,L,{...$,state:"ready"})}function H(y,L,$={}){let d=Math.max(0,Number($.count)||0);if(!y||d===0){f.replaceChildren(),C("history",$.emptyMessage||"");return}let x=e.createElement("div");if(x.className="setting-context__history-summary",x.appendChild(y),L&&d>Number($.summaryCount||ut)){let _=e.createElement("button");_.type="button",_.className="setting-context__more",_.textContent=n("setting_context_history_all","View all history"),_.addEventListener("click",()=>{h=_,typeof p.showModal=="function"?p.showModal():p.setAttribute("open",""),m.focus()}),x.appendChild(_),f.replaceChildren(L)}else f.replaceChildren();D("history",x,{count:d})}return P("description",n("setting_doc_loading","Loading guide...")),C("popular"),C("history"),u("description"),Object.freeze({root:i,activate:u,getPanel:y=>l.get(y)||null,getContent:y=>c.get(y)||null,setLoading:P,setEmpty:C,setContent:D,setHistoryContent:H,closeHistoryDialog:b})}var hn=le;var gn=Object.freeze({note:Object.freeze(["setting_doc_callout_note","Note"]),tip:Object.freeze(["setting_doc_callout_tip","Tip"]),important:Object.freeze(["setting_doc_callout_important","Important"]),warning:Object.freeze(["setting_doc_callout_warning","Warning"]),caution:Object.freeze(["setting_doc_callout_caution","Caution"])});function us(t,e){return String(e??"")}function Le(t){return Object.freeze({kind:"text",text:String(t??"")})}function M(t,e={}){return Object.freeze({kind:"element",tag:t,className:String(e.className||""),attrs:Object.freeze({...e.attrs||{}}),children:Object.freeze([...e.children||[]])})}function fn(t){return Object.freeze({kind:"fragment",children:Object.freeze(t)})}function Q(t,e){return(Array.isArray(t)?t:[]).map(n=>{switch(n?.type){case"text":return fn([...n.text?[Le(n.text)]:[],...Q(n.children,e)]);case"strong":return M("strong",{children:Q(n.children,e)});case"em":return M("em",{children:Q(n.children,e)});case"del":return M("del",{children:Q(n.children,e)});case"code":return M("code",{children:[Le(n.text)]});case"break":return M("br");case"link":{let r=it(n.href);if(!r)throw new TypeError("Unsafe documentation link");let s=/^https?:/i.test(r);return M("a",{attrs:{href:r,...n.title?{title:n.title}:{},...s?{target:"_blank",rel:"noopener noreferrer"}:{}},children:Q(n.children,e)})}case"image":{let r=it(n.href);if(!r)throw new TypeError("Unsafe documentation image");return M("img",{attrs:{src:r,alt:n.alt,loading:"lazy",decoding:"async",...n.title?{title:n.title}:{}}})}default:throw new TypeError(`Unsupported documentation inline node: ${n?.type||"unknown"}`)}})}function Pe(t,e){let n=e.text;return(Array.isArray(t)?t:[]).map(r=>{switch(r?.type){case"heading":{let s=Math.max(2,Math.min(6,Number(r.depth)||2));return M(`h${s}`,{children:Q(r.children,e)})}case"paragraph":return M("p",{children:Q(r.children,e)});case"list":{let s=r.ordered?"ol":"ul";return M(s,{attrs:r.ordered&&Number(r.start)!==1?{start:String(r.start)}:{},children:(r.items||[]).map(i=>{let a=i.task?[M("input",{className:"setting-doc-task",attrs:{type:"checkbox",disabled:!0,...i.checked?{checked:!0}:{}}})]:[];return M("li",{className:i.task?"setting-doc-task-item":"",children:[...a,...Pe(i.children,e)]})})})}case"table":{let s=M("tr",{children:(r.header||[]).map((a,o)=>M("th",{attrs:{scope:"col",...r.align?.[o]?{"data-align":r.align[o]}:{}},children:Q(a,e)}))}),i=(r.rows||[]).map(a=>M("tr",{children:a.map((o,l)=>M("td",{attrs:r.align?.[l]?{"data-align":r.align[l]}:{},children:Q(o,e)}))}));return M("div",{className:"setting-doc-table-wrap",children:[M("table",{children:[M("thead",{children:[s]}),M("tbody",{children:i})]})]})}case"callout":{let s=gn[r.tone]?r.tone:"note",[i,a]=gn[s];return M("aside",{className:`setting-doc-callout setting-doc-callout--${s}`,attrs:{role:"note"},children:[M("strong",{className:"setting-doc-callout__label",children:[Le(n(i,a))]}),...Pe(r.children,e)]})}case"code_block":return M("pre",{children:[M("code",{attrs:r.language?{"data-language":r.language}:{},children:[Le(r.text)]})]});case"separator":return M("hr");case"details":return M("details",{attrs:r.open?{open:!0}:{},children:[M("summary",{children:Q(r.summary,e)}),...Pe(r.children,e)]});default:throw new TypeError(`Unsupported documentation block node: ${r?.type||"unknown"}`)}})}function ht(t,e,n){if(n.kind==="text"){e.appendChild(t.createTextNode(n.text));return}if(n.kind==="fragment"){n.children.forEach(s=>ht(t,e,s));return}let r=t.createElement(n.tag);n.className&&(r.className=n.className),Object.entries(n.attrs).forEach(([s,i])=>{i===!1||i==null||(r.setAttribute(s,i===!0?"":String(i)),s==="checked"&&(r.checked=!0),s==="disabled"&&(r.disabled=!0))}),n.children.forEach(s=>ht(t,r,s)),e.appendChild(r)}function ce(t,e){(Array.isArray(t)?t:[]).forEach(n=>{if(Array.isArray(n)){ce(n,e);return}!n||typeof n!="object"||(typeof n.text=="string"&&e.push(n.text),typeof n.alt=="string"&&e.push(n.alt),ce(n.children,e),ce(n.summary,e),ce(n.items,e),ce(n.header,e),(n.rows||[]).forEach(r=>ce(r,e)))})}function gt(t,e={}){let n=typeof e.text=="function"?e.text:us;return fn(Pe(t,{text:n}))}function dn(t,e,n={}){if(!t?.createElement||!t?.createTextNode)throw new TypeError("A document is required");let r=t.createElement("article");return r.className="setting-doc-markdown setting-doc-ast",ht(t,r,gt(e,n)),r}function mn(t){let e=[];return ce(t,e),e.join(" ").replace(/\s+/g," ").trim()}var je=Object.freeze({web_ui:"setting_history_source_web",profile:"setting_history_source_profile",restore:"setting_history_source_restore",reset_defaults:"setting_history_source_reset",intro:"setting_history_source_intro",undo:"setting_history_source_undo",device:"setting_history_source_device",unknown:"setting_history_source_unknown"});function ps(t,e,n){let r=String(e??"");return n?r.replace(/\{(\w+)\}/g,(s,i)=>Object.prototype.hasOwnProperty.call(n,i)?String(n[i]):s):r}function dt(t){let e=Number(t);if(!Number.isFinite(e)||e<=0)return"";try{return new Date(e*1e3).toISOString()}catch{return""}}function mt(t,e={}){let n=Number(t),r=dt(n);if(!r)return{iso:"",absolute:""};let s=e.locale||void 0,i="";try{i=new Date(n*1e3).toLocaleString(s,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}catch{i=r}return{iso:r,absolute:i}}function ft(t,e){return typeof t=="function"?t:e}function hs(t,e){let n=e.escape,{iso:r,absolute:s}=mt(t?.ts,e);return r?``:'-'}function bn(t,e={}){let n=ft(e.escape,c=>String(c??"")),r=ft(e.text,ps),s=ft(e.formatValue,c=>String(c??"")),i=(c,u)=>typeof e.formatFor=="function"?e.formatFor(c,u):s(u),a=Array.isArray(t)?t:[],o=`
${n(r("setting_history_title","수정이력"))}`+(a.length?`${n(r("setting_history_count","최근 {n}건",{n:a.length}))}`:"")+"
";if(!a.length)return`
${o}
${n(r("setting_history_empty","기록된 변경이 없습니다."))}
`;let l=a.map((c,u)=>{let p=String(c?.source||"unknown"),g=je[p]||je.unknown,k=`${n(r(g,p))}`,m=c?.engaged?`${n(r("setting_history_engaged","주행중"))}`:"",f=u===0&&!e.withName?``:"",h=typeof e.displayName=="function"?e.displayName(c):c?.name;return'
'+(e.withName&&h?`${n(h)}`:"")+`${n(i(c,c?.prev))}${n(i(c,c?.next))}${hs(c,{...e,escape:n})}${k}${m}${f}
`}).join("");return`
${o}
${l}
`}function xn(t){return{min:Number(t?.min),max:Number(t?.max)}}function xe(t,e){if(e==null||e==="")return null;let{min:n,max:r}=xn(t),s=String(e).trim().toLowerCase();if(n===0&&r===1){if(s==="1"||s==="true"||s==="on")return 1;if(s==="0"||s==="false"||s==="off")return 0}let i=Number(e);return Number.isFinite(i)?i:null}function Me(t,e){let{min:n,max:r}=xn(t);if(!Number.isFinite(n)||!Number.isFinite(r))return!0;let s=xe(t,e);return s===null?!1:s>=n&&s<=r}function bt(t,e,n,r={}){let s=typeof r.formatValue=="function"?r.formatValue:f=>String(f??""),i=r.locale,a=Number(r.aIndex||0),o=Number(r.bIndex||0),l=Number(e?.count??0),c=Number(n?.count??0),u=Number.isFinite(l)?l:0,p=Number.isFinite(c)?c:0;if(u!==p)return p-u;let g=xe(t,e?.value),k=xe(t,n?.value);if(g!==null&&k!==null&&g!==k)return g-k;if(g!==null&&k===null)return-1;if(g===null&&k!==null)return 1;let m=String(s(e?.value)).localeCompare(String(s(n?.value)),i,{numeric:!0,sensitivity:"base"});return m!==0?m:a-o}function kn(t,e,n={}){if(!e||typeof e!="object")return null;let r=Number(e.sample??e.sample_count??0);if(!Number.isFinite(r)||r<1||!Me(t,e.value))return null;let s=Array.isArray(e.top_values)?e.top_values.map((i,a)=>({item:i,index:a})).filter(({item:i})=>{let a=Number(i?.count??0);return Number.isFinite(a)&&a>0&&Me(t,i?.value)}).sort((i,a)=>bt(t,i.item,a.item,{...n,aIndex:i.index,bIndex:a.index})).slice(0,10).map(({item:i})=>i):[];return{...e,top_values:s}}function ke(t){let e=Array.isArray(t?.top_values)?t.top_values:[],n=Number(e[0]?.count??t?.top_count??t?.count??0);return Number.isFinite(n)?n:0}function De(t){let e=Array.isArray(t?.top_values)?t.top_values:[];if(!e.length)return[];let n=ke(t);if(n<2)return[];let r=e.filter(s=>{let i=Number(s?.count??0);return Number.isFinite(i)&&i===n});return r.length<=2?r:[]}function xt(t,e,n){let r=String(e??"");if(n)for(let[s,i]of Object.entries(n))r=r.replaceAll(`{${s}}`,String(i));return r}function ye(t){return String(t??"")}function yn(t,e){let n=De(t);if(!n.length)return null;let r=ke(t),s=n.map(i=>e(i?.value)).filter(Boolean);return!r||!s.length?null:{sample:r,values:s}}function _n(t,e={}){let n=e.formatValue||ye,r=e.text||xt,s=yn(t,n);if(!s)return"";let i=r("setting_popular_value_chip_label","내 차종 인기값");return s.values.length===1?r("setting_popular_value_chip","{label} ({sample}대) {value}",{label:i,sample:s.sample,value:s.values[0]}):r("setting_popular_value_chip_tied","{label} (각 {sample}대) {values}",{label:i,sample:s.sample,values:s.values.join(" · ")})}function wn(t,e={}){let n=e.formatValue||ye,r=e.text||xt,s=e.escape||ye,i=yn(t,n);if(!i)return"";let a=i.values.length===1?r("setting_popular_value_chip_sample","{sample}대",{sample:i.sample}):r("setting_popular_value_chip_each_sample","각 {sample}대",{sample:i.sample});return` +`).trim();return P||v(`${i} has no visible documentation`),Object.freeze({markdown:P,ast:st(P),sections:Object.freeze(h)})}function Xt(){if(typeof DOMException=="function")return new DOMException("The operation was aborted","AbortError");let t=new Error("The operation was aborted");return t.name="AbortError",t}function Wt(t,e){return e?e.aborted?Promise.reject(Xt()):new Promise((n,r)=>{let s=()=>r(Xt());e.addEventListener("abort",s,{once:!0}),t.then(n,r).finally(()=>e.removeEventListener("abort",s))}):t}async function ts(t,e){let n=Number(t.headers?.get?.("content-length"));if(Number.isFinite(n)&&n>e&&v("published response is too large","capacity"),!t.body?.getReader){let l=await t.text();return re(l).byteLength>e&&v("published response is too large","capacity"),l}let r=t.body.getReader(),s=[],i=0;for(;;){let{done:l,value:c}=await r.read();if(l)break;i+=c.byteLength,i>e&&(await r.cancel(),v("published response is too large","capacity")),s.push(c)}let a=new Uint8Array(i),o=0;s.forEach(l=>{a.set(l,o),o+=l.byteLength});try{return new TextDecoder("utf-8",{fatal:!0}).decode(a)}catch{v("published response must be UTF-8")}}function Qt(t,e,n){let r=t.settings[e];if(!r)return null;let s=r.locales[n]?n:r.locales.en?"en":null;if(!s)return null;let i=r.locales[s];return Object.freeze({param:e,language:s,group:r.group,semanticHash:r.semanticHash,reviewStatus:i.reviewStatus,page:i.page,anchor:i.anchor,factsHash:i.factsHash,pageHash:t.pages[i.page].hash,pageBytes:t.pages[i.page].bytes})}function ns(t,e,n,r,s){return Object.freeze({ok:!0,available:!0,name:e.param,source:e.page.replace(/\.md$/i,""),anchor:e.anchor,language_requested:r,language_resolved:e.language,fallback:r!==e.language,markdown:n.markdown,ast:n.ast,sections:n.sections,content_source:s,catalog_hash:t.contentHash,catalog_commit:t.catalogCommit,wiki_commit:t.wikiCommit||"",review_status:e.reviewStatus})}function ot(){return{version:nn,catalogs:[]}}function Yt(t,e,n){try{let r=t?.getItem?.(e);if(!r||re(r).byteLength>n)return ot();let s=JSON.parse(r);return s?.version!==nn||!Array.isArray(s.catalogs)?ot():s}catch{return ot()}}function rs(t,e){t.catalogs=t.catalogs.filter(r=>typeof r?.indexText=="string"&&r.pages&&typeof r.pages=="object").sort((r,s)=>Number(s.savedAt||0)-Number(r.savedAt||0)).slice(0,2),t.catalogs.forEach(r=>{let s=Object.entries(r.pages).sort(([,i],[,a])=>Number(a.savedAt||0)-Number(i.savedAt||0)).slice(0,tn);r.pages=Object.fromEntries(s)});let n=JSON.stringify(t);for(;re(n).byteLength>e;){let r=t.catalogs.flatMap(s=>Object.entries(s.pages).map(([i,a])=>({catalog:s,page:i,savedAt:Number(a.savedAt||0)}))).sort((s,i)=>s.savedAt-i.savedAt);if(!r.length)return null;delete r[0].catalog.pages[r[0].page],t.catalogs=t.catalogs.filter(s=>Object.keys(s.pages).length),n=JSON.stringify(t)}return n}function ss(t,e,n,r){try{let s=rs(n,r);s&&t?.setItem?.(e,s)}catch{}}function sn(t={}){let e=t.fetchImpl||globalThis.fetch,n=t.clock||(()=>globalThis.performance?.now?.()??Date.now()),r=null;try{r=globalThis.localStorage}catch{}let s=t.storage===void 0?r:t.storage,i=t.now||Date.now,a=t.indexUrl||Ie,o=t.storageKey||Qr,l=t.indexTtlMs||Kr,c=t.requestTimeoutMs||Xr,u=t.maxIndexBytes||Jt,p=t.maxPageBytes||en,g=t.maxMemoryPages||tn,k=t.maxStorageBytes||Wr,b=a.slice(0,a.lastIndexOf("/")+1),f=new Map,h=new Set,m=new Map,w=new Map,S=null,T={loadCount:0,requestCount:0,responseBytes:0,unavailableCount:0,networkErrorCount:0,lastLoadMs:0,lastParseMs:0,lastContentSource:"",updatedAt:0};function P(E){let A=Number(n())-Number(E);return Number.isFinite(A)&&A>0?A:0}function C(){return Object.freeze({...T,errorRate:T.loadCount?T.unavailableCount/T.loadCount:0})}function D(E,A){if(f.has(E))return f.get(E);let I=A().finally(()=>{f.get(E)===I&&f.delete(E)});return f.set(E,I),I}async function H(E,A){typeof e!="function"&&v("published documentation fetch is unavailable","network"),T.requestCount+=1;let I=new AbortController;h.add(I);let j=setTimeout(()=>I.abort(),c);try{let R=await e(E,{cache:"no-store",credentials:"omit",referrerPolicy:"no-referrer",signal:I.signal});R.ok||v(`published documentation request failed: HTTP ${R.status}`,"network");let B=await ts(R,A);return T.responseBytes+=re(B).byteLength,B}catch(R){throw T.networkErrorCount+=1,R}finally{clearTimeout(j),h.delete(I)}}function y(E,A,I,j){let R=n();try{return x(E,A,I,j)}finally{T.lastParseMs=P(R)}}function L(){return S&&S.expiresAt>i()?Promise.resolve(S):D("index",async()=>{let E=Math.floor(i()/Math.max(1,l)),A=a.includes("?")?"&":"?",I=await H(`${a}${A}v=${E}`,u);return S={index:Kt(I,u),text:I,expiresAt:i()+l},S})}function $(E,A){for(m.delete(E),m.set(E,A);m.size>g;)m.delete(m.keys().next().value)}function d(E,A,I){let j=Yt(s,o,k),R=j.catalogs.find(B=>B.hash===E.index.contentHash);R||(R={hash:E.index.contentHash,indexText:E.text,savedAt:i(),pages:{}},j.catalogs.unshift(R)),R.indexText=E.text,R.savedAt=i(),R.pages[A.page]={text:I,savedAt:i()},ss(s,o,j,k)}function x(E,A,I,j){let R=re(I);(R.byteLength!==A.pageBytes||R.byteLength>p)&&v(`published page ${A.page} byte size does not match`,"hash"),at(R)!==A.pageHash&&v(`published page ${A.page} hash does not match`,"hash");let B=es(I,A);return ns(E.index,A,B,A.requestedLanguage,j)}function _(E,A){let I=`${E.index.contentHash}:${A.page}`,j=m.get(I);return j?($(I,j),Promise.resolve(y(E,A,j,"published-memory"))):D(`page:${I}`,async()=>{let B=encodeURIComponent(A.page),K=`${b}${B}?catalog=${E.index.contentHash}`,ee=await H(K,Math.min(p,A.pageBytes+1));return y(E,A,ee,"published"),$(I,ee),d(E,A,ee),ee}).then(B=>y(E,A,B,"published"))}async function N(E,A){let j=[...Yt(s,o,k).catalogs].sort((R,B)=>Number(B.savedAt||0)-Number(R.savedAt||0));for(let R of j)try{let B=Kt(R.indexText,u),K=Qt(B,E,A),ee=K&&R.pages?.[K.page];if(!K||typeof ee?.text!="string")continue;let ue={index:B,text:R.indexText,expiresAt:0};return y(ue,{...K,requestedLanguage:A},ee.text,"published-cache")}catch{}return null}function G(E,A){return Object.freeze({available:!1,name:E,language_requested:A,content_source:"published-unavailable"})}async function Y(E,A){try{let j=await L(),R=Qt(j.index,E,A);if(!R)return G(E,A);let B={...R,requestedLanguage:A};return await _(j,B)}catch{}return await N(E,A)||G(E,A)}function J(E,A,I={}){let j=String(E||"").trim(),R=rn(A);if(!lt.test(j))return Promise.resolve(Object.freeze({available:!1,name:j,language_requested:R}));let B=`${R}:${j}`,K=w.get(B);if(K&&K.expiresAt>i())return Wt(K.promise,I.signal);let ee=n();T.loadCount+=1;let ue=Y(j,R).catch(()=>G(j,R)).then(Ge=>(T.lastLoadMs=P(ee),T.lastContentSource=String(Ge?.content_source||""),T.updatedAt=Number(i())||0,Ge?.available||(T.unavailableCount+=1),Ge));return w.set(B,{promise:ue,expiresAt:i()+l}),ue.catch(()=>{w.get(B)?.promise===ue&&w.delete(B)}),Wt(ue,I.signal)}function _e(){h.forEach(E=>E.abort()),h.clear(),f.clear(),m.clear(),w.clear(),S=null}return Object.freeze({load:J,clear:_e,diagnostics:C})}var is=new Set(["ko","en","zh"]),as=Ie;function an(t){let e=String(t||"").trim().toLowerCase();return is.has(e)?e:"en"}function on(){return as}function ln(t={}){let e=String(t.indexUrl||Ie),n=sn({fetchImpl:t.fetchImpl,storage:t.storage,now:t.now,indexUrl:e,indexTtlMs:t.indexTtlMs,requestTimeoutMs:t.requestTimeoutMs,maxIndexBytes:t.maxIndexBytes,maxPageBytes:t.maxPageBytes,maxMemoryPages:t.maxMemoryPages,maxStorageBytes:t.maxStorageBytes,clock:t.clock});function r(...a){return n.load(...a)}function s(){n.clear()}function i(){return{...n.diagnostics(),channel:"wiki",indexUrl:e}}return Object.freeze({load:r,clear:s,diagnostics:i})}var Oe=Object.freeze([Object.freeze({id:"description",labelKey:"setting_context_description",labelFallback:"Description",emptyKey:"setting_context_description_empty",emptyFallback:"No detailed description is available yet."}),Object.freeze({id:"popular",labelKey:"setting_context_popular",labelFallback:"Popular",emptyKey:"setting_context_popular_empty",emptyFallback:"No popular-value data is available yet."}),Object.freeze({id:"history",labelKey:"setting_context_history",labelFallback:"History",emptyKey:"setting_context_history_empty",emptyFallback:"No changes have been recorded yet."})]),le=Object.freeze(Oe.map(t=>t.id)),os=0,ut=3,un=10;function ls(t,e,n){let r=String(e??"");return Object.entries(n||{}).forEach(([s,i])=>{r=r.replaceAll(`{${s}}`,String(i))}),r}function cn(t){return Oe.find(e=>e.id===t)||Oe[0]}function cs(t,e){let n=Math.max(0,Number(t)||0);try{return new Intl.NumberFormat(e||void 0,{maximumFractionDigits:0}).format(n)}catch{return String(Math.round(n))}}function pt(t,e,n=le.length){let r=Math.max(1,Number(n)||1),s=Math.max(0,Math.min(r-1,Number(t)||0));return e==="ArrowRight"?(s+1)%r:e==="ArrowLeft"?(s-1+r)%r:e==="Home"?0:e==="End"?r-1:s}function pn(t={}){let e=t.document||globalThis.document;if(!e?.createElement)throw new TypeError("A document is required");let n=typeof t.text=="function"?t.text:ls,r=String(t.locale||"").trim()||void 0,s=`setting-context-${++os}`,i=e.createElement("section");i.className="setting-context",i.setAttribute("aria-label",n("setting_context_aria","Setting information"));let a=e.createElement("div");a.className="setting-context__tabs c-segmented-control",a.setAttribute("role","tablist"),a.setAttribute("aria-label",n("setting_context_tabs_aria","Setting information sections"));let o=new Map,l=new Map,c=new Map;function u(y,L=!1){let $=le.includes(y)?y:le[0];return le.forEach(d=>{let x=d===$,_=o.get(d),N=l.get(d);_.setAttribute("aria-selected",String(x)),_.tabIndex=x?0:-1,N.hidden=!x}),L&&o.get($)?.focus(),i.dataset.activePanel=$,$}Oe.forEach((y,L)=>{let $=e.createElement("button");$.type="button",$.className="setting-context__tab c-segmented-control__item",$.id=`${s}-tab-${y.id}`,$.setAttribute("role","tab"),$.setAttribute("aria-controls",`${s}-panel-${y.id}`),$.setAttribute("aria-selected",String(L===0)),$.tabIndex=L===0?0:-1;let d=e.createElement("span");if(d.className="setting-context__tab-label",d.textContent=n(y.labelKey,y.labelFallback),$.appendChild(d),y.id==="history"){let N=e.createElement("span");N.className="setting-context__tab-count",N.textContent="0",N.setAttribute("aria-label",n("setting_context_history_count","{n} changes",{n:0})),$.appendChild(N)}let x=e.createElement("div");x.className=`setting-context__panel setting-context__panel--${y.id}`,x.id=`${s}-panel-${y.id}`,x.setAttribute("role","tabpanel"),x.setAttribute("aria-labelledby",$.id),x.setAttribute("aria-live","polite"),x.hidden=L!==0;let _=e.createElement("div");_.className="setting-context__content",x.appendChild(_),$.addEventListener("click",()=>u(y.id)),$.addEventListener("keydown",N=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(N.key))return;N.preventDefault();let G=le.indexOf(y.id);u(le[pt(G,N.key)],!0)}),o.set(y.id,$),l.set(y.id,x),c.set(y.id,_),a.appendChild($),i.appendChild(x)}),i.prepend(a);let p=e.createElement("dialog");p.className="setting-context__history-dialog",p.setAttribute("aria-labelledby",`${s}-history-title`);let g=e.createElement("header");g.className="setting-context__dialog-header";let k=e.createElement("h3");k.id=`${s}-history-title`,k.textContent=n("setting_context_history_all_title","All change history");let b=e.createElement("button");b.type="button",b.className="setting-context__dialog-close",b.textContent="×",b.setAttribute("aria-label",n("close","Close"));let f=e.createElement("div");f.className="setting-context__dialog-body",g.append(k,b),p.append(g,f),i.appendChild(p);let h=null;function m(){typeof p.close=="function"&&p.open?p.close():p.removeAttribute("open"),h?.focus()}b.addEventListener("click",m),p.addEventListener("cancel",y=>{y.preventDefault(),m()}),p.addEventListener("click",y=>{y.target===p&&m()});function w(y){let L=o.get("history")?.querySelector(".setting-context__tab-count");if(!L)return;let $=cs(y,r);L.textContent=$,L.setAttribute("aria-label",n("setting_context_history_count","{n} changes",{n:$}))}function S(y,L,$){let d=e.createElement("div");d.className=`setting-context__state setting-context__state--${$}`;let x=e.createElement("strong");return x.textContent=L||n(cn(y).emptyKey,cn(y).emptyFallback),d.appendChild(x),d}function T(y,L,$={}){if(!c.has(y))throw new RangeError(`Unknown setting context panel: ${y}`);let d=c.get(y),x=$.state||"ready";d.replaceChildren(L),d.dataset.state=x,l.get(y).setAttribute("aria-busy",String(x==="loading")),y==="history"&&$.count!==void 0&&w($.count)}function P(y,L=""){T(y,S(y,L||n("setting_context_loading","Loading..."),"loading"),{state:"loading",...y==="history"?{count:0}:{}})}function C(y,L=""){T(y,S(y,L,"empty"),{state:"empty",...y==="history"?{count:0}:{}})}function D(y,L,$={}){if(!L){C(y,$.emptyMessage||"");return}T(y,L,{...$,state:"ready"})}function H(y,L,$={}){let d=Math.max(0,Number($.count)||0);if(!y||d===0){f.replaceChildren(),C("history",$.emptyMessage||"");return}let x=e.createElement("div");if(x.className="setting-context__history-summary",x.appendChild(y),L&&d>Number($.summaryCount||ut)){let _=e.createElement("button");_.type="button",_.className="setting-context__more",_.textContent=n("setting_context_history_all","View all history"),_.addEventListener("click",()=>{h=_,typeof p.showModal=="function"?p.showModal():p.setAttribute("open",""),b.focus()}),x.appendChild(_),f.replaceChildren(L)}else f.replaceChildren();D("history",x,{count:d})}return P("description",n("setting_doc_loading","Loading guide...")),C("popular"),C("history"),u("description"),Object.freeze({root:i,activate:u,getPanel:y=>l.get(y)||null,getContent:y=>c.get(y)||null,setLoading:P,setEmpty:C,setContent:D,setHistoryContent:H,closeHistoryDialog:m})}var hn=le;var gn=Object.freeze({note:Object.freeze(["setting_doc_callout_note","Note"]),tip:Object.freeze(["setting_doc_callout_tip","Tip"]),important:Object.freeze(["setting_doc_callout_important","Important"]),warning:Object.freeze(["setting_doc_callout_warning","Warning"]),caution:Object.freeze(["setting_doc_callout_caution","Caution"])});function us(t,e){return String(e??"")}function Le(t){return Object.freeze({kind:"text",text:String(t??"")})}function M(t,e={}){return Object.freeze({kind:"element",tag:t,className:String(e.className||""),attrs:Object.freeze({...e.attrs||{}}),children:Object.freeze([...e.children||[]])})}function fn(t){return Object.freeze({kind:"fragment",children:Object.freeze(t)})}function Q(t,e){return(Array.isArray(t)?t:[]).map(n=>{switch(n?.type){case"text":return fn([...n.text?[Le(n.text)]:[],...Q(n.children,e)]);case"strong":return M("strong",{children:Q(n.children,e)});case"em":return M("em",{children:Q(n.children,e)});case"del":return M("del",{children:Q(n.children,e)});case"code":return M("code",{children:[Le(n.text)]});case"break":return M("br");case"link":{let r=it(n.href);if(!r)throw new TypeError("Unsafe documentation link");let s=/^https?:/i.test(r);return M("a",{attrs:{href:r,...n.title?{title:n.title}:{},...s?{target:"_blank",rel:"noopener noreferrer"}:{}},children:Q(n.children,e)})}case"image":{let r=it(n.href);if(!r)throw new TypeError("Unsafe documentation image");return M("img",{attrs:{src:r,alt:n.alt,loading:"lazy",decoding:"async",...n.title?{title:n.title}:{}}})}default:throw new TypeError(`Unsupported documentation inline node: ${n?.type||"unknown"}`)}})}function Pe(t,e){let n=e.text;return(Array.isArray(t)?t:[]).map(r=>{switch(r?.type){case"heading":{let s=Math.max(2,Math.min(6,Number(r.depth)||2));return M(`h${s}`,{children:Q(r.children,e)})}case"paragraph":return M("p",{children:Q(r.children,e)});case"list":{let s=r.ordered?"ol":"ul";return M(s,{attrs:r.ordered&&Number(r.start)!==1?{start:String(r.start)}:{},children:(r.items||[]).map(i=>{let a=i.task?[M("input",{className:"setting-doc-task",attrs:{type:"checkbox",disabled:!0,...i.checked?{checked:!0}:{}}})]:[];return M("li",{className:i.task?"setting-doc-task-item":"",children:[...a,...Pe(i.children,e)]})})})}case"table":{let s=M("tr",{children:(r.header||[]).map((a,o)=>M("th",{attrs:{scope:"col",...r.align?.[o]?{"data-align":r.align[o]}:{}},children:Q(a,e)}))}),i=(r.rows||[]).map(a=>M("tr",{children:a.map((o,l)=>M("td",{attrs:r.align?.[l]?{"data-align":r.align[l]}:{},children:Q(o,e)}))}));return M("div",{className:"setting-doc-table-wrap",children:[M("table",{children:[M("thead",{children:[s]}),M("tbody",{children:i})]})]})}case"callout":{let s=gn[r.tone]?r.tone:"note",[i,a]=gn[s];return M("aside",{className:`setting-doc-callout setting-doc-callout--${s}`,attrs:{role:"note"},children:[M("strong",{className:"setting-doc-callout__label",children:[Le(n(i,a))]}),...Pe(r.children,e)]})}case"code_block":return M("pre",{children:[M("code",{attrs:r.language?{"data-language":r.language}:{},children:[Le(r.text)]})]});case"separator":return M("hr");case"details":return M("details",{attrs:r.open?{open:!0}:{},children:[M("summary",{children:Q(r.summary,e)}),...Pe(r.children,e)]});default:throw new TypeError(`Unsupported documentation block node: ${r?.type||"unknown"}`)}})}function ht(t,e,n){if(n.kind==="text"){e.appendChild(t.createTextNode(n.text));return}if(n.kind==="fragment"){n.children.forEach(s=>ht(t,e,s));return}let r=t.createElement(n.tag);n.className&&(r.className=n.className),Object.entries(n.attrs).forEach(([s,i])=>{i===!1||i==null||(r.setAttribute(s,i===!0?"":String(i)),s==="checked"&&(r.checked=!0),s==="disabled"&&(r.disabled=!0))}),n.children.forEach(s=>ht(t,r,s)),e.appendChild(r)}function ce(t,e){(Array.isArray(t)?t:[]).forEach(n=>{if(Array.isArray(n)){ce(n,e);return}!n||typeof n!="object"||(typeof n.text=="string"&&e.push(n.text),typeof n.alt=="string"&&e.push(n.alt),ce(n.children,e),ce(n.summary,e),ce(n.items,e),ce(n.header,e),(n.rows||[]).forEach(r=>ce(r,e)))})}function gt(t,e={}){let n=typeof e.text=="function"?e.text:us;return fn(Pe(t,{text:n}))}function dn(t,e,n={}){if(!t?.createElement||!t?.createTextNode)throw new TypeError("A document is required");let r=t.createElement("article");return r.className="setting-doc-markdown setting-doc-ast",ht(t,r,gt(e,n)),r}function mn(t){let e=[];return ce(t,e),e.join(" ").replace(/\s+/g," ").trim()}var je=Object.freeze({web_ui:"setting_history_source_web",profile:"setting_history_source_profile",restore:"setting_history_source_restore",reset_defaults:"setting_history_source_reset",intro:"setting_history_source_intro",undo:"setting_history_source_undo",device:"setting_history_source_device",unknown:"setting_history_source_unknown"});function ps(t,e,n){let r=String(e??"");return n?r.replace(/\{(\w+)\}/g,(s,i)=>Object.prototype.hasOwnProperty.call(n,i)?String(n[i]):s):r}function dt(t){let e=Number(t);if(!Number.isFinite(e)||e<=0)return"";try{return new Date(e*1e3).toISOString()}catch{return""}}function mt(t,e={}){let n=Number(t),r=dt(n);if(!r)return{iso:"",absolute:""};let s=e.locale||void 0,i="";try{i=new Date(n*1e3).toLocaleString(s,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}catch{i=r}return{iso:r,absolute:i}}function ft(t,e){return typeof t=="function"?t:e}function hs(t,e){let n=e.escape,{iso:r,absolute:s}=mt(t?.ts,e);return r?``:'-'}function bn(t,e={}){let n=ft(e.escape,c=>String(c??"")),r=ft(e.text,ps),s=ft(e.formatValue,c=>String(c??"")),i=(c,u)=>typeof e.formatFor=="function"?e.formatFor(c,u):s(u),a=Array.isArray(t)?t:[],o=`
${n(r("setting_history_title","수정이력"))}`+(a.length?`${n(r("setting_history_count","최근 {n}건",{n:a.length}))}`:"")+"
";if(!a.length)return`
${o}
${n(r("setting_history_empty","기록된 변경이 없습니다."))}
`;let l=a.map((c,u)=>{let p=String(c?.source||"unknown"),g=je[p]||je.unknown,k=`${n(r(g,p))}`,b=c?.engaged?`${n(r("setting_history_engaged","주행중"))}`:"",f=u===0&&!e.withName?``:"",h=typeof e.displayName=="function"?e.displayName(c):c?.name;return'
'+(e.withName&&h?`${n(h)}`:"")+`${n(i(c,c?.prev))}${n(i(c,c?.next))}${hs(c,{...e,escape:n})}${k}${b}${f}
`}).join("");return`
${o}
${l}
`}function xn(t){return{min:Number(t?.min),max:Number(t?.max)}}function xe(t,e){if(e==null||e==="")return null;let{min:n,max:r}=xn(t),s=String(e).trim().toLowerCase();if(n===0&&r===1){if(s==="1"||s==="true"||s==="on")return 1;if(s==="0"||s==="false"||s==="off")return 0}let i=Number(e);return Number.isFinite(i)?i:null}function Me(t,e){let{min:n,max:r}=xn(t);if(!Number.isFinite(n)||!Number.isFinite(r))return!0;let s=xe(t,e);return s===null?!1:s>=n&&s<=r}function bt(t,e,n,r={}){let s=typeof r.formatValue=="function"?r.formatValue:f=>String(f??""),i=r.locale,a=Number(r.aIndex||0),o=Number(r.bIndex||0),l=Number(e?.count??0),c=Number(n?.count??0),u=Number.isFinite(l)?l:0,p=Number.isFinite(c)?c:0;if(u!==p)return p-u;let g=xe(t,e?.value),k=xe(t,n?.value);if(g!==null&&k!==null&&g!==k)return g-k;if(g!==null&&k===null)return-1;if(g===null&&k!==null)return 1;let b=String(s(e?.value)).localeCompare(String(s(n?.value)),i,{numeric:!0,sensitivity:"base"});return b!==0?b:a-o}function kn(t,e,n={}){if(!e||typeof e!="object")return null;let r=Number(e.sample??e.sample_count??0);if(!Number.isFinite(r)||r<1||!Me(t,e.value))return null;let s=Array.isArray(e.top_values)?e.top_values.map((i,a)=>({item:i,index:a})).filter(({item:i})=>{let a=Number(i?.count??0);return Number.isFinite(a)&&a>0&&Me(t,i?.value)}).sort((i,a)=>bt(t,i.item,a.item,{...n,aIndex:i.index,bIndex:a.index})).slice(0,10).map(({item:i})=>i):[];return{...e,top_values:s}}function ke(t){let e=Array.isArray(t?.top_values)?t.top_values:[],n=Number(e[0]?.count??t?.top_count??t?.count??0);return Number.isFinite(n)?n:0}function De(t){let e=Array.isArray(t?.top_values)?t.top_values:[];if(!e.length)return[];let n=ke(t);if(n<2)return[];let r=e.filter(s=>{let i=Number(s?.count??0);return Number.isFinite(i)&&i===n});return r.length<=2?r:[]}function xt(t,e,n){let r=String(e??"");if(n)for(let[s,i]of Object.entries(n))r=r.replaceAll(`{${s}}`,String(i));return r}function ye(t){return String(t??"")}function yn(t,e){let n=De(t);if(!n.length)return null;let r=ke(t),s=n.map(i=>e(i?.value)).filter(Boolean);return!r||!s.length?null:{sample:r,values:s}}function _n(t,e={}){let n=e.formatValue||ye,r=e.text||xt,s=yn(t,n);if(!s)return"";let i=r("setting_popular_value_chip_label","내 차종 인기값");return s.values.length===1?r("setting_popular_value_chip","{label} ({sample}대) {value}",{label:i,sample:s.sample,value:s.values[0]}):r("setting_popular_value_chip_tied","{label} (각 {sample}대) {values}",{label:i,sample:s.sample,values:s.values.join(" · ")})}function wn(t,e={}){let n=e.formatValue||ye,r=e.text||xt,s=e.escape||ye,i=yn(t,n);if(!i)return"";let a=i.values.length===1?r("setting_popular_value_chip_sample","{sample}대",{sample:i.sample}):r("setting_popular_value_chip_each_sample","각 {sample}대",{sample:i.sample});return` ${s(r("setting_popular_value_chip_label","내 차종 인기값"))} (${s(a)}) ${s(i.values.join(" · "))} - `}function Sn(t,e={}){let n=e.formatValue||ye,r=e.text||xt,s=e.escape||ye,i=String(e.title||""),a=String(e.updatedText||""),o=Array.isArray(t?.top_values)?t.top_values:[];if(!o.length)return``;let l=o.map(g=>Number(g?.count??0)).filter(g=>Number.isFinite(g)&&g>0),c=Math.max(1,...l),u=o.map(g=>{let k=n(g?.value),m=Number(g?.count??0),f=Number.isFinite(m)?Math.max(0,m):0,h=r("setting_popular_value_chip_sample","{sample} vehicles",{sample:f});return` + `}function Sn(t,e={}){let n=e.formatValue||ye,r=e.text||xt,s=e.escape||ye,i=String(e.title||""),a=String(e.updatedText||""),o=Array.isArray(t?.top_values)?t.top_values:[];if(!o.length)return``;let l=o.map(g=>Number(g?.count??0)).filter(g=>Number.isFinite(g)&&g>0),c=Math.max(1,...l),u=o.map(g=>{let k=n(g?.value),b=Number(g?.count??0),f=Number.isFinite(b)?Math.max(0,b):0,h=r("setting_popular_value_chip_sample","{sample} vehicles",{sample:f});return` `:"";return`
${s}
${i}
`+ds(t,n,r)+o+`
${a}
`}function ms(t){return typeof t=="object"&&t!==null}function En(t){return Array.isArray(t?.entries)?t.entries:[]}function Tn(t,e){let n=ms(e)?e:{},r={};for(let s of En(t)){let i=s?.key;s?.apply&&i!=null&&Object.prototype.hasOwnProperty.call(n,i)&&(r[i]=n[i])}return r}function $n(t){let e=new Set((t?.result?.fails||[]).map(r=>String(r?.key||"")).filter(Boolean)),n={};for(let r of En(t?.preview)){let s=r?.key;!r?.apply||s==null||e.has(String(s))||(n[s]=r.value)}return n}var bs=Object.freeze(["high","medium"]),Nn=Object.freeze({high:"setting_risk_high",medium:"setting_risk_medium"}),xs=Object.freeze({high:"danger",medium:"warning"});function kt(t){let e=String(t?.risk||"").trim().toLowerCase();return bs.includes(e)?e:null}function Cn(t,e={}){let n=kt(t);if(!n)return"";let r=typeof e.escape=="function"?e.escape:o=>String(o??""),s=typeof e.text=="function"?e.text:(o,l)=>l,i=n==="high"?s(Nn.high,"주의"):s(Nn.medium,"참고");return`${r(i)}`}function ks(t){return String(t??"")}function Rn(t,e,n={}){let r=typeof n.escape=="function"?n.escape:ks,s=n.markClass||"setting-search-result__mark",i=String(t??""),a=String(e||"").trim().toLowerCase();if(!i||!a)return r(i);let o=i.toLowerCase().indexOf(a);if(o<0)return r(i);let l=o+a.length;return`${r(i.slice(0,o))}${r(i.slice(o,l))}${r(i.slice(l))}`}function Be(...t){return t.flat().filter(Boolean).join(" ")}function ys(t){return Number.isFinite(Number(t))}function _s(t,e){return!!e&&String(t||"").startsWith(e)}function ws(t,e){return!!e&&String(t||"").startsWith(e)}function In(t={}){let e=Array.isArray(t.groups)?t.groups:[],n=String(t.currentGroup||""),r=t.ids||{},s=typeof t.getGroupLabel=="function"?t.getGroupLabel:l=>String(l||""),i=String(t.profilesLabel||"Profiles"),a=e.map((l,c)=>{let u=String(l?.group||""),p=ws(u,r.categoryDividerPrefix||""),g=u===r.profilesDivider||p,k=String(g?l?.label||i:s(u));if(g)return Object.freeze({kind:"divider",key:u||`divider:${c}`,label:k,categoryDivider:p,index:c});let m=ys(l?.count)?Number(l.count):null;return Object.freeze({kind:"group",key:u,group:u,label:k,count:m,title:m===null?k:`${k} (${m})`,favorite:u===r.favoritesGroup,profile:_s(u,r.profileGroupPrefix||""),active:u===n,index:c})}),o=JSON.stringify(a.map(l=>l.kind==="divider"?[l.kind,l.key,l.label,l.categoryDivider]:[l.kind,l.key,l.label,l.count,l.favorite,l.profile]));return Object.freeze({entries:Object.freeze(a),signature:o})}function Ss(t,e){let n=t.ownerDocument,r=n.createElement("span"),s=n.createElement("strong"),i=n.createElement("span");s.textContent=e,t.replaceChildren(r,s,i)}function vs(t,e){let n=t.ownerDocument.createElement("span");n.className="setting-group-label",n.textContent=e,t.replaceChildren(n)}function zn(t,e,n){t.onclick=null,e.kind==="divider"?(t.className=Be("setting-profile-divider",e.categoryDivider&&"setting-category-divider",n&&"ui-stagger-item"),t.removeAttribute("data-group"),t.removeAttribute("title"),Ss(t,e.label)):(t.className=Be("btn","groupBtn",e.favorite&&"groupBtn--favorites",e.profile&&"groupBtn--profile",e.active&&"active",n&&"ui-stagger-item"),t.dataset.group=e.group,t.title=e.title,vs(t,e.title)),n?t.style.setProperty("--i",String(e.index)):t.style.removeProperty("--i")}function On(t,e,n={}){if(!t||!e)return Object.freeze({reused:!1,count:0});let r=n.animate===!0,s=Array.isArray(e.entries)?e.entries:[];if(!r&&t.dataset.groupsSignature===e.signature&&t.children.length===s.length)return s.forEach((o,l)=>zn(t.children[l],o,!1)),Object.freeze({reused:!0,count:s.length});let a=t.ownerDocument.createDocumentFragment();return s.forEach(o=>{let l=t.ownerDocument.createElement(o.kind==="divider"?"div":"button");o.kind==="group"&&(l.type="button"),zn(l,o,r),a.appendChild(l)}),t.replaceChildren(a),t.dataset.groupsSignature=e.signature,Object.freeze({reused:!1,count:s.length})}function Pn(t={}){let e=Array.isArray(t.entries)?t.entries:[],n=String(t.group||""),r=t.detailMode===!0,s=t.profile||null,i=!r&&t.favoriteMode===!0,a=typeof t.getSectionLabel=="function"?t.getSectionLabel:()=>"",o=typeof t.getGroupLabel=="function"?t.getGroupLabel:k=>String(k||""),l=typeof t.getProfileSectionExpanded=="function"?t.getProfileSectionExpanded:()=>!0,c=new Map;s&&e.forEach(k=>{let m=String(k?.group||n);c.set(m,(c.get(m)||0)+1)});let u=null,p="",g=e.map((k,m)=>{let f=k?.item||null,h=String(k?.group||n),b=null;if(m===0&&r)b={kind:"detail",staggerIndex:1};else if(m===0&&i)b={kind:"favorites",staggerIndex:1};else if(!r&&s&&h!==p){p=h;let w=`${s.id}:${h}`;b={kind:"profile",key:w,label:o(h),count:c.get(h)||0,expanded:l(w)!==!1,staggerIndex:Math.min(m+1,14)}}else if(!r&&!s&&!i&&f?.__section){let w=String(f.__section.id||"");w!==u&&(u=w,b={kind:"category",key:w,label:String(a(f.__section)||""),staggerIndex:Math.min(m+1,14)})}return Object.freeze({entry:k,item:f,originGroup:h,index:m,section:b?Object.freeze(b):null})});return Object.freeze({rows:Object.freeze(g)})}function Ln(t,e={}){let n=t.ownerDocument.createElement("div");n.className="setting-favorites-empty";let r=t.ownerDocument.createElement("div");r.className="setting-favorites-empty__title",r.textContent=String(e.title||"");let s=t.ownerDocument.createElement("div");return s.className="setting-favorites-empty__desc",s.textContent=String(e.description||""),n.append(r,s),t.appendChild(n),n}function As(t,e,n){let r=t.ownerDocument,s=r.createElement("section");if(s.className=Be("setting-section-block",n&&"ui-stagger-item"),e.kind==="category"&&(s.dataset.settingSectionId=e.key),n&&s.style.setProperty("--i",String(e.staggerIndex)),e.label){let o=r.createElement("div");o.className="setting-group-card__title",o.textContent=e.label,s.appendChild(o)}let i=r.createElement("div");i.className="setting-group-card";let a=r.createElement("div");return a.className="setting-group-card__body",i.appendChild(a),s.appendChild(i),t.appendChild(s),Object.freeze({section:s,body:a,header:null})}function Es(t,e,n){let r=t.ownerDocument,s=r.createElement("div");s.className=Be("setting-section-block","setting-profile-section",n&&"ui-stagger-item",!e.expanded&&"is-collapsed"),n&&s.style.setProperty("--i",String(e.staggerIndex));let i=r.createElement("button");i.type="button",i.className="setting-profile-section__header",i.setAttribute("aria-expanded",e.expanded?"true":"false");let a=r.createElement("span");a.className="setting-profile-section__label",a.textContent=e.label;let o=r.createElement("span");o.className="setting-profile-section__count",o.textContent=String(e.count);let l=r.createElementNS("http://www.w3.org/2000/svg","svg");l.classList.add("setting-profile-section__chevron"),l.setAttribute("viewBox","0 0 24 24"),l.setAttribute("aria-hidden","true"),l.setAttribute("focusable","false");let c=r.createElementNS("http://www.w3.org/2000/svg","path");c.setAttribute("d","m6 9 6 6 6-6"),l.appendChild(c),i.append(a,o,l);let u=r.createElement("div");u.className="setting-profile-section__body";let p=r.createElement("div");return p.className="setting-group-card setting-group-card__body setting-profile-section__bodyInner",u.appendChild(p),s.append(i,u),t.appendChild(s),Object.freeze({section:s,body:p,header:i})}function jn(t,e,n={}){if(!t||!e)return null;let r=n.animate===!0;return e.kind==="profile"?Es(t,e,r):As(t,e,r)}var Ts="carrot:settings-store";function $s(t){if(!t||typeof t!="object"||!t.settings)throw new Error("Invalid settings snapshot");return t}function Mn(t){let e=t?.loadSnapshot,n=t?.eventTarget||null,r=t?.now||(()=>performance.now());if(typeof e!="function")throw new TypeError("loadSnapshot must be a function");let s=new Set,i={status:"idle",snapshot:null,promise:null,error:null,requestedAt:0,resolvedAt:0};function a(){return Object.freeze({status:i.status,snapshot:i.snapshot,error:i.error,requestedAt:i.requestedAt,resolvedAt:i.resolvedAt})}function o(){let g=a();s.forEach(m=>{try{m(g)}catch{}});let k=n?.CustomEvent||globalThis.CustomEvent;typeof n?.dispatchEvent=="function"&&typeof k=="function"&&n.dispatchEvent(new k(Ts,{detail:g}))}function l(g={}){if(!(g.force===!0)&&i.snapshot)return Promise.resolve(i.snapshot);if(i.promise)return i.promise;i.status="loading",i.error=null,i.requestedAt=r();let m=Promise.resolve().then(e).then($s).then(f=>(i.snapshot=f,i.status="ready",i.resolvedAt=r(),o(),f)).catch(f=>{throw i.status="error",i.error=f?.message||String(f||"unknown"),o(),f}).finally(()=>{i.promise=null});return i.promise=m,o(),m}function c(){return l().catch(()=>null)}function u(){return i.snapshot}function p(g){return typeof g!="function"?()=>{}:(s.add(g),()=>s.delete(g))}return Object.freeze({load:l,preload:c,peek:u,subscribe:p,getState:a,get status(){return i.status},get requestedAt(){return i.requestedAt},get resolvedAt(){return i.resolvedAt}})}function Dn(t={}){let e=t.now||(()=>Date.now()),n=Number.isFinite(t.defaultTtlMs)?t.defaultTtlMs:6e4,r=new Map,s=new Map,i=new Map,a=new Map,o=0;function l(h,b){return h>0&&e()-h{r.set(T,{value:P,loadedAt:w})})}function k(h){if(!h||typeof h!="object")return;let b=e();Object.entries(h).forEach(([w,S])=>{r.set(w,{value:S,loadedAt:b})});for(let w of s.values()){let S=!1;Object.entries(h).forEach(([T,P])=>{T in w.values&&(w.values[T]=P,S=!0)}),S&&(w.loadedAt=b)}}function m(h){let b=Array.isArray(h)?h.filter(Boolean):[],w={},S=b.length>0;return b.forEach(T=>{let P=r.get(T);if(!P){S=!1;return}w[T]=P.value}),Object.freeze({values:w,complete:S})}function f(h,b={}){if(!h)return Promise.resolve({});let w=Array.isArray(b.names)?b.names.filter(Boolean):[],S=b.force===!0,T=Number.isFinite(b.ttlMs)?b.ttlMs:n,P=b.fetchMissing;if(!w.length)return g(h,{}),Promise.resolve({});S&&i.has(h)&&(a.set(h,(a.get(h)||0)+1),i.delete(h));let C=s.get(h);if(!S&&C&&l(C.loadedAt,T))return Promise.resolve({...C.values});if(!S&&i.has(h))return i.get(h);let D={},H=[];if(w.forEach(d=>{let x=r.get(d);!S&&x&&l(x.loadedAt,T)?D[d]=x.value:H.push(d)}),!H.length)return g(h,D),Promise.resolve({...D});if(typeof P!="function")return Promise.reject(new TypeError("fetchMissing must be a function when values are missing"));let y=o,L=a.get(h)||0,$=Promise.resolve().then(()=>P(H.slice())).then(d=>{let x={...D,...d||{}};return o===y&&(a.get(h)||0)===L&&g(h,x),{...x}}).finally(()=>{i.get(h)===$&&i.delete(h)});return i.set(h,$),$}return Object.freeze({clear:c,invalidateGroup:u,setValue:p,primeGroup:g,applyValues:k,peekValues:m,loadGroup:f,defaultTtlMs:n})}var Bn=new WeakMap;function Ns(t){if(!t||typeof t!="object"&&typeof t!="function")throw new TypeError("Settings runtime target must be an object");return t}function Gn(t=globalThis,e={}){let n=Ns(t),r=Bn.get(n);if(r)return r;let s=Mn({loadSnapshot:e.loadSnapshot||yt(n),eventTarget:e.eventTarget||n,now:e.now}),i=vt(e.auxLoaders||_t(n)),a=ln({fetchImpl:typeof n.fetch=="function"?n.fetch.bind(n):null,indexUrl:on()}),o=Et();s.subscribe(u=>{u.status==="ready"&&u.snapshot&&i.hydrateSnapshot(u.snapshot)});let l=Object.freeze({store:s,aux:i,catalog:At(),derived:Object.freeze({createModel:He,getModel:o.get,localizedNodeLabel:fe,localizedItemText:Se,ids:V}),entry:Object.freeze({createController:Tt}),docs:Object.freeze({load:a.load,clear:a.clear,diagnostics:a.diagnostics,normalizeLanguage:an,createView:gt,renderAst:dn,plainText:mn}),context:Object.freeze({create:pn,resolveTabIndex:pt,tabs:hn,historyFetchLimit:un,historyPreviewLimit:ut}),profiles:Object.freeze({selectApplyValues:Tn,collectRestoredValues:$n}),search:Object.freeze({highlight:Rn}),fingerprint:Object.freeze({renderSummary:An}),risk:Object.freeze({level:kt,renderBadge:Cn}),popular:Object.freeze({normalizeNumeric:xe,isInRange:Me,compareItems:bt,buildDisplayEntry:kn,primaryCount:ke,summaryValues:De,renderChipText:_n,renderChipHtml:wn,renderDetailHtml:Sn}),history:Object.freeze({renderHtml:bn,formatTimestamp:mt,toIso:dt,sourceLabelKeys:je}),view:Object.freeze({appendItemSection:jn,createGroupPlan:In,createItemLayoutPlan:Pn,renderEmptyState:Ln,renderGroupList:On}),values:Dn()}),c=Object.freeze({store:s,runtime:l});return n.CarrotSettingsStore=s,n.CarrotSettingsRuntime=l,Bn.set(n,c),e.preload!==!1&&s.preload(),c}Gn(globalThis);})(); + `}function vn(t,e,n){let r=String(e??"");if(n)for(let[s,i]of Object.entries(n))r=r.replaceAll(`{${s}}`,String(i));return r}function gs(t){return String(t??"")}function fs(t,e=vn){return t?t.valid?e("setting_fingerprint_intact","기록 {n}건 · 이상 없음",{n:t.checked??0}):e("setting_fingerprint_broken","기록이 손상됨 ({n})",{n:(t.broken_at??0)+1}):""}function ds(t,e,n){if(!t.baseline)return"";if(t.changed){let r=n("setting_fingerprint_changed","기준 이후 {n}개 바뀜",{n:t.changed_count??0});return`
${e(r)}
`}return`
${e(n("setting_fingerprint_same","기준과 같아요"))}
`}function An(t={},e={}){let n=typeof e.escape=="function"?e.escape:gs,r=typeof e.text=="function"?e.text:vn,s=n(t.fingerprint||"-"),i=n(r("setting_fingerprint_hint","설정이 같으면 코드도 같아요")),a=`${n(r("setting_fingerprint_count","설정 {n}개",{n:t.count??0}))} · ${n(fs(t.integrity,r))}`,o=t.baseline&&t.changed?``:"";return`
${s}
${i}
`+ds(t,n,r)+o+`
${a}
`}function ms(t){return typeof t=="object"&&t!==null}function En(t){return Array.isArray(t?.entries)?t.entries:[]}function Tn(t,e){let n=ms(e)?e:{},r={};for(let s of En(t)){let i=s?.key;s?.apply&&i!=null&&Object.prototype.hasOwnProperty.call(n,i)&&(r[i]=n[i])}return r}function $n(t){let e=new Set((t?.result?.fails||[]).map(r=>String(r?.key||"")).filter(Boolean)),n={};for(let r of En(t?.preview)){let s=r?.key;!r?.apply||s==null||e.has(String(s))||(n[s]=r.value)}return n}var bs=Object.freeze(["high","medium"]),Nn=Object.freeze({high:"setting_risk_high",medium:"setting_risk_medium"}),xs=Object.freeze({high:"warning",medium:"warning"});function kt(t){let e=String(t?.risk||"").trim().toLowerCase();return bs.includes(e)?e:null}function Cn(t,e={}){let n=kt(t);if(!n)return"";let r=typeof e.escape=="function"?e.escape:o=>String(o??""),s=typeof e.text=="function"?e.text:(o,l)=>l,i=n==="high"?s(Nn.high,"주의"):s(Nn.medium,"참고");return`${r(i)}`}function ks(t){return String(t??"")}function Rn(t,e,n={}){let r=typeof n.escape=="function"?n.escape:ks,s=n.markClass||"setting-search-result__mark",i=String(t??""),a=String(e||"").trim().toLowerCase();if(!i||!a)return r(i);let o=i.toLowerCase().indexOf(a);if(o<0)return r(i);let l=o+a.length;return`${r(i.slice(0,o))}${r(i.slice(o,l))}${r(i.slice(l))}`}function Be(...t){return t.flat().filter(Boolean).join(" ")}function ys(t){return Number.isFinite(Number(t))}function _s(t,e){return!!e&&String(t||"").startsWith(e)}function ws(t,e){return!!e&&String(t||"").startsWith(e)}function In(t={}){let e=Array.isArray(t.groups)?t.groups:[],n=String(t.currentGroup||""),r=t.ids||{},s=typeof t.getGroupLabel=="function"?t.getGroupLabel:l=>String(l||""),i=String(t.profilesLabel||"Profiles"),a=e.map((l,c)=>{let u=String(l?.group||""),p=ws(u,r.categoryDividerPrefix||""),g=u===r.profilesDivider||p,k=String(g?l?.label||i:s(u));if(g)return Object.freeze({kind:"divider",key:u||`divider:${c}`,label:k,categoryDivider:p,index:c});let b=ys(l?.count)?Number(l.count):null;return Object.freeze({kind:"group",key:u,group:u,label:k,count:b,title:k,favorite:u===r.favoritesGroup,profile:_s(u,r.profileGroupPrefix||""),active:u===n,index:c})}),o=JSON.stringify(a.map(l=>l.kind==="divider"?[l.kind,l.key,l.label,l.categoryDivider]:[l.kind,l.key,l.label,l.count,l.favorite,l.profile]));return Object.freeze({entries:Object.freeze(a),signature:o})}function Ss(t,e){let n=t.ownerDocument,r=n.createElement("span"),s=n.createElement("strong"),i=n.createElement("span");s.textContent=e,t.replaceChildren(r,s,i)}function vs(t,e){let n=t.ownerDocument.createElement("span");n.className="setting-group-label",n.textContent=e,t.replaceChildren(n)}function zn(t,e,n){t.onclick=null,e.kind==="divider"?(t.className=Be("setting-profile-divider",e.categoryDivider&&"setting-category-divider",n&&"ui-stagger-item"),t.removeAttribute("data-group"),t.removeAttribute("title"),Ss(t,e.label)):(t.className=Be("btn","groupBtn",e.favorite&&"groupBtn--favorites",e.profile&&"groupBtn--profile",e.active&&"active",n&&"ui-stagger-item"),t.dataset.group=e.group,t.title=e.title,vs(t,e.title)),n?t.style.setProperty("--i",String(e.index)):t.style.removeProperty("--i")}function On(t,e,n={}){if(!t||!e)return Object.freeze({reused:!1,count:0});let r=n.animate===!0,s=Array.isArray(e.entries)?e.entries:[];if(!r&&t.dataset.groupsSignature===e.signature&&t.children.length===s.length)return s.forEach((o,l)=>zn(t.children[l],o,!1)),Object.freeze({reused:!0,count:s.length});let a=t.ownerDocument.createDocumentFragment();return s.forEach(o=>{let l=t.ownerDocument.createElement(o.kind==="divider"?"div":"button");o.kind==="group"&&(l.type="button"),zn(l,o,r),a.appendChild(l)}),t.replaceChildren(a),t.dataset.groupsSignature=e.signature,Object.freeze({reused:!1,count:s.length})}function Pn(t={}){let e=Array.isArray(t.entries)?t.entries:[],n=String(t.group||""),r=t.detailMode===!0,s=t.profile||null,i=!r&&t.favoriteMode===!0,a=typeof t.getSectionLabel=="function"?t.getSectionLabel:()=>"",o=typeof t.getGroupLabel=="function"?t.getGroupLabel:k=>String(k||""),l=typeof t.getProfileSectionExpanded=="function"?t.getProfileSectionExpanded:()=>!0,c=new Map;s&&e.forEach(k=>{let b=String(k?.group||n);c.set(b,(c.get(b)||0)+1)});let u=null,p="",g=e.map((k,b)=>{let f=k?.item||null,h=String(k?.group||n),m=null;if(b===0&&r)m={kind:"detail",staggerIndex:1};else if(b===0&&i)m={kind:"favorites",staggerIndex:1};else if(!r&&s&&h!==p){p=h;let w=`${s.id}:${h}`;m={kind:"profile",key:w,label:o(h),count:c.get(h)||0,expanded:l(w)!==!1,staggerIndex:Math.min(b+1,14)}}else if(!r&&!s&&!i&&f?.__section){let w=String(f.__section.id||"");w!==u&&(u=w,m={kind:"category",key:w,label:String(a(f.__section)||""),staggerIndex:Math.min(b+1,14)})}return Object.freeze({entry:k,item:f,originGroup:h,index:b,section:m?Object.freeze(m):null})});return Object.freeze({rows:Object.freeze(g)})}function Ln(t,e={}){let n=t.ownerDocument.createElement("div");n.className="setting-favorites-empty";let r=t.ownerDocument.createElement("div");r.className="setting-favorites-empty__title",r.textContent=String(e.title||"");let s=t.ownerDocument.createElement("div");return s.className="setting-favorites-empty__desc",s.textContent=String(e.description||""),n.append(r,s),t.appendChild(n),n}function As(t,e,n){let r=t.ownerDocument,s=r.createElement("section");if(s.className=Be("setting-section-block",n&&"ui-stagger-item"),e.kind==="category"&&(s.dataset.settingSectionId=e.key),n&&s.style.setProperty("--i",String(e.staggerIndex)),e.label){let o=r.createElement("div");o.className="setting-group-card__title",o.textContent=e.label,s.appendChild(o)}let i=r.createElement("div");i.className="setting-group-card";let a=r.createElement("div");return a.className="setting-group-card__body",i.appendChild(a),s.appendChild(i),t.appendChild(s),Object.freeze({section:s,body:a,header:null})}function Es(t,e,n){let r=t.ownerDocument,s=r.createElement("div");s.className=Be("setting-section-block","setting-profile-section",n&&"ui-stagger-item",!e.expanded&&"is-collapsed"),n&&s.style.setProperty("--i",String(e.staggerIndex));let i=r.createElement("button");i.type="button",i.className="setting-profile-section__header",i.setAttribute("aria-expanded",e.expanded?"true":"false");let a=r.createElement("span");a.className="setting-profile-section__label",a.textContent=e.label;let o=r.createElement("span");o.className="setting-profile-section__count",o.textContent=String(e.count);let l=r.createElementNS("http://www.w3.org/2000/svg","svg");l.classList.add("setting-profile-section__chevron"),l.setAttribute("viewBox","0 0 24 24"),l.setAttribute("aria-hidden","true"),l.setAttribute("focusable","false");let c=r.createElementNS("http://www.w3.org/2000/svg","path");c.setAttribute("d","m6 9 6 6 6-6"),l.appendChild(c),i.append(a,o,l);let u=r.createElement("div");u.className="setting-profile-section__body";let p=r.createElement("div");return p.className="setting-group-card setting-group-card__body setting-profile-section__bodyInner",u.appendChild(p),s.append(i,u),t.appendChild(s),Object.freeze({section:s,body:p,header:i})}function jn(t,e,n={}){if(!t||!e)return null;let r=n.animate===!0;return e.kind==="profile"?Es(t,e,r):As(t,e,r)}var Ts="carrot:settings-store";function $s(t){if(!t||typeof t!="object"||!t.settings)throw new Error("Invalid settings snapshot");return t}function Mn(t){let e=t?.loadSnapshot,n=t?.eventTarget||null,r=t?.now||(()=>performance.now());if(typeof e!="function")throw new TypeError("loadSnapshot must be a function");let s=new Set,i={status:"idle",snapshot:null,promise:null,error:null,requestedAt:0,resolvedAt:0};function a(){return Object.freeze({status:i.status,snapshot:i.snapshot,error:i.error,requestedAt:i.requestedAt,resolvedAt:i.resolvedAt})}function o(){let g=a();s.forEach(b=>{try{b(g)}catch{}});let k=n?.CustomEvent||globalThis.CustomEvent;typeof n?.dispatchEvent=="function"&&typeof k=="function"&&n.dispatchEvent(new k(Ts,{detail:g}))}function l(g={}){if(!(g.force===!0)&&i.snapshot)return Promise.resolve(i.snapshot);if(i.promise)return i.promise;i.status="loading",i.error=null,i.requestedAt=r();let b=Promise.resolve().then(e).then($s).then(f=>(i.snapshot=f,i.status="ready",i.resolvedAt=r(),o(),f)).catch(f=>{throw i.status="error",i.error=f?.message||String(f||"unknown"),o(),f}).finally(()=>{i.promise=null});return i.promise=b,o(),b}function c(){return l().catch(()=>null)}function u(){return i.snapshot}function p(g){return typeof g!="function"?()=>{}:(s.add(g),()=>s.delete(g))}return Object.freeze({load:l,preload:c,peek:u,subscribe:p,getState:a,get status(){return i.status},get requestedAt(){return i.requestedAt},get resolvedAt(){return i.resolvedAt}})}function Dn(t={}){let e=t.now||(()=>Date.now()),n=Number.isFinite(t.defaultTtlMs)?t.defaultTtlMs:6e4,r=new Map,s=new Map,i=new Map,a=new Map,o=0;function l(h,m){return h>0&&e()-h{r.set(T,{value:P,loadedAt:w})})}function k(h){if(!h||typeof h!="object")return;let m=e();Object.entries(h).forEach(([w,S])=>{r.set(w,{value:S,loadedAt:m})});for(let w of s.values()){let S=!1;Object.entries(h).forEach(([T,P])=>{T in w.values&&(w.values[T]=P,S=!0)}),S&&(w.loadedAt=m)}}function b(h){let m=Array.isArray(h)?h.filter(Boolean):[],w={},S=m.length>0;return m.forEach(T=>{let P=r.get(T);if(!P){S=!1;return}w[T]=P.value}),Object.freeze({values:w,complete:S})}function f(h,m={}){if(!h)return Promise.resolve({});let w=Array.isArray(m.names)?m.names.filter(Boolean):[],S=m.force===!0,T=Number.isFinite(m.ttlMs)?m.ttlMs:n,P=m.fetchMissing;if(!w.length)return g(h,{}),Promise.resolve({});S&&i.has(h)&&(a.set(h,(a.get(h)||0)+1),i.delete(h));let C=s.get(h);if(!S&&C&&l(C.loadedAt,T))return Promise.resolve({...C.values});if(!S&&i.has(h))return i.get(h);let D={},H=[];if(w.forEach(d=>{let x=r.get(d);!S&&x&&l(x.loadedAt,T)?D[d]=x.value:H.push(d)}),!H.length)return g(h,D),Promise.resolve({...D});if(typeof P!="function")return Promise.reject(new TypeError("fetchMissing must be a function when values are missing"));let y=o,L=a.get(h)||0,$=Promise.resolve().then(()=>P(H.slice())).then(d=>{let x={...D,...d||{}};return o===y&&(a.get(h)||0)===L&&g(h,x),{...x}}).finally(()=>{i.get(h)===$&&i.delete(h)});return i.set(h,$),$}return Object.freeze({clear:c,invalidateGroup:u,setValue:p,primeGroup:g,applyValues:k,peekValues:b,loadGroup:f,defaultTtlMs:n})}var Bn=new WeakMap;function Ns(t){if(!t||typeof t!="object"&&typeof t!="function")throw new TypeError("Settings runtime target must be an object");return t}function Gn(t=globalThis,e={}){let n=Ns(t),r=Bn.get(n);if(r)return r;let s=Mn({loadSnapshot:e.loadSnapshot||yt(n),eventTarget:e.eventTarget||n,now:e.now}),i=vt(e.auxLoaders||_t(n)),a=ln({fetchImpl:typeof n.fetch=="function"?n.fetch.bind(n):null,indexUrl:on()}),o=Et();s.subscribe(u=>{u.status==="ready"&&u.snapshot&&i.hydrateSnapshot(u.snapshot)});let l=Object.freeze({store:s,aux:i,catalog:At(),derived:Object.freeze({createModel:He,getModel:o.get,localizedNodeLabel:fe,localizedItemText:Se,ids:V}),entry:Object.freeze({createController:Tt}),docs:Object.freeze({load:a.load,clear:a.clear,diagnostics:a.diagnostics,normalizeLanguage:an,createView:gt,renderAst:dn,plainText:mn}),context:Object.freeze({create:pn,resolveTabIndex:pt,tabs:hn,historyFetchLimit:un,historyPreviewLimit:ut}),profiles:Object.freeze({selectApplyValues:Tn,collectRestoredValues:$n}),search:Object.freeze({highlight:Rn}),fingerprint:Object.freeze({renderSummary:An}),risk:Object.freeze({level:kt,renderBadge:Cn}),popular:Object.freeze({normalizeNumeric:xe,isInRange:Me,compareItems:bt,buildDisplayEntry:kn,primaryCount:ke,summaryValues:De,renderChipText:_n,renderChipHtml:wn,renderDetailHtml:Sn}),history:Object.freeze({renderHtml:bn,formatTimestamp:mt,toIso:dt,sourceLabelKeys:je}),view:Object.freeze({appendItemSection:jn,createGroupPlan:In,createItemLayoutPlan:Pn,renderEmptyState:Ln,renderGroupList:On}),values:Dn()}),c=Object.freeze({store:s,runtime:l});return n.CarrotSettingsStore=s,n.CarrotSettingsRuntime=l,Bn.set(n,c),e.preload!==!1&&s.preload(),c}Gn(globalThis);})(); diff --git a/openpilot/selfdrive/carrot/web/js/generated/tools.js b/openpilot/selfdrive/carrot/web/js/generated/tools.js index b041979cc0..ea934a6490 100644 --- a/openpilot/selfdrive/carrot/web/js/generated/tools.js +++ b/openpilot/selfdrive/carrot/web/js/generated/tools.js @@ -1,5 +1,5 @@ /* @generated by web/build.mjs; edit web/src/entries/tools.js instead. */ -(()=>{var be=[{id:"general",labelKey:"web_settings_general",items:[{id:"auto_update_git_pull",titleKey:"web_auto_update",descKey:"web_auto_update_desc"},{id:"start_page",titleKey:"web_start_page",descKey:"web_start_page_desc",options:[{value:"last",labelKey:"web_start_page_last"},{value:"carrot",labelKey:"home"},{value:"setting",labelKey:"setting"},{value:"tools",labelKey:"tools"},{value:"logs",labelKey:"logs"},{value:"terminal",labelKey:"terminal"}]}]},{id:"hud",labelKey:"web_settings_hud",items:[{id:"mini_hud_enabled",titleKey:"web_mini_hud_enabled",descKey:"web_mini_hud_enabled_desc"}]},{id:"layout",labelKey:"web_settings_drive_layout",items:[{id:"carrot_navi_layout",component:"drive-layout"}]},{id:"vision",labelKey:"web_settings_carrot_vision",items:[{id:"vision_fullscreen_default",titleKey:"web_vision_fullscreen_default",descKey:"web_vision_fullscreen_default_desc"},{id:"vision_ar_enabled",titleKey:"web_vision_ar_enabled",descKey:"web_vision_ar_enabled_desc"},{id:"vision_ar_debug",titleKey:"web_vision_ar_debug",descKey:"web_vision_ar_debug_desc"}]},{id:"navigation",labelKey:"web_settings_navigation",keepWhenEmpty:!0,items:[]},{id:"upload",labelKey:"web_settings_upload",items:[{id:"web_upload",component:"web-upload"}]}];window.WEB_SETTINGS_GROUPS=be;function jo(t=globalThis){if(Array.isArray(t?.CarrotWebCapabilitiesSpec))return t.CarrotWebCapabilitiesSpec;let n=t?.__CARROT_BOOTSTRAP__?.webCapabilitiesSpec;return Array.isArray(n)?n:[]}function zo(t=globalThis){if(Array.isArray(t?.CarrotWebSettingsSpec))return t.CarrotWebSettingsSpec;let n=t?.__CARROT_BOOTSTRAP__?.webSettingsSpec;return Array.isArray(n)?n:[]}function sn(t,n=globalThis){let a=String(t||"");return jo(n).find(i=>i?.id===a)||null}function rn(t,n=globalThis){let a=String(t||""),i=zo(n).find(s=>s?.key===a);return typeof i?.requiresCapability=="string"&&i.requiresCapability?i.requiresCapability:null}function he(t,n=globalThis){let a=String(t||""),i=n?.CarrotWebCapabilitiesState;if(i&&Object.prototype.hasOwnProperty.call(i,a))return!!i[a];let s=n?.__CARROT_BOOTSTRAP__?.webCapabilities;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!!s[a];let p=sn(a,n)?.settingKey,g=n?.CarrotWebSettingsState||n?.__CARROT_BOOTSTRAP__?.webSettings;return!!(p&&g?.[p])}function ln(t,n=globalThis){let a=rn(t,n);return!a||he(a,n)}function cn(t,n=globalThis){let a=rn(t,n);return a?sn(a,n):null}var dn="carrot_web_last_page",pn=new Set(["carrot","setting","tools","logs","terminal"]),we=Array.isArray(window.__CARROT_BOOTSTRAP__?.webSettingsSpec)?window.__CARROT_BOOTSTRAP__.webSettingsSpec:[],gn=Array.isArray(window.__CARROT_BOOTSTRAP__?.webCapabilitiesSpec)?window.__CARROT_BOOTSTRAP__.webCapabilitiesSpec:[],Pt=Object.create(null);we.forEach(t=>{t&&t.key&&(Pt[t.key]=t)});window.CarrotWebSettingsSpec=we;window.CarrotWebCapabilitiesSpec=gn;var ut=Object.create(null);we.forEach(t=>{t&&t.key&&(ut[t.key]=t.default)});window.CarrotWebSettingDefaults=ut;function fn(){let t=Object.keys(ut);return t.length?t:Object.keys(O)}function Vo(t){return typeof t=="string"?["1","true","yes","on"].includes(t.trim().toLowerCase()):!!t}function Se(t,n){let a=Pt[t];if(!a)return n;if(a.type==="bool")return Vo(n);if(a.type==="enum"){let s=String(n??"").trim().toLowerCase();return(a.choices||[]).includes(s)?s:a.default}if(t==="web_language"){if(typeof normalizeLangCode=="function")return normalizeLangCode(n);let s=String(n??"").trim().toLowerCase();return["en","ko","zh"].includes(s)?s:""}return String(n??"").trim()||a.default}var O={},ot={};window.CarrotWebSettingsState=O;window.CarrotWebCapabilitiesState=ot;var un=!1,Bt=null,ye=new Set;function Jo(t){if(typeof t!="function")throw new TypeError("web settings guard must be a function");return ye.add(t),()=>ye.delete(t)}function Yo(t){let n=Object.freeze({...t,keys:Object.freeze([...t.keys]),updates:Object.freeze({...t.updates}),previous:Object.freeze({...t.previous}),settings:Object.freeze({...t.settings})});for(let a of ye){let i=a(n);if(i&&typeof i.then=="function")throw new TypeError("web settings guards must complete synchronously")}}function Te(t={}){return fn().forEach(n=>{let a=Object.prototype.hasOwnProperty.call(t,n)?t[n]:Object.prototype.hasOwnProperty.call(O,n)?O[n]:ut[n];O[n]=Se(n,a)}),O}function ve(t={},n=O){return gn.forEach(a=>{if(!a?.id)return;let i=Object.prototype.hasOwnProperty.call(t,a.id)?t[a.id]:n?.[a.settingKey];ot[a.id]=!!i}),ot}function mn(t={}){return fn().filter(n=>!Object.is(t[n],O[n]))}function _n(t={}){return Object.keys(ot).filter(n=>!Object.is(t[n],ot[n]))}function jt(t,n={}){let a=[...new Set((t||[]).filter(i=>typeof i=="string"&&i))];return a.length?(window.dispatchEvent(new CustomEvent("carrot:websettingschange",{detail:{...n,key:a[0],keys:a,value:O[a[0]],values:Object.fromEntries(a.map(i=>[i,O[i]])),settings:{...O}}})),!0):!1}function bn(t,n={}){let a=[...new Set((t||[]).filter(i=>typeof i=="string"&&i))];return a.length?(window.dispatchEvent(new CustomEvent("carrot:webcapabilitieschange",{detail:{...n,id:a[0],ids:a,value:ot[a[0]],values:Object.fromEntries(a.map(i=>[i,ot[i]])),capabilities:{...ot}}})),!0):!1}Te(window.__CARROT_BOOTSTRAP__?.webSettings||{});ve(window.__CARROT_BOOTSTRAP__?.webCapabilities||{},O);async function hn(t="GET",n=null){let a={method:t};if(n&&(a.headers={"Content-Type":"application/json"},a.body=JSON.stringify(n)),typeof requestJson=="function")return requestJson("/api/web_settings",a);let i=await fetch("/api/web_settings",a),s=await i.json();if(!i.ok||s?.ok===!1)throw new Error(s?.error||`HTTP ${i.status}`);return s}async function Ce(t=!1){return!t&&un?O:Bt||(Bt=hn("GET").then(n=>{let a={...O},i={...ot};un=!0;let s=Te(n?.settings||{});return ve(n?.capabilities||{},s),jt(mn(a),{source:"load",pending:!1}),bn(_n(i),{source:"load"}),s}).finally(()=>{Bt=null}),Bt)}function Dt(t,n=void 0){return!Object.prototype.hasOwnProperty.call(O,t)&&!Object.prototype.hasOwnProperty.call(ut,t)?n:O[t]??n??ut[t]}function Xo(t){return he(t,window)}function Ae(t){return ln(t,window)}function Ee(t){return cn(t,window)}async function At(t={}){let n={},a={};for(let[p,g]of Object.entries(t||{}))(Object.prototype.hasOwnProperty.call(O,p)||Object.prototype.hasOwnProperty.call(ut,p))&&(a[p]=O[p],n[p]=Se(p,g));let i=Object.keys(n);if(!i.length)return{};let s={...O,...n},d=i.filter(p=>!Object.is(a[p],s[p]));d.length&&Yo({source:"local",keys:d,updates:n,previous:a,settings:s}),Object.assign(O,n),jt(d,{source:"local",pending:!0});try{let p=await hn("POST",n),g={...O},f={...ot};Te(p?.settings||n),ve(p?.capabilities||{},O),jt([...i,...mn(g)],{source:"server",pending:!1}),bn(_n(f),{source:"server"})}catch(p){throw Object.assign(O,a),jt(d,{source:"rollback",pending:!1}),p}return Object.fromEntries(i.map(p=>[p,O[p]]))}async function ht(t,n){return(await At({[t]:n}))[t]}function yn(){return Se("start_page",O.start_page)}function Zo(){let t=yn();if(t!=="last")return t;try{let n=localStorage.getItem(dn);return pn.has(n)?n:"carrot"}catch{return"carrot"}}function ta(t){return ht("start_page",t)}function ea(t){if(pn.has(t))try{localStorage.setItem(dn,t)}catch{}}window.loadWebSettings=Ce;window.getWebSettingByKey=Dt;window.setWebSettingByKey=ht;window.setWebSettingsByKeys=At;window.registerWebSettingsGuard=Jo;window.isWebCapabilityEnabled=Xo;window.isWebSettingUnlocked=Ae;window.getWebSettingCapabilitySpec=Ee;window.getWebStartPage=Zo;window.getWebStartPageSetting=yn;window.setWebStartPage=ta;window.recordWebLastPage=ea;globalThis.WebSettingsComponents=(()=>{let t=new Map;function n(p,g){let f=String(p||"").trim();if(!f||!g||typeof g.render!="function")throw new TypeError("WebSettingsComponents.register requires a renderable component");if(t.has(f))throw new Error(`Web settings component already registered: ${f}`);t.set(f,Object.freeze({...g}))}function a(p){return t.get(String(p||""))||null}function i(p,g){let f=a(p);return f?(f.settingKeys||[]).every(m=>!!g[m]):!1}function s(p,g){return a(p)?.render(g)||""}function d(p=document){for(let g of t.values())g.bind?.(p)}return Object.freeze({register:n,isVisible:i,render:s,bind:d})})();globalThis.WebSettingsComponents.register("web-upload",{settingKeys:["web_upload_url"],render(){let t=(a,i)=>getUIText(a)||i,n=String(Dt("web_upload_url","")||"");return` +(()=>{var he=[{id:"general",labelKey:"web_settings_general",items:[{id:"auto_update_git_pull",titleKey:"web_auto_update",descKey:"web_auto_update_desc"},{id:"start_page",titleKey:"web_start_page",descKey:"web_start_page_desc",options:[{value:"last",labelKey:"web_start_page_last"},{value:"carrot",labelKey:"home"},{value:"setting",labelKey:"setting"},{value:"tools",labelKey:"tools"},{value:"logs",labelKey:"logs"},{value:"terminal",labelKey:"terminal"}]}]},{id:"hud",labelKey:"web_settings_hud",items:[{id:"mini_hud_enabled",titleKey:"web_mini_hud_enabled",descKey:"web_mini_hud_enabled_desc"}]},{id:"layout",labelKey:"web_settings_drive_layout",items:[{id:"carrot_navi_layout",component:"drive-layout"}]},{id:"vision",labelKey:"web_settings_carrot_vision",items:[{id:"vision_fullscreen_default",titleKey:"web_vision_fullscreen_default",descKey:"web_vision_fullscreen_default_desc"},{id:"vision_ar_enabled",titleKey:"web_vision_ar_enabled",descKey:"web_vision_ar_enabled_desc"},{id:"vision_ar_debug",titleKey:"web_vision_ar_debug",descKey:"web_vision_ar_debug_desc"}]},{id:"navigation",labelKey:"web_settings_navigation",items:[{id:"carrot_navi_map_appearance",component:"param-selects",fields:[{id:"carrot_navi_map_type",paramName:"ClusterNaviMapType",titleKey:"web_navi_map_type",descKey:"web_navi_map_type_desc",options:[{value:"0",labelKey:"web_navi_map_type_normal"},{value:"1",labelKey:"web_navi_map_type_satellite"}]},{id:"carrot_navi_map_theme",paramName:"ClusterNaviMapTheme",titleKey:"web_navi_map_theme",descKey:"web_navi_map_theme_desc",options:[{value:"1",labelKey:"web_navi_map_theme_dark"},{value:"2",labelKey:"web_navi_map_theme_light"}]}]}]},{id:"upload",labelKey:"web_settings_upload",items:[{id:"web_upload",component:"web-upload"}]}];window.WEB_SETTINGS_GROUPS=he;function Jo(t=globalThis){if(Array.isArray(t?.CarrotWebCapabilitiesSpec))return t.CarrotWebCapabilitiesSpec;let n=t?.__CARROT_BOOTSTRAP__?.webCapabilitiesSpec;return Array.isArray(n)?n:[]}function Yo(t=globalThis){if(Array.isArray(t?.CarrotWebSettingsSpec))return t.CarrotWebSettingsSpec;let n=t?.__CARROT_BOOTSTRAP__?.webSettingsSpec;return Array.isArray(n)?n:[]}function rn(t,n=globalThis){let a=String(t||"");return Jo(n).find(s=>s?.id===a)||null}function ln(t,n=globalThis){let a=String(t||""),s=Yo(n).find(i=>i?.key===a);return typeof s?.requiresCapability=="string"&&s.requiresCapability?s.requiresCapability:null}function ye(t,n=globalThis){let a=String(t||""),s=n?.CarrotWebCapabilitiesState;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!!s[a];let i=n?.__CARROT_BOOTSTRAP__?.webCapabilities;if(i&&Object.prototype.hasOwnProperty.call(i,a))return!!i[a];let c=rn(a,n)?.settingKey,g=n?.CarrotWebSettingsState||n?.__CARROT_BOOTSTRAP__?.webSettings;return!!(c&&g?.[c])}function cn(t,n=globalThis){let a=ln(t,n);return!a||ye(a,n)}function un(t,n=globalThis){let a=ln(t,n);return a?rn(a,n):null}var pn="carrot_web_last_page",gn=new Set(["carrot","setting","tools","logs","terminal"]),Se=Array.isArray(window.__CARROT_BOOTSTRAP__?.webSettingsSpec)?window.__CARROT_BOOTSTRAP__.webSettingsSpec:[],mn=Array.isArray(window.__CARROT_BOOTSTRAP__?.webCapabilitiesSpec)?window.__CARROT_BOOTSTRAP__.webCapabilitiesSpec:[],$t=Object.create(null);Se.forEach(t=>{t&&t.key&&($t[t.key]=t)});window.CarrotWebSettingsSpec=Se;window.CarrotWebCapabilitiesSpec=mn;var ut=Object.create(null);Se.forEach(t=>{t&&t.key&&(ut[t.key]=t.default)});window.CarrotWebSettingDefaults=ut;function fn(){let t=Object.keys(ut);return t.length?t:Object.keys(O)}function Xo(t){return typeof t=="string"?["1","true","yes","on"].includes(t.trim().toLowerCase()):!!t}function Te(t,n){let a=$t[t];if(!a)return n;if(a.type==="bool")return Xo(n);if(a.type==="enum"){let i=String(n??"").trim().toLowerCase();return(a.choices||[]).includes(i)?i:a.default}if(t==="web_language"){if(typeof normalizeLangCode=="function")return normalizeLangCode(n);let i=String(n??"").trim().toLowerCase();return["en","ko","zh"].includes(i)?i:""}return String(n??"").trim()||a.default}var O={},ot={};window.CarrotWebSettingsState=O;window.CarrotWebCapabilitiesState=ot;var dn=!1,Pt=null,we=new Set;function Zo(t){if(typeof t!="function")throw new TypeError("web settings guard must be a function");return we.add(t),()=>we.delete(t)}function ta(t){let n=Object.freeze({...t,keys:Object.freeze([...t.keys]),updates:Object.freeze({...t.updates}),previous:Object.freeze({...t.previous}),settings:Object.freeze({...t.settings})});for(let a of we){let s=a(n);if(s&&typeof s.then=="function")throw new TypeError("web settings guards must complete synchronously")}}function ve(t={}){return fn().forEach(n=>{let a=Object.prototype.hasOwnProperty.call(t,n)?t[n]:Object.prototype.hasOwnProperty.call(O,n)?O[n]:ut[n];O[n]=Te(n,a)}),O}function Ce(t={},n=O){return mn.forEach(a=>{if(!a?.id)return;let s=Object.prototype.hasOwnProperty.call(t,a.id)?t[a.id]:n?.[a.settingKey];ot[a.id]=!!s}),ot}function _n(t={}){return fn().filter(n=>!Object.is(t[n],O[n]))}function bn(t={}){return Object.keys(ot).filter(n=>!Object.is(t[n],ot[n]))}function zt(t,n={}){let a=[...new Set((t||[]).filter(s=>typeof s=="string"&&s))];return a.length?(window.dispatchEvent(new CustomEvent("carrot:websettingschange",{detail:{...n,key:a[0],keys:a,value:O[a[0]],values:Object.fromEntries(a.map(s=>[s,O[s]])),settings:{...O}}})),!0):!1}function hn(t,n={}){let a=[...new Set((t||[]).filter(s=>typeof s=="string"&&s))];return a.length?(window.dispatchEvent(new CustomEvent("carrot:webcapabilitieschange",{detail:{...n,id:a[0],ids:a,value:ot[a[0]],values:Object.fromEntries(a.map(s=>[s,ot[s]])),capabilities:{...ot}}})),!0):!1}ve(window.__CARROT_BOOTSTRAP__?.webSettings||{});Ce(window.__CARROT_BOOTSTRAP__?.webCapabilities||{},O);async function yn(t="GET",n=null){let a={method:t};if(n&&(a.headers={"Content-Type":"application/json"},a.body=JSON.stringify(n)),typeof requestJson=="function")return requestJson("/api/web_settings",a);let s=await fetch("/api/web_settings",a),i=await s.json();if(!s.ok||i?.ok===!1)throw new Error(i?.error||`HTTP ${s.status}`);return i}async function Ae(t=!1){return!t&&dn?O:Pt||(Pt=yn("GET").then(n=>{let a={...O},s={...ot};dn=!0;let i=ve(n?.settings||{});return Ce(n?.capabilities||{},i),zt(_n(a),{source:"load",pending:!1}),hn(bn(s),{source:"load"}),i}).finally(()=>{Pt=null}),Pt)}function Bt(t,n=void 0){return!Object.prototype.hasOwnProperty.call(O,t)&&!Object.prototype.hasOwnProperty.call(ut,t)?n:O[t]??n??ut[t]}function ea(t){return ye(t,window)}function Ee(t){return cn(t,window)}function Le(t){return un(t,window)}async function At(t={}){let n={},a={};for(let[c,g]of Object.entries(t||{}))(Object.prototype.hasOwnProperty.call(O,c)||Object.prototype.hasOwnProperty.call(ut,c))&&(a[c]=O[c],n[c]=Te(c,g));let s=Object.keys(n);if(!s.length)return{};let i={...O,...n},p=s.filter(c=>!Object.is(a[c],i[c]));p.length&&ta({source:"local",keys:p,updates:n,previous:a,settings:i}),Object.assign(O,n),zt(p,{source:"local",pending:!0});try{let c=await yn("POST",n),g={...O},m={...ot};ve(c?.settings||n),Ce(c?.capabilities||{},O),zt([...s,..._n(g)],{source:"server",pending:!1}),hn(bn(m),{source:"server"})}catch(c){throw Object.assign(O,a),zt(p,{source:"rollback",pending:!1}),c}return Object.fromEntries(s.map(c=>[c,O[c]]))}async function ht(t,n){return(await At({[t]:n}))[t]}function wn(){return Te("start_page",O.start_page)}function na(){let t=wn();if(t!=="last")return t;try{let n=localStorage.getItem(pn);return gn.has(n)?n:"carrot"}catch{return"carrot"}}function oa(t){return ht("start_page",t)}function aa(t){if(gn.has(t))try{localStorage.setItem(pn,t)}catch{}}window.loadWebSettings=Ae;window.getWebSettingByKey=Bt;window.setWebSettingByKey=ht;window.setWebSettingsByKeys=At;window.registerWebSettingsGuard=Zo;window.isWebCapabilityEnabled=ea;window.isWebSettingUnlocked=Ee;window.getWebSettingCapabilitySpec=Le;window.getWebStartPage=na;window.getWebStartPageSetting=wn;window.setWebStartPage=oa;window.recordWebLastPage=aa;globalThis.WebSettingsComponents=(()=>{let t=new Map;function n(c,g){let m=String(c||"").trim();if(!m||!g||typeof g.render!="function")throw new TypeError("WebSettingsComponents.register requires a renderable component");if(t.has(m))throw new Error(`Web settings component already registered: ${m}`);t.set(m,Object.freeze({...g}))}function a(c){return t.get(String(c||""))||null}function s(c,g,m=null){let f=a(c);return f?typeof f.isVisible=="function"?f.isVisible(m,g)===!0:(f.settingKeys||[]).every(L=>!!g[L]):!1}function i(c,g){return a(c)?.render(g)||""}function p(c=document){for(let g of t.values())g.bind?.(c)}return Object.freeze({register:n,isVisible:s,render:i,bind:p})})();globalThis.WebSettingsComponents.register("web-upload",{settingKeys:["web_upload_url"],render(){let t=(a,s)=>getUIText(a)||s,n=String(Bt("web_upload_url","")||"");return`
- `},bind(t=document){let n=t.querySelector(".web-upload-settings");if(!n||n.dataset.bound==="1")return;n.dataset.bound="1";let a=[...n.querySelectorAll("[data-web-upload-field]")],i=n.querySelector(".web-upload-settings__status"),s=n.querySelector(".web-upload-settings__test"),d=()=>Object.fromEntries(a.map(g=>[g.dataset.webUploadField,g.value.trim()])),p=()=>At(d());a.forEach(g=>{g.addEventListener("change",()=>p().catch(f=>{i&&(i.textContent=f?.message||String(f))}))}),s?.addEventListener("click",async()=>{s.disabled=!0,i&&(i.textContent=getUIText("web_upload_testing")||"Testing...");try{await p();let g=await fetch("/api/dashcam/upload/test",{method:"POST"}),f=await g.json();if(!g.ok||f?.ok===!1)throw new Error(f?.error||`HTTP ${g.status}`);i&&(i.textContent=getUIText("web_upload_test_ok")||"Connection OK")}catch(g){i&&(i.textContent=`${getUIText("web_upload_test_failed")||"Connection failed"}: ${g?.message||g}`)}finally{s.disabled=!1}})}});var ft="general";function wn(t){return ft=String(t||"general"),ft}function P(t){return getUIText(t)||String(t||"")}function Sn(t){return t?.id&&Pt[t.id]||null}function na(t){return t?.component?!!globalThis.WebSettingsComponents?.isVisible?.(t.component,Pt):!!Sn(t)}function Tn(){return be.map(t=>({...t,items:t.items.filter(na)})).filter(t=>t.keepWhenEmpty||t.items.length>0)}function vn(t){for(let n of Tn()){let a=n.items.find(i=>i.id===t);if(a)return a}return null}function kt(t){return Dt(t.id,ut[t.id])}function Ie(t,n){return ht(t.id,n)}function oa(t){if(Ae(t.id))return"";let n=Ee(t.id);return P(n?.lockedLabelKey||"web_feature_locked")}function Le(t,n,a=""){return` + `},bind(t=document){let n=t.querySelector(".web-upload-settings");if(!n||n.dataset.bound==="1")return;n.dataset.bound="1";let a=[...n.querySelectorAll("[data-web-upload-field]")],s=n.querySelector(".web-upload-settings__status"),i=n.querySelector(".web-upload-settings__test"),p=()=>Object.fromEntries(a.map(g=>[g.dataset.webUploadField,g.value.trim()])),c=()=>At(p());a.forEach(g=>{g.addEventListener("change",()=>c().catch(m=>{s&&(s.textContent=m?.message||String(m))}))}),i?.addEventListener("click",async()=>{i.disabled=!0,s&&(s.textContent=getUIText("web_upload_testing")||"Testing...");try{await c();let g=await fetch("/api/dashcam/upload/test",{method:"POST"}),m=await g.json();if(!g.ok||m?.ok===!1)throw new Error(m?.error||`HTTP ${g.status}`);s&&(s.textContent=getUIText("web_upload_test_ok")||"Connection OK")}catch(g){s&&(s.textContent=`${getUIText("web_upload_test_failed")||"Connection failed"}: ${g?.message||g}`)}finally{i.disabled=!1}})}});var sa="param-selects",ia="web_ui";function Sn(t){return(Array.isArray(t?.fields)?t.fields:[]).filter(a=>typeof a?.id=="string"&&a.id&&typeof a?.paramName=="string"&&a.paramName&&typeof a?.titleKey=="string"&&a.titleKey&&Array.isArray(a?.options)&&a.options.length>0&&a.options.every(s=>typeof s?.value=="string"&&typeof s?.labelKey=="string"&&s.labelKey))}function Dt(t){return getUIText(t)||String(t||"")}function ra(t){let n=Dt(t.titleKey),a=t.descKey?Dt(t.descKey):"",s=t.options.map(i=>` + + `).join("");return` + `}function Tn(t){typeof showAppToast=="function"&&showAppToast(t?.message||String(t),{tone:"error"})}async function la(t){if(typeof globalThis.bulkGet!="function")throw new Error(Dt("web_navi_map_settings_unavailable"));return globalThis.bulkGet(t)}async function ca(t,n){if(typeof globalThis.setParam!="function")throw new Error(Dt("web_navi_map_settings_unavailable"));return globalThis.setParam(t,n,{source:ia})}globalThis.WebSettingsComponents.register(sa,{isVisible(t){return Sn(t).length>0},render(t){let n=Sn(t);return` +
+ ${n.map(ra).join("")} +
`},async bind(t=document){let n=[...t.querySelectorAll("[data-web-param-selects]")];for(let a of n){if(a.dataset.bound==="1")continue;a.dataset.bound="1";let i=[...a.querySelectorAll("[data-web-param-setting]")].map(c=>c.querySelector("select[data-param-name]")).filter(Boolean),p=[...new Set(i.map(c=>c.dataset.paramName).filter(Boolean))];try{let c=await la(p);i.forEach(g=>{let m=String(c?.[g.dataset.paramName]??"");g.value=[...g.options].some(f=>f.value===m)?m:"",g.disabled=!1})}catch(c){Tn(c);continue}i.forEach(c=>{c.addEventListener("change",async()=>{let g=c.dataset.committedValue??c.value,m=c.value;c.disabled=!0;try{await ca(c.dataset.paramName,m),c.dataset.committedValue=m}catch(f){c.value=g,Tn(f)}finally{c.disabled=!1}}),c.dataset.committedValue=c.value})}}});var mt="general";function vn(t){return mt=String(t||"general"),mt}function $(t){return getUIText(t)||String(t||"")}function Cn(t){return t?.id&&$t[t.id]||null}function ua(t){return t?.component?!!globalThis.WebSettingsComponents?.isVisible?.(t.component,$t,t):!!Cn(t)}function An(){return he.map(t=>({...t,items:t.items.filter(ua)})).filter(t=>t.keepWhenEmpty||t.items.length>0)}function En(t){for(let n of An()){let a=n.items.find(s=>s.id===t);if(a)return a}return null}function kt(t){return Bt(t.id,ut[t.id])}function xe(t,n){return ht(t.id,n)}function da(t){if(Ee(t.id))return"";let n=Le(t.id);return $(n?.lockedLabelKey||"web_feature_locked")}function Ie(t,n,a=""){return` ${escapeHtml(t)} ${n?`${escapeHtml(n)}`:""} - `}function aa(t){if(t?.component)return globalThis.WebSettingsComponents?.render?.(t.component,t)||"";let n=Sn(t);if(!n)return"";let a=P(t.titleKey),i=P(t.descKey),s=oa(t),d=t.disabled===!0||!!s;if(n.type==="bool"){let p=d?!1:!!kt(t);return` - `}if(n.type==="enum"){let c=String(kt(t)),g=new Set(n.choices||[]),m=(t.options||[]).filter(f=>g.size===0||g.has(f.value)).map(f=>` + `).join("");return` - `}return` -
- ${Le(a,i,s)} -
`}function ia(t){let n=P(t.labelKey),a=t.items.map(aa).join("");return` -
+
+ ${Ie(a,s,i)} +
`}function ga(t){let n=$(t.labelKey),a=t.items.map(pa).join("");return` +
${escapeHtml(n)}
${a}
-
`}function Cn(){let t=Tn();t.some(a=>a.id===ft)||(ft=t[0]?.id||"general");let n=t.map(a=>{let i=a.id===ft;return` -
`}function Ln(){let t=An();t.some(a=>a.id===mt)||(mt=t[0]?.id||"general");let n=t.map(a=>{let s=a.id===mt;return` + `}).join("");return`
-
`}function An(){document.querySelectorAll("[data-web-settings-group]").forEach(t=>{let n=t.dataset.webSettingsGroup===ft;t.classList.toggle("is-active",n),t.setAttribute("aria-pressed",n?"true":"false")}),document.querySelectorAll("[data-web-settings-panel]").forEach(t=>{t.hidden=t.dataset.webSettingsPanel!==ft})}(()=>{let t=globalThis.CarrotDriveLayoutSpec,n=globalThis.WebSettingsComponents;if(!t||!n)return;let a="drive-layout",i="live",s="drive_content_status_unavailable",d=Object.freeze({area1Content:Object.freeze({slot:"primary",fallbackId:"vision"}),area2Content:Object.freeze({slot:"secondary",fallbackId:"navigation"})}),p=Object.freeze({orientation:Object.freeze([Object.freeze({value:t.ORIENTATION.HORIZONTAL,labelKey:"web_drive_layout_horizontal"}),Object.freeze({value:t.ORIENTATION.VERTICAL,labelKey:"web_drive_layout_vertical"})]),mode:Object.freeze([Object.freeze({value:t.MODE.SPLIT,labelKey:"web_drive_layout_mode_split"}),Object.freeze({value:t.MODE.AREA_1,labelKey:"web_drive_layout_mode_area_1"}),Object.freeze({value:t.MODE.AREA_2,labelKey:"web_drive_layout_mode_area_2"})])});function g(){return typeof t.orientationForViewport=="function"?t.orientationForViewport(globalThis,document):t.ORIENTATION.HORIZONTAL}let f=g();function m(S,w){return w.map(x=>` + `}function In(){document.querySelectorAll("[data-web-settings-group]").forEach(t=>{let n=t.dataset.webSettingsGroup===mt;t.classList.toggle("is-active",n),t.setAttribute("aria-pressed",n?"true":"false")}),document.querySelectorAll("[data-web-settings-panel]").forEach(t=>{t.hidden=t.dataset.webSettingsPanel!==mt})}(()=>{let t=globalThis.CarrotDriveLayoutSpec,n=globalThis.WebSettingsComponents;if(!t||!n)return;let a="drive-layout",s="live",i="drive_content_status_unavailable",p=Object.freeze({area1Content:Object.freeze({slot:"primary",fallbackId:"vision"}),area2Content:Object.freeze({slot:"secondary",fallbackId:"navigation"})}),c=Object.freeze({orientation:Object.freeze([Object.freeze({value:t.ORIENTATION.HORIZONTAL,labelKey:"web_drive_layout_horizontal"}),Object.freeze({value:t.ORIENTATION.VERTICAL,labelKey:"web_drive_layout_vertical"})]),mode:Object.freeze([Object.freeze({value:t.MODE.SPLIT,labelKey:"web_drive_layout_mode_split"}),Object.freeze({value:t.MODE.AREA_1,labelKey:"web_drive_layout_mode_area_1"}),Object.freeze({value:t.MODE.AREA_2,labelKey:"web_drive_layout_mode_area_2"})])});function g(){return typeof t.orientationForViewport=="function"?t.orientationForViewport(globalThis,document):t.ORIENTATION.HORIZONTAL}let m=g();function f(S,w){return w.map(x=>` `).join("")}function I(){return globalThis.DriveContentRegistry||null}function N(S){try{return I()?.get?.(S)||null}catch{return null}}function F(S){let w=N(S);return w?.labelKey?P(w.labelKey):P(s)}function u(S){let w=d[S],x=I();if(!w||typeof x?.list!="function")return[];try{let L=x.list({slot:w.slot,source:i,fallbackId:w.fallbackId,selectedIds:[]});return(Array.isArray(L)?L:[]).filter(y=>y?.id&&y?.labelKey)}catch{return[]}}function h(S,w="",x=""){let L=S.map(y=>{let G=y.singleton===!0&&y.id===x;return` + ${escapeHtml(x.label||$(x.labelKey))} + `).join("")}function L(){return globalThis.DriveContentRegistry||null}function R(S){try{return L()?.get?.(S)||null}catch{return null}}function K(S){let w=R(S);return w?.labelKey?$(w.labelKey):$(i)}function d(S){let w=p[S],x=L();if(!w||typeof x?.list!="function")return[];try{let I=x.list({slot:w.slot,source:s,fallbackId:w.fallbackId,selectedIds:[]});return(Array.isArray(I)?I:[]).filter(y=>y?.id&&y?.labelKey)}catch{return[]}}function h(S,w="",x=""){let I=S.map(y=>{let G=y.singleton===!0&&y.id===x;return` `});if(w&&!S.some(y=>y.id===w)){let y=N(w),G=y?.labelKey?P(y.labelKey):String(w);L.unshift(` + ${escapeHtml($(y.labelKey))} + `});if(w&&!S.some(y=>y.id===w)){let y=R(w),G=y?.labelKey?$(y.labelKey):String(w);I.unshift(` `)}return L.length||L.push(` + ${escapeHtml(`${G} (${$(i)})`)} + `)}return I.length||I.push(` `),L.join("")}function _(){try{return t.read(window.CarrotWebSettingsState,f)}catch{return null}}function v(){f=g();let S=_(),w=S?.area1Content||"",x=S?.area2Content||"",L=u("area1Content"),y=u("area2Content");return` + ${escapeHtml($(i))} + `),I.join("")}function _(){try{return t.read(window.CarrotWebSettingsState,m)}catch{return null}}function v(){m=g();let S=_(),w=S?.area1Content||"",x=S?.area2Content||"",I=d("area1Content"),y=d("area2Content");return`
-

${escapeHtml(P("web_drive_layout_title"))}

-
- ${m("orientation",p.orientation)} +

${escapeHtml($("web_drive_layout_title"))}

+
+ ${f("orientation",c.orientation)}
- ${escapeHtml(P("web_drive_layout_area_1"))} + ${escapeHtml($("web_drive_layout_area_1"))}
- ${escapeHtml(P("web_drive_layout_area_2"))} + ${escapeHtml($("web_drive_layout_area_2"))}
@@ -108,50 +130,50 @@
- ${escapeHtml(P("web_drive_layout_display"))} -
- ${m("mode",p.mode)} + ${escapeHtml($("web_drive_layout_display"))} +
+ ${f("mode",c.mode)}
-
`}function D(S,w,x){S.querySelectorAll(`[data-drive-layout-control="${w}"]`).forEach(L=>{L.setAttribute("aria-pressed",String(L.dataset.value===String(x)))})}function q(S,w,x){let L=S.querySelector(`[data-area="${w}"]`);if(!L)return;L.dataset.content=x;let y=L.querySelector("[data-content-label]");y&&(y.textContent=F(x))}function Q(S,w,x,L){let y=S.querySelector(`[data-drive-layout-content="${w}"]`);if(!y)return;let G=u(w);y.innerHTML=h(G,x,L),y.disabled=G.length===0,y.value=x}function U(S){let w=_();if(!w){S.style.removeProperty("--drive-layout-preview-area-1-size"),S.style.removeProperty("--drive-layout-preview-area-2-size"),S.dataset.orientation=f,S.dataset.mode="",S.dataset.contentUnavailable="true",q(S,"area_1",""),q(S,"area_2",""),Q(S,"area1Content","",""),Q(S,"area2Content","",""),D(S,"orientation",f),D(S,"mode","");return}delete S.dataset.contentUnavailable,S.style.setProperty("--drive-layout-preview-area-1-size",`${w.ratio}fr`),S.style.setProperty("--drive-layout-preview-area-2-size",`${Number((1-w.ratio).toFixed(2))}fr`),S.dataset.orientation=w.orientation,S.dataset.mode=w.mode,q(S,"area_1",w.area1Content),q(S,"area_2",w.area2Content),Q(S,"area1Content",w.area1Content,w.area2Content),Q(S,"area2Content",w.area2Content,w.area1Content);let x=S.querySelector("[data-drive-layout-swap] span");x&&(x.textContent=w.orientation===t.ORIENTATION.VERTICAL?"⇅":"⇄"),D(S,"orientation",w.orientation),D(S,"mode",w.mode)}function j(S){typeof showAppToast=="function"&&showAppToast(S?.message||String(S),{tone:"error"})}function Ft(S){S.querySelectorAll(`[data-web-settings-component="${a}"]`).forEach(w=>{if(w.dataset.webSettingsBound==="1")return;w.dataset.webSettingsBound="1";let x=!1;w.querySelectorAll("[data-drive-layout-control]").forEach(L=>{L.addEventListener("click",async()=>{if(x)return;let y=L.dataset.driveLayoutControl,G=L.dataset.value;if(y==="orientation"){f=t.normalizeOrientation(G),U(w);return}let nt=t.keysFor(f);x=!0;try{let st=ht(nt.mode,G);U(w),await st}catch(st){j(st)}finally{x=!1,U(w)}})}),w.querySelectorAll("[data-drive-layout-content]").forEach(L=>{L.addEventListener("change",async()=>{if(x)return;let y=L.dataset.driveLayoutContent,G=t.keysFor(f),nt=L.value;x=!0;try{let st=ht(G[y],nt);U(w),await st}catch(st){j(st)}finally{x=!1,U(w)}})}),w.querySelector("[data-drive-layout-swap]")?.addEventListener("click",async()=>{if(x)return;let L=t.keysFor(f),y=_();if(!y){U(w);return}x=!0;try{let G=At({[L.area1Content]:y.area2Content,[L.area2Content]:y.area1Content});U(w),await G}catch(G){j(G)}finally{x=!1,U(w)}}),U(w)})}n.register(a,{settingKeys:t.settingKeys,render:v,bind:Ft})})();var En=!1;function sa(){let t=document.querySelector(".app-dialog--web-settings .web-settings-nav"),n=t?.querySelector(".web-settings-nav__item.is-active");if(!t||!n)return!1;let a=t.getBoundingClientRect(),i=n.getBoundingClientRect(),s=0,d=0;return i.lefta.right&&(s=i.right-a.right),i.topa.bottom&&(d=i.bottom-a.bottom),Math.abs(s)<1&&Math.abs(d)<1?!1:(typeof t.scrollBy=="function"?t.scrollBy({left:s,top:d,behavior:"auto"}):(t.scrollLeft+=s,t.scrollTop+=d),!0)}function xe(){window.requestAnimationFrame(sa)}function ra(){if(document.querySelectorAll("[data-web-settings-group]").forEach(t=>{t.dataset.webSettingsBound!=="1"&&(t.dataset.webSettingsBound="1",t.addEventListener("click",()=>{wn(t.dataset.webSettingsGroup||"general"),An(),xe()}))}),document.querySelectorAll("[data-web-setting]").forEach(t=>{if(t.dataset.webSettingBound==="1")return;t.dataset.webSettingBound="1";let n=vn(t.dataset.webSetting),a=t.querySelector(".c-switch__input"),i=t.querySelector(".web-settings-select");n&&(a&&a.addEventListener("change",()=>{Ie(n,a.checked).then(()=>{n.id==="auto_update_git_pull"&&a.checked&&globalThis.CarrotToolsRuntime?.refreshGitPullStatus?.({force:!0,ttlMs:0}).catch(()=>{})}).catch(s=>{a.checked=!!kt(n),typeof showAppToast=="function"&&showAppToast(s?.message||String(s),{tone:"error"})})}),i&&i.addEventListener("change",()=>{Ie(n,i.value).catch(s=>{i.value=String(kt(n)),typeof showAppToast=="function"&&showAppToast(s?.message||String(s),{tone:"error"})})}))}),globalThis.WebSettingsComponents?.bind?.(document),xe(),!En){En=!0;for(let t of["resize","orientationchange","carrot:viewportlayout"])window.addEventListener(t,xe,{passive:!0})}}async function zt(){await Ce(!0).catch(()=>{});let t=appAlert("",{title:P("web_settings"),html:!0,messageHtml:Cn()});return typeof appDialog<"u"&&appDialog&&appDialog.classList.add("app-dialog--web-settings"),window.setTimeout(ra,0),t.finally(()=>{typeof appDialog<"u"&&appDialog&&appDialog.classList.remove("app-dialog--web-settings")}),t}function Re(t={}){}window.openWebSettingsDialog=zt;window.handleWebAutoUpdateStatus=Re;var mt=null,Ln=0,Jt=null,$t=null,In=0,xn=null,Rn=!1,Ne=null,Yt=!1;function la(){return window.CarrotLayout?.isWide?.()?!1:!!window.matchMedia?.("(max-width: 640px), (aspect-ratio < 13/10) and (max-width: 639px), (aspect-ratio < 13/10) and (max-height: 649px)")?.matches}function ca(){if(CURRENT_PAGE!=="tools"||!la()||history.state?.toolsLogPanel)return;let t=history.state&&history.state.page==="tools"?history.state:{page:"tools"};history.pushState({...t,page:"tools",toolsLogPanel:!0},"")}function ua(){!history.state?.toolsLogPanel||Yt||(Yt=!0,history.back(),window.setTimeout(()=>{Yt=!1},360))}function da(){document.body?.dataset.toolsLogHistoryDismissBound!=="1"&&(document.body&&(document.body.dataset.toolsLogHistoryDismissBound="1"),window.addEventListener("popstate",t=>{document.getElementById("pageTools")?.classList.contains("tools-log-expanded")&&(dt(!1,{syncHistory:!1}),Yt=!1,t.stopImmediatePropagation())},!0))}var pa=1e4,Dn=20,qt="",kn="",Z=[],Ot=null,wt=null,Xt=0;function Et(t){return String(t??"").replace(/\s+$/,"")}function ga(t){return Et(t).split(/\n{2,}/).map(n=>n.trim()).filter(Boolean).slice(-Dn).join(` + `}function B(S,w,x){S.querySelectorAll(`[data-drive-layout-control="${w}"]`).forEach(I=>{I.setAttribute("aria-pressed",String(I.dataset.value===String(x)))})}function q(S,w,x){let I=S.querySelector(`[data-area="${w}"]`);if(!I)return;I.dataset.content=x;let y=I.querySelector("[data-content-label]");y&&(y.textContent=K(x))}function Q(S,w,x,I){let y=S.querySelector(`[data-drive-layout-content="${w}"]`);if(!y)return;let G=d(w);y.innerHTML=h(G,x,I),y.disabled=G.length===0,y.value=x}function U(S){let w=_();if(!w){S.style.removeProperty("--drive-layout-preview-area-1-size"),S.style.removeProperty("--drive-layout-preview-area-2-size"),S.dataset.orientation=m,S.dataset.mode="",S.dataset.contentUnavailable="true",q(S,"area_1",""),q(S,"area_2",""),Q(S,"area1Content","",""),Q(S,"area2Content","",""),B(S,"orientation",m),B(S,"mode","");return}delete S.dataset.contentUnavailable,S.style.setProperty("--drive-layout-preview-area-1-size",`${w.ratio}fr`),S.style.setProperty("--drive-layout-preview-area-2-size",`${Number((1-w.ratio).toFixed(2))}fr`),S.dataset.orientation=w.orientation,S.dataset.mode=w.mode,q(S,"area_1",w.area1Content),q(S,"area_2",w.area2Content),Q(S,"area1Content",w.area1Content,w.area2Content),Q(S,"area2Content",w.area2Content,w.area1Content);let x=S.querySelector("[data-drive-layout-swap] span");x&&(x.textContent=w.orientation===t.ORIENTATION.VERTICAL?"⇅":"⇄"),B(S,"orientation",w.orientation),B(S,"mode",w.mode)}function j(S){typeof showAppToast=="function"&&showAppToast(S?.message||String(S),{tone:"error"})}function Ft(S){S.querySelectorAll(`[data-web-settings-component="${a}"]`).forEach(w=>{if(w.dataset.webSettingsBound==="1")return;w.dataset.webSettingsBound="1";let x=!1;w.querySelectorAll("[data-drive-layout-control]").forEach(I=>{I.addEventListener("click",async()=>{if(x)return;let y=I.dataset.driveLayoutControl,G=I.dataset.value;if(y==="orientation"){m=t.normalizeOrientation(G),U(w);return}let nt=t.keysFor(m);x=!0;try{let it=ht(nt.mode,G);U(w),await it}catch(it){j(it)}finally{x=!1,U(w)}})}),w.querySelectorAll("[data-drive-layout-content]").forEach(I=>{I.addEventListener("change",async()=>{if(x)return;let y=I.dataset.driveLayoutContent,G=t.keysFor(m),nt=I.value;x=!0;try{let it=ht(G[y],nt);U(w),await it}catch(it){j(it)}finally{x=!1,U(w)}})}),w.querySelector("[data-drive-layout-swap]")?.addEventListener("click",async()=>{if(x)return;let I=t.keysFor(m),y=_();if(!y){U(w);return}x=!0;try{let G=At({[I.area1Content]:y.area2Content,[I.area2Content]:y.area1Content});U(w),await G}catch(G){j(G)}finally{x=!1,U(w)}}),U(w)})}n.register(a,{settingKeys:t.settingKeys,render:v,bind:Ft})})();var xn=!1;function ma(){let t=document.querySelector(".app-dialog--web-settings .web-settings-nav"),n=t?.querySelector(".web-settings-nav__item.is-active");if(!t||!n)return!1;let a=t.getBoundingClientRect(),s=n.getBoundingClientRect(),i=0,p=0;return s.lefta.right&&(i=s.right-a.right),s.topa.bottom&&(p=s.bottom-a.bottom),Math.abs(i)<1&&Math.abs(p)<1?!1:(typeof t.scrollBy=="function"?t.scrollBy({left:i,top:p,behavior:"auto"}):(t.scrollLeft+=i,t.scrollTop+=p),!0)}function Ne(){window.requestAnimationFrame(ma)}function fa(){if(document.querySelectorAll("[data-web-settings-group]").forEach(t=>{t.dataset.webSettingsBound!=="1"&&(t.dataset.webSettingsBound="1",t.addEventListener("click",()=>{vn(t.dataset.webSettingsGroup||"general"),In(),Ne()}))}),document.querySelectorAll("[data-web-setting]").forEach(t=>{if(t.dataset.webSettingBound==="1")return;t.dataset.webSettingBound="1";let n=En(t.dataset.webSetting),a=t.querySelector(".c-switch__input"),s=t.querySelector(".web-settings-select");n&&(a&&a.addEventListener("change",()=>{xe(n,a.checked).then(()=>{n.id==="auto_update_git_pull"&&a.checked&&globalThis.CarrotToolsRuntime?.refreshGitPullStatus?.({force:!0,ttlMs:0}).catch(()=>{})}).catch(i=>{a.checked=!!kt(n),typeof showAppToast=="function"&&showAppToast(i?.message||String(i),{tone:"error"})})}),s&&s.addEventListener("change",()=>{xe(n,s.value).catch(i=>{s.value=String(kt(n)),typeof showAppToast=="function"&&showAppToast(i?.message||String(i),{tone:"error"})})}))}),globalThis.WebSettingsComponents?.bind?.(document),Ne(),!xn){xn=!0;for(let t of["resize","orientationchange","carrot:viewportlayout"])window.addEventListener(t,Ne,{passive:!0})}}async function Vt(){await Ae(!0).catch(()=>{});let t=appAlert("",{title:$("web_settings"),html:!0,messageHtml:Ln()});return typeof appDialog<"u"&&appDialog&&appDialog.classList.add("app-dialog--web-settings"),window.setTimeout(fa,0),t.finally(()=>{typeof appDialog<"u"&&appDialog&&appDialog.classList.remove("app-dialog--web-settings")}),t}function Re(t={}){}window.openWebSettingsDialog=Vt;window.handleWebAutoUpdateStatus=Re;var ft=null,Nn=0,Yt=null,Ot=null,Rn=0,Pn=null,$n=!1,Pe=null,Xt=!1;function _a(){return window.CarrotLayout?.isWide?.()?!1:!!window.matchMedia?.("(max-width: 640px), (aspect-ratio < 13/10) and (max-width: 639px), (aspect-ratio < 13/10) and (max-height: 649px)")?.matches}function ba(){if(CURRENT_PAGE!=="tools"||!_a()||history.state?.toolsLogPanel)return;let t=history.state&&history.state.page==="tools"?history.state:{page:"tools"};history.pushState({...t,page:"tools",toolsLogPanel:!0},"")}function ha(){!history.state?.toolsLogPanel||Xt||(Xt=!0,history.back(),window.setTimeout(()=>{Xt=!1},360))}function ya(){document.body?.dataset.toolsLogHistoryDismissBound!=="1"&&(document.body&&(document.body.dataset.toolsLogHistoryDismissBound="1"),window.addEventListener("popstate",t=>{document.getElementById("pageTools")?.classList.contains("tools-log-expanded")&&(dt(!1,{syncHistory:!1}),Xt=!1,t.stopImmediatePropagation())},!0))}var wa=1e4,On=20,Gt="",Mn="",Z=[],Mt=null,wt=null,Zt=0;function Et(t){return String(t??"").replace(/\s+$/,"")}function Sa(t){return Et(t).split(/\n{2,}/).map(n=>n.trim()).filter(Boolean).slice(-On).join(` -`)}function Mt(t){let n=Number(t?.updated_at||0),a=Number(t?.created_at||0);return Number.isFinite(n)&&n>0?n:Number.isFinite(a)?a:0}function fa(t){return t.slice().sort((n,a)=>Mt(a)-Mt(n)).slice(0,Dn).sort((n,a)=>Mt(n)-Mt(a))}function ae(t){Z=fa(Array.isArray(t)?t.filter(n=>n?.id):[])}function Zt(t){if(!t?.id)return;let n=Z.filter(a=>a?.id!==t.id);n.push(t),ae(n)}async function Pe(){return Ot||(Ot=getJson("/api/tools/jobs").then(t=>(ae(t.jobs||[]),pt(),Z)).finally(()=>{Ot=null}),Ot)}function te(t=0){window.setTimeout(()=>{let n=document.querySelector("#toolsOut .tools-console-log__body")||document.getElementById("toolsOut");n&&(n.scrollTop=n.scrollHeight)},t)}function ma(){Xt=0;let t=document.querySelector("#toolsMeta .tools-meta__status"),n=t?.querySelector(".tools-meta__statusTrack");if(!t||!n)return;let a=n.scrollWidth>t.clientWidth+3;if(t.classList.toggle("is-overflowing",a),!a){n.style.removeProperty("--tools-meta-scroll-distance"),n.style.removeProperty("--tools-meta-scroll-duration");return}let i=Math.max(18,Math.ceil(n.scrollWidth-t.clientWidth));n.style.setProperty("--tools-meta-scroll-distance",`${i}px`),n.style.setProperty("--tools-meta-scroll-duration",`${Math.max(2.4,Math.min(6.2,i/58))}s`)}function $n(){Xt&&cancelAnimationFrame(Xt),Xt=requestAnimationFrame(ma)}function Gt(){let t=document.getElementById("pageTools");!t||t.classList.contains("tools-log-expanded")||(t.classList.add("tools-log-attention"),wt&&window.clearTimeout(wt),wt=window.setTimeout(()=>{t.classList.remove("tools-log-attention"),wt=null},3200))}function dt(t,n={}){let a=document.getElementById("pageTools");if(!a)return;let i=a.classList.contains("tools-log-expanded");a.classList.toggle("tools-log-expanded",t),document.getElementById("toolsOut")?.setAttribute("aria-expanded",t?"true":"false");let s=document.getElementById("toolsMeta");s&&s.setAttribute("aria-expanded",t?"true":"false"),t&&!i&&n.syncHistory!==!1&&ca(),!t&&i&&n.syncHistory!==!1&&ua(),t&&(a.classList.remove("tools-log-attention"),wt&&(window.clearTimeout(wt),wt=null),window.CarrotToolsNotifications?.focusLatest?.({expand:!0,smoothOnce:!0,stableDetail:!0})),window.CarrotToolsNotifications?.render||(te(),te(280))}function pt(){let t=document.getElementById("toolsOut");if(!t)return;let n=Et(qt),a=Et(kn);window.CarrotToolsNotifications?.render?window.CarrotToolsNotifications.render(t,{jobs:Z,historyText:n,currentText:a},{onClear:_a,onClose:()=>dt(!1),autoFocusLatest:!0}):(t.textContent=a||n||" ",requestAnimationFrame(()=>te()),te(280))}async function _a(){let t=document.getElementById("toolsOut");t?.querySelector(".tools-console-log__card")&&(t.classList.add("is-clearing"),await new Promise(i=>window.setTimeout(i,180))),qt="",kn="";let a=[];try{a=(await requestJson("/api/tools/jobs",{method:"DELETE"})).jobs||[]}catch{a=Z.filter(i=>String(i?.status||"")==="running")}t?.classList.remove("is-clearing"),ae(a),window.CarrotToolsNotifications?.resetDetail?.(),pt(),Z.length||dt(!1)}function ba(t){let n=Et(t);n&&(qt=ga(qt?`${qt} +`)}function qt(t){let n=Number(t?.updated_at||0),a=Number(t?.created_at||0);return Number.isFinite(n)&&n>0?n:Number.isFinite(a)?a:0}function Ta(t){return t.slice().sort((n,a)=>qt(a)-qt(n)).slice(0,On).sort((n,a)=>qt(n)-qt(a))}function se(t){Z=Ta(Array.isArray(t)?t.filter(n=>n?.id):[])}function te(t){if(!t?.id)return;let n=Z.filter(a=>a?.id!==t.id);n.push(t),se(n)}async function Be(){return Mt||(Mt=getJson("/api/tools/jobs").then(t=>(se(t.jobs||[]),pt(),Z)).finally(()=>{Mt=null}),Mt)}function ee(t=0){window.setTimeout(()=>{let n=document.querySelector("#toolsOut .tools-console-log__body")||document.getElementById("toolsOut");n&&(n.scrollTop=n.scrollHeight)},t)}function va(){Zt=0;let t=document.querySelector("#toolsMeta .tools-meta__status"),n=t?.querySelector(".tools-meta__statusTrack");if(!t||!n)return;let a=n.scrollWidth>t.clientWidth+3;if(t.classList.toggle("is-overflowing",a),!a){n.style.removeProperty("--tools-meta-scroll-distance"),n.style.removeProperty("--tools-meta-scroll-duration");return}let s=Math.max(18,Math.ceil(n.scrollWidth-t.clientWidth));n.style.setProperty("--tools-meta-scroll-distance",`${s}px`),n.style.setProperty("--tools-meta-scroll-duration",`${Math.max(2.4,Math.min(6.2,s/58))}s`)}function qn(){Zt&&cancelAnimationFrame(Zt),Zt=requestAnimationFrame(va)}function Wt(){let t=document.getElementById("pageTools");!t||t.classList.contains("tools-log-expanded")||(t.classList.add("tools-log-attention"),wt&&window.clearTimeout(wt),wt=window.setTimeout(()=>{t.classList.remove("tools-log-attention"),wt=null},3200))}function dt(t,n={}){let a=document.getElementById("pageTools");if(!a)return;let s=a.classList.contains("tools-log-expanded");a.classList.toggle("tools-log-expanded",t),document.getElementById("toolsOut")?.setAttribute("aria-expanded",t?"true":"false");let i=document.getElementById("toolsMeta");i&&i.setAttribute("aria-expanded",t?"true":"false"),t&&!s&&n.syncHistory!==!1&&ba(),!t&&s&&n.syncHistory!==!1&&ha(),t&&(a.classList.remove("tools-log-attention"),wt&&(window.clearTimeout(wt),wt=null),window.CarrotToolsNotifications?.focusLatest?.({expand:!0,smoothOnce:!0,stableDetail:!0})),window.CarrotToolsNotifications?.render||(ee(),ee(280))}function pt(){let t=document.getElementById("toolsOut");if(!t)return;let n=Et(Gt),a=Et(Mn);window.CarrotToolsNotifications?.render?window.CarrotToolsNotifications.render(t,{jobs:Z,historyText:n,currentText:a},{onClear:Ca,onClose:()=>dt(!1),autoFocusLatest:!0}):(t.textContent=a||n||" ",requestAnimationFrame(()=>ee()),ee(280))}async function Ca(){let t=document.getElementById("toolsOut");t?.querySelector(".tools-console-log__card")&&(t.classList.add("is-clearing"),await new Promise(s=>window.setTimeout(s,180))),Gt="",Mn="";let a=[];try{a=(await requestJson("/api/tools/jobs",{method:"DELETE"})).jobs||[]}catch{a=Z.filter(s=>String(s?.status||"")==="running")}t?.classList.remove("is-clearing"),se(a),window.CarrotToolsNotifications?.resetDetail?.(),pt(),Z.length||dt(!1)}function Aa(t){let n=Et(t);n&&(Gt=Sa(Gt?`${Gt} -${n}`:n),pt(),Gt())}function z(t,n={}){let a=Et(t);if(!a)return;let i=n.label?String(n.label).trim():"notice",s=Date.now()/1e3,d=`client-${Math.round(s*1e3).toString(36)}`;Zt({id:d,action:i,payload:{notice:!0},status:"done",log:a,progress:100,message:"",result:{ok:!0,out:a},created_at:s,updated_at:s}),pt(),Gt(),postJson("/api/tools/jobs/notice",{action:i,message:a}).then(p=>{Z=Z.filter(g=>g?.id!==d),p.job?Zt(p.job):ae(p.jobs||Z),pt()}).catch(()=>{Z=Z.filter(p=>p?.id!==d),ba(`[${i}] -${a}`)}),n.meta!==!1&&it(a.split(` -`)[0]),n.clearProgress!==!1&&et(null,{active:!1})}function Nn(t={}){let n=document.getElementById("btnGitPull"),a=document.getElementById("gitPullBadge"),i=typeof btnTools<"u"&&btnTools?btnTools:document.getElementById("btnTools");if(!n||!a)return;let s=Math.max(0,Number(t.behind||0)),d=String(t.state||""),p=!!(d&&d!=="ok"),g=s>0,f=g?s>99?"99+":String(s):p?"X":"✓";if(n.classList.toggle("has-updates",g),n.classList.toggle("is-current",!g&&!p),n.classList.toggle("has-git-error",!g&&p),a.hidden=!1,a.textContent=f,a.dataset.state=g?"updates":p?"error":"current",i&&(i.classList.toggle("has-git-updates",g),g?i.dataset.gitBehind=f:i.removeAttribute("data-git-behind")),g){let m=String(t.upstream||"").trim(),I=m?` (${m})`:"";n.title=`${s} commits available${I}`}else p?n.title=t.error||t.fetch_error||"git status unavailable":n.title="Up to date"}async function at(t={}){let n=t.force===!0,a=Number.isFinite(t.ttlMs)?t.ttlMs:6e4;if(!n&&$t)return $t;if(!n&&hasFreshPageData(In,a))return null;let i=`/api/tools/git_status${n?"?force=1":""}`;return $t=getJson(i).then(s=>(In=Date.now(),Nn(s),typeof Re=="function"&&void 0,s)).catch(s=>(console.log("[GitStatus] check failed:",s),Nn({behind:0}),null)).finally(()=>{$t=null}),$t}function Bn(){Rn||(Rn=!0,document.addEventListener("visibilitychange",()=>{document.hidden||at({force:!0,ttlMs:0}).catch(()=>{})})),!xn&&(xn=window.setInterval(()=>{document.hidden||at({ttlMs:0}).catch(()=>{})},pa))}function St(t,n={}){switch(t){case"shell_cmd":return String(n.cmd||"").trim()||"command";case"git_pull":return"git pull";case"git_sync":return"git sync";case"git_reset":return`git reset --${n.mode||"hard"} ${n.target||"HEAD"}`.trim();case"git_checkout":return`git checkout ${n.branch||""}`.trim();case"git_log":return"git log";case"git_branch_list":return"change branch";case"git_remote_set":return"change repository";case"git_remote_add":return`git remote add/set-url ${n.name||""}`.trim();case"send_tmux_log":return"capture tmux";case"server_tmux_log":return"send tmux";case"install_required":return"install flask";case"delete_all_videos":return"delete all videos";case"delete_all_logs":return"delete all logs";case"rebuild_all":return"rebuild all";case"backup_settings":return"backup settings";case"reboot":return"reboot";case"git_reset_repo_fetch":return"reset repo (fetch)";case"git_reset_repo_checkout":return`reset repo (checkout ${n.branch||"unknown"})`;case"reset_calib":return"reset calib";default:return t}}var ee="",De="",ne="";function ha(){let t=window.CarrotTranslations||{},n=window.CARROT_WEB_LANGUAGE_CODES||["ko","en","zh"],a=Array.isArray(t.order)?t.order:n;return[...new Set([...a,...n])].filter(s=>n.includes(s)).map(s=>{let d=t.getPack?.(s)||t.packs?.[s]||{};return UI_STRINGS?.[s]?{lang:s,name:d.name||s.toUpperCase(),nativeName:d.nativeName||d.name||s.toUpperCase(),shortName:d.shortName||s.toUpperCase()}:null}).filter(Boolean)}async function ya(){let t=ha(),a=(t.find(s=>s.lang===LANG)||t[0])?.name||LANG.toUpperCase(),i=await openAppDialog({mode:"choice",title:getUIText("language","Language"),message:`${getUIText("current_language","Current language")}: ${a}`,choiceLayout:"list",choices:t.map(s=>({label:s.name,value:s.lang,selected:s.lang===LANG}))});i&&i!==LANG&&typeof setWebLanguage=="function"&&await Promise.resolve(setWebLanguage(i))}function gt(){let t=document.getElementById("toolsMeta");if(!t)return;t.textContent="";let n=document.createElement("span");n.className="tools-meta__status",n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-expanded",document.getElementById("pageTools")?.classList.contains("tools-log-expanded")?"true":"false"),n.setAttribute("aria-label",getUIText("toggle_log_panel","Expand or collapse log panel"));let a=Math.max(0,Number(window.CarrotToolsNotifications?.unreadCount?.()||0));n.classList.toggle("has-unread",a>0),n.dataset.unreadCount=a>0?String(a):"";let i=document.createElement("span");i.className="tools-meta__statusTrack",i.textContent=ee||"-",n.appendChild(i),window.CarrotToolsNotifications?.bindStatusGesture?.(n,{setExpanded:dt}),n.addEventListener("click",()=>{let s=document.getElementById("pageTools");dt(!s?.classList.contains("tools-log-expanded"))}),n.addEventListener("keydown",s=>{if(s.key!=="Enter"&&s.key!==" ")return;s.preventDefault();let d=document.getElementById("pageTools");dt(!d?.classList.contains("tools-log-expanded"))}),t.appendChild(n),$n()}function On(){document.getElementById("toolsPrimaryActions")?.setAttribute("aria-label",getUIText("tools_shortcuts","Tools shortcuts"))}function it(t){ee=String(t||""),gt()}function wa(t={}){let n=String(t.GitBranch||"").trim(),a=String(t.GitCommit||"").trim(),i=String(t.DongleId||"").trim(),s=String(t.HardwareSerial||"").trim(),d=[];return n&&d.push(n),a&&d.push(a.slice(0,7)),i&&d.push(i),s&&d.push(s),d.join(" · ")}function Mn(t){let n=String(t||"").replace(/['"]/g,"").trim();if(!n)return"";let a=n.split(" ");if(a.length>1&&/^\d{10,}$/.test(a[0])){let m=new Date(parseInt(a[0],10)*1e3);if(!isNaN(m))return`${m.getFullYear()}.${String(m.getMonth()+1).padStart(2,"0")}.${String(m.getDate()).padStart(2,"0")}`}let i=n.match(/^(\d{4})[-./](\d{2})[-./](\d{2})/);if(i)return`${i[1]}.${i[2]}.${i[3]}`;let s=Date.parse(n);if(!Number.isFinite(s))return"";let d=new Date(s),p=d.getFullYear(),g=String(d.getMonth()+1).padStart(2,"0"),f=String(d.getDate()).padStart(2,"0");return`${p}.${g}.${f}`}function qn(t){let n=String(t||"").trim();if(!n)return"";let a=NaN;if(/^\d+$/.test(n)){let I=Number(n);Number.isFinite(I)&&(a=n.length>=13?I:I*1e3)}else a=Date.parse(n);if(!Number.isFinite(a))return"";let i=new Date(a),s=i.getFullYear(),d=String(i.getMonth()+1).padStart(2,"0"),p=String(i.getDate()).padStart(2,"0"),g=String(i.getHours()).padStart(2,"0"),f=String(i.getMinutes()).padStart(2,"0"),m=String(i.getSeconds()).padStart(2,"0");return`${s}.${d}.${p} ${g}:${f}:${m}`}function Sa(t={}){let n=String(t.GitBranch||"").trim(),a=String(t.GitCommit||"").trim(),i=Mn(t.GitCommitDate),s=String(t.DongleId||"").trim(),d=String(t.HardwareSerial||"").trim(),p=qn(t.GitPullTime),g={branch:getUIText("branch","Branch"),commit:getUIText("commit","Commit"),deviceType:getUIText("device_type","Device"),dongle:getUIText("dongle_id","Dongle ID"),serial:getUIText("serial","Serial"),gitPull:getUIText("recent_update","Recent update"),position:getUIText("position","Position")},f=typeof escapeHtml=="function"?escapeHtml:h=>String(h).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'"),m=[],I=String(t.GitRemote||"").trim(),N=I?I.replace(/^https?:\/\/[^/]+\//,"").replace(/\.git$/,""):"",F=n+(N?` (${N})`:"");if(F&&m.push(`
${f(g.branch)}: ${f(F)}
`),a){let h=`${a.slice(0,7)}${i?` (${i})`:""}`;m.push(`
${f(g.commit)}: ${f(h)}
`)}s&&m.push(`
${f(g.dongle)}: ${f(s)}
`),d&&m.push(`
${f(g.serial)}: ${f(d)}
`);let u=String(t.DevicePosition||"").trim();return m.push(`
${f(g.position)}: ${f(u)}
`),p&&m.push(`
${f(g.gitPull)}: ${f(p)}
`),`
${m.join("")}
`}function Ta(t={}){let n=String(t.GitBranch||"").trim(),a=String(t.GitCommit||"").trim(),i=Mn(t.GitCommitDate),s=String(t.DongleId||"").trim(),d=String(t.HardwareSerial||"").trim(),p=qn(t.GitPullTime),g=String(t.GitRemote||"").trim(),f=g?g.replace(/^https?:\/\/[^/]+\//,"").replace(/\.git$/,""):"",m=n+(f?` (${f})`:""),I=String(t.DevicePosition||"").trim(),N=[];return m&&N.push(`Branch: ${m}`),a&&N.push(`Commit: ${a.slice(0,7)}${i?` (${i})`:""}`),s&&N.push(`DongleID: ${s}`),d&&N.push(`Serial: ${d}`),I&&N.push(`Position: ${I}`),p&&N.push(`Updated: ${p}`),N.join(` -`)}function va(){let t=String(ee||"").trim();if(!t)return;(window.CarrotTranslations?.order||["ko","en","zh"]).map(i=>UI_STRINGS[i]?.ready||"Ready").filter(Boolean).includes(t)&&(ee=getUIText("ready","Ready"))}function Gn(){va(),gt(),On(),yt().catch(()=>{}),CURRENT_PAGE==="logs"&&(globalThis.CarrotLogsRuntime?.dashcam.render?.({animate:!1}),globalThis.CarrotLogsRuntime?.screenrecord.render?.({animate:!1}));let t=document.getElementById("terminalMeta");if(!t)return;let n=String(t.textContent||"").trim(),a=[["connecting","connecting..."],["connected","connected"],["reconnecting","reconnecting..."],["terminal_ready","tmux ready"],["terminal_disconnected","disconnected"],["terminal_unavailable","terminal unavailable"],["terminal_offline","terminal offline"]],i=window.CarrotTranslations?.order||["ko","en","zh"];for(let[s,d]of a)if(i.map(g=>UI_STRINGS[g]?.[s]||d).filter(Boolean).includes(n)){t.textContent=getUIText(s,d);break}}async function yt(t={}){let n=t.force===!0,a=t.silent===!0,i=Number.isFinite(t.ttlMs)?t.ttlMs:PAGE_DATA_TTL_MS;if(typeof bulkGet=="function")return!n&&mt?mt:!n&&hasFreshPageData(Ln,i)?((!a||CURRENT_PAGE==="tools")&>(),{text:De,dialog:ne}):(mt=(async()=>{let s=await bulkGet(["GitBranch","GitCommit","GitCommitDate","GitRemote","DeviceType","DongleId","HardwareSerial","GitPullTime","DevicePosition"]);return De=wa(s),ne=Sa(s),Ln=Date.now(),Jt=s,(!a||CURRENT_PAGE==="tools")&>(),s})().finally(()=>{mt=null}),mt)}function Ca(){return Promise.allSettled([loadCurrentCar({resetRetry:!1,ttlMs:PAGE_DATA_TTL_MS}),loadRecordState({ttlMs:PAGE_DATA_TTL_MS}),yt({silent:!0,ttlMs:PAGE_DATA_TTL_MS}),at({ttlMs:6e5}),typeof updateQuickLink=="function"?updateQuickLink({silent:!0,ttlMs:PAGE_DATA_TTL_MS}):Promise.resolve(),ensureCarsLoaded()])}function oe(t=140){Ne||(Ne=window.setTimeout(()=>{Ne=null,requestIdleTask(()=>{Ca().catch(()=>{})})},Math.max(0,t)))}document.readyState==="complete"?(oe(120),Bn()):window.addEventListener("load",()=>{oe(120),Bn()},{once:!0});window.addEventListener("resize",$n,{passive:!0});function et(t=null,n={}){let a=document.getElementById("toolsProgress"),i=document.getElementById("toolsProgressBar");if(!a||!i)return;let s=n.active!==!1,d=!!n.indeterminate;if(!s){a.hidden=!1,a.setAttribute("aria-hidden","false"),a.classList.remove("is-indeterminate"),i.style.width="0%";return}a.hidden=!1,a.setAttribute("aria-hidden","false"),a.classList.toggle("is-indeterminate",d);let g=Number.isFinite(t)?Math.max(4,Math.min(100,Number(t))):28;i.style.width=`${g}%`}var Be=0,Pn=Promise.resolve(),Vt=0;function Aa(t,n){let a=String(n?.message||t.running||""),i=Number(n?.step_current||0),s=Number(n?.step_total||0),d=Number(n?.progress),p=Number.isFinite(d)&&d>0,g=a||t.running;p&&d<100?g=`${g} · ${Math.round(d)}%`:s>1&&i>0&&(g=`${g} · ${i}/${s}`),it(g),et(p?d:null,{active:!0,indeterminate:!p||d>=100})}async function M(t,n){let a=Vt;Vt+=1;let i=async()=>{if(a>0){let d=St(t,n||{});it(getUIText("tool_queued","Queued...")),z(getUIText("tool_queued_detail","Queued: {command}",{command:d}),{label:"queue"})}try{return await Ea(t,n)}finally{Vt=Math.max(0,Vt-1)}},s=Pn.catch(()=>{}).then(i);return Pn=s.catch(()=>{}),s}async function Ea(t,n){let a=getActionLabel(t),i=++Be,s=St(t,n||{}),d=typeof beginAppActivity=="function"?beginAppActivity("tools",a.running||s):null;try{it(a.running),et(null,{active:!0,indeterminate:!0});let g=(await postJson("/api/tools/start",{action:t,...n||{}})).job_id,f=Date.now()/1e3;Zt({id:g,action:t,payload:n||{},status:"running",log:"",progress:0,message:a.running,created_at:f,updated_at:f}),pt(),Gt();let m=null;for(;i===Be;){if(m=await getJson(`/api/tools/job?id=${encodeURIComponent(g)}`),Zt(m),pt(),Gt(),!m.done){Aa(a,m),await waitMs(320);continue}let I=m.result||m;if(!I.ok){let N=friendlyError(I)||I.error||m.error||a.failed;throw it(a.failed),et(null,{active:!1}),Pe().catch(()=>{}),new Error(N)}return it(a.done),et(100,{active:!0,indeterminate:!1}),Pe().catch(()=>{}),window.setTimeout(()=>{Be===i&&et(null,{active:!1})},900),I}throw new Error("tool run cancelled")}finally{d&&typeof endAppActivity=="function"&&endAppActivity(d)}}function La(t){let n=Et(t?.out||t?.log||"");if(!n)return!1;let a=n.toLowerCase();return a.includes("already up to date")||a.includes("already up-to-date")?!1:a.includes("fast-forward")||a.includes("merge made by")||a.includes("updating ")||/[0-9]+\s+files?\s+changed/.test(a)||a.includes("create mode ")||a.includes("delete mode ")||a.includes("rewrite ")}function $(t,n){let i=getActionLabel(t).failed,s=typeof n=="object"&&n.message?n.message:String(n);if(it(i),et(null,{active:!1}),Z.some(p=>String(p?.action||"")===String(t||"")&&String(p?.status||"")==="failed"&&Date.now()/1e3-Mt(p)<30)){pt(),Gt();return}z(s,{label:t,meta:!1})}function Wn(){let t=(u,h)=>{let _=document.getElementById(u);!_||_.dataset.bound==="1"||(_.dataset.bound="1",_.onclick=h)},n=(u,h,_,v="click")=>{!u||u.dataset[h]==="1"||(u.dataset[h]="1",u.addEventListener(v,_))},a=()=>{let u=Array.from(document.querySelectorAll("#pageTools .tools-group")),h=()=>{Array.from(document.querySelectorAll("#pageTools .tools-scroll-stack > .row-wrap:first-child, #pageTools .tools-group, #pageTools .tools-group.is-open .tools-group__bodyInner > *")).filter(v=>!v.hidden&&!v.classList.contains("hidden")).forEach((v,D)=>{v.classList.add("ui-stagger-item"),v.style.setProperty("--i",String(D))})};u.forEach(_=>{let v=_.querySelector(".tools-group__toggle"),D=_.querySelector(".tools-group__body");if(!v||!D)return;let q=_.dataset.toolsGroup,Q=localStorage.getItem("tools_group_"+q),U=Q!==null?Q==="true":!0;_.classList.toggle("is-open",U),v.setAttribute("aria-expanded",U?"true":"false"),n(v,"toolsGroupToggle",()=>{let j=!_.classList.contains("is-open");_.classList.remove("is-expanding","is-collapsing"),_.__toolsGroupMotionTimer&&clearTimeout(_.__toolsGroupMotionTimer),_.offsetWidth,_.classList.toggle("is-open",j),_.classList.add(j?"is-expanding":"is-collapsing"),v.setAttribute("aria-expanded",j?"true":"false"),localStorage.setItem("tools_group_"+q,j?"true":"false"),_.__toolsGroupMotionTimer=window.setTimeout(()=>{_.classList.remove("is-expanding","is-collapsing"),_.__toolsGroupMotionTimer=null},280)})}),h()},i=()=>{da();let u=document.getElementById("toolsOut");u&&u.dataset.toolsLogBound!=="1"&&(u.dataset.toolsLogBound="1",u.setAttribute("aria-expanded","false"));let h=document.querySelector("#pageTools .tools-console-dock");h&&h.dataset.toolsLogDismissBound!=="1"&&(h.dataset.toolsLogDismissBound="1",h.addEventListener("click",_=>{_.target===h&&dt(!1)})),window.CarrotToolsNotifications?.bindPanelDrag?.(h,{setExpanded:dt}),document.body?.dataset.toolsLogEscBound!=="1"&&(document.body.dataset.toolsLogEscBound="1",document.addEventListener("keydown",_=>{_.key==="Escape"&&dt(!1)})),pt(),Pe().catch(()=>{})},s=async()=>{let h=(document.getElementById("sysCmdInput")?.value||"").trim();if(h)try{await M("shell_cmd",{cmd:h})}catch(_){$("shell_cmd",_)}};it(getUIText("ready","Ready")),On(),et(null,{active:!1}),yt().catch(()=>{}),at({force:!0}).catch(()=>{}),a(),i(),t("btnToolsCarSelect",()=>{typeof window.openCarPickerFlow=="function"?window.openCarPickerFlow():typeof showPage=="function"&&showPage("car",!0)}),t("btnToolsLanguage",()=>{ya().catch(u=>$("language",u))}),t("btnToolsWebSettings",()=>{typeof zt=="function"&&zt()}),t("btnDeviceInfo",async()=>{let u=getUIText("carrot_info","Carrot Info");try{!Jt&&!mt&&await yt({ttlMs:36e5});let h=mt?await mt:Jt;if(h){let _=String(h.DeviceType||"").trim();if(_){let D={tici:"c3",tizi:"c3x",mici:"c4"}[_]||_,q=D!==_?`${D}/${_}`:_;u+=`(${q})`}}}catch{}appAlert(ne||De,{title:u,html:!0,messageHtml:ne,copyText:Ta(Jt||{})})}),t("btnGitPull",async()=>{try{let u=await M("git_pull");if(await yt(),await at({force:!0}),!La(u))return;await appConfirm(UI_STRINGS[LANG].confirm_reboot||"Reboot now?",{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(u){$("git_pull",u)}}),t("btnGitSync",async()=>{if(await appConfirm(UI_STRINGS[LANG].git_sync_confirm||"Run git sync?",{title:"git sync"}))try{await M("git_sync"),await at({force:!0})}catch(u){$("git_sync",u)}});async function d(u){let h=String(u||"hard").trim().toLowerCase(),_=`git reset --${h}`,v=UI_STRINGS[LANG].git_reset_confirm||"Run git reset?";if(await appConfirm(`${v} +${n}`:n),pt(),Wt())}function z(t,n={}){let a=Et(t);if(!a)return;let s=n.label?String(n.label).trim():"notice",i=Date.now()/1e3,p=`client-${Math.round(i*1e3).toString(36)}`;te({id:p,action:s,payload:{notice:!0},status:"done",log:a,progress:100,message:"",result:{ok:!0,out:a},created_at:i,updated_at:i}),pt(),Wt(),postJson("/api/tools/jobs/notice",{action:s,message:a}).then(c=>{Z=Z.filter(g=>g?.id!==p),c.job?te(c.job):se(c.jobs||Z),pt()}).catch(()=>{Z=Z.filter(c=>c?.id!==p),Aa(`[${s}] +${a}`)}),n.meta!==!1&&st(a.split(` +`)[0]),n.clearProgress!==!1&&et(null,{active:!1})}function Bn(t={}){let n=document.getElementById("btnGitPull"),a=document.getElementById("gitPullBadge"),s=typeof btnTools<"u"&&btnTools?btnTools:document.getElementById("btnTools");if(!n||!a)return;let i=Math.max(0,Number(t.behind||0)),p=String(t.state||""),c=!!(p&&p!=="ok"),g=i>0,m=g?i>99?"99+":String(i):c?"X":"✓";if(n.classList.toggle("has-updates",g),n.classList.toggle("is-current",!g&&!c),n.classList.toggle("has-git-error",!g&&c),a.hidden=!1,a.textContent=m,a.dataset.state=g?"updates":c?"error":"current",s&&(s.classList.toggle("has-git-updates",g),g?s.dataset.gitBehind=m:s.removeAttribute("data-git-behind")),g){let f=String(t.upstream||"").trim(),L=f?` (${f})`:"";n.title=`${i} commits available${L}`}else c?n.title=t.error||t.fetch_error||"git status unavailable":n.title="Up to date"}async function at(t={}){let n=t.force===!0,a=Number.isFinite(t.ttlMs)?t.ttlMs:6e4;if(!n&&Ot)return Ot;if(!n&&hasFreshPageData(Rn,a))return null;let s=`/api/tools/git_status${n?"?force=1":""}`;return Ot=getJson(s).then(i=>(Rn=Date.now(),Bn(i),typeof Re=="function"&&void 0,i)).catch(i=>(console.log("[GitStatus] check failed:",i),Bn({behind:0}),null)).finally(()=>{Ot=null}),Ot}function Dn(){$n||($n=!0,document.addEventListener("visibilitychange",()=>{document.hidden||at({force:!0,ttlMs:0}).catch(()=>{})})),!Pn&&(Pn=window.setInterval(()=>{document.hidden||at({ttlMs:0}).catch(()=>{})},wa))}function St(t,n={}){switch(t){case"shell_cmd":return String(n.cmd||"").trim()||"command";case"git_pull":return"git pull";case"git_sync":return"git sync";case"git_reset":return`git reset --${n.mode||"hard"} ${n.target||"HEAD"}`.trim();case"git_checkout":return`git checkout ${n.branch||""}`.trim();case"git_log":return"git log";case"git_branch_list":return"change branch";case"git_remote_set":return"change repository";case"git_remote_add":return`git remote add/set-url ${n.name||""}`.trim();case"send_tmux_log":return"capture tmux";case"server_tmux_log":return"send tmux";case"install_required":return"install flask";case"delete_all_videos":return"delete all videos";case"delete_all_logs":return"delete all logs";case"rebuild_all":return"rebuild all";case"backup_settings":return"backup settings";case"reboot":return"reboot";case"git_reset_repo_fetch":return"reset repo (fetch)";case"git_reset_repo_checkout":return`reset repo (checkout ${n.branch||"unknown"})`;case"reset_calib":return"reset calib";default:return t}}var ne="",De="",oe="";function Ea(){let t=window.CarrotTranslations||{},n=window.CARROT_WEB_LANGUAGE_CODES||["ko","en","zh"],a=Array.isArray(t.order)?t.order:n;return[...new Set([...a,...n])].filter(i=>n.includes(i)).map(i=>{let p=t.getPack?.(i)||t.packs?.[i]||{};return UI_STRINGS?.[i]?{lang:i,name:p.name||i.toUpperCase(),nativeName:p.nativeName||p.name||i.toUpperCase(),shortName:p.shortName||i.toUpperCase()}:null}).filter(Boolean)}async function La(){let t=Ea(),a=(t.find(i=>i.lang===LANG)||t[0])?.name||LANG.toUpperCase(),s=await openAppDialog({mode:"choice",title:getUIText("language","Language"),message:`${getUIText("current_language","Current language")}: ${a}`,choiceLayout:"list",choices:t.map(i=>({label:i.name,value:i.lang,selected:i.lang===LANG}))});s&&s!==LANG&&typeof setWebLanguage=="function"&&await Promise.resolve(setWebLanguage(s))}function gt(){let t=document.getElementById("toolsMeta");if(!t)return;t.textContent="";let n=document.createElement("span");n.className="tools-meta__status",n.setAttribute("role","button"),n.setAttribute("tabindex","0"),n.setAttribute("aria-expanded",document.getElementById("pageTools")?.classList.contains("tools-log-expanded")?"true":"false"),n.setAttribute("aria-label",getUIText("toggle_log_panel","Expand or collapse log panel"));let a=Math.max(0,Number(window.CarrotToolsNotifications?.unreadCount?.()||0));n.classList.toggle("has-unread",a>0),n.dataset.unreadCount=a>0?String(a):"";let s=document.createElement("span");s.className="tools-meta__statusTrack",s.textContent=ne||"-",n.appendChild(s),window.CarrotToolsNotifications?.bindStatusGesture?.(n,{setExpanded:dt}),n.addEventListener("click",()=>{let i=document.getElementById("pageTools");dt(!i?.classList.contains("tools-log-expanded"))}),n.addEventListener("keydown",i=>{if(i.key!=="Enter"&&i.key!==" ")return;i.preventDefault();let p=document.getElementById("pageTools");dt(!p?.classList.contains("tools-log-expanded"))}),t.appendChild(n),qn()}function Gn(){document.getElementById("toolsPrimaryActions")?.setAttribute("aria-label",getUIText("tools_shortcuts","Tools shortcuts"))}function st(t){ne=String(t||""),gt()}function Ia(t={}){let n=String(t.GitBranch||"").trim(),a=String(t.GitCommit||"").trim(),s=String(t.DongleId||"").trim(),i=String(t.HardwareSerial||"").trim(),p=[];return n&&p.push(n),a&&p.push(a.slice(0,7)),s&&p.push(s),i&&p.push(i),p.join(" · ")}function Wn(t){let n=String(t||"").replace(/['"]/g,"").trim();if(!n)return"";let a=n.split(" ");if(a.length>1&&/^\d{10,}$/.test(a[0])){let f=new Date(parseInt(a[0],10)*1e3);if(!isNaN(f))return`${f.getFullYear()}.${String(f.getMonth()+1).padStart(2,"0")}.${String(f.getDate()).padStart(2,"0")}`}let s=n.match(/^(\d{4})[-./](\d{2})[-./](\d{2})/);if(s)return`${s[1]}.${s[2]}.${s[3]}`;let i=Date.parse(n);if(!Number.isFinite(i))return"";let p=new Date(i),c=p.getFullYear(),g=String(p.getMonth()+1).padStart(2,"0"),m=String(p.getDate()).padStart(2,"0");return`${c}.${g}.${m}`}function Un(t){let n=String(t||"").trim();if(!n)return"";let a=NaN;if(/^\d+$/.test(n)){let L=Number(n);Number.isFinite(L)&&(a=n.length>=13?L:L*1e3)}else a=Date.parse(n);if(!Number.isFinite(a))return"";let s=new Date(a),i=s.getFullYear(),p=String(s.getMonth()+1).padStart(2,"0"),c=String(s.getDate()).padStart(2,"0"),g=String(s.getHours()).padStart(2,"0"),m=String(s.getMinutes()).padStart(2,"0"),f=String(s.getSeconds()).padStart(2,"0");return`${i}.${p}.${c} ${g}:${m}:${f}`}function xa(t={}){let n=String(t.GitBranch||"").trim(),a=String(t.GitCommit||"").trim(),s=Wn(t.GitCommitDate),i=String(t.DongleId||"").trim(),p=String(t.HardwareSerial||"").trim(),c=Un(t.GitPullTime),g={branch:getUIText("branch","Branch"),commit:getUIText("commit","Commit"),deviceType:getUIText("device_type","Device"),dongle:getUIText("dongle_id","Dongle ID"),serial:getUIText("serial","Serial"),gitPull:getUIText("recent_update","Recent update"),position:getUIText("position","Position")},m=typeof escapeHtml=="function"?escapeHtml:h=>String(h).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'"),f=[],L=String(t.GitRemote||"").trim(),R=L?L.replace(/^https?:\/\/[^/]+\//,"").replace(/\.git$/,""):"",K=n+(R?` (${R})`:"");if(K&&f.push(`
${m(g.branch)}: ${m(K)}
`),a){let h=`${a.slice(0,7)}${s?` (${s})`:""}`;f.push(`
${m(g.commit)}: ${m(h)}
`)}i&&f.push(`
${m(g.dongle)}: ${m(i)}
`),p&&f.push(`
${m(g.serial)}: ${m(p)}
`);let d=String(t.DevicePosition||"").trim();return f.push(`
${m(g.position)}: ${m(d)}
`),c&&f.push(`
${m(g.gitPull)}: ${m(c)}
`),`
${f.join("")}
`}function Na(t={}){let n=String(t.GitBranch||"").trim(),a=String(t.GitCommit||"").trim(),s=Wn(t.GitCommitDate),i=String(t.DongleId||"").trim(),p=String(t.HardwareSerial||"").trim(),c=Un(t.GitPullTime),g=String(t.GitRemote||"").trim(),m=g?g.replace(/^https?:\/\/[^/]+\//,"").replace(/\.git$/,""):"",f=n+(m?` (${m})`:""),L=String(t.DevicePosition||"").trim(),R=[];return f&&R.push(`Branch: ${f}`),a&&R.push(`Commit: ${a.slice(0,7)}${s?` (${s})`:""}`),i&&R.push(`DongleID: ${i}`),p&&R.push(`Serial: ${p}`),L&&R.push(`Position: ${L}`),c&&R.push(`Updated: ${c}`),R.join(` +`)}function Ra(){let t=String(ne||"").trim();if(!t)return;(window.CarrotTranslations?.order||["ko","en","zh"]).map(s=>UI_STRINGS[s]?.ready||"Ready").filter(Boolean).includes(t)&&(ne=getUIText("ready","Ready"))}function Hn(){Ra(),gt(),Gn(),yt().catch(()=>{}),CURRENT_PAGE==="logs"&&(globalThis.CarrotLogsRuntime?.dashcam.render?.({animate:!1}),globalThis.CarrotLogsRuntime?.screenrecord.render?.({animate:!1}));let t=document.getElementById("terminalMeta");if(!t)return;let n=String(t.textContent||"").trim(),a=[["connecting","connecting..."],["connected","connected"],["reconnecting","reconnecting..."],["terminal_ready","tmux ready"],["terminal_disconnected","disconnected"],["terminal_unavailable","terminal unavailable"],["terminal_offline","terminal offline"]],s=window.CarrotTranslations?.order||["ko","en","zh"];for(let[i,p]of a)if(s.map(g=>UI_STRINGS[g]?.[i]||p).filter(Boolean).includes(n)){t.textContent=getUIText(i,p);break}}async function yt(t={}){let n=t.force===!0,a=t.silent===!0,s=Number.isFinite(t.ttlMs)?t.ttlMs:PAGE_DATA_TTL_MS;if(typeof bulkGet=="function")return!n&&ft?ft:!n&&hasFreshPageData(Nn,s)?((!a||CURRENT_PAGE==="tools")&>(),{text:De,dialog:oe}):(ft=(async()=>{let i=await bulkGet(["GitBranch","GitCommit","GitCommitDate","GitRemote","DeviceType","DongleId","HardwareSerial","GitPullTime","DevicePosition"]);return De=Ia(i),oe=xa(i),Nn=Date.now(),Yt=i,(!a||CURRENT_PAGE==="tools")&>(),i})().finally(()=>{ft=null}),ft)}function Pa(){return Promise.allSettled([loadCurrentCar({resetRetry:!1,ttlMs:PAGE_DATA_TTL_MS}),loadRecordState({ttlMs:PAGE_DATA_TTL_MS}),yt({silent:!0,ttlMs:PAGE_DATA_TTL_MS}),at({ttlMs:6e5}),typeof updateQuickLink=="function"?updateQuickLink({silent:!0,ttlMs:PAGE_DATA_TTL_MS}):Promise.resolve(),ensureCarsLoaded()])}function ae(t=140){Pe||(Pe=window.setTimeout(()=>{Pe=null,requestIdleTask(()=>{Pa().catch(()=>{})})},Math.max(0,t)))}document.readyState==="complete"?(ae(120),Dn()):window.addEventListener("load",()=>{ae(120),Dn()},{once:!0});window.addEventListener("resize",qn,{passive:!0});function et(t=null,n={}){let a=document.getElementById("toolsProgress"),s=document.getElementById("toolsProgressBar");if(!a||!s)return;let i=n.active!==!1,p=!!n.indeterminate;if(!i){a.hidden=!1,a.setAttribute("aria-hidden","false"),a.classList.remove("is-indeterminate"),s.style.width="0%";return}a.hidden=!1,a.setAttribute("aria-hidden","false"),a.classList.toggle("is-indeterminate",p);let g=Number.isFinite(t)?Math.max(4,Math.min(100,Number(t))):28;s.style.width=`${g}%`}var $e=0,kn=Promise.resolve(),Jt=0;function $a(t,n){let a=String(n?.message||t.running||""),s=Number(n?.step_current||0),i=Number(n?.step_total||0),p=Number(n?.progress),c=Number.isFinite(p)&&p>0,g=a||t.running;c&&p<100?g=`${g} · ${Math.round(p)}%`:i>1&&s>0&&(g=`${g} · ${s}/${i}`),st(g),et(c?p:null,{active:!0,indeterminate:!c||p>=100})}async function M(t,n){let a=Jt;Jt+=1;let s=async()=>{if(a>0){let p=St(t,n||{});st(getUIText("tool_queued","Queued...")),z(getUIText("tool_queued_detail","Queued: {command}",{command:p}),{label:"queue"})}try{return await Ba(t,n)}finally{Jt=Math.max(0,Jt-1)}},i=kn.catch(()=>{}).then(s);return kn=i.catch(()=>{}),i}async function Ba(t,n){let a=getActionLabel(t),s=++$e,i=St(t,n||{}),p=typeof beginAppActivity=="function"?beginAppActivity("tools",a.running||i):null;try{st(a.running),et(null,{active:!0,indeterminate:!0});let g=(await postJson("/api/tools/start",{action:t,...n||{}})).job_id,m=Date.now()/1e3;te({id:g,action:t,payload:n||{},status:"running",log:"",progress:0,message:a.running,created_at:m,updated_at:m}),pt(),Wt();let f=null;for(;s===$e;){if(f=await getJson(`/api/tools/job?id=${encodeURIComponent(g)}`),te(f),pt(),Wt(),!f.done){$a(a,f),await waitMs(320);continue}let L=f.result||f;if(!L.ok){let R=friendlyError(L)||L.error||f.error||a.failed;throw st(a.failed),et(null,{active:!1}),Be().catch(()=>{}),new Error(R)}return st(a.done),et(100,{active:!0,indeterminate:!1}),Be().catch(()=>{}),window.setTimeout(()=>{$e===s&&et(null,{active:!1})},900),L}throw new Error("tool run cancelled")}finally{p&&typeof endAppActivity=="function"&&endAppActivity(p)}}function Da(t){let n=Et(t?.out||t?.log||"");if(!n)return!1;let a=n.toLowerCase();return a.includes("already up to date")||a.includes("already up-to-date")?!1:a.includes("fast-forward")||a.includes("merge made by")||a.includes("updating ")||/[0-9]+\s+files?\s+changed/.test(a)||a.includes("create mode ")||a.includes("delete mode ")||a.includes("rewrite ")}function k(t,n){let s=getActionLabel(t).failed,i=typeof n=="object"&&n.message?n.message:String(n);if(st(s),et(null,{active:!1}),Z.some(c=>String(c?.action||"")===String(t||"")&&String(c?.status||"")==="failed"&&Date.now()/1e3-qt(c)<30)){pt(),Wt();return}z(i,{label:t,meta:!1})}function Kn(){let t=(d,h)=>{let _=document.getElementById(d);!_||_.dataset.bound==="1"||(_.dataset.bound="1",_.onclick=h)},n=(d,h,_,v="click")=>{!d||d.dataset[h]==="1"||(d.dataset[h]="1",d.addEventListener(v,_))},a=()=>{let d=Array.from(document.querySelectorAll("#pageTools .tools-group")),h=()=>{Array.from(document.querySelectorAll("#pageTools .tools-scroll-stack > .row-wrap:first-child, #pageTools .tools-group, #pageTools .tools-group.is-open .tools-group__bodyInner > *")).filter(v=>!v.hidden&&!v.classList.contains("hidden")).forEach((v,B)=>{v.classList.add("ui-stagger-item"),v.style.setProperty("--i",String(B))})};d.forEach(_=>{let v=_.querySelector(".tools-group__toggle"),B=_.querySelector(".tools-group__body");if(!v||!B)return;let q=_.dataset.toolsGroup,Q=localStorage.getItem("tools_group_"+q),U=Q!==null?Q==="true":!0;_.classList.toggle("is-open",U),v.setAttribute("aria-expanded",U?"true":"false"),n(v,"toolsGroupToggle",()=>{let j=!_.classList.contains("is-open");_.classList.remove("is-expanding","is-collapsing"),_.__toolsGroupMotionTimer&&clearTimeout(_.__toolsGroupMotionTimer),_.offsetWidth,_.classList.toggle("is-open",j),_.classList.add(j?"is-expanding":"is-collapsing"),v.setAttribute("aria-expanded",j?"true":"false"),localStorage.setItem("tools_group_"+q,j?"true":"false"),_.__toolsGroupMotionTimer=window.setTimeout(()=>{_.classList.remove("is-expanding","is-collapsing"),_.__toolsGroupMotionTimer=null},280)})}),h()},s=()=>{ya();let d=document.getElementById("toolsOut");d&&d.dataset.toolsLogBound!=="1"&&(d.dataset.toolsLogBound="1",d.setAttribute("aria-expanded","false"));let h=document.querySelector("#pageTools .tools-console-dock");h&&h.dataset.toolsLogDismissBound!=="1"&&(h.dataset.toolsLogDismissBound="1",h.addEventListener("click",_=>{_.target===h&&dt(!1)})),window.CarrotToolsNotifications?.bindPanelDrag?.(h,{setExpanded:dt}),document.body?.dataset.toolsLogEscBound!=="1"&&(document.body.dataset.toolsLogEscBound="1",document.addEventListener("keydown",_=>{_.key==="Escape"&&dt(!1)})),pt(),Be().catch(()=>{})},i=async()=>{let h=(document.getElementById("sysCmdInput")?.value||"").trim();if(h)try{await M("shell_cmd",{cmd:h})}catch(_){k("shell_cmd",_)}};st(getUIText("ready","Ready")),Gn(),et(null,{active:!1}),yt().catch(()=>{}),at({force:!0}).catch(()=>{}),a(),s(),t("btnToolsCarSelect",()=>{typeof window.openCarPickerFlow=="function"?window.openCarPickerFlow():typeof showPage=="function"&&showPage("car",!0)}),t("btnToolsLanguage",()=>{La().catch(d=>k("language",d))}),t("btnToolsWebSettings",()=>{typeof Vt=="function"&&Vt()}),t("btnDeviceInfo",async()=>{let d=getUIText("carrot_info","Carrot Info");try{!Yt&&!ft&&await yt({ttlMs:36e5});let h=ft?await ft:Yt;if(h){let _=String(h.DeviceType||"").trim();if(_){let B={tici:"c3",tizi:"c3x",mici:"c4"}[_]||_,q=B!==_?`${B}/${_}`:_;d+=`(${q})`}}}catch{}appAlert(oe||De,{title:d,html:!0,messageHtml:oe,copyText:Na(Yt||{})})}),t("btnGitPull",async()=>{try{let d=await M("git_pull");if(await yt(),await at({force:!0}),!Da(d))return;await appConfirm(UI_STRINGS[LANG].confirm_reboot||"Reboot now?",{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(d){k("git_pull",d)}}),t("btnGitSync",async()=>{if(await appConfirm(UI_STRINGS[LANG].git_sync_confirm||"Run git sync?",{title:"git sync"}))try{await M("git_sync"),await at({force:!0})}catch(d){k("git_sync",d)}});async function p(d){let h=String(d||"hard").trim().toLowerCase(),_=`git reset --${h}`,v=UI_STRINGS[LANG].git_reset_confirm||"Run git reset?";if(await appConfirm(`${v} -HEAD`,{title:_}))try{await M("git_reset",{mode:h,target:"HEAD"})}catch(D){$("git_reset",D)}}t("btnGitReset",async()=>{let u=await openAppDialog({mode:"choice",title:"git reset",message:getUIText("git_reset_head_prompt","Select reset mode based on HEAD."),cancelLabel:UI_STRINGS[LANG].cancel||"Cancel",choices:[{label:"reset hard",value:"hard",danger:!0},{label:"reset mixed",value:"mixed"},{label:"reset soft",value:"soft"}]});u&&await d(u)}),t("btnGitBranch",async()=>{await loadBranchesAndShow()}),t("btnGitLog",async()=>{try{await M("git_log",{count:20});let u=await postJson("/api/tools",{action:"git_log",count:20});if(!u.ok)throw new Error(u.error||"Failed to load git log");let h=u.commits||[],_=u.current_commit||"";if(!h.length){z("No commits found",{label:"git_log"});return}let v=await openAppDialog({mode:"choice",title:"git log",message:getUIText("git_log_checkout_prompt","Select commit to checkout"),cancelLabel:UI_STRINGS[LANG].cancel||"Cancel",choices:h.map(Q=>{let U=_&&Q.hash.startsWith(_),j=U?` ${getUIText("branch_current","Current")}`:"";return{labelHtml:`${escapeHtml(Q.hash)}${escapeHtml(Q.message)}${j}`,value:Q.hash,className:U?"is-current":""}})});if(!v)return;let D=`${getUIText("git_log_checkout_confirm","Checkout this commit?")} +HEAD`,{title:_}))try{await M("git_reset",{mode:h,target:"HEAD"})}catch(B){k("git_reset",B)}}t("btnGitReset",async()=>{let d=await openAppDialog({mode:"choice",title:"git reset",message:getUIText("git_reset_head_prompt","Select reset mode based on HEAD."),cancelLabel:UI_STRINGS[LANG].cancel||"Cancel",choices:[{label:"reset hard",value:"hard",danger:!0},{label:"reset mixed",value:"mixed"},{label:"reset soft",value:"soft"}]});d&&await p(d)}),t("btnGitBranch",async()=>{await loadBranchesAndShow()}),t("btnGitLog",async()=>{try{await M("git_log",{count:20});let d=await postJson("/api/tools",{action:"git_log",count:20});if(!d.ok)throw new Error(d.error||"Failed to load git log");let h=d.commits||[],_=d.current_commit||"";if(!h.length){z("No commits found",{label:"git_log"});return}let v=await openAppDialog({mode:"choice",title:"git log",message:getUIText("git_log_checkout_prompt","Select commit to checkout"),cancelLabel:UI_STRINGS[LANG].cancel||"Cancel",choices:h.map(Q=>{let U=_&&Q.hash.startsWith(_),j=U?` ${getUIText("branch_current","Current")}`:"";return{labelHtml:`${escapeHtml(Q.hash)}${escapeHtml(Q.message)}${j}`,value:Q.hash,className:U?"is-current":""}})});if(!v)return;let B=`${getUIText("git_log_checkout_confirm","Checkout this commit?")} -${v}`;if(!await appConfirm(D,{title:"git checkout"}))return;let q=await postJson("/api/tools",{action:"git_reset",mode:"hard",target:v});if(!q.ok)throw new Error(q.error||"Reset failed");z(getUIText("git_log_checkout_done","Checkout complete"),{label:"git_log"}),await yt(),await at({force:!0})}catch(u){$("git_log",u)}}),t("btnGitResetRepo",async()=>{let u=getUIText("git_reset_repo_title","Reset Repository"),h=getUIText("git_reset_repo_confirm",`Warning: This will remove origin and re-add 'ajouatom/openpilot'. -All local changes will be lost. Proceed?`);if(await appConfirm(h,{title:u,danger:!0}))try{let v=(await M("git_reset_repo_fetch")).branches||[];if(!v.length){z(getUIText("git_reset_repo_no_branches","No branches found"),{label:"git_reset_repo"});return}let D=await openAppDialog({mode:"choice",title:getUIText("branch_select","Select Branch"),message:getUIText("git_reset_repo_branch_message","Select branch to reset to"),cancelLabel:UI_STRINGS[LANG].cancel||"Cancel",choices:v.map(q=>({label:q,value:q}))});if(!D)return;await M("git_reset_repo_checkout",{branch:D}),z(getUIText("git_reset_repo_done","Reset to '{branch}' complete",{branch:D}),{label:"git_reset_repo"}),await yt(),await at({force:!0}),await appConfirm(UI_STRINGS[LANG].confirm_reboot||"Reboot now?",{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(_){$("git_reset_repo",_)}}),t("btnResetCalib",async()=>{let u=getUIText("reset_calib_title","ReCalibration"),h=getUIText("reset_calib_confirm",`Are you sure you want to reset calibration? -Device will reboot automatically.`);if(await appConfirm(h,{title:u}))try{await M("reset_calib")}catch(_){$("reset_calib",_)}}),t("btnDeviceLang",async()=>{let u=(window.CarrotDeviceLanguageOptions||[]).map(_=>({label:_.name,value:_.code})),h=await openAppDialog({mode:"choice",title:getUIText("device_lang","Device Language"),message:getUIText("device_lang_select_prompt","Select language for the device UI"),cancelLabel:UI_STRINGS[LANG]?.cancel||"Cancel",choices:u});if(h)try{await setParam("LanguageSetting",h),typeof setWebLanguage=="function"&&setWebLanguage(h,{persist:!0});let _=getUIText("setting_changed_reboot","Setting changed. Reboot now?");await appConfirm(_,{title:getUIText("reboot","Reboot")})&&await M("reboot")}catch(_){$("shell_cmd",_)}}),t("btnSendTmuxLog",async()=>{try{let u=await M("send_tmux_log");u.file&&(window.location.href=u.file)}catch(u){$("send_tmux_log",u)}}),t("btnSendTmuxServerLog",async()=>{try{let u=await M("server_tmux_log");u.file&&(window.location.href=u.file)}catch(u){$("server_tmux_log",u)}}),t("btnInstallRequired",async()=>{try{let u=await M("install_required"),h="";u.results&&Array.isArray(u.results)&&(h=u.results.map(v=>`${v.package}: ${v.status}`).join(` -`)),h.trim()&&z(h,{label:"install_required",meta:!1}),u.need_reboot&&await appConfirm(UI_STRINGS[LANG].confirm_reboot_after_install,{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(u){$("install_required",u)}}),t("btnDeleteVideos",async()=>{if(await appConfirm(UI_STRINGS[LANG].delete_videos_confirm||"Delete ALL videos?",{title:"delete videos"}))try{await M("delete_all_videos")}catch(u){$("delete_all_videos",u)}}),t("btnDeleteLogs",async()=>{if(await appConfirm(UI_STRINGS[LANG].delete_logs_confirm||"Delete ALL logs?",{title:"delete logs"}))try{await M("delete_all_logs")}catch(u){$("delete_all_logs",u)}}),t("btnRebuildAll",async()=>{if(await appConfirm(UI_STRINGS[LANG].rebuild_confirm||"Rebuild all?",{title:"Rebuild All"}))try{await M("rebuild_all")}catch(u){$("rebuild_all",u)}}),t("btnBackupSettings",async()=>{try{let u=await M("backup_settings");u.file&&(window.location.href=u.file)}catch(u){$("backup_settings",u)}}),t("btnRestoreSettings",async()=>{let u=document.createElement("input");u.type="file",u.accept="application/json,text/plain,*/*",u.style.display="none",u.onchange=async()=>{if(!u.files||!u.files[0]||!await appConfirm(UI_STRINGS[LANG].restore_confirm||"Restore settings from file?",{title:UI_STRINGS[LANG].restore||"Restore"}))return;let h=null;try{let _=getActionLabel("backup_settings");h=typeof beginAppActivity=="function"?beginAppActivity("tools",_.running||"restore settings"):null,it(_.running),z(_.running||"Restore settings",{label:"restore settings",clearProgress:!1}),et(null,{active:!0,indeterminate:!0});let v=new FormData;v.append("file",u.files[0]);let D=await requestJson("/api/params_restore",{method:"POST",body:v});it(_.done),et(100,{active:!0,indeterminate:!1}),z(JSON.stringify(D.result,null,2),{label:"restore settings",meta:!1,clearProgress:!1}),h&&typeof endAppActivity=="function"&&(endAppActivity(h),h=null),await appConfirm(UI_STRINGS[LANG].restore_done_reboot||`Restore done. -Reboot now?`,{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(_){$("backup_settings",_)}finally{h&&typeof endAppActivity=="function"&&endAppActivity(h),window.setTimeout(()=>et(null,{active:!1}),900),u.remove()}},document.body.appendChild(u),u.click()});function p(u){if(!u||!u.items_by_group)return[];let h=[];return Object.values(u.items_by_group).forEach(_=>{_.forEach(v=>h.push(v.name))}),h}async function g(){if(!SETTINGS||!SETTINGS.items_by_group){let v=await getJson("/api/settings");v.ok&&(SETTINGS=v)}if(!SETTINGS||!SETTINGS.items_by_group)return{text:"",count:0};let u=p(SETTINGS),h=await bulkGet(u),_={};return u.forEach(v=>{_[v]=h[v]??""}),{text:JSON.stringify(_,null,2),count:u.length}}t("btnCopySettings",async()=>{try{let{text:u,count:h}=await g();if(!u){z(getUIText("settings_not_loaded","Settings not loaded"),{label:"copy settings"});return}copyToClipboard(u),z(getUIText("copy_settings_done","{count} params copied",{count:h}),{label:"copy settings"})}catch(u){$("copy settings",u)}}),t("btnViewSettings",async()=>{try{let{text:u,count:h}=await g();if(!u){z(getUIText("settings_not_loaded","Settings not loaded"),{label:"view settings"});return}appAlert(u,{title:getUIText("settings_title","Settings ({count} params)",{count:h}),copyText:u})}catch(u){$("view settings",u)}}),t("btnReboot",async()=>{if(await appConfirm(UI_STRINGS[LANG].confirm_reboot||"Reboot now?",{title:UI_STRINGS[LANG].reboot||"Reboot"}))try{await M("reboot")}catch(u){$("reboot",u)}});let f=document.getElementById("sysCmdForm"),m=document.getElementById("sysCmdInput");n(f,"submitBound",u=>{u.preventDefault(),s()},"submit");let I=document.getElementById("btnSysCmdInfo"),N=document.getElementById("sysCmdHelpPanel"),F=()=>{if(!m||!N||!N.hidden)return;let u=Date.now(),h=Number(m.dataset.hintCooldownUntil||"0");u{m.value.trim()||F()},"focus"),n(m,"hintInputBound",()=>{m.value.trim().length===1&&F()},"input"),n(I,"toggleBound",()=>{if(!N)return;let u=N.hidden;N.hidden=!u,I.setAttribute("aria-expanded",u?"true":"false")})}var Ia=Object.freeze({init:Wn,refreshGitPullStatus:at,renderLanguage:Gn,run:M,scheduleWarmup:oe,showError:$,logNotice:z,getCommandPreview:St,renderMeta:gt});Object.assign(globalThis,{CarrotToolsRuntime:Ia,initToolsPage:Wn,refreshGitPullStatus:at,rerenderPageLangUi:Gn,runTool:M,scheduleUiWarmup:oe,showError:$,toolsLogNotice:z,getToolCommandPreview:St,renderToolsMeta:gt});(function(n){let a=Object.freeze({LANDSCAPE:"landscape",PORTRAIT:"portrait"}),i=20,s=24,d=72,p=44,g="carrot_tools_update_acknowledged_v1",f=80,m="",I=null,N={},F={},u=!1,h=null,_=0,v=null,D=null,q=null,Q="",U=0,j=null,Ft=0,S=new Map,w="",x="",L=jn();function y(e,o,r=null){return typeof getUIText=="function"?getUIText(e,o,r):o}function G(e){return String(e??"").replace(/\s+$/,"")}function nt(e,o=0){let r=Number(e);return Number.isFinite(r)?r:o}function st(e){let o=0,r=String(e||"");for(let l=0;lf;)L.delete(L.values().next().value);zn(),o&&(o.classList.remove("is-unread-update"),o.classList.add("is-update-read")),gt()}}function rt(){return n.CarrotLayout?.isWide?.()?a.LANDSCAPE:n.matchMedia?.("(max-width: 640px), (aspect-ratio < 13/10) and (max-width: 639px), (aspect-ratio < 13/10) and (max-height: 649px)")?.matches?a.PORTRAIT:a.LANDSCAPE}function ke(e,o=rt()){let r=e?.closest?.(".tools-console-dock"),l=e?.closest?.(".tools-console-shell");[r,l,e].forEach(c=>{c&&(c.classList.toggle("tools-notifications--portrait",o===a.PORTRAIT),c.classList.toggle("tools-notifications--landscape",o===a.LANDSCAPE),c.dataset.toolsNotificationMode=o)}),I=e||I}function Jn(){return document.getElementById("pageTools")}function $e(e){return e?.closest?.(".tools-console-dock")||document.querySelector("#pageTools .tools-console-dock")}function Yn(){return!!Jn()?.classList.contains("tools-log-expanded")}function Oe(){return rt()===a.PORTRAIT}function Xn(e,o,r){e&&(e.classList.add("is-dragging"),e.dataset.toolsNotificationDrag=r?"closing":"opening",e.style.setProperty("--tools-notification-drag-y",`${Math.round(o)}px`))}function Me(e){e&&(e.classList.remove("is-dragging"),delete e.dataset.toolsNotificationDrag,e.style.removeProperty("--tools-notification-drag-y"))}function Zn(e){return!(e.pointerType==="mouse"&&e.button!==0)}function to(e){return!!e?.closest?.(".tools-console-log__clearBtn, .tools-console-log__body, select, input, textarea, a[href]")}function eo(e){e&&(e.dataset.toolsNotificationSuppressClick="1",n.setTimeout(()=>{delete e.dataset.toolsNotificationSuppressClick},0))}function no(e){!e||e.dataset.toolsNotificationSuppressClickBound==="1"||(e.dataset.toolsNotificationSuppressClickBound="1",e.addEventListener("click",o=>{e.dataset.toolsNotificationSuppressClick==="1"&&(o.preventDefault(),o.stopImmediatePropagation())},!0))}function qe(e,o={},r={}){if(!e||e.dataset[r.boundKey]==="1")return;e.dataset[r.boundKey]="1",no(e);let l=0,c=0,b=!1,T=!1,C=!1,k=null,B=null,H=0,A=0,K=()=>{n.removeEventListener("pointermove",tt,!0),n.removeEventListener("pointerup",lt,!0),n.removeEventListener("pointercancel",Y,!0),k=null,b=!1},W=(E=null)=>{if(!b||E&&k!==null&&E.pointerId!==k)return;let X=Number.isFinite(E?.clientX)?E.clientX:H,Ct=Number.isFinite(E?.clientY)?E.clientY:A,Nt=X-l,ct=Ct-c,an=Math.abs(ct)>=s&&Math.abs(ct)>Math.abs(Nt)*1.15,_e=C?p:d,Qo=C?ct>-_e:ct>_e;Me(B),(T||an)&&(eo(e),o.setExpanded?.(Qo)),T=!1,B=null,K()};function tt(E){if(!b||k!==null&&E.pointerId!==k||!B||!Oe())return;let X=E.clientX-l,Ct=E.clientY-c;if(H=E.clientX,A=E.clientY,!(Math.abs(Ct)>Math.abs(X)*1.15))return;let ct=C?Math.min(0,Ct):Math.max(0,Ct);Math.abs(ct)>=1&&(T=!0,Xn(B,ct,C)),E.preventDefault()}function lt(E){W(E)}function Y(E){if(!(k!==null&&E.pointerId!==k)){if(T){W(null);return}Me(B),T=!1,B=null,K()}}e.addEventListener("pointerdown",E=>{if(!(!Oe()||!Zn(E))&&!r.ignoreTarget?.(E.target)&&(B=r.getPanel?.(e)||$e(e),!!B)){b=!0,T=!1,C=Yn(),k=E.pointerId,l=E.clientX,c=E.clientY,H=l,A=c,n.addEventListener("pointermove",tt,{capture:!0,passive:!1}),n.addEventListener("pointerup",lt,{capture:!0,passive:!0}),n.addEventListener("pointercancel",Y,{capture:!0,passive:!0});try{e.setPointerCapture(E.pointerId)}catch{}}},{passive:!0})}function oo(){u||(u=!0,n.addEventListener("resize",()=>{I&&Rt(I,N,F)},{passive:!0}))}function ao(e){let o=String(e||"").split(` -`).map(c=>c.trim()).find(Boolean)||"",r=o.match(/^\[([^\]]+)\]/);if(r)return r[1];let l=o.match(/^>\s*(.+)$/);return l?l[1]:o||y("notice","Notice")}function io(e){return String(e||"").replace(/^\[[^\]]+\]\n?/,"").replace(/^>\s*.+\n?/,"").trim()}function le(e){let o=io(e);return o?o.split(` +${v}`;if(!await appConfirm(B,{title:"git checkout"}))return;let q=await postJson("/api/tools",{action:"git_reset",mode:"hard",target:v});if(!q.ok)throw new Error(q.error||"Reset failed");z(getUIText("git_log_checkout_done","Checkout complete"),{label:"git_log"}),await yt(),await at({force:!0})}catch(d){k("git_log",d)}}),t("btnGitResetRepo",async()=>{let d=getUIText("git_reset_repo_title","Reset Repository"),h=getUIText("git_reset_repo_confirm",`Warning: This will remove origin and re-add 'ajouatom/openpilot'. +All local changes will be lost. Proceed?`);if(await appConfirm(h,{title:d,danger:!0}))try{let v=(await M("git_reset_repo_fetch")).branches||[];if(!v.length){z(getUIText("git_reset_repo_no_branches","No branches found"),{label:"git_reset_repo"});return}let B=await openAppDialog({mode:"choice",title:getUIText("branch_select","Select Branch"),message:getUIText("git_reset_repo_branch_message","Select branch to reset to"),cancelLabel:UI_STRINGS[LANG].cancel||"Cancel",choices:v.map(q=>({label:q,value:q}))});if(!B)return;await M("git_reset_repo_checkout",{branch:B}),z(getUIText("git_reset_repo_done","Reset to '{branch}' complete",{branch:B}),{label:"git_reset_repo"}),await yt(),await at({force:!0}),await appConfirm(UI_STRINGS[LANG].confirm_reboot||"Reboot now?",{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(_){k("git_reset_repo",_)}}),t("btnResetCalib",async()=>{let d=getUIText("reset_calib_title","ReCalibration"),h=getUIText("reset_calib_confirm",`Are you sure you want to reset calibration? +Device will reboot automatically.`);if(await appConfirm(h,{title:d}))try{await M("reset_calib")}catch(_){k("reset_calib",_)}}),t("btnDeviceLang",async()=>{let d=(window.CarrotDeviceLanguageOptions||[]).map(_=>({label:_.name,value:_.code})),h=await openAppDialog({mode:"choice",title:getUIText("device_lang","Device Language"),message:getUIText("device_lang_select_prompt","Select language for the device UI"),cancelLabel:UI_STRINGS[LANG]?.cancel||"Cancel",choices:d});if(h)try{await setParam("LanguageSetting",h),typeof setWebLanguage=="function"&&setWebLanguage(h,{persist:!0});let _=getUIText("setting_changed_reboot","Setting changed. Reboot now?");await appConfirm(_,{title:getUIText("reboot","Reboot")})&&await M("reboot")}catch(_){k("shell_cmd",_)}}),t("btnSendTmuxLog",async()=>{try{let d=await M("send_tmux_log");d.file&&(window.location.href=d.file)}catch(d){k("send_tmux_log",d)}}),t("btnSendTmuxServerLog",async()=>{try{let d=await M("server_tmux_log");d.file&&(window.location.href=d.file)}catch(d){k("server_tmux_log",d)}}),t("btnInstallRequired",async()=>{try{let d=await M("install_required"),h="";d.results&&Array.isArray(d.results)&&(h=d.results.map(v=>`${v.package}: ${v.status}`).join(` +`)),h.trim()&&z(h,{label:"install_required",meta:!1}),d.need_reboot&&await appConfirm(UI_STRINGS[LANG].confirm_reboot_after_install,{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(d){k("install_required",d)}}),t("btnDeleteVideos",async()=>{if(await appConfirm(UI_STRINGS[LANG].delete_videos_confirm||"Delete ALL videos?",{title:"delete videos"}))try{await M("delete_all_videos")}catch(d){k("delete_all_videos",d)}}),t("btnDeleteLogs",async()=>{if(await appConfirm(UI_STRINGS[LANG].delete_logs_confirm||"Delete ALL logs?",{title:"delete logs"}))try{await M("delete_all_logs")}catch(d){k("delete_all_logs",d)}}),t("btnRebuildAll",async()=>{if(await appConfirm(UI_STRINGS[LANG].rebuild_confirm||"Rebuild all?",{title:"Rebuild All"}))try{await M("rebuild_all")}catch(d){k("rebuild_all",d)}}),t("btnBackupSettings",async()=>{try{let d=await M("backup_settings");d.file&&(window.location.href=d.file)}catch(d){k("backup_settings",d)}}),t("btnRestoreSettings",async()=>{let d=document.createElement("input");d.type="file",d.accept="application/json,text/plain,*/*",d.style.display="none",d.onchange=async()=>{if(!d.files||!d.files[0]||!await appConfirm(UI_STRINGS[LANG].restore_confirm||"Restore settings from file?",{title:UI_STRINGS[LANG].restore||"Restore"}))return;let h=null;try{let _=getActionLabel("backup_settings");h=typeof beginAppActivity=="function"?beginAppActivity("tools",_.running||"restore settings"):null,st(_.running),z(_.running||"Restore settings",{label:"restore settings",clearProgress:!1}),et(null,{active:!0,indeterminate:!0});let v=new FormData;v.append("file",d.files[0]);let B=await requestJson("/api/params_restore",{method:"POST",body:v});st(_.done),et(100,{active:!0,indeterminate:!1}),z(JSON.stringify(B.result,null,2),{label:"restore settings",meta:!1,clearProgress:!1}),h&&typeof endAppActivity=="function"&&(endAppActivity(h),h=null),await appConfirm(UI_STRINGS[LANG].restore_done_reboot||`Restore done. +Reboot now?`,{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(_){k("backup_settings",_)}finally{h&&typeof endAppActivity=="function"&&endAppActivity(h),window.setTimeout(()=>et(null,{active:!1}),900),d.remove()}},document.body.appendChild(d),d.click()});function c(d){if(!d||!d.items_by_group)return[];let h=[];return Object.values(d.items_by_group).forEach(_=>{_.forEach(v=>h.push(v.name))}),h}async function g(){if(!SETTINGS||!SETTINGS.items_by_group){let v=await getJson("/api/settings");v.ok&&(SETTINGS=v)}if(!SETTINGS||!SETTINGS.items_by_group)return{text:"",count:0};let d=c(SETTINGS),h=await bulkGet(d),_={};return d.forEach(v=>{_[v]=h[v]??""}),{text:JSON.stringify(_,null,2),count:d.length}}t("btnCopySettings",async()=>{try{let{text:d,count:h}=await g();if(!d){z(getUIText("settings_not_loaded","Settings not loaded"),{label:"copy settings"});return}copyToClipboard(d),z(getUIText("copy_settings_done","{count} params copied",{count:h}),{label:"copy settings"})}catch(d){k("copy settings",d)}}),t("btnViewSettings",async()=>{try{let{text:d,count:h}=await g();if(!d){z(getUIText("settings_not_loaded","Settings not loaded"),{label:"view settings"});return}appAlert(d,{title:getUIText("settings_title","Settings ({count} params)",{count:h}),copyText:d})}catch(d){k("view settings",d)}}),t("btnReboot",async()=>{if(await appConfirm(UI_STRINGS[LANG].confirm_reboot||"Reboot now?",{title:UI_STRINGS[LANG].reboot||"Reboot"}))try{await M("reboot")}catch(d){k("reboot",d)}});let m=document.getElementById("sysCmdForm"),f=document.getElementById("sysCmdInput");n(m,"submitBound",d=>{d.preventDefault(),i()},"submit");let L=document.getElementById("btnSysCmdInfo"),R=document.getElementById("sysCmdHelpPanel"),K=()=>{if(!f||!R||!R.hidden)return;let d=Date.now(),h=Number(f.dataset.hintCooldownUntil||"0");d{f.value.trim()||K()},"focus"),n(f,"hintInputBound",()=>{f.value.trim().length===1&&K()},"input"),n(L,"toggleBound",()=>{if(!R)return;let d=R.hidden;R.hidden=!d,L.setAttribute("aria-expanded",d?"true":"false")})}var ka=Object.freeze({init:Kn,refreshGitPullStatus:at,renderLanguage:Hn,run:M,scheduleWarmup:ae,showError:k,logNotice:z,getCommandPreview:St,renderMeta:gt});Object.assign(globalThis,{CarrotToolsRuntime:ka,initToolsPage:Kn,refreshGitPullStatus:at,rerenderPageLangUi:Hn,runTool:M,scheduleUiWarmup:ae,showError:k,toolsLogNotice:z,getToolCommandPreview:St,renderToolsMeta:gt});(function(n){let a=Object.freeze({LANDSCAPE:"landscape",PORTRAIT:"portrait"}),s=20,i=24,p=72,c=44,g="carrot_tools_update_acknowledged_v1",m=80,f="",L=null,R={},K={},d=!1,h=null,_=0,v=null,B=null,q=null,Q="",U=0,j=null,Ft=0,S=new Map,w="",x="",I=Jn();function y(e,o,r=null){return typeof getUIText=="function"?getUIText(e,o,r):o}function G(e){return String(e??"").replace(/\s+$/,"")}function nt(e,o=0){let r=Number(e);return Number.isFinite(r)?r:o}function it(e){let o=0,r=String(e||"");for(let l=0;lm;)I.delete(I.values().next().value);Yn(),o&&(o.classList.remove("is-unread-update"),o.classList.add("is-update-read")),gt()}}function rt(){return n.CarrotLayout?.isWide?.()?a.LANDSCAPE:n.matchMedia?.("(max-width: 640px), (aspect-ratio < 13/10) and (max-width: 639px), (aspect-ratio < 13/10) and (max-height: 649px)")?.matches?a.PORTRAIT:a.LANDSCAPE}function ke(e,o=rt()){let r=e?.closest?.(".tools-console-dock"),l=e?.closest?.(".tools-console-shell");[r,l,e].forEach(u=>{u&&(u.classList.toggle("tools-notifications--portrait",o===a.PORTRAIT),u.classList.toggle("tools-notifications--landscape",o===a.LANDSCAPE),u.dataset.toolsNotificationMode=o)}),L=e||L}function Zn(){return document.getElementById("pageTools")}function Oe(e){return e?.closest?.(".tools-console-dock")||document.querySelector("#pageTools .tools-console-dock")}function to(){return!!Zn()?.classList.contains("tools-log-expanded")}function Me(){return rt()===a.PORTRAIT}function eo(e,o,r){e&&(e.classList.add("is-dragging"),e.dataset.toolsNotificationDrag=r?"closing":"opening",e.style.setProperty("--tools-notification-drag-y",`${Math.round(o)}px`))}function qe(e){e&&(e.classList.remove("is-dragging"),delete e.dataset.toolsNotificationDrag,e.style.removeProperty("--tools-notification-drag-y"))}function no(e){return!(e.pointerType==="mouse"&&e.button!==0)}function oo(e){return!!e?.closest?.(".tools-console-log__clearBtn, .tools-console-log__body, select, input, textarea, a[href]")}function ao(e){e&&(e.dataset.toolsNotificationSuppressClick="1",n.setTimeout(()=>{delete e.dataset.toolsNotificationSuppressClick},0))}function so(e){!e||e.dataset.toolsNotificationSuppressClickBound==="1"||(e.dataset.toolsNotificationSuppressClickBound="1",e.addEventListener("click",o=>{e.dataset.toolsNotificationSuppressClick==="1"&&(o.preventDefault(),o.stopImmediatePropagation())},!0))}function Ge(e,o={},r={}){if(!e||e.dataset[r.boundKey]==="1")return;e.dataset[r.boundKey]="1",so(e);let l=0,u=0,b=!1,T=!1,C=!1,D=null,P=null,H=0,A=0,F=()=>{n.removeEventListener("pointermove",tt,!0),n.removeEventListener("pointerup",lt,!0),n.removeEventListener("pointercancel",Y,!0),D=null,b=!1},W=(E=null)=>{if(!b||E&&D!==null&&E.pointerId!==D)return;let X=Number.isFinite(E?.clientX)?E.clientX:H,Ct=Number.isFinite(E?.clientY)?E.clientY:A,Rt=X-l,ct=Ct-u,sn=Math.abs(ct)>=i&&Math.abs(ct)>Math.abs(Rt)*1.15,be=C?c:p,Vo=C?ct>-be:ct>be;qe(P),(T||sn)&&(ao(e),o.setExpanded?.(Vo)),T=!1,P=null,F()};function tt(E){if(!b||D!==null&&E.pointerId!==D||!P||!Me())return;let X=E.clientX-l,Ct=E.clientY-u;if(H=E.clientX,A=E.clientY,!(Math.abs(Ct)>Math.abs(X)*1.15))return;let ct=C?Math.min(0,Ct):Math.max(0,Ct);Math.abs(ct)>=1&&(T=!0,eo(P,ct,C)),E.preventDefault()}function lt(E){W(E)}function Y(E){if(!(D!==null&&E.pointerId!==D)){if(T){W(null);return}qe(P),T=!1,P=null,F()}}e.addEventListener("pointerdown",E=>{if(!(!Me()||!no(E))&&!r.ignoreTarget?.(E.target)&&(P=r.getPanel?.(e)||Oe(e),!!P)){b=!0,T=!1,C=to(),D=E.pointerId,l=E.clientX,u=E.clientY,H=l,A=u,n.addEventListener("pointermove",tt,{capture:!0,passive:!1}),n.addEventListener("pointerup",lt,{capture:!0,passive:!0}),n.addEventListener("pointercancel",Y,{capture:!0,passive:!0});try{e.setPointerCapture(E.pointerId)}catch{}}},{passive:!0})}function io(){d||(d=!0,n.addEventListener("resize",()=>{L&&Nt(L,R,K)},{passive:!0}))}function ro(e){let o=String(e||"").split(` +`).map(u=>u.trim()).find(Boolean)||"",r=o.match(/^\[([^\]]+)\]/);if(r)return r[1];let l=o.match(/^>\s*(.+)$/);return l?l[1]:o||y("notice","Notice")}function lo(e){return String(e||"").replace(/^\[[^\]]+\]\n?/,"").replace(/^>\s*.+\n?/,"").trim()}function ce(e){let o=lo(e);return o?o.split(` `).map(r=>r.trim()).filter(Boolean).slice(0,2).join(` -`):y("tools_notifications_no_output","(no output)")}function so(e){let o=Number(e||0);if(!Number.isFinite(o)||o<=0)return"";let r=Math.round(o-Date.now()/1e3),l=Math.abs(r),c=[["day",86400],["hour",3600],["minute",60],["second",1]],[b,T]=c.find(k=>l>=k[1])||c[c.length-1],C=Math.round(r/T);try{let k=typeof LANG<"u"?LANG:void 0;return new Intl.RelativeTimeFormat(k,{numeric:"always"}).format(C,b)}catch{return b==="second"?"just now":`${Math.abs(C)} ${b}${Math.abs(C)===1?"":"s"} ago`}}function ro(e){let o=Date.now()/1e3;return e.some(l=>{let c=Number(l.timestamp||0);return Number.isFinite(c)&&c>0&&Math.abs(o-c)<60})?1e3:3e4}function It(e){D&&(n.clearTimeout(D),D=null),!(!I||!e.some(o=>Number(o.timestamp||0)>0))&&(D=n.setTimeout(()=>{if(D=null,!I)return;let o=Kt(N);fe(I,o.entries),It(o.entries)},ro(e)))}function Ge(e){let o=String(e?.action||"").trim(),r=e?.payload&&typeof e.payload=="object"?e.payload:{};try{if(typeof St=="function"){let l=St(o,r);if(l)return l}}catch{}return o?o.replace(/_/g," "):y("notice","Notice")}function We(e){let o=String(e?.status||"");return o==="running"?String(e?.message||"").trim()||y("tools_notifications_running","Running"):o==="failed"?String(e?.error||e?.error_detail||"").trim()||y("tools_notifications_failed","Failed"):y("tools_notifications_done","Done")}function lo(e){try{let o=typeof getActionLabel=="function"?getActionLabel(e):null;return String(o?.done||"").trim()}catch{return""}}function co(e){try{let o=typeof getActionLabel=="function"?getActionLabel(e):null;return String(o?.running||"").trim()}catch{return""}}function uo(e){try{let o=typeof getActionLabel=="function"?getActionLabel(e):null;return String(o?.failed||"").trim()}catch{return""}}function ce(e){let o=e?.result&&typeof e.result=="object"?e.result:{};return G(e?.log||o.out||e?.error_detail||e?.error||e?.message||"")}function po(e=N){let o=on(e);o!==Ft&&(Ft=o,gt())}function Ue(e){let o=String(e||"").trim().toLowerCase();return o==="(no output)"||o==="no output"||o==="(no data)"||o==="no data"||o==="no sync"}function xt(e){let o=e?.result&&typeof e.result=="object"?e.result:{};return o.summary_vars&&typeof o.summary_vars=="object"?o.summary_vars:{}}function ue(e){let o=e?.result&&typeof e.result=="object"?e.result:{},r=String(o.summary_key||"").trim();return r?String(y(r,"",xt(e))||"").trim():""}function go(e){switch(String(e?.action||"").trim()){case"git_sync":return y("git_result_sync_done","Sync complete. No remote changes.");case"git_pull":return y("git_update_up_to_date","Already up to date");case"git_reset":return y("git_result_reset_done","Reset complete",xt(e));case"git_checkout":return y("git_result_checkout_done","Branch changed",xt(e));case"git_remote_set":return y("git_result_remote_set_done","Repository changed");case"git_remote_add":return y("git_result_remote_add_done","Remote added/updated",xt(e));case"git_reset_repo_checkout":return y("git_result_reset_repo_checkout_done","Repository reset complete",xt(e));case"shell_cmd":return y("tools_command_completed_no_output","Command complete. No output.");default:return ue(e)||y("tools_command_completed_no_output","Command complete. No output.")}}function He(e){let o=ce(e);return(e?.result&&typeof e.result=="object"?e.result:{}).empty_output||Ue(o)?go(e):o}function Fe(e){let o=String(e?.action||"").trim(),r=e?.result&&typeof e.result=="object"?e.result:{},l=r.update_summary&&typeof r.update_summary=="object"?r.update_summary:null;return o==="git_pull"?l:null}function Ke(e,o){if(!o||typeof o!="object")return null;if(!o.updated){let E=y("git_update_up_to_date","Already up to date");return{card:E,label:E,messages:[],stats:null,detail:`${E} +`):y("tools_notifications_no_output","(no output)")}function co(e){let o=Number(e||0);if(!Number.isFinite(o)||o<=0)return"";let r=Math.round(o-Date.now()/1e3),l=Math.abs(r),u=[["day",86400],["hour",3600],["minute",60],["second",1]],[b,T]=u.find(D=>l>=D[1])||u[u.length-1],C=Math.round(r/T);try{let D=typeof LANG<"u"?LANG:void 0;return new Intl.RelativeTimeFormat(D,{numeric:"always"}).format(C,b)}catch{return b==="second"?"just now":`${Math.abs(C)} ${b}${Math.abs(C)===1?"":"s"} ago`}}function uo(e){let o=Date.now()/1e3;return e.some(l=>{let u=Number(l.timestamp||0);return Number.isFinite(u)&&u>0&&Math.abs(o-u)<60})?1e3:3e4}function It(e){B&&(n.clearTimeout(B),B=null),!(!L||!e.some(o=>Number(o.timestamp||0)>0))&&(B=n.setTimeout(()=>{if(B=null,!L)return;let o=Qt(R);fe(L,o.entries),It(o.entries)},uo(e)))}function We(e){let o=String(e?.action||"").trim(),r=e?.payload&&typeof e.payload=="object"?e.payload:{};try{if(typeof St=="function"){let l=St(o,r);if(l)return l}}catch{}return o?o.replace(/_/g," "):y("notice","Notice")}function Ue(e){let o=String(e?.status||"");return o==="running"?String(e?.message||"").trim()||y("tools_notifications_running","Running"):o==="failed"?String(e?.error||e?.error_detail||"").trim()||y("tools_notifications_failed","Failed"):y("tools_notifications_done","Done")}function po(e){try{let o=typeof getActionLabel=="function"?getActionLabel(e):null;return String(o?.done||"").trim()}catch{return""}}function go(e){try{let o=typeof getActionLabel=="function"?getActionLabel(e):null;return String(o?.running||"").trim()}catch{return""}}function mo(e){try{let o=typeof getActionLabel=="function"?getActionLabel(e):null;return String(o?.failed||"").trim()}catch{return""}}function ue(e){let o=e?.result&&typeof e.result=="object"?e.result:{};return G(e?.log||o.out||e?.error_detail||e?.error||e?.message||"")}function fo(e=R){let o=an(e);o!==Ft&&(Ft=o,gt())}function He(e){let o=String(e||"").trim().toLowerCase();return o==="(no output)"||o==="no output"||o==="(no data)"||o==="no data"||o==="no sync"}function xt(e){let o=e?.result&&typeof e.result=="object"?e.result:{};return o.summary_vars&&typeof o.summary_vars=="object"?o.summary_vars:{}}function de(e){let o=e?.result&&typeof e.result=="object"?e.result:{},r=String(o.summary_key||"").trim();return r?String(y(r,"",xt(e))||"").trim():""}function _o(e){switch(String(e?.action||"").trim()){case"git_sync":return y("git_result_sync_done","Sync complete. No remote changes.");case"git_pull":return y("git_update_up_to_date","Already up to date");case"git_reset":return y("git_result_reset_done","Reset complete",xt(e));case"git_checkout":return y("git_result_checkout_done","Branch changed",xt(e));case"git_remote_set":return y("git_result_remote_set_done","Repository changed");case"git_remote_add":return y("git_result_remote_add_done","Remote added/updated",xt(e));case"git_reset_repo_checkout":return y("git_result_reset_repo_checkout_done","Repository reset complete",xt(e));case"shell_cmd":return y("tools_command_completed_no_output","Command complete. No output.");default:return de(e)||y("tools_command_completed_no_output","Command complete. No output.")}}function Ke(e){let o=ue(e);return(e?.result&&typeof e.result=="object"?e.result:{}).empty_output||He(o)?_o(e):o}function Fe(e){let o=String(e?.action||"").trim(),r=e?.result&&typeof e.result=="object"?e.result:{},l=r.update_summary&&typeof r.update_summary=="object"?r.update_summary:null;return o==="git_pull"?l:null}function Qe(e,o){if(!o||typeof o!="object")return null;if(!o.updated){let E=y("git_update_up_to_date","Already up to date");return{card:E,label:E,messages:[],stats:null,detail:`${E} ${y("git_update_output","Git output")} -${He(e)}`.trim()}}let r=Array.isArray(o.commits)?o.commits:[],l=Math.max(0,nt(o.commit_count,r.length)),c=Math.max(0,nt(o.files_changed)),b=Math.max(0,nt(o.insertions)),T=Math.max(0,nt(o.deletions)),C=r.slice(0,3),k=Math.max(0,l-C.length),B=[y("git_update_new_updates","New Updates"),""],H=[];if(C.forEach(E=>{let X=String(E?.message||E?.hash||"").trim();X&&(H.push(X),B.push(X))}),k>0){let E=y("git_update_more_commits","{count} more commits",{count:k});H.push(E),B.push(E)}let A=y("git_update_commit_count","{count} commits",{count:l}),K=c>0?y("git_update_shortstat","{commits} | {files} | +{insertions} -{deletions}",{commits:A,files:y("git_update_file_count","{count} files",{count:c}),insertions:b,deletions:T}):y("git_update_shortstat_no_files","{commits} | +{insertions} -{deletions}",{commits:A,insertions:b,deletions:T});B.push("",K);let W=B.join(` +${Ke(e)}`.trim()}}let r=Array.isArray(o.commits)?o.commits:[],l=Math.max(0,nt(o.commit_count,r.length)),u=Math.max(0,nt(o.files_changed)),b=Math.max(0,nt(o.insertions)),T=Math.max(0,nt(o.deletions)),C=r.slice(0,3),D=Math.max(0,l-C.length),P=[y("git_update_new_updates","New Updates"),""],H=[];if(C.forEach(E=>{let X=String(E?.message||E?.hash||"").trim();X&&(H.push(X),P.push(X))}),D>0){let E=y("git_update_more_commits","{count} more commits",{count:D});H.push(E),P.push(E)}let A=y("git_update_commit_count","{count} commits",{count:l}),F=u>0?y("git_update_shortstat","{commits} | {files} | +{insertions} -{deletions}",{commits:A,files:y("git_update_file_count","{count} files",{count:u}),insertions:b,deletions:T}):y("git_update_shortstat_no_files","{commits} | +{insertions} -{deletions}",{commits:A,insertions:b,deletions:T});P.push("",F);let W=P.join(` `).trim(),tt=r.map(E=>`${String(E?.hash||"").trim()} ${String(E?.message||"").trim()}`.trim()).filter(Boolean).join(` -`),lt=ce(e),Y=[W];return tt&&Y.push("",y("git_update_commit_log","Commit log"),tt),lt&&Y.push("",y("git_update_output","Git output"),lt),{card:W,label:y("git_update_new_updates","New Updates"),messages:H,stats:{commits:A,files:c>0?y("git_update_file_count","{count} files",{count:c}):"",insertions:b,deletions:T},detail:Y.join(` -`).trim()}}function fo(e){let o=Fe(e),r=Ke(e,o),c=G(r?.detail||o?.detail||"");if(!c){let b=ue(e),T=He(e);b&&T&&T!==b&&!Ue(ce(e))?c=`${b} +`),lt=ue(e),Y=[W];return tt&&Y.push("",y("git_update_commit_log","Commit log"),tt),lt&&Y.push("",y("git_update_output","Git output"),lt),{card:W,label:y("git_update_new_updates","New Updates"),messages:H,stats:{commits:A,files:u>0?y("git_update_file_count","{count} files",{count:u}):"",insertions:b,deletions:T},detail:Y.join(` +`).trim()}}function bo(e){let o=Fe(e),r=Qe(e,o),u=G(r?.detail||o?.detail||"");if(!u){let b=de(e),T=Ke(e);b&&T&&T!==b&&!He(ue(e))?u=`${b} ${y("tools_raw_output","Raw output")} -${T}`:c=b||T||We(e)}return`> ${Ge(e)} -${c}`}function mo(e,o){let r=String(e?.status||""),l=String(e?.action||"").trim(),c=Fe(e),b=c?Ke(e,c):null,T=fo(e),C=Number(e?.updated_at||e?.created_at||0),k=!!e?.payload?.notice,B=`job-${e?.id||o}`,H=c?`${B}:${c.after||c.before||""}`:"",A=We(e);return r==="running"?A=String(e?.message||"").trim()||co(l)||A:r==="failed"?A=uo(l)||A:k?A=le(T):c?A=G(b?.card||c.card_summary||c.display||"")||le(T):A=ue(e)||lo(l)||A,{id:B,ackId:H,source:r==="running"?"current":"history",text:T,title:Ge(e),summary:A,updateCard:b?{label:b.label||"",messages:Array.isArray(b.messages)?b.messages:[],stats:b.stats||null}:null,status:r,highlight:!!(c?.updated&&r==="done"&&!L.has(H)),updateKind:c?"git_pull":"",timestamp:C,timeLabel:so(C)}}function Qe(e,o,r){let l=G(e);return{id:`${o}-${r}-${st(l)}`,source:o,text:l,title:ao(l),summary:le(l),timestamp:0,timeLabel:""}}function Kt(e={}){let o=G(e.currentText),r=G(e.historyText),l=Array.isArray(e.jobs)?e.jobs.filter(Boolean):[],c=[];return l.slice(0,i).forEach((b,T)=>c.push(mo(b,T))),o&&c.push(Qe(o,"current",0)),r&&r.split(/\n{2,}/).map(b=>b.trim()).filter(Boolean).slice(-i).forEach((b,T)=>c.push(Qe(b,"history",T))),{entries:c,hasHistory:!!r||l.some(b=>String(b?.status||"")!=="running"),state:{jobs:l,historyText:r,currentText:o}}}function je(e,o){let r=document.createElement("button");return r.type="button",r.className="tools-console-log__clearBtn",r.textContent=y("tools_notifications_clear","Clear"),r.disabled=!e.hasHistory,r.addEventListener("click",l=>{l.stopPropagation(),m="",o.options.onClear?.()}),r}function ze(e){let o=document.createElement("span");o.className="tools-console-log__header",o.dataset.toolsNotificationMode=e.mode;let r=document.createElement("span");if(r.className="tools-console-log__headerTitle",r.textContent=y("tools_notifications","Notifications"),o.appendChild(r),e.mode===a.LANDSCAPE){let l=document.createElement("span");l.className="tools-console-log__headerActions",l.appendChild(je(e.model,e)),o.appendChild(l)}return o}function _o(){let e=document.createElement("span");return e.className="tools-console-log__empty",e.textContent=y("tools_notifications_empty","No notifications"),e}function de(){return!!n.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches}function bo(e){let o=String(e||"").trim().split(",")[0].trim();if(!o)return 0;let r=Number.parseFloat(o);return Number.isFinite(r)?o.endsWith("ms")?r:r*1e3:0}function Ve(e){if(de())return 0;try{let o=n.getComputedStyle?.(e),r=bo(o?.getPropertyValue("--tools-detail-duration"));return Math.max(180,r||320)+40}catch{return 360}}function pe(){q&&(n.clearTimeout(q),q=null,Q="",U=0,j=null)}function ho(e){return!!(q&&Q&&Date.now()wo(o.id,e),{passive:!0}))}function Qt(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");o&&(o.style.maxHeight=`${o.scrollHeight}px`)}function Ye(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");o&&(o.style.transition="none",o.style.animation="none",o.style.opacity="1",o.style.transform="translateY(0)",Qt(e),o.getBoundingClientRect())}function To(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");o&&(o.style.maxHeight=`${o.scrollHeight}px`,o.style.opacity="1",o.style.transform="translateY(0)",o.getBoundingClientRect(),e.classList.add("is-collapsing"),e.classList.remove("is-expanded"),e.setAttribute("aria-expanded","false"),n.requestAnimationFrame(()=>{o.style.maxHeight="0px",o.style.opacity="0",o.style.transform="translateY(-6px)"}))}function V(e){return e?(e.dataset.toolsNotificationMode||rt())===a.PORTRAIT?e:e?.querySelector?.(".tools-console-log__body")||e||null:null}function J(e,o){return!e||!o?null:Array.from(e.querySelectorAll("[data-notification-id]")).find(r=>r.dataset.notificationId===o)||null}function vo(e,o){return JSON.stringify({mode:o,active:m,hasHistory:e.hasHistory,entries:e.entries.map(r=>({id:r.id,source:r.source,title:r.title,summary:r.summary,updateCard:r.updateCard||null,text:r.text,status:r.status||"",highlight:!!r.highlight,updateKind:r.updateKind||"",hasTime:Number(r.timestamp||0)>0}))})}function Co(e){return String(e?.status||"")==="running"}function Ao(e){return!!e&&!Co(e)}function Xe(e){let o=V(e);return o?Array.from(o.querySelectorAll("[data-notification-id]")):[]}function Eo(e,o){let r=Xe(e);return r.length===o.entries.length&&r.every((l,c)=>l.dataset.notificationId===o.entries[c]?.id)}function ge(e,o){e&&e.textContent!==o&&(e.textContent=o)}function vt(e,o,r){let l=document.createElement("span");return l.className=o,l.textContent=r,e.appendChild(l),l}function Ze(e,o){if(!e)return;if(e.replaceChildren(),e.classList.toggle("tools-console-log__cardBody--update",!!o.updateCard),!o.updateCard){e.textContent=o.summary;return}let r=String(o.updateCard.label||"").trim();r&&vt(e,"tools-console-log__updateLabel",r);let l=Array.isArray(o.updateCard.messages)?o.updateCard.messages.filter(Boolean):[];if(l.length){let b=document.createElement("span");b.className="tools-console-log__updateMessages",l.slice(0,3).forEach(T=>vt(b,"tools-console-log__updateMessage",T)),e.appendChild(b)}let c=o.updateCard.stats&&typeof o.updateCard.stats=="object"?o.updateCard.stats:null;if(c){let b=document.createElement("span");b.className="tools-console-log__updateStats",c.commits&&vt(b,"tools-console-log__updateStat",c.commits),c.files&&vt(b,"tools-console-log__updateStat",c.files),vt(b,"tools-console-log__updateStat tools-console-log__updateStat--add",`+${Math.max(0,nt(c.insertions))}`),vt(b,"tools-console-log__updateStat tools-console-log__updateStat--delete",`-${Math.max(0,nt(c.deletions))}`),e.appendChild(b)}else!l.length&&r&&(e.textContent=r)}function Lo(e,o,r){let l=m===o.id;e.classList.toggle("tools-console-log__current",o.source==="current"),e.classList.toggle("tools-console-log__history",o.source==="history"),e.classList.toggle("is-expanded",l),e.classList.toggle("is-git-update",o.updateKind==="git_pull"),e.classList.toggle("is-unread-update",!!o.highlight),e.dataset.toolsNotificationMode=r.mode,e.setAttribute("aria-expanded",l?"true":"false"),ge(e.querySelector(".tools-console-log__cardTitle"),o.title);let c=e.querySelector(".tools-console-log__cardHead"),b=e.querySelector(".tools-console-log__cardTime");o.timeLabel?(!b&&c&&(b=document.createElement("span"),b.className="tools-console-log__cardTime",c.appendChild(b)),ge(b,o.timeLabel)):b&&b.remove(),Ze(e.querySelector(".tools-console-log__cardBody"),o),ge(e.querySelector(".tools-console-log__detail"),o.text)}function Io(e,o,r){Xe(e).forEach((l,c)=>Lo(l,o.entries[c],r)),e.querySelectorAll(".tools-console-log__clearBtn").forEach(l=>{l.disabled=!o.hasHistory})}function fe(e,o){if(!e)return;let r=new Map(o.map(l=>[l.id,l.timeLabel||""]));e.querySelectorAll("[data-notification-id]").forEach(l=>{let c=r.get(l.dataset.notificationId)||"",b=l.querySelector(".tools-console-log__cardTime");b&&b.textContent!==c&&(b.textContent=c)})}function xo(e){m&&(e.entries.some(o=>o.id===m)||(m=""))}function tn(e){if(!e?.entries?.length)return null;let o=null,r=0;return e.entries.forEach(l=>{let c=Number(l.timestamp||0);Number.isFinite(c)&&c>0&&c>=r&&(o=l,r=c)}),o||e.entries.slice().reverse().find(l=>l.source==="current")||e.entries[e.entries.length-1]}function Ro(e,o,r=!0,l={}){let c=V(e),T=J(c,o)?.getBoundingClientRect?.();return{id:o,expanded:r,keyboard:!1,instant:l.instant===!0,smoothOnce:l.smoothOnce===!0,stableDetail:l.stableDetail===!0,mode:e?.dataset?.toolsNotificationMode||rt(),scrollTop:c?.scrollTop||0,cardTop:T?T.top:null}}function en(e,o,r={}){if(!o)return"";let l=r.expand!==!1;return pe(),m=l?o:"",h=Ro(e,o,l,r),S.delete(o),o}function No(e=I,o={}){let r=Kt(N),l=tn(r);if(!l)return"";let c=en(e,l.id,o);return e&&Rt(e,r.state,F,{force:!0,preserveScroll:!1}),c}function Bo(e,o=m){let r=V(e);if(!r)return null;let l=J(r,o),c=e?.dataset?.toolsNotificationMode||rt();return{anchorId:o,mode:c,scrollTop:r.scrollTop||0,cardTop:l?l.getBoundingClientRect().top:null}}function Po(e,o,r,l){let c=V(e),b=J(c,o),T=e?.dataset?.toolsNotificationMode||rt(),C=b?.getBoundingClientRect?.();return{id:o,expanded:r,keyboard:l,mode:T,scrollTop:c?.scrollTop||0,cardTop:C?C.top:null}}function Do(e,o){let r=V(e);if(!r||!o)return;let l=o.scrollTop;if(o.mode!==a.LANDSCAPE&&o.anchorId&&o.cardTop!==null){let c=J(r,o.anchorId);c&&(l+=c.getBoundingClientRect().top-o.cardTop)}r.scrollTop=Math.max(0,l)}function me(e,o){let r=Math.max(0,(e?.scrollHeight||0)-(e?.clientHeight||0));return Math.min(Math.max(0,o),r)}function ko(e,o){let r=V(e),l=J(r,o?.id);if(!r||!o)return;if(!l||o.cardTop===null){r.scrollTop=me(r,o.scrollTop||0);return}let c=l.getBoundingClientRect().top-o.cardTop;if(Math.abs(c)<1)return;let b=(o.scrollTop||0)+c;r.scrollTop=me(r,b)}function bt(e,o,r="settled",l={}){let c=V(e),b=J(c,o?.id);if(!c||!b)return;if(o.keyboard)try{b.focus({preventScroll:!0})}catch{}let T=c.getBoundingClientRect(),C=b.getBoundingClientRect(),k=b.querySelector(".tools-console-log__cardHead")?.getBoundingClientRect?.()||C,B=e.dataset.toolsNotificationMode||rt(),H=B===a.PORTRAIT?18:12,A=B===a.PORTRAIT?92:20,K=Math.max(T.height-H-A,1),W=T.top+H,tt=T.bottom-A,lt=Math.max(0,Number(l.expandedHeightDelta)||0),Y=lt>0?{top:C.top,bottom:C.bottom+lt,height:C.height+lt}:C,E=r==="opening"?k:Y,X=0;if(!o.smoothOnce&&!o.stableDetail&&!o.instant&&(Y.top>=W&&Y.bottom<=tt||k.top>=W&&k.bottom<=tt&&Y.height>=K)||r==="opening"&&E.top>=W&&E.bottom<=tt||(o?.expanded&&r!=="opening"&&Y.height>=K?X=Y.top-W:E.toptt&&(X=E.bottom-tt),Math.abs(X)<2))return;let Nt=me(c,c.scrollTop+X),ct=l.behavior||(de()?"auto":"smooth");try{c.scrollTo({top:Nt,behavior:ct})}catch{c.scrollTop=Nt}}function $o(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");if(!o)return 0;let r=o.getBoundingClientRect();return Math.max(0,o.scrollHeight-r.height)}function Oo(e,o){if(!o?.id)return;_+=1;let r=_;v&&(n.clearTimeout(v),v=null);let l=rt();n.requestAnimationFrame(()=>{if(r!==_)return;if(o.instant){bt(e,o,"settled",{behavior:"auto"});return}if(o.smoothOnce){bt(e,o,"settled");return}if(!o.stableDetail){o.keyboard&&bt(e,o,"opening");return}if(o.expanded&&!de()){let b=V(e),T=J(b,o.id),C=$o(T);bt(e,o,"concurrent",{expandedHeightDelta:C});let k=l===a.PORTRAIT?380:360;v=n.setTimeout(()=>{v=null,r===_&&bt(e,o,"settled")},k);return}bt(e,o,"opening");let c=o.expanded?l===a.PORTRAIT?380:360:l===a.PORTRAIT?180:160;v=n.setTimeout(()=>{v=null,r===_&&bt(e,o,"settled")},c)})}function Mo(e){let o=document.createElement("span");o.className="tools-console-log__detailWrap";let r=document.createElement("span");r.className="tools-console-log__detailInner";let l=document.createElement("span");l.className="tools-console-log__detailTitle",l.textContent=y("tools_notification_detail","Detail log"),r.appendChild(l);let c=document.createElement("span");return c.className="tools-console-log__detail",c.textContent=e.text,So(c,e),r.appendChild(c),o.appendChild(r),o}function qo(e,o){let r=m===e.id,l=document.createElement("div");l.className=`tools-console-log__card tools-console-log__${e.source}`,l.classList.toggle("is-expanded",r),l.classList.toggle("is-git-update",e.updateKind==="git_pull"),l.classList.toggle("is-unread-update",!!e.highlight),l.dataset.notificationId=e.id,l.dataset.toolsNotificationMode=o.mode,l.setAttribute("role","button"),l.setAttribute("tabindex","0"),l.setAttribute("aria-expanded",r?"true":"false");let c=document.createElement("span");c.className="tools-console-log__cardTitle",c.textContent=e.title;let b=document.createElement("span");if(b.className="tools-console-log__cardHead",b.appendChild(c),e.timeLabel){let A=document.createElement("span");A.className="tools-console-log__cardTime",A.textContent=e.timeLabel,b.appendChild(A)}l.appendChild(b);let T=document.createElement("span");T.className="tools-console-log__cardBody",Ze(T,e),l.appendChild(T),l.appendChild(Mo(e));let C=0,k=0,B=!1,H=(A,K=!1)=>{if(B){B=!1,A.preventDefault();return}let W=!r;if(h=Po(o.out,e.id,W,K),Vn(e,l),!W){pe(),m="",S.delete(e.id),Q=e.id,j=o.out,To(l),U=Date.now()+Ve(l),q=n.setTimeout(()=>{q=null,Q="",U=0,j=null,Rt(o.out,o.model.state,o.options,{force:!0})},Ve(l));return}pe(),m=W?e.id:"",Rt(o.out,o.model.state,o.options)};return l.addEventListener("pointerdown",A=>{C=A.clientX,k=A.clientY,B=!1},{passive:!0}),l.addEventListener("pointermove",A=>{Math.hypot(A.clientX-C,A.clientY-k)>8&&(B=!0)},{passive:!0}),l.addEventListener("click",A=>{H(A,A.detail===0)}),l.addEventListener("keydown",A=>{A.key!=="Enter"&&A.key!==" "||(A.preventDefault(),H(A,!0))}),l}function Go(e,o){let r=document.createElement("span");return r.className="tools-console-log__footer",r.dataset.toolsNotificationMode=o.mode,r.appendChild(je(e,o)),r}function Wo(e,o){let r=document.createDocumentFragment();return e.entries.length?(e.entries.forEach(l=>r.appendChild(qo(l,o))),r):(r.appendChild(_o()),r)}function nn(e){let o=document.createElement("span");return o.className="tools-console-log__body",o.appendChild(Wo(e.model,e)),o}function Uo(e){let o=document.createDocumentFragment();return o.appendChild(ze(e)),o.appendChild(nn(e)),o}function Ho(e){let o=document.createDocumentFragment();return o.appendChild(ze(e)),o.appendChild(nn(e)),o.appendChild(Go(e.model,e)),o}function Rt(e,o={},r={},l={}){if(!e)return;oo();let c=h,b=l.preserveScroll===!1||c?null:Bo(e),T=rt(),C=Kt(o);if(N=C.state,F=r,po(C.state),ke(e,T),!l.force&&ho(e)){fe(e,C.entries),It(C.entries);return}xo(C);let B=r.autoFocusLatest===!0&&!l.skipAutoFocusLatest?tn(C):null;Ao(B)&&B.id!==x&&(x=B.id,en(e,B.id,{expand:!0,smoothOnce:!0,stableDetail:!0}),c=h,b=null);let H=vo(C,T),A={out:e,mode:T,model:C,options:r};if(!c&&H===w&&e.childElementCount>0){fe(e,C.entries),It(C.entries);return}if(!c&&e.childElementCount>0&&Eo(e,C)){Io(e,C,A),w=H,It(C.entries),m&&n.requestAnimationFrame(()=>{let K=V(e),W=J(K,m);Qt(W),Je(e,m)});return}if(e.replaceChildren(T===a.PORTRAIT?Ho(A):Uo(A)),w=H,c){if(ko(e,c),c.instant||c.stableDetail){let K=V(e);Ye(J(K,c.id))}}else if(Do(e,b),m){let K=V(e);Ye(J(K,m))}It(C.entries),c?(h=null,c.expanded&&n.requestAnimationFrame(()=>{let K=V(e),W=J(K,c.id);Qt(W),yo(e,c.id)}),Oo(e,c)):m&&n.requestAnimationFrame(()=>{let K=V(e),W=J(K,m);Qt(W),Je(e,m)})}function Fo(e,o={}){qe(e,o,{boundKey:"toolsNotificationGestureBound",getPanel:$e})}function Ko(e,o={}){qe(e,o,{boundKey:"toolsNotificationPanelDragBound",getPanel:()=>e,ignoreTarget:to})}function on(e=N){return Kt(e).entries.filter(o=>!!o.highlight).length}n.CarrotToolsNotifications={bindPanelDrag:Ko,bindStatusGesture:Fo,unreadCount:on,render:Rt,resetDetail(){m="",x="",S.clear()},focusLatest(e={}){return No(e.out||I,e)},syncMode(e=I){e&&ke(e)}}})(window);var Tt=null,Lt=null,Ht=null,Ut=0,Wt=null;function R(t,n,a=null){return typeof getUIText=="function"?getUIText(t,n,a):n}function ie(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function re(t){typeof appDialog>"u"||!appDialog||appDialog.classList.toggle("app-dialog--tools-qr",!!t)}function Un(t,n,a=null,i=null){let s=R(t,n,a);return typeof showAppToast=="function"&&showAppToast(s,i||void 0),s}function se(){Lt&&(cancelAnimationFrame(Lt),Lt=null),Ht&&(clearTimeout(Ht),Ht=null),Ut=0,Tt&&(Tt.getTracks().forEach(t=>t.stop()),Tt=null)}function _t(t,n){t&&(t.dataset.scanState=n||"idle")}function xa(t,n){let a=Math.min(t,n)*.74;return{left:(t-a)/2,top:(n-a)/2,right:(t+a)/2,bottom:(n+a)/2,width:a,height:a}}function Ra(t){let n=[t?.location?.topLeftCorner,t?.location?.topRightCorner,t?.location?.bottomRightCorner,t?.location?.bottomLeftCorner].filter(f=>Number.isFinite(Number(f?.x))&&Number.isFinite(Number(f?.y)));if(n.length<4)return null;let a=n.map(f=>Number(f.x)),i=n.map(f=>Number(f.y)),s=Math.min(...a),d=Math.max(...a),p=Math.min(...i),g=Math.max(...i);return{left:s,top:p,right:d,bottom:g,width:d-s,height:g-p,centerX:(s+d)/2,centerY:(p+g)/2}}function Na(t,n,a){let i=xa(n,a),s=Ra(t);if(!s||s.width<=0||s.height<=0)return!1;let d=i.width*.18,p=i.height*.18,g=s.centerX>=i.left&&s.centerX<=i.right&&s.centerY>=i.top&&s.centerY<=i.bottom,f=s.left>=i.left-d&&s.right<=i.right+d&&s.top>=i.top-p&&s.bottom<=i.bottom+p,m=s.width>=i.width*.34&&s.height>=i.height*.34&&s.width<=i.width*1.18&&s.height<=i.height*1.18;return g&&f&&m}function Fn(t){if(typeof qrcode!="function")throw new Error("QR library not loaded");let n=qrcode(0,"L"),a=String(t||"");return n.addData(t,a.startsWith("CQR3:")||a.startsWith("CQR4:")?"Alphanumeric":"Byte"),n.make(),n}function Ba(t){return Fn(t).createSvgTag(2,4)}function Pa(t){let n=Fn(t),a=n.getModuleCount(),i=4,s=4,d=(a+s*2)*i,p=document.createElement("canvas");p.width=d,p.height=d;let g=p.getContext("2d");g.fillStyle="#ffffff",g.fillRect(0,0,d,d),g.fillStyle="#000000";for(let f=0;f|]+/g,"-").replace(/\s+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,64)||"carrot"}function Hn(t=new Date){let n=String(t.getFullYear()),a=String(t.getMonth()+1).padStart(2,"0"),i=String(t.getDate()).padStart(2,"0");return`${n}${a}${i}`}async function ka(){try{let t=await bulkGet(["GitBranch"]);return`${Da(t.GitBranch)}-${Hn()}.png`}catch{return`carrot-${Hn()}.png`}}async function Kn(){if(Wt)return Wt;Wt=(async()=>{let t=await getJson("/api/params_qr_dependency");if(console.info("[carrot][qr-dependency]",t),t.installed)return t;Un("qr_configuring","Please wait...");let n=await postJson("/api/params_qr_dependency/ensure",{});if(console.info("[carrot][qr-dependency]",n),!n.ok||!n.installed)throw new Error(n.error||R("qr_config_failed","QR feature could not be configured."));return Un("qr_config_done","QR feature is ready."),n})();try{return await Wt}finally{Wt=null}}function $a(t,n){let a=document.createElement("a");a.href=t,a.download=n,document.body.appendChild(a),a.click(),a.remove()}function Oa(t){let n=document.createElement("canvas"),a=Math.min(1,1600/Math.max(t.naturalWidth||t.width,t.naturalHeight||t.height,1));n.width=Math.max(1,Math.floor((t.naturalWidth||t.width)*a)),n.height=Math.max(1,Math.floor((t.naturalHeight||t.height)*a));let i=n.getContext("2d",{willReadFrequently:!0});i.drawImage(t,0,0,n.width,n.height);let s=i.getImageData(0,0,n.width,n.height);return(typeof jsQR=="function"?jsQR(s.data,n.width,n.height):null)?.data||""}function Ma(t,n,a){if(!t)return;let i=new FileReader;i.onload=()=>{let s=new Image;s.onload=()=>{let d=Oa(s);d?n(d):a.textContent=R("qr_restore_decode_failed","QR code was not found.")},s.onerror=()=>{a.textContent=R("qr_restore_decode_failed","QR code was not found.")},s.src=String(i.result||"")},i.readAsDataURL(t)}function qa(t={}){return typeof renderSettingsDiffSummary=="function"?renderSettingsDiffSummary(t):""}function Ga(t){return typeof renderSettingsDiffHtml=="function"?renderSettingsDiffHtml(t,{currentLabel:R("qr_restore_current_value","Current"),nextLabel:R("qr_restore_backup_value","Restore"),changedLabel:R("qr_restore_changed","Changed")}):qa(t?.summary)}async function Wa(){try{await Kn();let t=await getJson("/api/params_qr_backup"),n=t.format||String(t.payload||"").split(/[.:]/,1)[0]||"unknown";console.info("[carrot][qr-backup]",{format:n,version:t.version,count:t.count,payloadChars:t.payload_chars,rawBytes:t.json_bytes,compressedBytes:t.compressed_bytes,ecc:t.ecc});let a=Ba(t.payload),i=Pa(t.payload),s=await ka(),d=R("qr_backup_title","QR Backup"),p=` +${T}`:u=b||T||Ue(e)}return`> ${We(e)} +${u}`}function ho(e,o){let r=String(e?.status||""),l=String(e?.action||"").trim(),u=Fe(e),b=u?Qe(e,u):null,T=bo(e),C=Number(e?.updated_at||e?.created_at||0),D=!!e?.payload?.notice,P=`job-${e?.id||o}`,H=u?`${P}:${u.after||u.before||""}`:"",A=Ue(e);return r==="running"?A=String(e?.message||"").trim()||go(l)||A:r==="failed"?A=mo(l)||A:D?A=ce(T):u?A=G(b?.card||u.card_summary||u.display||"")||ce(T):A=de(e)||po(l)||A,{id:P,ackId:H,source:r==="running"?"current":"history",text:T,title:We(e),summary:A,updateCard:b?{label:b.label||"",messages:Array.isArray(b.messages)?b.messages:[],stats:b.stats||null}:null,status:r,highlight:!!(u?.updated&&r==="done"&&!I.has(H)),updateKind:u?"git_pull":"",timestamp:C,timeLabel:co(C)}}function je(e,o,r){let l=G(e);return{id:`${o}-${r}-${it(l)}`,source:o,text:l,title:ro(l),summary:ce(l),timestamp:0,timeLabel:""}}function Qt(e={}){let o=G(e.currentText),r=G(e.historyText),l=Array.isArray(e.jobs)?e.jobs.filter(Boolean):[],u=[];return l.slice(0,s).forEach((b,T)=>u.push(ho(b,T))),o&&u.push(je(o,"current",0)),r&&r.split(/\n{2,}/).map(b=>b.trim()).filter(Boolean).slice(-s).forEach((b,T)=>u.push(je(b,"history",T))),{entries:u,hasHistory:!!r||l.some(b=>String(b?.status||"")!=="running"),state:{jobs:l,historyText:r,currentText:o}}}function ze(e,o){let r=document.createElement("button");return r.type="button",r.className="tools-console-log__clearBtn",r.textContent=y("tools_notifications_clear","Clear"),r.disabled=!e.hasHistory,r.addEventListener("click",l=>{l.stopPropagation(),f="",o.options.onClear?.()}),r}function Ve(e){let o=document.createElement("span");o.className="tools-console-log__header",o.dataset.toolsNotificationMode=e.mode;let r=document.createElement("span");if(r.className="tools-console-log__headerTitle",r.textContent=y("tools_notifications","Notifications"),o.appendChild(r),e.mode===a.LANDSCAPE){let l=document.createElement("span");l.className="tools-console-log__headerActions",l.appendChild(ze(e.model,e)),o.appendChild(l)}return o}function yo(){let e=document.createElement("span");return e.className="tools-console-log__empty",e.textContent=y("tools_notifications_empty","No notifications"),e}function pe(){return!!n.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches}function wo(e){let o=String(e||"").trim().split(",")[0].trim();if(!o)return 0;let r=Number.parseFloat(o);return Number.isFinite(r)?o.endsWith("ms")?r:r*1e3:0}function Je(e){if(pe())return 0;try{let o=n.getComputedStyle?.(e),r=wo(o?.getPropertyValue("--tools-detail-duration"));return Math.max(180,r||320)+40}catch{return 360}}function ge(){q&&(n.clearTimeout(q),q=null,Q="",U=0,j=null)}function So(e){return!!(q&&Q&&Date.now()vo(o.id,e),{passive:!0}))}function jt(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");o&&(o.style.maxHeight=`${o.scrollHeight}px`)}function Xe(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");o&&(o.style.transition="none",o.style.animation="none",o.style.opacity="1",o.style.transform="translateY(0)",jt(e),o.getBoundingClientRect())}function Ao(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");o&&(o.style.maxHeight=`${o.scrollHeight}px`,o.style.opacity="1",o.style.transform="translateY(0)",o.getBoundingClientRect(),e.classList.add("is-collapsing"),e.classList.remove("is-expanded"),e.setAttribute("aria-expanded","false"),n.requestAnimationFrame(()=>{o.style.maxHeight="0px",o.style.opacity="0",o.style.transform="translateY(-6px)"}))}function V(e){return e?(e.dataset.toolsNotificationMode||rt())===a.PORTRAIT?e:e?.querySelector?.(".tools-console-log__body")||e||null:null}function J(e,o){return!e||!o?null:Array.from(e.querySelectorAll("[data-notification-id]")).find(r=>r.dataset.notificationId===o)||null}function Eo(e,o){return JSON.stringify({mode:o,active:f,hasHistory:e.hasHistory,entries:e.entries.map(r=>({id:r.id,source:r.source,title:r.title,summary:r.summary,updateCard:r.updateCard||null,text:r.text,status:r.status||"",highlight:!!r.highlight,updateKind:r.updateKind||"",hasTime:Number(r.timestamp||0)>0}))})}function Lo(e){return String(e?.status||"")==="running"}function Io(e){return!!e&&!Lo(e)}function Ze(e){let o=V(e);return o?Array.from(o.querySelectorAll("[data-notification-id]")):[]}function xo(e,o){let r=Ze(e);return r.length===o.entries.length&&r.every((l,u)=>l.dataset.notificationId===o.entries[u]?.id)}function me(e,o){e&&e.textContent!==o&&(e.textContent=o)}function vt(e,o,r){let l=document.createElement("span");return l.className=o,l.textContent=r,e.appendChild(l),l}function tn(e,o){if(!e)return;if(e.replaceChildren(),e.classList.toggle("tools-console-log__cardBody--update",!!o.updateCard),!o.updateCard){e.textContent=o.summary;return}let r=String(o.updateCard.label||"").trim();r&&vt(e,"tools-console-log__updateLabel",r);let l=Array.isArray(o.updateCard.messages)?o.updateCard.messages.filter(Boolean):[];if(l.length){let b=document.createElement("span");b.className="tools-console-log__updateMessages",l.slice(0,3).forEach(T=>vt(b,"tools-console-log__updateMessage",T)),e.appendChild(b)}let u=o.updateCard.stats&&typeof o.updateCard.stats=="object"?o.updateCard.stats:null;if(u){let b=document.createElement("span");b.className="tools-console-log__updateStats",u.commits&&vt(b,"tools-console-log__updateStat",u.commits),u.files&&vt(b,"tools-console-log__updateStat",u.files),vt(b,"tools-console-log__updateStat tools-console-log__updateStat--add",`+${Math.max(0,nt(u.insertions))}`),vt(b,"tools-console-log__updateStat tools-console-log__updateStat--delete",`-${Math.max(0,nt(u.deletions))}`),e.appendChild(b)}else!l.length&&r&&(e.textContent=r)}function No(e,o,r){let l=f===o.id;e.classList.toggle("tools-console-log__current",o.source==="current"),e.classList.toggle("tools-console-log__history",o.source==="history"),e.classList.toggle("is-expanded",l),e.classList.toggle("is-git-update",o.updateKind==="git_pull"),e.classList.toggle("is-unread-update",!!o.highlight),e.dataset.toolsNotificationMode=r.mode,e.setAttribute("aria-expanded",l?"true":"false"),me(e.querySelector(".tools-console-log__cardTitle"),o.title);let u=e.querySelector(".tools-console-log__cardHead"),b=e.querySelector(".tools-console-log__cardTime");o.timeLabel?(!b&&u&&(b=document.createElement("span"),b.className="tools-console-log__cardTime",u.appendChild(b)),me(b,o.timeLabel)):b&&b.remove(),tn(e.querySelector(".tools-console-log__cardBody"),o),me(e.querySelector(".tools-console-log__detail"),o.text)}function Ro(e,o,r){Ze(e).forEach((l,u)=>No(l,o.entries[u],r)),e.querySelectorAll(".tools-console-log__clearBtn").forEach(l=>{l.disabled=!o.hasHistory})}function fe(e,o){if(!e)return;let r=new Map(o.map(l=>[l.id,l.timeLabel||""]));e.querySelectorAll("[data-notification-id]").forEach(l=>{let u=r.get(l.dataset.notificationId)||"",b=l.querySelector(".tools-console-log__cardTime");b&&b.textContent!==u&&(b.textContent=u)})}function Po(e){f&&(e.entries.some(o=>o.id===f)||(f=""))}function en(e){if(!e?.entries?.length)return null;let o=null,r=0;return e.entries.forEach(l=>{let u=Number(l.timestamp||0);Number.isFinite(u)&&u>0&&u>=r&&(o=l,r=u)}),o||e.entries.slice().reverse().find(l=>l.source==="current")||e.entries[e.entries.length-1]}function $o(e,o,r=!0,l={}){let u=V(e),T=J(u,o)?.getBoundingClientRect?.();return{id:o,expanded:r,keyboard:!1,instant:l.instant===!0,smoothOnce:l.smoothOnce===!0,stableDetail:l.stableDetail===!0,mode:e?.dataset?.toolsNotificationMode||rt(),scrollTop:u?.scrollTop||0,cardTop:T?T.top:null}}function nn(e,o,r={}){if(!o)return"";let l=r.expand!==!1;return ge(),f=l?o:"",h=$o(e,o,l,r),S.delete(o),o}function Bo(e=L,o={}){let r=Qt(R),l=en(r);if(!l)return"";let u=nn(e,l.id,o);return e&&Nt(e,r.state,K,{force:!0,preserveScroll:!1}),u}function Do(e,o=f){let r=V(e);if(!r)return null;let l=J(r,o),u=e?.dataset?.toolsNotificationMode||rt();return{anchorId:o,mode:u,scrollTop:r.scrollTop||0,cardTop:l?l.getBoundingClientRect().top:null}}function ko(e,o,r,l){let u=V(e),b=J(u,o),T=e?.dataset?.toolsNotificationMode||rt(),C=b?.getBoundingClientRect?.();return{id:o,expanded:r,keyboard:l,mode:T,scrollTop:u?.scrollTop||0,cardTop:C?C.top:null}}function Oo(e,o){let r=V(e);if(!r||!o)return;let l=o.scrollTop;if(o.mode!==a.LANDSCAPE&&o.anchorId&&o.cardTop!==null){let u=J(r,o.anchorId);u&&(l+=u.getBoundingClientRect().top-o.cardTop)}r.scrollTop=Math.max(0,l)}function _e(e,o){let r=Math.max(0,(e?.scrollHeight||0)-(e?.clientHeight||0));return Math.min(Math.max(0,o),r)}function Mo(e,o){let r=V(e),l=J(r,o?.id);if(!r||!o)return;if(!l||o.cardTop===null){r.scrollTop=_e(r,o.scrollTop||0);return}let u=l.getBoundingClientRect().top-o.cardTop;if(Math.abs(u)<1)return;let b=(o.scrollTop||0)+u;r.scrollTop=_e(r,b)}function bt(e,o,r="settled",l={}){let u=V(e),b=J(u,o?.id);if(!u||!b)return;if(o.keyboard)try{b.focus({preventScroll:!0})}catch{}let T=u.getBoundingClientRect(),C=b.getBoundingClientRect(),D=b.querySelector(".tools-console-log__cardHead")?.getBoundingClientRect?.()||C,P=e.dataset.toolsNotificationMode||rt(),H=P===a.PORTRAIT?18:12,A=P===a.PORTRAIT?92:20,F=Math.max(T.height-H-A,1),W=T.top+H,tt=T.bottom-A,lt=Math.max(0,Number(l.expandedHeightDelta)||0),Y=lt>0?{top:C.top,bottom:C.bottom+lt,height:C.height+lt}:C,E=r==="opening"?D:Y,X=0;if(!o.smoothOnce&&!o.stableDetail&&!o.instant&&(Y.top>=W&&Y.bottom<=tt||D.top>=W&&D.bottom<=tt&&Y.height>=F)||r==="opening"&&E.top>=W&&E.bottom<=tt||(o?.expanded&&r!=="opening"&&Y.height>=F?X=Y.top-W:E.toptt&&(X=E.bottom-tt),Math.abs(X)<2))return;let Rt=_e(u,u.scrollTop+X),ct=l.behavior||(pe()?"auto":"smooth");try{u.scrollTo({top:Rt,behavior:ct})}catch{u.scrollTop=Rt}}function qo(e){let o=e?.querySelector?.(".tools-console-log__detailWrap");if(!o)return 0;let r=o.getBoundingClientRect();return Math.max(0,o.scrollHeight-r.height)}function Go(e,o){if(!o?.id)return;_+=1;let r=_;v&&(n.clearTimeout(v),v=null);let l=rt();n.requestAnimationFrame(()=>{if(r!==_)return;if(o.instant){bt(e,o,"settled",{behavior:"auto"});return}if(o.smoothOnce){bt(e,o,"settled");return}if(!o.stableDetail){o.keyboard&&bt(e,o,"opening");return}if(o.expanded&&!pe()){let b=V(e),T=J(b,o.id),C=qo(T);bt(e,o,"concurrent",{expandedHeightDelta:C});let D=l===a.PORTRAIT?380:360;v=n.setTimeout(()=>{v=null,r===_&&bt(e,o,"settled")},D);return}bt(e,o,"opening");let u=o.expanded?l===a.PORTRAIT?380:360:l===a.PORTRAIT?180:160;v=n.setTimeout(()=>{v=null,r===_&&bt(e,o,"settled")},u)})}function Wo(e){let o=document.createElement("span");o.className="tools-console-log__detailWrap";let r=document.createElement("span");r.className="tools-console-log__detailInner";let l=document.createElement("span");l.className="tools-console-log__detailTitle",l.textContent=y("tools_notification_detail","Detail log"),r.appendChild(l);let u=document.createElement("span");return u.className="tools-console-log__detail",u.textContent=e.text,Co(u,e),r.appendChild(u),o.appendChild(r),o}function Uo(e,o){let r=f===e.id,l=document.createElement("div");l.className=`tools-console-log__card tools-console-log__${e.source}`,l.classList.toggle("is-expanded",r),l.classList.toggle("is-git-update",e.updateKind==="git_pull"),l.classList.toggle("is-unread-update",!!e.highlight),l.dataset.notificationId=e.id,l.dataset.toolsNotificationMode=o.mode,l.setAttribute("role","button"),l.setAttribute("tabindex","0"),l.setAttribute("aria-expanded",r?"true":"false");let u=document.createElement("span");u.className="tools-console-log__cardTitle",u.textContent=e.title;let b=document.createElement("span");if(b.className="tools-console-log__cardHead",b.appendChild(u),e.timeLabel){let A=document.createElement("span");A.className="tools-console-log__cardTime",A.textContent=e.timeLabel,b.appendChild(A)}l.appendChild(b);let T=document.createElement("span");T.className="tools-console-log__cardBody",tn(T,e),l.appendChild(T),l.appendChild(Wo(e));let C=0,D=0,P=!1,H=(A,F=!1)=>{if(P){P=!1,A.preventDefault();return}let W=!r;if(h=ko(o.out,e.id,W,F),Xn(e,l),!W){ge(),f="",S.delete(e.id),Q=e.id,j=o.out,Ao(l),U=Date.now()+Je(l),q=n.setTimeout(()=>{q=null,Q="",U=0,j=null,Nt(o.out,o.model.state,o.options,{force:!0})},Je(l));return}ge(),f=W?e.id:"",Nt(o.out,o.model.state,o.options)};return l.addEventListener("pointerdown",A=>{C=A.clientX,D=A.clientY,P=!1},{passive:!0}),l.addEventListener("pointermove",A=>{Math.hypot(A.clientX-C,A.clientY-D)>8&&(P=!0)},{passive:!0}),l.addEventListener("click",A=>{H(A,A.detail===0)}),l.addEventListener("keydown",A=>{A.key!=="Enter"&&A.key!==" "||(A.preventDefault(),H(A,!0))}),l}function Ho(e,o){let r=document.createElement("span");return r.className="tools-console-log__footer",r.dataset.toolsNotificationMode=o.mode,r.appendChild(ze(e,o)),r}function Ko(e,o){let r=document.createDocumentFragment();return e.entries.length?(e.entries.forEach(l=>r.appendChild(Uo(l,o))),r):(r.appendChild(yo()),r)}function on(e){let o=document.createElement("span");return o.className="tools-console-log__body",o.appendChild(Ko(e.model,e)),o}function Fo(e){let o=document.createDocumentFragment();return o.appendChild(Ve(e)),o.appendChild(on(e)),o}function Qo(e){let o=document.createDocumentFragment();return o.appendChild(Ve(e)),o.appendChild(on(e)),o.appendChild(Ho(e.model,e)),o}function Nt(e,o={},r={},l={}){if(!e)return;io();let u=h,b=l.preserveScroll===!1||u?null:Do(e),T=rt(),C=Qt(o);if(R=C.state,K=r,fo(C.state),ke(e,T),!l.force&&So(e)){fe(e,C.entries),It(C.entries);return}Po(C);let P=r.autoFocusLatest===!0&&!l.skipAutoFocusLatest?en(C):null;Io(P)&&P.id!==x&&(x=P.id,nn(e,P.id,{expand:!0,smoothOnce:!0,stableDetail:!0}),u=h,b=null);let H=Eo(C,T),A={out:e,mode:T,model:C,options:r};if(!u&&H===w&&e.childElementCount>0){fe(e,C.entries),It(C.entries);return}if(!u&&e.childElementCount>0&&xo(e,C)){Ro(e,C,A),w=H,It(C.entries),f&&n.requestAnimationFrame(()=>{let F=V(e),W=J(F,f);jt(W),Ye(e,f)});return}if(e.replaceChildren(T===a.PORTRAIT?Qo(A):Fo(A)),w=H,u){if(Mo(e,u),u.instant||u.stableDetail){let F=V(e);Xe(J(F,u.id))}}else if(Oo(e,b),f){let F=V(e);Xe(J(F,f))}It(C.entries),u?(h=null,u.expanded&&n.requestAnimationFrame(()=>{let F=V(e),W=J(F,u.id);jt(W),To(e,u.id)}),Go(e,u)):f&&n.requestAnimationFrame(()=>{let F=V(e),W=J(F,f);jt(W),Ye(e,f)})}function jo(e,o={}){Ge(e,o,{boundKey:"toolsNotificationGestureBound",getPanel:Oe})}function zo(e,o={}){Ge(e,o,{boundKey:"toolsNotificationPanelDragBound",getPanel:()=>e,ignoreTarget:oo})}function an(e=R){return Qt(e).entries.filter(o=>!!o.highlight).length}n.CarrotToolsNotifications={bindPanelDrag:zo,bindStatusGesture:jo,unreadCount:an,render:Nt,resetDetail(){f="",x="",S.clear()},focusLatest(e={}){return Bo(e.out||L,e)},syncMode(e=L){e&&ke(e)}}})(window);var Tt=null,Lt=null,Kt=null,Ht=0,Ut=null;function N(t,n,a=null){return typeof getUIText=="function"?getUIText(t,n,a):n}function ie(t){return String(t??"").replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function le(t){typeof appDialog>"u"||!appDialog||appDialog.classList.toggle("app-dialog--tools-qr",!!t)}function Fn(t,n,a=null,s=null){let i=N(t,n,a);return typeof showAppToast=="function"&&showAppToast(i,s||void 0),i}function re(){Lt&&(cancelAnimationFrame(Lt),Lt=null),Kt&&(clearTimeout(Kt),Kt=null),Ht=0,Tt&&(Tt.getTracks().forEach(t=>t.stop()),Tt=null)}function _t(t,n){t&&(t.dataset.scanState=n||"idle")}function Oa(t,n){let a=Math.min(t,n)*.74;return{left:(t-a)/2,top:(n-a)/2,right:(t+a)/2,bottom:(n+a)/2,width:a,height:a}}function Ma(t){let n=[t?.location?.topLeftCorner,t?.location?.topRightCorner,t?.location?.bottomRightCorner,t?.location?.bottomLeftCorner].filter(m=>Number.isFinite(Number(m?.x))&&Number.isFinite(Number(m?.y)));if(n.length<4)return null;let a=n.map(m=>Number(m.x)),s=n.map(m=>Number(m.y)),i=Math.min(...a),p=Math.max(...a),c=Math.min(...s),g=Math.max(...s);return{left:i,top:c,right:p,bottom:g,width:p-i,height:g-c,centerX:(i+p)/2,centerY:(c+g)/2}}function qa(t,n,a){let s=Oa(n,a),i=Ma(t);if(!i||i.width<=0||i.height<=0)return!1;let p=s.width*.18,c=s.height*.18,g=i.centerX>=s.left&&i.centerX<=s.right&&i.centerY>=s.top&&i.centerY<=s.bottom,m=i.left>=s.left-p&&i.right<=s.right+p&&i.top>=s.top-c&&i.bottom<=s.bottom+c,f=i.width>=s.width*.34&&i.height>=s.height*.34&&i.width<=s.width*1.18&&i.height<=s.height*1.18;return g&&m&&f}function jn(t){if(typeof qrcode!="function")throw new Error("QR library not loaded");let n=qrcode(0,"L"),a=String(t||"");return n.addData(t,a.startsWith("CQR3:")||a.startsWith("CQR4:")?"Alphanumeric":"Byte"),n.make(),n}function Ga(t){return jn(t).createSvgTag(2,4)}function Wa(t){let n=jn(t),a=n.getModuleCount(),s=4,i=4,p=(a+i*2)*s,c=document.createElement("canvas");c.width=p,c.height=p;let g=c.getContext("2d");g.fillStyle="#ffffff",g.fillRect(0,0,p,p),g.fillStyle="#000000";for(let m=0;m|]+/g,"-").replace(/\s+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,64)||"carrot"}function Qn(t=new Date){let n=String(t.getFullYear()),a=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0");return`${n}${a}${s}`}async function Ha(){try{let t=await bulkGet(["GitBranch"]);return`${Ua(t.GitBranch)}-${Qn()}.png`}catch{return`carrot-${Qn()}.png`}}async function zn(){if(Ut)return Ut;Ut=(async()=>{let t=await getJson("/api/params_qr_dependency");if(console.info("[carrot][qr-dependency]",t),t.installed)return t;Fn("qr_configuring","Please wait...");let n=await postJson("/api/params_qr_dependency/ensure",{});if(console.info("[carrot][qr-dependency]",n),!n.ok||!n.installed)throw new Error(n.error||N("qr_config_failed","QR feature could not be configured."));return Fn("qr_config_done","QR feature is ready."),n})();try{return await Ut}finally{Ut=null}}function Ka(t,n){let a=document.createElement("a");a.href=t,a.download=n,document.body.appendChild(a),a.click(),a.remove()}function Fa(t){let n=document.createElement("canvas"),a=Math.min(1,1600/Math.max(t.naturalWidth||t.width,t.naturalHeight||t.height,1));n.width=Math.max(1,Math.floor((t.naturalWidth||t.width)*a)),n.height=Math.max(1,Math.floor((t.naturalHeight||t.height)*a));let s=n.getContext("2d",{willReadFrequently:!0});s.drawImage(t,0,0,n.width,n.height);let i=s.getImageData(0,0,n.width,n.height);return(typeof jsQR=="function"?jsQR(i.data,n.width,n.height):null)?.data||""}function Qa(t,n,a){if(!t)return;let s=new FileReader;s.onload=()=>{let i=new Image;i.onload=()=>{let p=Fa(i);p?n(p):a.textContent=N("qr_restore_decode_failed","QR code was not found.")},i.onerror=()=>{a.textContent=N("qr_restore_decode_failed","QR code was not found.")},i.src=String(s.result||"")},s.readAsDataURL(t)}function ja(t={}){return typeof renderSettingsDiffSummary=="function"?renderSettingsDiffSummary(t):""}function za(t){return typeof renderSettingsDiffHtml=="function"?renderSettingsDiffHtml(t,{currentLabel:N("qr_restore_current_value","Current"),nextLabel:N("qr_restore_backup_value","Restore"),changedLabel:N("qr_restore_changed","Changed")}):ja(t?.summary)}async function Va(){try{await zn();let t=await getJson("/api/params_qr_backup"),n=t.format||String(t.payload||"").split(/[.:]/,1)[0]||"unknown";console.info("[carrot][qr-backup]",{format:n,version:t.version,count:t.count,payloadChars:t.payload_chars,rawBytes:t.json_bytes,compressedBytes:t.compressed_bytes,ecc:t.ecc});let a=Ga(t.payload),s=Wa(t.payload),i=await Ha(),p=N("qr_backup_title","QR Backup"),c=`
-
${a}
+
${a}
- `,g=openAppDialog({mode:"confirm",title:d,html:!0,messageHtml:p,confirmLabel:R("download","Download"),cancelLabel:R("cancel","Cancel")});re(!0),g.finally(()=>re(!1)),await g&&$a(i,s)}catch(t){$("qr backup",t)}}async function Ua(t,n,a,i){let s=String(t||"").trim();if(!s)return;i.textContent=R("qr_restore_previewing","Checking backup..."),a.disabled=!0;let d=await postJson("/api/params_restore_preview",{payload:s});n.innerHTML=Ga(d.preview);let p=Number(d.preview?.summary?.selected||0);return a.disabled=p<=0,i.textContent=p>0?R("qr_restore_ready","{count} changes ready",{count:p}):R("qr_restore_no_changes","No changes to apply."),s}function Ha(t){let n=document.getElementById("toolsQrImageBtn"),a=document.getElementById("toolsQrImageInput"),i=document.getElementById("toolsQrCameraBtn"),s=document.getElementById("toolsQrCameraWrap"),d=document.getElementById("toolsQrVideo"),p=document.getElementById("toolsQrCanvas"),g=document.getElementById("toolsQrStatus"),f=document.getElementById("toolsQrDiff"),m=typeof appDialogConfirm<"u"?appDialogConfirm:null;if(!n||!a||!i||!s||!d||!p||!g||!f||!m)return;m.disabled=!0;let I=!!(window.isSecureContext&&navigator.mediaDevices?.getUserMedia);I||(i.disabled=!0,i.classList.add("is-disabled"),i.textContent=R("qr_restore_camera_disabled","Camera unavailable"),i.setAttribute("aria-label",R("qr_restore_https_required","Open this page with HTTPS to use the camera.")),i.title=R("qr_restore_https_required","Open this page with HTTPS to use the camera."));let N=async F=>{try{t.payload=await Ua(F,f,m,g)}catch(u){t.payload="",m.disabled=!0,g.textContent=u?.message||R("qr_restore_preview_failed","Failed to read backup."),f.innerHTML=""}};n.onclick=()=>a.click(),a.onchange=()=>{Ma(a.files?.[0],N,g),a.value=""},i.onclick=async()=>{if(I){if(Tt){se(),s.hidden=!0,_t(s,"idle"),i.textContent=R("qr_restore_camera","Camera");return}try{if(!window.isSecureContext){g.textContent=R("qr_restore_https_required","Open this page with HTTPS to use the camera.");return}if(!navigator.mediaDevices?.getUserMedia){g.textContent=R("qr_restore_camera_unsupported","Camera stream is not supported by this browser.");return}Tt=await navigator.mediaDevices.getUserMedia({video:{facingMode:{ideal:"environment"}},audio:!1}),d.srcObject=Tt,d.setAttribute("playsinline","true"),await d.play(),s.hidden=!1,_t(s,"searching"),i.textContent=R("qr_restore_stop_camera","Stop Camera"),g.textContent=R("qr_restore_scan_hint","Point the camera at the QR code.");let F=()=>{if(!Tt||d.readyState<2){Lt=requestAnimationFrame(F);return}p.width=d.videoWidth||640,p.height=d.videoHeight||480;let u=p.getContext("2d",{willReadFrequently:!0});u.drawImage(d,0,0,p.width,p.height);let h=u.getImageData(0,0,p.width,p.height),_=typeof jsQR=="function"?jsQR(h.data,p.width,p.height):null;if(_?.data)if(Na(_,p.width,p.height)){if(Ut+=1,_t(s,"aligned"),g.textContent=R("qr_restore_scan_aligned","QR code detected. Hold still..."),Ut>=2){_t(s,"locked"),g.textContent=R("qr_restore_scan_locked","QR code captured."),Ht=window.setTimeout(()=>{Ht=null,se(),s.hidden=!0,_t(s,"idle"),i.textContent=R("qr_restore_camera","Camera"),N(_.data)},160);return}}else Ut=0,_t(s,"detected"),g.textContent=R("qr_restore_scan_detected","Move the QR code into the guide box.");else Ut=0,_t(s,"searching");Lt=requestAnimationFrame(F)};Lt=requestAnimationFrame(F)}catch(F){se(),s.hidden=!0,_t(s,"idle"),i.textContent=R("qr_restore_camera","Camera"),g.textContent=F?.message||R("qr_restore_camera_failed","Camera could not be opened.")}}}}async function Fa(){try{await Kn()}catch(s){$("qr restore",s);return}let t={payload:""},n=` + `,g=openAppDialog({mode:"confirm",title:p,html:!0,messageHtml:c,confirmLabel:N("download","Download"),cancelLabel:N("cancel","Cancel")});le(!0),g.finally(()=>le(!1)),await g&&Ka(s,i)}catch(t){k("qr backup",t)}}async function Ja(t,n,a,s){let i=String(t||"").trim();if(!i)return;s.textContent=N("qr_restore_previewing","Checking backup..."),a.disabled=!0;let p=await postJson("/api/params_restore_preview",{payload:i});n.innerHTML=za(p.preview);let c=Number(p.preview?.summary?.selected||0);return a.disabled=c<=0,s.textContent=c>0?N("qr_restore_ready","{count} changes ready",{count:c}):N("qr_restore_no_changes","No changes to apply."),i}function Ya(t){let n=document.getElementById("toolsQrImageBtn"),a=document.getElementById("toolsQrImageInput"),s=document.getElementById("toolsQrCameraBtn"),i=document.getElementById("toolsQrCameraWrap"),p=document.getElementById("toolsQrVideo"),c=document.getElementById("toolsQrCanvas"),g=document.getElementById("toolsQrStatus"),m=document.getElementById("toolsQrDiff"),f=typeof appDialogConfirm<"u"?appDialogConfirm:null;if(!n||!a||!s||!i||!p||!c||!g||!m||!f)return;f.disabled=!0;let L=!!(window.isSecureContext&&navigator.mediaDevices?.getUserMedia);L||(s.disabled=!0,s.classList.add("is-disabled"),s.textContent=N("qr_restore_camera_disabled","Camera unavailable"),s.setAttribute("aria-label",N("qr_restore_https_required","Open this page with HTTPS to use the camera.")),s.title=N("qr_restore_https_required","Open this page with HTTPS to use the camera."));let R=async K=>{try{t.payload=await Ja(K,m,f,g)}catch(d){t.payload="",f.disabled=!0,g.textContent=d?.message||N("qr_restore_preview_failed","Failed to read backup."),m.innerHTML=""}};n.onclick=()=>a.click(),a.onchange=()=>{Qa(a.files?.[0],R,g),a.value=""},s.onclick=async()=>{if(L){if(Tt){re(),i.hidden=!0,_t(i,"idle"),s.textContent=N("qr_restore_camera","Camera");return}try{if(!window.isSecureContext){g.textContent=N("qr_restore_https_required","Open this page with HTTPS to use the camera.");return}if(!navigator.mediaDevices?.getUserMedia){g.textContent=N("qr_restore_camera_unsupported","Camera stream is not supported by this browser.");return}Tt=await navigator.mediaDevices.getUserMedia({video:{facingMode:{ideal:"environment"}},audio:!1}),p.srcObject=Tt,p.setAttribute("playsinline","true"),await p.play(),i.hidden=!1,_t(i,"searching"),s.textContent=N("qr_restore_stop_camera","Stop Camera"),g.textContent=N("qr_restore_scan_hint","Point the camera at the QR code.");let K=()=>{if(!Tt||p.readyState<2){Lt=requestAnimationFrame(K);return}c.width=p.videoWidth||640,c.height=p.videoHeight||480;let d=c.getContext("2d",{willReadFrequently:!0});d.drawImage(p,0,0,c.width,c.height);let h=d.getImageData(0,0,c.width,c.height),_=typeof jsQR=="function"?jsQR(h.data,c.width,c.height):null;if(_?.data)if(qa(_,c.width,c.height)){if(Ht+=1,_t(i,"aligned"),g.textContent=N("qr_restore_scan_aligned","QR code detected. Hold still..."),Ht>=2){_t(i,"locked"),g.textContent=N("qr_restore_scan_locked","QR code captured."),Kt=window.setTimeout(()=>{Kt=null,re(),i.hidden=!0,_t(i,"idle"),s.textContent=N("qr_restore_camera","Camera"),R(_.data)},160);return}}else Ht=0,_t(i,"detected"),g.textContent=N("qr_restore_scan_detected","Move the QR code into the guide box.");else Ht=0,_t(i,"searching");Lt=requestAnimationFrame(K)};Lt=requestAnimationFrame(K)}catch(K){re(),i.hidden=!0,_t(i,"idle"),s.textContent=N("qr_restore_camera","Camera"),g.textContent=K?.message||N("qr_restore_camera_failed","Camera could not be opened.")}}}}async function Xa(){try{await zn()}catch(i){k("qr restore",i);return}let t={payload:""},n=`
- - + +
-
${ie(R("qr_restore_hint","Scan or select a QR backup image before restoring."))}
+
${ie(N("qr_restore_hint","Scan or select a QR backup image before restoring."))}
- `,a=openAppDialog({mode:"confirm",title:R("qr_restore_title","QR Restore"),html:!0,messageHtml:n,confirmLabel:R("qr_restore_apply","Apply"),cancelLabel:R("cancel","Cancel")});if(re(!0),window.setTimeout(()=>Ha(t),0),!(!await a.finally(()=>{se(),re(!1)})||!t.payload))try{let s=await postJson("/api/params_restore_json",{payload:t.payload}),d=Number(s.result?.ok_cnt||0),p=new Set((s.result?.fails||[]).map(f=>String(f?.key||"")).filter(Boolean)),g={};(s.preview?.entries||[]).forEach(f=>{!f?.apply||p.has(String(f.key))||(g[f.key]=f.value)}),Object.keys(g).length&&(window.dispatchEvent(new CustomEvent("carrot:paramsrestored",{detail:{source:"qr_restore",values:g}})),Object.entries(g).forEach(([f,m])=>{window.dispatchEvent(new CustomEvent("carrot:paramchange",{detail:{name:f,value:m,source:"qr_restore"}}))})),z(JSON.stringify(s.result,null,2),{label:"qr restore",meta:!1}),typeof showAppToast=="function"&&showAppToast(R("qr_restore_applied","{count} params restored",{count:d})),d>0&&await appConfirm(UI_STRINGS[LANG].restore_done_reboot||`Restore done. -Reboot now?`,{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(s){$("qr restore",s)}}function Qn(){let t=(n,a)=>{let i=document.getElementById(n);!i||i.dataset.qrBound==="1"||(i.dataset.qrBound="1",i.addEventListener("click",a))};t("btnQrBackupSettings",Wa),t("btnQrRestoreSettings",Fa)}document.addEventListener("DOMContentLoaded",Qn);document.readyState!=="loading"&&Qn();})(); + `,a=openAppDialog({mode:"confirm",title:N("qr_restore_title","QR Restore"),html:!0,messageHtml:n,confirmLabel:N("qr_restore_apply","Apply"),cancelLabel:N("cancel","Cancel")});if(le(!0),window.setTimeout(()=>Ya(t),0),!(!await a.finally(()=>{re(),le(!1)})||!t.payload))try{let i=await postJson("/api/params_restore_json",{payload:t.payload}),p=Number(i.result?.ok_cnt||0),c=new Set((i.result?.fails||[]).map(m=>String(m?.key||"")).filter(Boolean)),g={};(i.preview?.entries||[]).forEach(m=>{!m?.apply||c.has(String(m.key))||(g[m.key]=m.value)}),Object.keys(g).length&&(window.dispatchEvent(new CustomEvent("carrot:paramsrestored",{detail:{source:"qr_restore",values:g}})),Object.entries(g).forEach(([m,f])=>{window.dispatchEvent(new CustomEvent("carrot:paramchange",{detail:{name:m,value:f,source:"qr_restore"}}))})),z(JSON.stringify(i.result,null,2),{label:"qr restore",meta:!1}),typeof showAppToast=="function"&&showAppToast(N("qr_restore_applied","{count} params restored",{count:p})),p>0&&await appConfirm(UI_STRINGS[LANG].restore_done_reboot||`Restore done. +Reboot now?`,{title:UI_STRINGS[LANG].reboot||"Reboot"})&&await M("reboot")}catch(i){k("qr restore",i)}}function Vn(){let t=(n,a)=>{let s=document.getElementById(n);!s||s.dataset.qrBound==="1"||(s.dataset.qrBound="1",s.addEventListener("click",a))};t("btnQrBackupSettings",Va),t("btnQrRestoreSettings",Xa)}document.addEventListener("DOMContentLoaded",Vn);document.readyState!=="loading"&&Vn();})(); diff --git a/openpilot/selfdrive/carrot/web/js/pages/setting_device_render.js b/openpilot/selfdrive/carrot/web/js/pages/setting_device_render.js index 393ebed9dc..750523a934 100644 --- a/openpilot/selfdrive/carrot/web/js/pages/setting_device_render.js +++ b/openpilot/selfdrive/carrot/web/js/pages/setting_device_render.js @@ -74,7 +74,7 @@ function renderSshKeysRow(statusOrUsername, fallbackHasKeys) { ], }); return ` -
+
${escapeHtml(getUIText("ssh_keys", "SSH Keys"))}
diff --git a/openpilot/selfdrive/carrot/web/js/realtime/vision_raw.js b/openpilot/selfdrive/carrot/web/js/realtime/vision_raw.js index d32cfece82..0c05e2334b 100644 --- a/openpilot/selfdrive/carrot/web/js/realtime/vision_raw.js +++ b/openpilot/selfdrive/carrot/web/js/realtime/vision_raw.js @@ -415,6 +415,8 @@ function drivingHudUpdateFromCarPayload(j) { gear: j.gear, gearStep: j.gearStep, lfaActive: j.lfaActive, + laneModeRequested: j.laneModeRequested, + laneModePlanned: j.laneModePlanned, steeringAngleDeg: j.steeringAngleDeg, aEgo: j.aEgo, steerOutput: j.steerOutput, @@ -435,6 +437,9 @@ function drivingHudUpdateFromCarPayload(j) { ...basePayload, evActive: j.evActive === true, activeLaneLine: j.activeLaneLine == null ? null : j.activeLaneLine === true, + laneModeRequested: j.laneModeRequested == null ? null : j.laneModeRequested === true, + laneModePlanned: j.laneModePlanned == null ? null : j.laneModePlanned === true, + laneModePresentation: j.laneModePresentation ?? null, cruiseOverride: j.cruiseOverride && typeof j.cruiseOverride === "object" ? j.cruiseOverride : null, @@ -752,6 +757,9 @@ function deriveCompactHudPayload(state) { ...payload, evActive: vehiclePayload.evActive === true, activeLaneLine: vehiclePayload.activeLaneLine == null ? null : vehiclePayload.activeLaneLine === true, + laneModeRequested: vehiclePayload.laneModeRequested ?? null, + laneModePlanned: vehiclePayload.laneModePlanned ?? null, + laneModePresentation: vehiclePayload.laneModePresentation ?? null, cruiseOverride: vehiclePayload.cruiseOverride ?? null, trafficState: Number.isFinite(trafficState) ? trafficState : 0, drivingMode: vehiclePayload.drivingMode ?? null, diff --git a/openpilot/selfdrive/carrot/web/js/translations/en.js b/openpilot/selfdrive/carrot/web/js/translations/en.js index 1c6a638ed3..a19566bbc4 100644 --- a/openpilot/selfdrive/carrot/web/js/translations/en.js +++ b/openpilot/selfdrive/carrot/web/js/translations/en.js @@ -344,6 +344,15 @@ window.CarrotTranslations.register("en", { web_settings_hud: "HUD", web_settings_drive_layout: "Screen layout", web_settings_navigation: "Carrot Navi", + web_navi_map_type: "Map type", + web_navi_map_type_desc: "Choose the Carrot Navi map background.", + web_navi_map_type_normal: "Normal mode", + web_navi_map_type_satellite: "Satellite mode", + web_navi_map_theme: "Map theme", + web_navi_map_theme_desc: "Choose the color theme for routes and crossroad views.", + web_navi_map_theme_dark: "Dark", + web_navi_map_theme_light: "Light", + web_navi_map_settings_unavailable: "Carrot Navi map settings are unavailable.", web_settings_upload: "Web upload", web_upload_url: "Upload server", web_upload_url_desc: "HTTPS API address; sessions are created automatically", diff --git a/openpilot/selfdrive/carrot/web/js/translations/ko.js b/openpilot/selfdrive/carrot/web/js/translations/ko.js index 7078426f83..e9bab9d034 100644 --- a/openpilot/selfdrive/carrot/web/js/translations/ko.js +++ b/openpilot/selfdrive/carrot/web/js/translations/ko.js @@ -344,6 +344,15 @@ window.CarrotTranslations.register("ko", { web_settings_hud: "HUD", web_settings_drive_layout: "화면 구성", web_settings_navigation: "당근네비", + web_navi_map_type: "지도 종류", + web_navi_map_type_desc: "당근네비 지도 배경을 선택합니다.", + web_navi_map_type_normal: "일반 모드", + web_navi_map_type_satellite: "위성 모드", + web_navi_map_theme: "지도 테마", + web_navi_map_theme_desc: "지도 경로와 교차로 화면의 색상 테마를 선택합니다.", + web_navi_map_theme_dark: "다크", + web_navi_map_theme_light: "라이트", + web_navi_map_settings_unavailable: "당근네비 지도 설정을 불러올 수 없습니다.", web_settings_upload: "웹 업로드", web_upload_url: "업로드 서버", web_upload_url_desc: "자동 세션으로 로그를 전송할 HTTPS API 주소", diff --git a/openpilot/selfdrive/carrot/web/js/translations/zh.js b/openpilot/selfdrive/carrot/web/js/translations/zh.js index 8954ce65c5..8ea94479fb 100644 --- a/openpilot/selfdrive/carrot/web/js/translations/zh.js +++ b/openpilot/selfdrive/carrot/web/js/translations/zh.js @@ -344,6 +344,15 @@ window.CarrotTranslations.register("zh", { web_settings_hud: "HUD", web_settings_drive_layout: "画面布局", web_settings_navigation: "Carrot 导航", + web_navi_map_type: "地图类型", + web_navi_map_type_desc: "选择 Carrot 导航的地图背景。", + web_navi_map_type_normal: "普通模式", + web_navi_map_type_satellite: "卫星模式", + web_navi_map_theme: "地图主题", + web_navi_map_theme_desc: "选择路线和交叉路口画面的颜色主题。", + web_navi_map_theme_dark: "深色", + web_navi_map_theme_light: "浅色", + web_navi_map_settings_unavailable: "无法加载 Carrot 导航地图设置。", web_settings_upload: "Web upload", web_upload_url: "Upload server", web_upload_url_desc: "HTTPS API address; sessions are created automatically", diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/data_bridge.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/data_bridge.js index 105ff1938a..bb9f8d6ab7 100644 --- a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/data_bridge.js +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/data_bridge.js @@ -1,5 +1,12 @@ "use strict"; +import { + resolveLaneModeFields, + resolveLaneModeState, +} from "../lane_mode.js"; + +export { resolveLaneModeState }; + function finite(value) { if (value === null || value === undefined || value === "") return null; const number = Number(value); @@ -145,12 +152,18 @@ export function createCruiseOverrideHold(options = {}) { // Keep the cluster-only fields in one shared rule so live and replay cannot // silently drop them at that boundary. export function withVehicleHudFields(payload = {}, source = {}) { + const laneMode = resolveLaneModeFields({ + requested: source.laneModeRequested, + planned: source.laneModePlanned, + controlled: source.activeLaneLine, + }); return { ...payload, evActive: source.evActive === true, - activeLaneLine: source.activeLaneLine == null - ? null - : source.activeLaneLine === true, + activeLaneLine: laneMode.controlled, + laneModeRequested: laneMode.requested, + laneModePlanned: laneMode.planned, + laneModePresentation: laneMode.presentation, cruiseOverride: cruiseOverridePayload(source.cruiseOverride), trafficState: trafficSignalState(source.trafficState ?? payload.trafficState), drivingMode: drivingModeState(source.drivingMode ?? payload.drivingMode), @@ -164,6 +177,9 @@ export function vehicleHudSignature(payload = {}) { return [ payload.evActive === true ? 1 : 0, payload.activeLaneLine == null ? "-" : (payload.activeLaneLine === true ? 1 : 0), + payload.laneModeRequested == null ? "-" : (payload.laneModeRequested === true ? 1 : 0), + payload.laneModePlanned == null ? "-" : (payload.laneModePlanned === true ? 1 : 0), + payload.laneModePresentation ?? "-", override?.kph ?? "-", override?.label ?? "-", override?.mode ?? "-", @@ -267,19 +283,20 @@ export function deriveVehicleHudPayload(state = {}) { ? Math.round(rawGearStep) : null; - // Cluster parity: EV telltale (carState.evModeValid & evModeActive) and the - // LFA lane-line lateral mode (controlsState.activeLaneLine → green lane wings). + // Keep user intent, planner selection and final control activation separate. + // They update on different service clocks in both live and replay. const evActive = Boolean(carState.evModeValid) && Boolean(carState.evModeActive); - const activeLaneLine = controlsState.activeLaneLine == null - ? null - : Boolean(controlsState.activeLaneLine); + const laneMode = resolveLaneModeState(state); const latActive = optionalBoolean(carControl.latActive); return { gear, gearStep, evActive, - activeLaneLine, + activeLaneLine: laneMode.controlled, + laneModeRequested: laneMode.requested, + laneModePlanned: laneMode.planned, + laneModePresentation: laneMode.presentation, cruiseOverride: deriveCruiseOverride(state), trafficState: resolveTrafficState(state), drivingMode: drivingModeState(state.longitudinalPlan?.myDrivingMode), @@ -303,6 +320,7 @@ export function deriveVehicleHudPayload(state = {}) { export const CarrotHudDataBridge = Object.freeze({ deriveVehicleHudPayload, + resolveLaneModeState, deriveCruiseOverride, createCruiseOverrideHold, resolveTrafficState, diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/debug.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/debug.js index 61f3d4c397..72e624df4a 100644 --- a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/debug.js +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/debug.js @@ -7,6 +7,7 @@ function own(object, key) { function selectedSourceState(state = {}) { const carState = state.carState || {}; const controlsState = state.controlsState || {}; + const lateralPlan = state.lateralPlan || {}; const longitudinalPlan = state.longitudinalPlan || {}; const carrotMan = state.carrotMan || {}; const selfdriveState = state.selfdriveState || {}; @@ -15,6 +16,7 @@ function selectedSourceState(state = {}) { services: { carState: own(state, "carState"), controlsState: own(state, "controlsState"), + lateralPlan: own(state, "lateralPlan"), longitudinalPlan: own(state, "longitudinalPlan"), carrotMan: own(state, "carrotMan"), selfdriveState: own(state, "selfdriveState"), @@ -27,12 +29,16 @@ function selectedSourceState(state = {}) { evModeValid: carState.evModeValid ?? null, evModeActive: carState.evModeActive ?? null, gearShifter: carState.gearShifter ?? null, + useLaneLineSpeed: carState.useLaneLineSpeed ?? null, }, controlsState: { enabled: controlsState.enabled ?? null, vCruiseCluster: controlsState.vCruiseCluster ?? null, activeLaneLine: controlsState.activeLaneLine ?? null, }, + lateralPlan: { + useLaneLines: lateralPlan.useLaneLines ?? null, + }, longitudinalPlan: { cruiseTarget: longitudinalPlan.cruiseTarget ?? null, trafficState: longitudinalPlan.trafficState ?? null, diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/index.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/index.js index d75c2b7358..4315d737d3 100644 --- a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/index.js +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/index.js @@ -15,6 +15,7 @@ import { createClock } from "./widgets/clock.js"; import { createDeviceTemp } from "./widgets/device_temp.js"; import { createWifiIcon } from "./widgets/wifi_icon.js"; import { createLfaIcon } from "./widgets/lfa_icon.js"; +import { resolveLaneModeFields } from "../lane_mode.js"; import { createAccelGauge } from "./widgets/accel_gauge.js"; import { createSteerGauge } from "./widgets/steer_gauge.js"; import { createTurnSignal } from "./widgets/turn_signal.js"; @@ -53,6 +54,11 @@ export function mapPayload(p = {}) { : (p.gear == null ? null : String(p.gear).trim().toUpperCase().slice(0, 2)); const override = p.cruiseOverride && typeof p.cruiseOverride === "object" ? p.cruiseOverride : null; const overrideKph = override != null ? num(override.kph) : null; + const laneMode = resolveLaneModeFields({ + requested: p.laneModeRequested, + planned: p.laneModePlanned, + controlled: p.activeLaneLine, + }); return { speed: toUnit(speed), // 크루즈 off면 0/음수로 오므로 숨김 @@ -62,7 +68,10 @@ export function mapPayload(p = {}) { speedLimit: limit != null && limit > 0 ? toUnit(limit) : null, // 클러스터 패리티: EV 텔테일 / LFA 레인 초록 날개 / 크루즈 오버라이드(감속=주황·eco=초록) evActive: p.evActive === true, - activeLaneLine: p.activeLaneLine === true, + activeLaneLine: laneMode.controlled, + laneModeRequested: laneMode.requested, + laneModePlanned: laneMode.planned, + laneModePresentation: laneMode.presentation, cruiseOverride: overrideKph != null && overrideKph > 0 ? { kph: toUnit(overrideKph), label: override.label == null ? "" : String(override.label), mode: num(override.mode) ?? 0 } : null, @@ -175,8 +184,6 @@ export function createHudOverlay(doc) { data.speedLimit != null && data.speedLimit > 0, data.leftBlinker, data.rightBlinker, - // 레인 날개는 LFA 폭을 바꾸므로 등장/소멸 시 재배치 판정이 필요하다. - data.activeLaneLine, data.fuelGauge != null && data.fuelGauge > 0 && data.fuelGauge <= 1, data.ureaGauge != null && data.ureaGauge > 0 && data.ureaGauge <= 1, ].join(":"); diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/style.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/style.js index 21558877a4..58bbba4083 100644 --- a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/style.js +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/style.js @@ -119,12 +119,13 @@ html:not([data-carrot-mini-hud="1"]) #carrotMiniHud { display:none !important; } .chud-tlight-halo{opacity:.28} .chud-tlight-dot{stroke:rgba(255,255,255,.85);stroke-width:3} -/* LFA 당근 — 클러스터 동작: 활성 풀컬러 / 비활성 회색 + 조향각 회전 */ -.chud-lfa{position:relative;display:flex;align-items:center;justify-content:center} -/* 레인 날개(폭 2x)가 뜰 때만 그 오버행(각 변 휠 절반)을 패딩으로 예약 → - * 옆 위젯과 겹치거나 좌측으로 삐져나가지 않는다(휠 위치는 중앙 유지). */ -.chud-lfa.has-lane{padding-inline:clamp(14px,2.8cqw,28px)} -.chud-lfa-img{position:relative;z-index:1;height:clamp(28px,5.6cqw,56px);width:clamp(28px,5.6cqw,56px);display:block;object-fit:contain; +/* LFA 아이콘의 flex 점유 폭은 모드와 무관하게 휠 크기로 고정한다. + * 2x 레인 날개는 absolute overflow로만 그려 옆 Wi-Fi/시계가 움직이지 않는다. */ +.chud-lfa{position:relative;display:flex;align-items:center;justify-content:center; + --chud-lfa-size:clamp(28px,5.6cqw,56px);--chud-lfa-lane-width:clamp(56px,11.2cqw,112px); + --chud-lfa-armed-opacity:.48;--chud-lfa-active-opacity:.78; + width:var(--chud-lfa-size);height:var(--chud-lfa-size);flex:0 0 auto} +.chud-lfa-img{position:relative;z-index:1;height:var(--chud-lfa-size);width:var(--chud-lfa-size);display:block;object-fit:contain; transform-origin:50% 50%;transition:transform .12s linear,filter .2s,opacity .2s; filter:drop-shadow(0 2px 5px rgba(0,0,0,.55))} .chud-lfa:not(.is-active) .chud-lfa-img{opacity:.5;filter:grayscale(.7) drop-shadow(0 2px 5px rgba(0,0,0,.55))} @@ -132,13 +133,17 @@ html:not([data-carrot-mini-hud="1"]) #carrotMiniHud { display:none !important; } * 휠 뒤에 깔리고 좌우로 삐져나온다. 색=배경(활성 초록/비활성 muted), 모양=mask(JS가 URL 주입). */ .chud-lfa-lane{position:absolute;left:50%;top:50%; transform:translate(-50%,-56%);pointer-events:none;z-index:0; - width:clamp(56px,11.2cqw,112px);height:clamp(28px,5.6cqw,56px); - background-color:var(--chud-muted); + width:var(--chud-lfa-lane-width);height:var(--chud-lfa-size); + background-color:var(--chud-muted);opacity:0;visibility:hidden; -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat; -webkit-mask-position:center;mask-position:center; -webkit-mask-size:contain;mask-size:contain; - filter:drop-shadow(0 2px 5px rgba(0,0,0,.5))} -.chud-lfa.is-active .chud-lfa-lane{background-color:var(--chud-carrot)} + filter:drop-shadow(0 2px 5px rgba(0,0,0,.5)); + transition:opacity .18s ease-out,background-color .18s ease-out,visibility 0s linear .18s} +.chud-lfa.has-lane .chud-lfa-lane{opacity:var(--chud-lfa-armed-opacity);visibility:visible;transition-delay:0s} +.chud-lfa.is-lane-active .chud-lfa-lane{opacity:var(--chud-lfa-active-opacity)} +.chud-lfa.is-lane-active.is-active .chud-lfa-lane{background-color:var(--chud-carrot);opacity:1} +@media (prefers-reduced-motion:reduce){.chud-lfa-lane{transition:none}} /* WiFi */ .chud-wifi{height:clamp(24px,4.8cqw,48px);width:clamp(24px,4.8cqw,48px);display:block;color:#fff; @@ -196,9 +201,7 @@ html:not([data-carrot-mini-hud="1"]) #carrotMiniHud { display:none !important; } * 커진 결과가 다른 존을 침범하면 layout.js가 낮은 우선순위부터 제거한다. */ @container chud (max-width:520px){ .chud-gauge,.chud-level{width:clamp(44px,16cqw,64px)} - .chud-lfa-img{width:clamp(32px,12cqw,46px);height:clamp(32px,12cqw,46px)} - .chud-lfa-lane{width:clamp(64px,24cqw,92px);height:clamp(32px,12cqw,46px)} - .chud-lfa.has-lane{padding-inline:clamp(16px,6cqw,23px)} + .chud-lfa{--chud-lfa-size:clamp(32px,12cqw,46px);--chud-lfa-lane-width:clamp(64px,24cqw,92px)} .chud-wifi{width:clamp(28px,10cqw,40px);height:clamp(28px,10cqw,40px)} .chud-clock{font-size:clamp(28px,10cqw,40px);height:clamp(28px,10cqw,40px)} .chud-limit{width:clamp(52px,16cqw,68px)} diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/widgets/lfa_icon.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/widgets/lfa_icon.js index d65aa32c32..0704431b6e 100644 --- a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/widgets/lfa_icon.js +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud/widgets/lfa_icon.js @@ -2,11 +2,12 @@ import { el } from "../dom.js"; import { CARROT_URI, LFA_LANE_URI } from "../assets.js"; +import { LANE_MODE_PRESENTATION } from "../../lane_mode.js"; /* LFA 아이콘 = 클러스터와 동일한 원본 에셋. 클러스터 동작: * - 활성 시 풀컬러 / 비활성 시 회색(muted) * - 조향각만큼 회전(cluster: rotation = -steering_angle_deg) - * - controlsState.activeLaneLine(횡방향 레인모드) 시 carrot_wheel_lane 초록 날개 오버레이. + * - 사용자 레인모드 선택/자동 폴백/최종 활성 상태를 고정 폭 날개로 구분. * 클러스터는 흰 실루엣 텍스처를 GREEN(활성)/muted(비활성)로 틴트 → 웹은 동일 자산을 * mask-image로 깔고 배경색만 토큰(--chud-carrot/--chud-muted)으로 칠한다(픽셀루프/새 에셋 없음). */ export function createLfaIcon(doc) { @@ -20,10 +21,19 @@ export function createLfaIcon(doc) { function update(data = {}) { root.classList.toggle("is-active", data.lfaActive !== false); - const laneOn = data.activeLaneLine === true; - // 날개가 보일 때만 컨테이너가 2x 폭을 예약 → 옆 위젯과 겹침/좌측 오버플로우 방지. - root.classList.toggle("has-lane", laneOn); - lane.style.display = laneOn ? "" : "none"; + const presentation = data.laneModePresentation || ( + data.activeLaneLine === true + ? LANE_MODE_PRESENTATION.ACTIVE + : LANE_MODE_PRESENTATION.LANELESS + ); + const hasLane = ( + presentation === LANE_MODE_PRESENTATION.ARMED + || presentation === LANE_MODE_PRESENTATION.ACTIVE + ); + root.classList.toggle("has-lane", hasLane); + root.classList.toggle("is-lane-armed", presentation === LANE_MODE_PRESENTATION.ARMED); + root.classList.toggle("is-lane-active", presentation === LANE_MODE_PRESENTATION.ACTIVE); + root.setAttribute("data-lane-state", presentation); const angle = Number(data.steerAngle); if (Number.isFinite(angle)) img.style.transform = `rotate(${(-angle).toFixed(1)}deg)`; } diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud_model.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud_model.js index 796795d530..d713a5cb66 100644 --- a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud_model.js +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/hud_model.js @@ -1,3 +1,5 @@ +import { resolveLaneModeState } from "./lane_mode.js"; + function finiteNumber(value, fallback = 0) { const number = Number(value); return Number.isFinite(number) ? number : fallback; @@ -34,8 +36,7 @@ function isLongActive(overlayState) { } function isLaneMode(hudState) { - return Boolean(hudState?.controlsState?.activeLaneLine) - || finiteNumber(hudState?.carState?.useLaneLineSpeed, 0) > 0; + return resolveLaneModeState(hudState).pathActive; } function buildRtcPerf(perf) { @@ -128,6 +129,7 @@ function formatRtcPerfLabel(perf) { export const DriveVisionHudModel = Object.freeze({ isLongActive, isLaneMode, + resolveLaneModeState, buildRtcPerf, formatRtcPerfLabel, }); @@ -135,6 +137,7 @@ export const DriveVisionHudModel = Object.freeze({ export { isLongActive, isLaneMode, + resolveLaneModeState, buildRtcPerf, formatRtcPerfLabel, }; diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/lane_mode.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/lane_mode.js new file mode 100644 index 0000000000..84524643ac --- /dev/null +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/lane_mode.js @@ -0,0 +1,67 @@ +"use strict"; + +export const LANE_MODE_PRESENTATION = Object.freeze({ + UNKNOWN: "unknown", + LANELESS: "laneless", + ARMED: "armed", + ACTIVE: "active", +}); + +function optionalBoolean(value) { + return value == null ? null : Boolean(value); +} + +function optionalNumber(value) { + if (value == null || value === "") return null; + const number = Number(value); + return Number.isFinite(number) ? number : null; +} + +export function resolveLaneModeFields(fields = {}) { + const requested = optionalBoolean(fields.requested); + const planned = optionalBoolean(fields.planned); + const controlled = optionalBoolean(fields.controlled); + const pathActive = planned ?? controlled ?? false; + let presentation = LANE_MODE_PRESENTATION.UNKNOWN; + + // A direct request to leave lane mode must be acknowledged immediately, + // while the slower planner/control services may still carry an older sample. + if (requested === false) { + presentation = LANE_MODE_PRESENTATION.LANELESS; + } else if (controlled === true) { + presentation = LANE_MODE_PRESENTATION.ACTIVE; + } else if (controlled === false) { + presentation = requested === true || planned === true + ? LANE_MODE_PRESENTATION.ARMED + : LANE_MODE_PRESENTATION.LANELESS; + } else if (planned === true) { + presentation = LANE_MODE_PRESENTATION.ACTIVE; + } else if (requested === true) { + presentation = LANE_MODE_PRESENTATION.ARMED; + } else if (planned === false) { + presentation = LANE_MODE_PRESENTATION.LANELESS; + } + + return Object.freeze({ + requested, + planned, + controlled, + pathActive: pathActive === true, + presentation, + }); +} + +export function resolveLaneModeState(state = {}) { + const useLaneLineSpeed = optionalNumber(state.carState?.useLaneLineSpeed); + return resolveLaneModeFields({ + requested: useLaneLineSpeed == null ? null : useLaneLineSpeed > 0, + planned: state.lateralPlan?.useLaneLines, + controlled: state.controlsState?.activeLaneLine, + }); +} + +export const DriveVisionLaneMode = Object.freeze({ + PRESENTATION: LANE_MODE_PRESENTATION, + resolveFields: resolveLaneModeFields, + resolveState: resolveLaneModeState, +}); diff --git a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/road_overlay_policy.js b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/road_overlay_policy.js index 8968ea0c4f..b3b104997e 100644 --- a/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/road_overlay_policy.js +++ b/openpilot/selfdrive/carrot/web/src/features/drive/contents/vision/road_overlay_policy.js @@ -19,7 +19,10 @@ export function createRoadOverlayPolicy(options = {}) { if (!hudModel?.isLaneMode || !hudModel?.isLongActive) return null; function resolve(overlayState, hudState, params = {}) { - const laneMode = hudModel.isLaneMode(hudState); + // Geometry follows the actual planner result, never the requested mode + // alone. The HUD icon separately acknowledges requested/fallback state. + const laneModeState = hudModel.resolveLaneModeState?.(hudState); + const laneMode = laneModeState?.pathActive ?? hudModel.isLaneMode(hudState); const model = overlayState?.modelV2 || null; const lateralPlan = overlayState?.lateralPlan || null; const lanePath = lateralPlan?.position; diff --git a/openpilot/selfdrive/carrot/web/src/features/settings/dom_renderer.js b/openpilot/selfdrive/carrot/web/src/features/settings/dom_renderer.js index 92ea6c4aaf..0fa7d992c8 100644 --- a/openpilot/selfdrive/carrot/web/src/features/settings/dom_renderer.js +++ b/openpilot/selfdrive/carrot/web/src/features/settings/dom_renderer.js @@ -48,7 +48,7 @@ export function createSettingsGroupRenderPlan(options = {}) { group, label, count, - title: count === null ? label : `${label} (${count})`, + title: label, favorite: group === ids.favoritesGroup, profile: isProfileGroup(group, ids.profileGroupPrefix || ""), active: group === currentGroup, diff --git a/openpilot/selfdrive/carrot/web/src/features/settings/risk.js b/openpilot/selfdrive/carrot/web/src/features/settings/risk.js index 6c47e4d2ca..146af2cda0 100644 --- a/openpilot/selfdrive/carrot/web/src/features/settings/risk.js +++ b/openpilot/selfdrive/carrot/web/src/features/settings/risk.js @@ -16,7 +16,7 @@ const RISK_LABEL_KEYS = Object.freeze({ }); const RISK_TONES = Object.freeze({ - high: "danger", + high: "warning", medium: "warning", }); diff --git a/openpilot/selfdrive/carrot/web/src/features/settings/styles/device_tab.css b/openpilot/selfdrive/carrot/web/src/features/settings/styles/device_tab.css index b3e1bed56b..9528b0f3e7 100644 --- a/openpilot/selfdrive/carrot/web/src/features/settings/styles/device_tab.css +++ b/openpilot/selfdrive/carrot/web/src/features/settings/styles/device_tab.css @@ -94,8 +94,15 @@ white-space: nowrap; } +.page--setting #deviceItems .device-setting--ssh .settingTop { + display: grid; + grid-template-columns: minmax(88px, max-content) minmax(0, 1fr); + gap: var(--sp-md); + align-items: start; +} + .page--setting #deviceItems .device-ssh-control { - width: min(68vw, 720px); + width: 100%; min-width: 0; } @@ -188,8 +195,12 @@ } @media (aspect-ratio < 13/10) and (max-width: 639px), (aspect-ratio < 13/10) and (max-height: 649px) { + .page--setting #deviceItems .device-setting--ssh .settingTop { + grid-template-columns: minmax(0, 1fr); + } + .page--setting #deviceItems .device-ssh-control { - grid-column: 1 / -1; + grid-column: 1; width: 100%; min-width: 0; } diff --git a/openpilot/selfdrive/carrot/web/src/features/settings/styles/item_chrome.css b/openpilot/selfdrive/carrot/web/src/features/settings/styles/item_chrome.css index 78270f4055..d2d5cd358f 100644 --- a/openpilot/selfdrive/carrot/web/src/features/settings/styles/item_chrome.css +++ b/openpilot/selfdrive/carrot/web/src/features/settings/styles/item_chrome.css @@ -24,8 +24,15 @@ } .page--setting #settingScreenItems .setting-risk-badge { + --chip-font-size: var(--fs-label-sm); + --chip-min-height: var(--control-switch-height); + --chip-padding-block: 0; + --chip-padding-inline: var(--sp-sm); flex: 0 0 auto; align-self: center; + justify-content: center; + min-width: var(--control-switch-width); + box-sizing: border-box; } .page--setting #settingScreenItems .setting-favorite-mark { diff --git a/openpilot/selfdrive/carrot/web/src/features/tools/index.js b/openpilot/selfdrive/carrot/web/src/features/tools/index.js index 46f4a632b4..ba3446df5f 100644 --- a/openpilot/selfdrive/carrot/web/src/features/tools/index.js +++ b/openpilot/selfdrive/carrot/web/src/features/tools/index.js @@ -1,6 +1,7 @@ import "./web_settings/schema.js"; import "./web_settings/state.js"; import "./web_settings/components.js"; +import "./web_settings/param_selects.js"; import "./web_settings/render.js"; import "./web_settings/drive_layout.js"; import "./web_settings/controller.js"; diff --git a/openpilot/selfdrive/carrot/web/src/features/tools/styles/base.css b/openpilot/selfdrive/carrot/web/src/features/tools/styles/base.css index 703bd68d02..d8d64ca104 100644 --- a/openpilot/selfdrive/carrot/web/src/features/tools/styles/base.css +++ b/openpilot/selfdrive/carrot/web/src/features/tools/styles/base.css @@ -33,6 +33,10 @@ --tools-log-scroll-gap: 6px; --tools-detail-scroll-gap: 8px; --tools-scrollbar-content-gap: 8px; + --tools-content-end-gap: max( + var(--tools-page-gutter-block), + env(safe-area-inset-bottom, 0px) + ); display: flex; flex-direction: column; position: relative; @@ -240,11 +244,15 @@ overflow-wrap: anywhere; } -.web-settings-group__body { +.web-settings-group__body, +.web-settings-list { display: grid; grid-auto-rows: max-content; gap: var(--sp-sm); align-content: start; +} + +.web-settings-group__body { flex: 1 1 auto; min-height: 0; max-height: none; diff --git a/openpilot/selfdrive/carrot/web/src/features/tools/styles/main.css b/openpilot/selfdrive/carrot/web/src/features/tools/styles/main.css index 950d254fc7..c58c949a03 100644 --- a/openpilot/selfdrive/carrot/web/src/features/tools/styles/main.css +++ b/openpilot/selfdrive/carrot/web/src/features/tools/styles/main.css @@ -125,7 +125,8 @@ overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; - padding: 2px var(--tools-scrollbar-content-gap) 0 0; + padding: 2px var(--tools-scrollbar-content-gap) var(--tools-content-end-gap) 0; + scroll-padding-bottom: var(--tools-content-end-gap); } .tools-primary-actions { @@ -907,8 +908,8 @@ grid-row: 3; min-height: 0; overflow-y: auto; - padding-bottom: 0; - scroll-padding-bottom: 0; + padding-bottom: var(--tools-content-end-gap); + scroll-padding-bottom: var(--tools-content-end-gap); } .page--tools > .tools-console-dock { diff --git a/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/components.js b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/components.js index 836777a95c..cfa901e52f 100644 --- a/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/components.js +++ b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/components.js @@ -20,9 +20,12 @@ globalThis.WebSettingsComponents = (() => { return components.get(String(name || "")) || null; } - function isVisible(name, fields) { + function isVisible(name, fields, item = null) { const component = definition(name); if (!component) return false; + if (typeof component.isVisible === "function") { + return component.isVisible(item, fields) === true; + } return (component.settingKeys || []).every((key) => Boolean(fields[key])); } diff --git a/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/param_selects.js b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/param_selects.js new file mode 100644 index 0000000000..3c21b66011 --- /dev/null +++ b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/param_selects.js @@ -0,0 +1,129 @@ +"use strict"; + +const COMPONENT_NAME = "param-selects"; +const PARAM_SOURCE = "web_ui"; + +function normalizedFields(item) { + const fields = Array.isArray(item?.fields) ? item.fields : []; + return fields.filter((field) => ( + typeof field?.id === "string" + && field.id + && typeof field?.paramName === "string" + && field.paramName + && typeof field?.titleKey === "string" + && field.titleKey + && Array.isArray(field?.options) + && field.options.length > 0 + && field.options.every((option) => ( + typeof option?.value === "string" + && typeof option?.labelKey === "string" + && option.labelKey + )) + )); +} + +function text(key) { + return getUIText(key) || String(key || ""); +} + +function renderField(field) { + const title = text(field.titleKey); + const desc = field.descKey ? text(field.descKey) : ""; + const options = field.options.map((option) => ` + + `).join(""); + return ` + `; +} + +function showError(error) { + if (typeof showAppToast !== "function") return; + showAppToast(error?.message || String(error), { tone: "error" }); +} + +async function readParamValues(names) { + if (typeof globalThis.bulkGet !== "function") { + throw new Error(text("web_navi_map_settings_unavailable")); + } + return globalThis.bulkGet(names); +} + +async function writeParamValue(name, value) { + if (typeof globalThis.setParam !== "function") { + throw new Error(text("web_navi_map_settings_unavailable")); + } + return globalThis.setParam(name, value, { source: PARAM_SOURCE }); +} + +globalThis.WebSettingsComponents.register(COMPONENT_NAME, { + isVisible(item) { + return normalizedFields(item).length > 0; + }, + render(item) { + const fields = normalizedFields(item); + return ` +
+ ${fields.map(renderField).join("")} +
`; + }, + async bind(root = document) { + const containers = [...root.querySelectorAll("[data-web-param-selects]")]; + for (const container of containers) { + if (container.dataset.bound === "1") continue; + container.dataset.bound = "1"; + const rows = [...container.querySelectorAll("[data-web-param-setting]")]; + const selects = rows + .map((row) => row.querySelector("select[data-param-name]")) + .filter(Boolean); + const names = [...new Set(selects.map((select) => select.dataset.paramName).filter(Boolean))]; + + try { + const values = await readParamValues(names); + selects.forEach((select) => { + const current = String(values?.[select.dataset.paramName] ?? ""); + select.value = [...select.options].some((option) => option.value === current) ? current : ""; + select.disabled = false; + }); + } catch (error) { + showError(error); + continue; + } + + selects.forEach((select) => { + select.addEventListener("change", async () => { + const previous = select.dataset.committedValue ?? select.value; + const next = select.value; + select.disabled = true; + try { + await writeParamValue(select.dataset.paramName, next); + select.dataset.committedValue = next; + } catch (error) { + select.value = previous; + showError(error); + } finally { + select.disabled = false; + } + }); + select.dataset.committedValue = select.value; + }); + } + }, +}); + +export { COMPONENT_NAME, normalizedFields }; diff --git a/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/render.js b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/render.js index f300cd07e9..43953a3471 100644 --- a/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/render.js +++ b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/render.js @@ -30,7 +30,7 @@ function getWebSettingsField(item) { function isWebSettingsItemVisible(item) { if (item?.component) { - return Boolean(globalThis.WebSettingsComponents?.isVisible?.(item.component, WEB_SPEC_BY_KEY)); + return Boolean(globalThis.WebSettingsComponents?.isVisible?.(item.component, WEB_SPEC_BY_KEY, item)); } return Boolean(getWebSettingsField(item)); } diff --git a/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/schema.js b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/schema.js index 9b80a55842..f90b724c3b 100644 --- a/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/schema.js +++ b/openpilot/selfdrive/carrot/web/src/features/tools/web_settings/schema.js @@ -74,10 +74,34 @@ const WEB_SETTINGS_GROUPS = [ { id: "navigation", labelKey: "web_settings_navigation", - // Carrot Navi is always enabled; retain its group as a stable home for - // navigation-specific settings added here later. - keepWhenEmpty: true, - items: [], + items: [ + { + id: "carrot_navi_map_appearance", + component: "param-selects", + fields: [ + { + id: "carrot_navi_map_type", + paramName: "ClusterNaviMapType", + titleKey: "web_navi_map_type", + descKey: "web_navi_map_type_desc", + options: [ + { value: "0", labelKey: "web_navi_map_type_normal" }, + { value: "1", labelKey: "web_navi_map_type_satellite" }, + ], + }, + { + id: "carrot_navi_map_theme", + paramName: "ClusterNaviMapTheme", + titleKey: "web_navi_map_theme", + descKey: "web_navi_map_theme_desc", + options: [ + { value: "1", labelKey: "web_navi_map_theme_dark" }, + { value: "2", labelKey: "web_navi_map_theme_light" }, + ], + }, + ], + }, + ], }, { id: "upload", diff --git a/openpilot/selfdrive/carrot/web/src/ui/primitives/controls.css b/openpilot/selfdrive/carrot/web/src/ui/primitives/controls.css index f71ab87c14..171e25392c 100644 --- a/openpilot/selfdrive/carrot/web/src/ui/primitives/controls.css +++ b/openpilot/selfdrive/carrot/web/src/ui/primitives/controls.css @@ -1,6 +1,13 @@ +:root { + --control-switch-width: 52px; + --control-switch-height: 32px; + --control-switch-sm-width: 44px; + --control-switch-sm-height: 28px; +} + .c-switch { - --switch-w: 52px; - --switch-h: 32px; + --switch-w: var(--control-switch-width); + --switch-h: var(--control-switch-height); position: relative; display: inline-flex; flex: 0 0 var(--switch-w); @@ -11,8 +18,8 @@ } .c-switch--sm { - --switch-w: 44px; - --switch-h: 28px; + --switch-w: var(--control-switch-sm-width); + --switch-h: var(--control-switch-sm-height); } .c-switch__input { diff --git a/openpilot/selfdrive/carrot/web/tests/hud_data_bridge.test.mjs b/openpilot/selfdrive/carrot/web/tests/hud_data_bridge.test.mjs index 156ed4d8b8..9e2a4eac24 100644 --- a/openpilot/selfdrive/carrot/web/tests/hud_data_bridge.test.mjs +++ b/openpilot/selfdrive/carrot/web/tests/hud_data_bridge.test.mjs @@ -7,6 +7,7 @@ import { deriveVehicleHudPayload, deriveCruiseOverride, isCruiseDisplayVisible, + resolveLaneModeState, resolveCruiseKph, resolveTrafficState, vehicleHudSignature, @@ -23,13 +24,42 @@ test("EV telltale requires both valid and active", () => { assert.equal(deriveVehicleHudPayload({}).evActive, false); }); -// Cluster parity: controlsState.activeLaneLine drives the green lane wings; unknown stays null. -test("active lane line is tri-state (true/false/null)", () => { - assert.equal(deriveVehicleHudPayload({ controlsState: { activeLaneLine: true } }).activeLaneLine, true); - assert.equal(deriveVehicleHudPayload({ controlsState: { activeLaneLine: false } }).activeLaneLine, false); +test("lane mode separates user request, planner result and final control", () => { + assert.deepEqual(resolveLaneModeState({ + carState: { useLaneLineSpeed: 50 }, + lateralPlan: { useLaneLines: false }, + controlsState: { activeLaneLine: false }, + }), { + requested: true, + planned: false, + controlled: false, + pathActive: false, + presentation: "armed", + }); + assert.deepEqual(resolveLaneModeState({ + carState: { useLaneLineSpeed: 50 }, + lateralPlan: { useLaneLines: true }, + controlsState: { activeLaneLine: true }, + }), { + requested: true, + planned: true, + controlled: true, + pathActive: true, + presentation: "active", + }); assert.equal(deriveVehicleHudPayload({}).activeLaneLine, null); }); +test("manual laneless request wins presentation while stale services settle", () => { + const laneMode = resolveLaneModeState({ + carState: { useLaneLineSpeed: 0 }, + lateralPlan: { useLaneLines: true }, + controlsState: { activeLaneLine: true }, + }); + assert.equal(laneMode.presentation, "laneless"); + assert.equal(laneMode.pathActive, true, "road geometry keeps following the current planner sample"); +}); + test("traffic light keeps an active planner state when carrotMan carries zero", () => { assert.equal(resolveTrafficState({ longitudinalPlan: { trafficState: 1 }, @@ -209,6 +239,8 @@ test("final presentation payload retains cluster-only fields", () => { { evActive: true, activeLaneLine: false, + laneModeRequested: true, + laneModePlanned: false, cruiseOverride: { kph: 77, label: "cam:n", mode: 2 }, }, ); @@ -217,6 +249,9 @@ test("final presentation payload retains cluster-only fields", () => { gear: "D", evActive: true, activeLaneLine: false, + laneModeRequested: true, + laneModePlanned: false, + laneModePresentation: "armed", cruiseOverride: { kph: 77, label: "cam:n", mode: 2 }, trafficState: 0, drivingMode: null, @@ -227,6 +262,8 @@ test("cluster-only changes produce distinct presentation signatures", () => { const base = { evActive: false, activeLaneLine: null, cruiseOverride: null }; assert.notEqual(vehicleHudSignature(base), vehicleHudSignature({ ...base, evActive: true })); assert.notEqual(vehicleHudSignature(base), vehicleHudSignature({ ...base, activeLaneLine: false })); + assert.notEqual(vehicleHudSignature(base), vehicleHudSignature({ ...base, laneModeRequested: true })); + assert.notEqual(vehicleHudSignature(base), vehicleHudSignature({ ...base, laneModePlanned: true })); assert.notEqual( vehicleHudSignature(base), vehicleHudSignature({ ...base, cruiseOverride: { kph: 77, label: "cam:n", mode: 2 } }), diff --git a/openpilot/selfdrive/carrot/web/tests/hud_debug.test.mjs b/openpilot/selfdrive/carrot/web/tests/hud_debug.test.mjs index 3d14dc7cb7..0a05faae5e 100644 --- a/openpilot/selfdrive/carrot/web/tests/hud_debug.test.mjs +++ b/openpilot/selfdrive/carrot/web/tests/hud_debug.test.mjs @@ -34,8 +34,10 @@ test("HUD debug snapshot stays compact and separates source, derivation and disp vCruiseCluster: 88, evModeValid: true, evModeActive: true, + useLaneLineSpeed: 50, }, controlsState: { enabled: true, vCruiseCluster: 87, activeLaneLine: true }, + lateralPlan: { useLaneLines: true }, longitudinalPlan: { trafficState: 2 }, carControl: { latActive: true }, carrotMan: { @@ -87,7 +89,9 @@ test("HUD debug snapshot stays compact and separates source, derivation and disp assert.equal(report.replay.currentTime, 12.3); assert.deepEqual(report.replay.services, ["carState", "carrotMan", "controlsState"]); assert.equal(report.source.carState.evModeActive, true); + assert.equal(report.source.carState.useLaneLineSpeed, 50); assert.equal(report.source.controlsState.vCruiseCluster, 87); + assert.equal(report.source.lateralPlan.useLaneLines, true); assert.equal(report.source.carControl.latActive, true); assert.equal(report.source.carrotMan.xSpdDist, 420); assert.equal(report.source.carrotMan.trafficState, 0); diff --git a/openpilot/selfdrive/carrot/web/tests/hud_render.test.mjs b/openpilot/selfdrive/carrot/web/tests/hud_render.test.mjs index 48f4e696d5..aac3ddfb4e 100644 --- a/openpilot/selfdrive/carrot/web/tests/hud_render.test.mjs +++ b/openpilot/selfdrive/carrot/web/tests/hud_render.test.mjs @@ -1,4 +1,5 @@ import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; import test from "node:test"; import { createSpeedPanel } from "../src/features/drive/contents/vision/hud/widgets/speed_panel.js"; @@ -11,6 +12,11 @@ import { } from "../src/features/drive/contents/vision/hud/data_bridge.js"; import { COLORS, DRIVE_MODE_COLORS } from "../src/features/drive/contents/vision/hud/tokens.js"; +const hudStyleSource = readFileSync( + new URL("../src/features/drive/contents/vision/hud/style.js", import.meta.url), + "utf8", +); + /* Minimal DOM stub — enough for the SVG/DOM helpers the widgets use. * The widgets only touch: create(NS), setAttribute, className, textContent, * classList.toggle, style.*, append(Child), toggleAttribute. */ @@ -103,6 +109,7 @@ function renderFromCereal(state) { overrideLabel: findByClass(panel.el, "chud-t-override-label"), speed: findByClass(panel.el, "chud-t-speed"), lane: findByClass(lfa.el, "chud-lfa-lane"), + lfa: lfa.el, }; } @@ -133,7 +140,8 @@ test("live: EV + green lane wings + orange decel override all render", () => { assert.equal(r.speed.textContent, "53"); assert.ok(isVisible(r.ev), "EV telltale visible"); assert.equal(r.ev.textContent, "EV"); - assert.ok(isVisible(r.lane), "green lane wings visible"); + assert.ok(r.lfa.classList.contains("has-lane"), "lane wings visible"); + assert.ok(r.lfa.classList.contains("is-lane-active"), "lane wings active"); assert.ok(isVisible(r.overrideSpeed), "override visible"); assert.equal(r.overrideSpeed.textContent, "77"); assert.equal(r.overrideLabel.textContent, "cam:n"); @@ -149,7 +157,7 @@ test("replay: eco (green) override renders; EV and lane correctly hidden", () => }); assert.equal(r.speed.textContent, "60"); assert.ok(!isVisible(r.ev), "EV hidden when not in EV mode"); - assert.ok(!isVisible(r.lane), "lane wings hidden when lane mode off"); + assert.ok(!r.lfa.classList.contains("has-lane"), "lane wings hidden when lane mode off"); assert.ok(isVisible(r.overrideSpeed), "eco override visible"); assert.equal(r.overrideSpeed.textContent, "95"); assert.equal(r.overrideLabel.textContent, "eco"); @@ -175,7 +183,32 @@ test("pre-drive idle: EV, override and lane wings are all hidden", () => { const r = renderFromCereal({}); assert.ok(!isVisible(r.ev), "EV hidden"); assert.ok(!isVisible(r.overrideSpeed), "override hidden"); - assert.ok(!isVisible(r.lane), "lane wings hidden"); + assert.ok(!r.lfa.classList.contains("has-lane"), "lane wings hidden"); +}); + +test("manual lane selection is acknowledged while automatic fallback stays distinct", () => { + const armed = renderFromCereal({ + carState: { useLaneLineSpeed: 50 }, + lateralPlan: { useLaneLines: false }, + controlsState: { activeLaneLine: false }, + }); + assert.equal(armed.data.laneModePresentation, "armed"); + assert.ok(armed.lfa.classList.contains("has-lane")); + assert.ok(armed.lfa.classList.contains("is-lane-armed")); + assert.ok(!armed.lfa.classList.contains("is-lane-active")); + + const laneless = renderFromCereal({ + carState: { useLaneLineSpeed: 0 }, + lateralPlan: { useLaneLines: true }, + controlsState: { activeLaneLine: true }, + }); + assert.equal(laneless.data.laneModePresentation, "laneless"); + assert.ok(!laneless.lfa.classList.contains("has-lane")); +}); + +test("lane wing state never changes the LFA flex footprint", () => { + assert.match(hudStyleSource, /\.chud-lfa\{[^}]*width:var\(--chud-lfa-size\)[^}]*flex:0 0 auto/s); + assert.doesNotMatch(hudStyleSource, /\.chud-lfa\.has-lane\{[^}]*padding/s); }); // mph 표시(비미터)에서도 오버라이드 속도가 변환되는지. diff --git a/openpilot/selfdrive/carrot/web/tests/lane_mode.test.mjs b/openpilot/selfdrive/carrot/web/tests/lane_mode.test.mjs new file mode 100644 index 0000000000..e7b6f407ac --- /dev/null +++ b/openpilot/selfdrive/carrot/web/tests/lane_mode.test.mjs @@ -0,0 +1,70 @@ +import assert from "node:assert/strict"; +import test from "node:test"; + +import { DriveVisionHudModel } from "../src/features/drive/contents/vision/hud_model.js"; +import { resolveLaneModeState } from "../src/features/drive/contents/vision/lane_mode.js"; +import { createRoadOverlayPolicy } from "../src/features/drive/contents/vision/road_overlay_policy.js"; + +test("older recordings fall back to the available final-control state", () => { + assert.deepEqual(resolveLaneModeState({ + controlsState: { activeLaneLine: true }, + }), { + requested: null, + planned: null, + controlled: true, + pathActive: true, + presentation: "active", + }); + assert.equal(resolveLaneModeState({ + controlsState: { activeLaneLine: false }, + }).presentation, "laneless"); +}); + +test("road overlay mode follows planner output rather than request alone", () => { + assert.equal(DriveVisionHudModel.isLaneMode({ + carState: { useLaneLineSpeed: 50 }, + lateralPlan: { useLaneLines: false }, + controlsState: { activeLaneLine: false }, + }), false); + assert.equal(DriveVisionHudModel.isLaneMode({ + carState: { useLaneLineSpeed: 50 }, + lateralPlan: { useLaneLines: true }, + controlsState: { activeLaneLine: false }, + }), true); +}); + +test("road overlay selects matching geometry and style without mixing user intent", () => { + const policy = createRoadOverlayPolicy(); + const modelPath = { x: [0, 10, 20], y: [0, 0, 0] }; + const lanePath = { x: [0, 10, 20], y: [0, 0.1, 0.2] }; + const overlayState = { + modelV2: { position: modelPath }, + lateralPlan: { position: lanePath, useLaneLines: false }, + carControl: { longActive: true }, + }; + const params = { + ShowPathMode: 1, + ShowPathColor: 11, + ShowPathModeLane: 2, + ShowPathColorLane: 12, + }; + + const requestedOnly = policy.resolve(overlayState, { + carState: { useLaneLineSpeed: 50 }, + lateralPlan: { useLaneLines: false }, + controlsState: { activeLaneLine: false }, + }, params); + assert.equal(requestedOnly.selectedPath.pathSource, "modelV2"); + assert.equal(requestedOnly.pathStyle.mode, 1); + assert.equal(requestedOnly.pathStyle.laneMode, false); + + overlayState.lateralPlan.useLaneLines = true; + const planned = policy.resolve(overlayState, { + carState: { useLaneLineSpeed: 50 }, + lateralPlan: { useLaneLines: true }, + controlsState: { activeLaneLine: false }, + }, params); + assert.equal(planned.selectedPath.pathSource, "lateralPlan"); + assert.equal(planned.pathStyle.mode, 2); + assert.equal(planned.pathStyle.laneMode, true); +}); diff --git a/openpilot/selfdrive/carrot/web/tests/settings_render_plan.test.mjs b/openpilot/selfdrive/carrot/web/tests/settings_render_plan.test.mjs index a3df03f398..695f79472c 100644 --- a/openpilot/selfdrive/carrot/web/tests/settings_render_plan.test.mjs +++ b/openpilot/selfdrive/carrot/web/tests/settings_render_plan.test.mjs @@ -19,7 +19,7 @@ function groupPlan(groups, currentGroup = "") { }); } -test("plain groups become group entries carrying label, count and active state", () => { +test("plain groups retain internal counts without displaying them in the title", () => { const plan = groupPlan([{ group: "SPEED", count: 3 }], "SPEED"); const [entry] = plan.entries; @@ -27,7 +27,7 @@ test("plain groups become group entries carrying label, count and active state", assert.equal(entry.group, "SPEED"); assert.equal(entry.label, "label:SPEED"); assert.equal(entry.count, 3); - assert.equal(entry.title, "label:SPEED (3)"); + assert.equal(entry.title, "label:SPEED"); assert.equal(entry.active, true); assert.equal(entry.favorite, false); assert.equal(entry.profile, false); diff --git a/openpilot/selfdrive/carrot/web/tests/settings_risk.test.mjs b/openpilot/selfdrive/carrot/web/tests/settings_risk.test.mjs index 7a813664cf..79382de33b 100644 --- a/openpilot/selfdrive/carrot/web/tests/settings_risk.test.mjs +++ b/openpilot/selfdrive/carrot/web/tests/settings_risk.test.mjs @@ -29,7 +29,7 @@ test("a risky parameter renders a level-tagged badge", () => { escape, text: (key, fallback) => (key === "setting_risk_high" ? "주의" : fallback), }); - assert.match(html, /chip chip--compact chip--danger/); + assert.match(html, /chip chip--compact chip--warning/); assert.match(html, /setting-risk-badge--high/); assert.match(html, /data-risk-level="high"/); assert.match(html, />주의