@wcstack/state 1.22.5 → 1.22.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.min.js","sources":["../../src/config.ts","../../src/bindings/initializeBindingPromiseByNode.ts","../../src/define.ts","../../src/address/PathInfo.ts","../../src/getCustomElement.ts","../../src/platform/customElementRegistry.ts","../../src/protocol/wcBindableReader.ts","../../src/raiseError.ts","../../src/bindTextParser/expandSpread.ts","../../src/structural/resolveNodePath.ts","../../src/bindings/getBindingsByNode.ts","../../src/structural/define.ts","../../src/filters/errorMessages.ts","../../src/filters/builtinFilters.ts","../../src/bindTextParser/parseFilters.ts","../../src/bindTextParser/parseFilterArgs.ts","../../src/bindTextParser/utils.ts","../../src/bindTextParser/parsePropPart.ts","../../src/bindTextParser/parseStatePart.ts","../../src/bindTextParser/parseBindTextsForElement.ts","../../src/bindings/parseCommentNode.ts","../../src/structural/fragmentInfoByUUID.ts","../../src/bindings/getParseBindTextResults.ts","../../src/bindTextParser/parseBindTextForEmbeddedNode.ts","../../src/bindings/getSubscriberNodes.ts","../../src/bindings/collectNodesAndBindingInfos.ts","../../src/bindings/getBindingInfos.ts","../../src/list/loopContextByNode.ts","../../src/list/lastListValueByAbsoluteStateAddress.ts","../../src/proxy/symbols.ts","../../src/address/AbsolutePathInfo.ts","../../src/address/AbsoluteStateAddress.ts","../../src/apply/rootNodeByFragment.ts","../../src/address/calcWildcardLen.ts","../../src/list/getListIndexByBindingInfo.ts","../../src/binding/getAbsoluteStateAddressByBinding.ts","../../src/devtools/sink.ts","../../src/binding/getBindingSetByAbsoluteStateAddress.ts","../../src/address/StateAddress.ts","../../src/binding/getStateAddressByBindingInfo.ts","../../src/event/handlerBindingRegistry.ts","../../src/event/checkboxHandler.ts","../../src/token/Token.ts","../../src/event/EventToken.ts","../../src/event/eventTokenRegistry.ts","../../src/event/eventTokenHandler.ts","../../src/command/CommandToken.ts","../../src/event/handler.ts","../../src/event/radioHandler.ts","../../src/event/isPossibleTwoWay.ts","../../src/propagation/propagation.ts","../../src/event/twowayHandler.ts","../../src/bindings/observerSkip.ts","../../src/bindings/DefinitionCoordinator.ts","../../src/bindings/initialSync.ts","../../src/bindings/BindingSession.ts","../../src/bindings/replaceToReplaceNode.ts","../../src/webComponent/completeWebComponent.ts","../../src/apply/getFilteredValue.ts","../../src/apply/applyChangeToCheckbox.ts","../../src/createEmptyArray.ts","../../src/apply/applyChangeToCommand.ts","../../src/bindings/indexBindingsByContent.ts","../../src/polyfills.ts","../../src/getUUID.ts","../../src/list/createListIndex.ts","../../src/list/listIndexesByList.ts","../../src/list/createListDiff.ts","../../src/list/stableListOrder.ts","../../src/bindings/bindingsByContent.ts","../../src/bindings/bindingSessionByContent.ts","../../src/bindings/nodesByContent.ts","../../src/bindings/bindLoopContextToContent.ts","../../src/structural/activateContent.ts","../../src/structural/contentsByNode.ts","../../src/createEmptySet.ts","../../src/structural/createContent.ts","../../src/bindings/initializeBindings.ts","../../src/structural/rowPlan.ts","../../src/apply/applyChangeToFor.ts","../../src/apply/applyChangeToIf.ts","../../src/apply/ssrPropertyStore.ts","../../src/apply/applyChangeToProperty.ts","../../src/event/getInputAttributeMirror.ts","../../src/apply/applyChangeToText.ts","../../src/apply/applyChangeToWebComponent.ts","../../src/apply/getValue.ts","../../src/list/getIndexValueByLoopContext.ts","../../src/apply/scheduleDeferredApply.ts","../../src/apply/applyChange.ts","../../src/apply/applyChangeToClass.ts","../../src/apply/applyChangeToAttribute.ts","../../src/apply/applyChangeToStyle.ts","../../src/apply/applyChangeToRadio.ts","../../src/apply/applyChangeFromBindings.ts","../../src/mustache/convertMustacheToComments.ts","../../src/structural/createNotFilter.ts","../../src/structural/expandShorthandPaths.ts","../../src/structural/getNodePath.ts","../../src/structural/getFragmentNodeInfos.ts","../../src/structural/optimizeFragment.ts","../../src/structural/collectStructuralFragments.ts","../../src/waitForStateInitialize.ts","../../src/buildBindings.ts","../../src/version.ts","../../src/platform/HTMLElementBase.ts","../../src/components/Ssr.ts","../../src/hydrateBindings.ts","../../src/stateElementByName.ts","../../src/updater/updater.ts","../../src/devtools/types.ts","../../src/devtools/bridge.ts","../../src/stateLoader/loadFromInnerScript.ts","../../src/stateLoader/loadFromScriptFile.ts","../../src/list/loopContext.ts","../../src/command/commandTokenRegistry.ts","../../src/command/commandNamespace.ts","../../src/stream/lastNotified.ts","../../src/stream/activeStateElements.ts","../../src/stream/streamRegistry.ts","../../src/stream/processStreamsDeclaration.ts","../../src/stream/streamNamespace.ts","../../src/stream/argsTrace.ts","../../src/stream/consumeSource.ts","../../src/stream/streamRuntime.ts","../../src/dcc/dccPropertyFactories.ts","../../src/address/ResolvedAddress.ts","../../src/cache/cacheEntryByAbsoluteStateAddress.ts","../../src/proxy/methods/getByAddress.ts","../../src/proxy/methods/checkDependency.ts","../../src/proxy/methods/getContextListIndex.ts","../../src/proxy/methods/hasByAddress.ts","../../src/proxy/methods/swapInfo.ts","../../src/dependency/walkDependency.ts","../../src/proxy/methods/setByAddress.ts","../../src/proxy/apis/resolve.ts","../../src/proxy/apis/getAll.ts","../../src/proxy/methods/getListIndex.ts","../../src/proxy/methods/setLoopContext.ts","../../src/proxy/traps/get.ts","../../src/proxy/apis/postUpdate.ts","../../src/proxy/apis/trackDependency.ts","../../src/proxy/apis/untrackDependency.ts","../../src/proxy/apis/connectedCallback.ts","../../src/proxy/apis/disconnectedCallback.ts","../../src/proxy/apis/updatedCallback.ts","../../src/proxy/StateHandler.ts","../../src/proxy/traps/set.ts","../../src/webComponent/lastValueByAbsoluteStateAddress.ts","../../src/webComponent/stateElementByWebComponent.ts","../../src/webComponent/MappingRule.ts","../../src/webComponent/meltFrozenObject.ts","../../src/webComponent/innerState.ts","../../src/webComponent/outerState.ts","../../src/webComponent/plainOuterState.ts","../../src/webComponent/bindWebComponent.ts","../../src/components/State.ts","../../src/command/processCommandTokensDeclaration.ts","../../src/event/processEventTokensDeclaration.ts","../../src/event/processOnDeclaration.ts","../../src/stateLoader/loadFromScriptJson.ts","../../src/stateLoader/loadFromJsonFile.ts","../../src/dcc/defineDCC.ts","../../src/dcc/wcBindable.ts","../../src/registerComponents.ts","../../src/bootstrapState.ts","../../src/defineState.ts","../../src/filters/filterMeta.ts","../../src/manifest.ts","../../src/contract/contractAnalyzer.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\nexport function inSsr(): boolean {\n // キャッシュしない: SSR モードはプロセスの属性ではなく「現在の document」の\n // 属性。@wcstack/server はグローバル document を差し替えてサーバーレンダリング\n // した後、同一プロセスでクライアント側ハイドレーションが走る(SSR→hydrate の\n // e2e が該当)。サーバーフェーズの判定をキャッシュするとクライアントフェーズが\n // SSR モード扱いになり、hydrateBindings の代わりに buildBindings が選ばれて\n // connectedCallbackPromise が永久に未解決になる。\n const html = document.documentElement;\n return html ? html.hasAttribute('data-wcs-server') : false;\n}\n\ninterface IInternalConfig {\n bindAttributeName: string;\n commentTextPrefix: string;\n commentForPrefix: string;\n commentIfPrefix: string;\n commentElseIfPrefix: string;\n commentElsePrefix: string;\n tagNames: {\n state: string;\n ssr: string;\n };\n locale: string;\n debug: boolean;\n enableMustache: boolean;\n enableDirectionalInitialSync: boolean;\n enablePropagationContext: boolean;\n enableContractAnalyzer: boolean;\n sameValueGuard: boolean;\n}\n\nconst _config: IInternalConfig = {\n bindAttributeName: 'data-wcs',\n commentTextPrefix: 'wcs-text',\n commentForPrefix: 'wcs-for',\n commentIfPrefix: 'wcs-if',\n commentElseIfPrefix: 'wcs-elseif',\n commentElsePrefix: 'wcs-else',\n tagNames: {\n state: 'wcs-state',\n ssr: 'wcs-ssr',\n },\n locale: 'en',\n debug: false,\n enableMustache: true,\n enableDirectionalInitialSync: true,\n enablePropagationContext: true,\n // Phase 5b の dev-time contract analyzer は意図的に explicit opt-in(既定 off)。\n // wcstack は buildless / zero-config で NODE_ENV 相当の確実な dev/prod 判定が無く、\n // hostname や minification の heuristic で auto-ON すると誤検出で prod にコストを\n // 乗せうるため、dev 既定 ON は採らない。利用側が setConfig で明示有効化する\n // (docs/architecture-hardening/10-defaulting-rollout-status.md §C)。\n enableContractAnalyzer: false,\n sameValueGuard: true,\n};\n\n// backward compatible export (read-only usage)\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n return config;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n if (typeof partialConfig.bindAttributeName === \"string\") {\n _config.bindAttributeName = partialConfig.bindAttributeName;\n }\n if (typeof partialConfig.commentTextPrefix === \"string\") {\n _config.commentTextPrefix = partialConfig.commentTextPrefix;\n }\n if (typeof partialConfig.commentForPrefix === \"string\") {\n _config.commentForPrefix = partialConfig.commentForPrefix;\n }\n if (typeof partialConfig.commentIfPrefix === \"string\") {\n _config.commentIfPrefix = partialConfig.commentIfPrefix;\n }\n if (typeof partialConfig.commentElseIfPrefix === \"string\") {\n _config.commentElseIfPrefix = partialConfig.commentElseIfPrefix;\n }\n if (typeof partialConfig.commentElsePrefix === \"string\") {\n _config.commentElsePrefix = partialConfig.commentElsePrefix;\n }\n if (typeof partialConfig.locale === \"string\") {\n _config.locale = partialConfig.locale;\n }\n if (typeof partialConfig.debug === \"boolean\") {\n _config.debug = partialConfig.debug;\n }\n if (typeof partialConfig.enableMustache === \"boolean\") {\n _config.enableMustache = partialConfig.enableMustache;\n }\n if (typeof partialConfig.enableDirectionalInitialSync === \"boolean\") {\n _config.enableDirectionalInitialSync = partialConfig.enableDirectionalInitialSync;\n }\n if (typeof partialConfig.enablePropagationContext === \"boolean\") {\n _config.enablePropagationContext = partialConfig.enablePropagationContext;\n }\n if (typeof partialConfig.enableContractAnalyzer === \"boolean\") {\n _config.enableContractAnalyzer = partialConfig.enableContractAnalyzer;\n }\n if (typeof partialConfig.sameValueGuard === \"boolean\") {\n _config.sameValueGuard = partialConfig.sameValueGuard;\n }\n}\n","import { IInitializeBindingPromise } from \"./types\";\n\nconst bindingPromiseByNode = new WeakMap<Node, IInitializeBindingPromise>();\n// resolve 済みマーク。エントリ未生成のまま resolve されたノードは、後から\n// wait された時に「生成して即 resolve」で追いつく。\nconst resolvedNodes = new WeakSet<Node>();\n\nlet id = 0;\n\nexport function getInitializeBindingPromiseByNode(node: Node): IInitializeBindingPromise {\n let bindingPromise = bindingPromiseByNode.get(node) || null;\n if (bindingPromise !== null) {\n return bindingPromise;\n }\n let resolveFn = undefined;\n const promise = new Promise<void>((resolve) => {\n resolveFn = resolve;\n });\n bindingPromise = {\n id: ++id,\n promise,\n resolve: resolveFn!\n };\n bindingPromiseByNode.set(node, bindingPromise);\n if (resolvedNodes.has(node)) {\n bindingPromise.resolve();\n }\n return bindingPromise;\n}\n\nexport async function waitInitializeBinding(node: Node): Promise<void> {\n const bindingPromise = getInitializeBindingPromiseByNode(node);\n await bindingPromise.promise;\n}\n\nexport function resolveInitializedBinding(node: Node): void {\n // ホットパス: リスト行では全 subscriber ノードがここを通るが、await する消費者\n // (boundComponent / shadowRoot host)はほぼ居ない。既存エントリが無ければ\n // Promise+closure を生成せず resolve 済みマークだけ残す(15 万個級の割り当て削減)。\n const existing = bindingPromiseByNode.get(node);\n if (typeof existing !== \"undefined\") {\n existing.resolve();\n return;\n }\n resolvedNodes.add(node);\n}\n","export const DELIMITER = '.';\nexport const WILDCARD = '*';\nexport const MAX_WILDCARD_DEPTH = 128;\nexport const MAX_LOOP_DEPTH = 128;\n// 因果伝播(Phase 3)の 1 transaction あたり hop 上限。超過分の未処理 record は\n// quarantine し(適用済みの値は戻さない)、updater から例外は投げない。\nexport const MAX_PROPAGATION_HOPS = 32;\n\n// data-wcs バインディング構文 `[prop][#mod]: [path][@state][|filter...]` の区切り文字(単一正本)。\n// これらは「死守の壁(構文契約)」であり値は不変。manifest.syntax.delimiters で公開される。\nexport const BINDING_SEPARATOR = ';'; // 複数バインディングの区切り\nexport const PROP_VALUE_SEPARATOR = ':'; // 左辺(prop)と右辺(path)の区切り\nexport const MODIFIER_SEPARATOR = '#'; // prop と修飾子の区切り\nexport const STATE_NAME_SEPARATOR = '@'; // path と @stateName の区切り\nexport const FILTER_SEPARATOR = '|'; // フィルタパイプの区切り\n\n/**\n * stackIndexByIndexName\n * インデックス名からスタックインデックスへのマッピング\n * $1 => 0\n * $2 => 1\n * :\n * ${i + 1} => i\n * i < MAX_WILDCARD_DEPTH\n */\nconst tmpIndexByIndexName: { [key: PropertyKey]: number } = {};\nfor (let i = 0; i < MAX_WILDCARD_DEPTH; i++) {\n tmpIndexByIndexName[`$${i+1}`] = i;\n}\nexport const INDEX_BY_INDEX_NAME: { [key: PropertyKey]: number } = Object.freeze(tmpIndexByIndexName);\n\nexport const NO_SET_TIMEOUT = 60 * 1000; // 1分\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nexport const STATE_CONNECTED_CALLBACK_NAME = \"$connectedCallback\";\nexport const STATE_DISCONNECTED_CALLBACK_NAME = \"$disconnectedCallback\";\nexport const STATE_UPDATED_CALLBACK_NAME = \"$updatedCallback\";\n\nexport const WEBCOMPONENT_STATE_READY_CALLBACK_NAME = \"$stateReadyCallback\";\n\nexport const STATE_BINDABLES_NAME = \"$bindables\";\nexport const STATE_COMMAND_TOKENS_NAME = \"$commandTokens\";\nexport const STATE_COMMAND_NAMESPACE_NAME = \"$command\";\nexport const STATE_EVENT_TOKENS_NAME = \"$eventTokens\";\nexport const STATE_ON_NAME = \"$on\";\nexport const STATE_STREAMS_NAME = \"$streams\";\nexport const STATE_STREAM_STATUS_NAMESPACE_NAME = \"$streamStatus\";\nexport const STATE_STREAM_ERROR_NAMESPACE_NAME = \"$streamError\";\nexport const DCC_DEFINITION_ATTRIBUTE = \"data-wc-definition\";\n","import { WILDCARD } from \"../define.js\";\nimport { IPathInfo } from \"./types.js\";\n\nconst _cache: Map<string, IPathInfo> = new Map();\n\nlet id: number = 0;\nexport function getPathInfo(path: string): IPathInfo {\n let pathInfo = _cache.get(path);\n if (typeof pathInfo !== \"undefined\") {\n return pathInfo;\n }\n pathInfo = Object.freeze(new PathInfo(path));\n _cache.set(path, pathInfo);\n return pathInfo;\n}\n\nclass PathInfo implements IPathInfo {\n readonly id: number = ++id;\n readonly path: string;\n readonly segments: string[];\n readonly lastSegment: string;\n readonly cumulativePaths: string[];\n readonly cumulativePathSet: Set<string>;\n readonly cumulativePathInfos: IPathInfo[];\n readonly cumulativePathInfoSet: Set<IPathInfo>;\n readonly parentPath: string | null;\n readonly wildcardPaths: string[];\n readonly wildcardPathSet: Set<string>;\n readonly indexByWildcardPath: Record<string, number>;\n readonly wildcardPathInfos: IPathInfo[];\n readonly wildcardPathInfoSet: Set<IPathInfo>;\n readonly wildcardParentPaths: string[];\n readonly wildcardParentPathSet: Set<string>;\n readonly wildcardParentPathInfos: IPathInfo[];\n readonly wildcardParentPathInfoSet: Set<IPathInfo>;\n readonly wildcardPositions: number[];\n readonly lastWildcardPath: string | null;\n readonly lastWildcardInfo: IPathInfo | null;\n readonly wildcardCount: number;\n readonly parentPathInfo: IPathInfo | null;\n constructor(path: string) {\n // Helper to get or create StructuredPathInfo instances, avoiding redundant creation for self-reference\n const getPattern = (_path: string): IPathInfo => {\n return (path === _path) ? this : getPathInfo(_path);\n };\n \n // Split the pattern into individual path segments (e.g., \"items.*.name\" → [\"items\", \"*\", \"name\"])\n const segments = path.split(\".\");\n \n // Arrays to track all cumulative paths from root to each segment\n const cumulativePaths = [];\n const cumulativePathInfos: IPathInfo[] = [];\n \n // Arrays to track wildcard-specific information\n const wildcardPaths = [];\n const indexByWildcardPath: Record<string, number> = {}; // Maps wildcard path to its index position\n const wildcardPathInfos = [];\n const wildcardParentPaths = []; // Paths of parent segments for each wildcard\n const wildcardParentPathInfos = [];\n const wildcardPositions = [];\n \n let currentPatternPath = \"\", prevPatternPath = \"\";\n let wildcardCount = 0;\n \n // Iterate through each segment to build cumulative paths and identify wildcards\n for(let i = 0; i < segments.length; i++) {\n currentPatternPath += segments[i];\n \n // If this segment is a wildcard, track it with all wildcard-specific metadata\n if (segments[i] === WILDCARD) {\n wildcardPaths.push(currentPatternPath);\n indexByWildcardPath[currentPatternPath] = wildcardCount; // Store wildcard's ordinal position\n wildcardPathInfos.push(getPattern(currentPatternPath));\n wildcardParentPaths.push(prevPatternPath); // Parent path is the previous cumulative path\n wildcardParentPathInfos.push(getPattern(prevPatternPath));\n wildcardPositions.push(i);\n wildcardCount++;\n }\n \n // Track all cumulative paths for hierarchical navigation (e.g., \"items\", \"items.*\", \"items.*.name\")\n cumulativePaths.push(currentPatternPath);\n cumulativePathInfos.push(getPattern(currentPatternPath));\n \n // Save current path as previous for next iteration, then add separator\n prevPatternPath = currentPatternPath;\n currentPatternPath += \".\";\n }\n \n // Determine the deepest (last) wildcard path and the parent path of the entire pattern\n const lastWildcardPath = wildcardPaths.length > 0 ? wildcardPaths[wildcardPaths.length - 1] : null;\n const parentPath = cumulativePaths.length > 1 ? cumulativePaths[cumulativePaths.length - 2] : null;\n \n // Assign all analyzed data to readonly properties\n this.path = path;\n this.segments = segments;\n this.lastSegment = segments[segments.length - 1];\n this.cumulativePaths = cumulativePaths;\n this.cumulativePathSet = new Set(cumulativePaths); // Set for fast lookup\n this.cumulativePathInfos = cumulativePathInfos;\n this.cumulativePathInfoSet = new Set(cumulativePathInfos);\n this.wildcardPaths = wildcardPaths;\n this.wildcardPathSet = new Set(wildcardPaths);\n this.indexByWildcardPath = indexByWildcardPath;\n this.wildcardPathInfos = wildcardPathInfos;\n this.wildcardPathInfoSet = new Set(wildcardPathInfos);\n this.wildcardParentPaths = wildcardParentPaths;\n this.wildcardParentPathSet = new Set(wildcardParentPaths);\n this.wildcardParentPathInfos = wildcardParentPathInfos;\n this.wildcardParentPathInfoSet = new Set(wildcardParentPathInfos);\n this.wildcardPositions = wildcardPositions;\n this.lastWildcardPath = lastWildcardPath;\n this.lastWildcardInfo = lastWildcardPath ? getPattern(lastWildcardPath) : null;\n this.parentPath = parentPath;\n this.parentPathInfo = parentPath ? getPattern(parentPath) : null;\n this.wildcardCount = wildcardCount;\n }\n}\n","\nconst cache = new WeakMap<Node, string | null>();\n\nexport function getCustomElement(node: Node): string | null {\n const cached = cache.get(node);\n if (cached !== undefined) {\n return cached;\n }\n let value: string | null = null;\n try {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return value;\n }\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n if (tagName.includes(\"-\")) {\n return value = tagName;\n }\n if (element.hasAttribute(\"is\")) {\n const is = element.getAttribute(\"is\")!;\n if (is.includes(\"-\")) {\n return value = is;\n }\n }\n return value;\n } finally {\n cache.set(node, value);\n }\n}\n","export interface ICustomElementRegistryAdapter {\n get(name: string): CustomElementConstructor | undefined;\n whenDefined(name: string): Promise<CustomElementConstructor>;\n upgrade?(root: Node): void;\n}\n\nexport interface ICustomElementRegistryOwner {\n readonly customElements?: unknown;\n}\n\n/**\n * Resolve the registry at operation time so importing the runtime remains safe\n * when browser globals are absent. The owner hook is reserved for scoped\n * registries; current callers fall back to the global registry.\n */\nexport function getCustomElementRegistry(\n owner: ICustomElementRegistryOwner | null = null,\n): ICustomElementRegistryAdapter | null {\n const globalRegistry = (globalThis as { readonly customElements?: unknown }).customElements;\n const registry = owner?.customElements ?? globalRegistry;\n if (typeof registry !== \"object\" || registry === null) return null;\n\n const candidate = registry as Partial<ICustomElementRegistryAdapter>;\n if (typeof candidate.get !== \"function\" || typeof candidate.whenDefined !== \"function\") {\n return null;\n }\n return candidate as ICustomElementRegistryAdapter;\n}\n\nexport function upgradeCustomElement(\n registry: ICustomElementRegistryAdapter,\n root: Node,\n): void {\n registry.upgrade?.(root);\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/wc-bindable-reader.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\nimport type {\n IWcBindable,\n IWcBindableCommand,\n IWcBindableInput,\n IWcBindableProperty,\n} from \"./wcBindable.js\";\n\nexport const MIN_WC_BINDABLE_VERSION = 1;\n\nexport interface WcBindableElement {\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions,\n ): void;\n readonly constructor: {\n readonly wcBindable: IWcBindable;\n };\n}\n\nexport interface ReadBindableResult {\n readonly target: WcBindableElement;\n readonly liveDeclaration: IWcBindable;\n readonly knownProperties: ReadonlyMap<string, IWcBindableProperty>;\n readonly declaredInputs: ReadonlyMap<string, IWcBindableInput>;\n readonly declaredCommands: ReadonlyMap<string, IWcBindableCommand>;\n}\n\n/**\n * Repository-local conformance mirror of @wc-bindable/core's\n * getWcBindableDeclaration(). Discovery has one path only:\n * target.constructor.wcBindable.\n *\n * The declaration remains live. The maps are read-time indexes and are not a\n * clone, freeze, or normalized replacement for liveDeclaration.\n */\nexport function readBindableDeclaration(target: unknown): ReadBindableResult | null {\n try {\n if (target === null || (typeof target !== \"object\" && typeof target !== \"function\")) {\n return null;\n }\n\n const candidate = target as {\n readonly addEventListener?: unknown;\n readonly removeEventListener?: unknown;\n readonly constructor?: { readonly wcBindable?: IWcBindable };\n };\n const addEventListener = candidate.addEventListener;\n const removeEventListener = candidate.removeEventListener;\n const declaration = candidate.constructor?.wcBindable;\n\n if (typeof addEventListener !== \"function\" || typeof removeEventListener !== \"function\") {\n return null;\n }\n if (declaration?.protocol !== \"wc-bindable\") return null;\n if (!Number.isInteger(declaration.version) || declaration.version < MIN_WC_BINDABLE_VERSION) {\n return null;\n }\n\n const knownProperties = readNamedList(declaration.properties, isValidPropertyDescriptor);\n if (knownProperties === null) return null;\n\n const declaredInputs = declaration.inputs === undefined\n ? new Map<string, IWcBindableInput>()\n : readNamedList(declaration.inputs, isValidInputDescriptor);\n if (declaredInputs === null) return null;\n\n const declaredCommands = declaration.commands === undefined\n ? new Map<string, IWcBindableCommand>()\n : readNamedList(declaration.commands, isValidCommandDescriptor);\n if (declaredCommands === null) return null;\n\n return {\n target: target as WcBindableElement,\n liveDeclaration: declaration,\n knownProperties,\n declaredInputs,\n declaredCommands,\n };\n } catch {\n return null;\n }\n}\n\nfunction isValidPropertyDescriptor(value: unknown): value is IWcBindableProperty {\n if (typeof value !== \"object\" || value === null) return false;\n const descriptor = value as Partial<IWcBindableProperty>;\n if (typeof descriptor.name !== \"string\" || descriptor.name.length === 0) return false;\n if (typeof descriptor.event !== \"string\" || descriptor.event.length === 0) return false;\n return descriptor.getter === undefined || typeof descriptor.getter === \"function\";\n}\n\nfunction isValidInputDescriptor(value: unknown): value is IWcBindableInput {\n if (typeof value !== \"object\" || value === null) return false;\n const descriptor = value as Partial<IWcBindableInput>;\n if (typeof descriptor.name !== \"string\" || descriptor.name.length === 0) return false;\n return descriptor.attribute === undefined || typeof descriptor.attribute === \"string\";\n}\n\nfunction isValidCommandDescriptor(value: unknown): value is IWcBindableCommand {\n if (typeof value !== \"object\" || value === null) return false;\n const descriptor = value as Partial<IWcBindableCommand>;\n if (typeof descriptor.name !== \"string\" || descriptor.name.length === 0) return false;\n return descriptor.async === undefined || typeof descriptor.async === \"boolean\";\n}\n\nfunction readNamedList<T extends { readonly name: string }>(\n value: unknown,\n isValidEntry: (entry: unknown) => entry is T,\n): ReadonlyMap<string, T> | null {\n if (!Array.isArray(value)) return null;\n const entries = new Map<string, T>();\n for (const entry of value) {\n if (!isValidEntry(entry) || entries.has(entry.name)) return null;\n entries.set(entry.name, entry);\n }\n return entries;\n}\n","\nexport function raiseError(message: string): never {\n throw new Error(`[@wcstack/state] ${message}`);\n}","import { getPathInfo } from \"../address/PathInfo\";\nimport { config } from \"../config\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry, upgradeCustomElement } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\nimport { ParseBindTextResult } from \"./types\";\n\nfunction makeExpandedEntry(\n name: string,\n base: string,\n stateName: string,\n): ParseBindTextResult {\n // Dot-relative spread keeps the loop item root (`.`) without producing `..foo`.\n const expandedPath = base === \".\" ? `.${name}` : `${base}.${name}`;\n return {\n propName: name,\n propSegments: [name],\n propModifiers: [],\n statePathName: expandedPath,\n statePathInfo: getPathInfo(expandedPath),\n stateName,\n inFilters: [],\n outFilters: [],\n bindingType: 'prop',\n };\n}\n\nfunction dedupKey(r: ParseBindTextResult): string | null {\n switch (r.bindingType) {\n case 'prop':\n case 'event':\n case 'radio':\n case 'checkbox':\n return `${r.bindingType}::${r.propName}`;\n case 'spread':\n return null;\n default:\n return null;\n }\n}\n\nexport interface IExpandSpreadOptions {\n /**\n * When false, raise an error if the custom element class is not yet defined.\n * When true (default), leave the spread entry in place so the caller can\n * defer expansion via customElements.whenDefined.\n */\n readonly allowDeferred?: boolean;\n}\n\n/**\n * Expand spread bind-text entries (`...: target`) into per-prop entries\n * by enumerating wcBindable.properties + inputs of the element's class.\n *\n * Behavior:\n * - With `allowDeferred: true` (default): if class is not yet defined, the\n * spread entry stays so the caller can wait via customElements.whenDefined.\n * - With `allowDeferred: false`: raises if class is not defined.\n * - Duplicate propName: last-wins (explicit binding overrides spread).\n * - When config.debug, console.debug logs each override.\n * - Mid-`*` in target path is allowed (e.g. `...: stores.*.fetch`).\n *\n * Composite Profile (COMPOSITE.md / SPEC-extensions § 4) support:\n * - A composite shell exposes its synthesized declaration via the standard\n * `target.constructor.wcBindable` surface (§ 1 Discovery), so this function\n * handles it without any composite-specific code path.\n * - Composed property names use the `<sourceId>.<sourceName>` pattern\n * (e.g. \"s3.progress\"); we keep the dotted name as a single segment so\n * element member access stays flat (element[\"s3.progress\"], not nested).\n * - The expanded state path becomes `targetBase.s3.progress`, which resolves\n * as nested state access — author state as `{ s3: { progress: 0 } }` to\n * mirror the composed structure.\n * - Tier claim (Symbol.for(\"wc-bindable.composite.tiers\")) is not read here;\n * spread covers observation (T1) and writable inputs (T2) transparently\n * through normal property assignment, and commands stay out of spread by\n * design regardless of tier.\n */\nexport function expandSpread(\n node: Node,\n results: ParseBindTextResult[],\n options: IExpandSpreadOptions = {},\n): ParseBindTextResult[] {\n const allowDeferred = options.allowDeferred ?? true;\n if (!results.some(r => r.bindingType === 'spread')) {\n return results;\n }\n const expanded: ParseBindTextResult[] = [];\n const spreadOrigin = new WeakSet<ParseBindTextResult>();\n for (const result of results) {\n if (result.bindingType !== 'spread') {\n expanded.push(result);\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n raiseError(`Spread binding requires an element node.`);\n }\n const element = node as Element;\n const tagName = getCustomElement(element);\n if (tagName === null) {\n raiseError(`Spread binding \"${result.statePathName}\" requires a custom element with wcBindable, but <${element.tagName.toLowerCase()}> is not a custom element.`);\n }\n const registry = getCustomElementRegistry();\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${tagName}>.`);\n }\n const customClass = registry.get(tagName);\n if (typeof customClass === \"undefined\") {\n if (!allowDeferred) {\n raiseError(`Spread binding \"${result.statePathName}\" requires <${tagName}> to be registered. Define the custom element before initializing this binding.`);\n }\n // Deferred: keep spread entry intact; caller retries via whenDefined.\n expanded.push(result);\n continue;\n }\n upgradeCustomElement(registry, element);\n const bindable = readBindableDeclaration(element);\n if (bindable === null) {\n raiseError(`Spread binding \"${result.statePathName}\" requires <${tagName}> to expose a valid wcBindable declaration.`);\n }\n const targetBase = result.statePathName;\n const stateName = result.stateName;\n const seen = new Set<string>();\n for (const name of bindable.knownProperties.keys()) {\n if (seen.has(name)) continue;\n seen.add(name);\n const entry = makeExpandedEntry(name, targetBase, stateName);\n spreadOrigin.add(entry);\n expanded.push(entry);\n }\n // properties win over inputs when the name overlaps because they carry the\n // full property contract (for example change events).\n for (const name of bindable.declaredInputs.keys()) {\n if (seen.has(name)) continue;\n seen.add(name);\n const entry = makeExpandedEntry(name, targetBase, stateName);\n spreadOrigin.add(entry);\n expanded.push(entry);\n }\n }\n // Last-wins de-duplication\n const lastIndexByKey = new Map<string, number>();\n for (let i = 0; i < expanded.length; i++) {\n const key = dedupKey(expanded[i]);\n if (key !== null) {\n lastIndexByKey.set(key, i);\n }\n }\n const final: ParseBindTextResult[] = [];\n for (let i = 0; i < expanded.length; i++) {\n const key = dedupKey(expanded[i]);\n if (key === null) {\n final.push(expanded[i]);\n continue;\n }\n if (lastIndexByKey.get(key) === i) {\n final.push(expanded[i]);\n } else if (config.debug && spreadOrigin.has(expanded[i])) {\n const overrider = expanded[lastIndexByKey.get(key)!];\n const tagText = node.nodeType === Node.ELEMENT_NODE\n ? `<${(node as Element).tagName.toLowerCase()}>`\n : 'node';\n console.debug(`[@wcstack/state] spread: prop \"${expanded[i].propName}\" of ${tagText} overridden by explicit binding (statePath: \"${overrider.statePathName}\").`);\n }\n }\n return final;\n}\n\nexport function hasUnresolvedSpread(results: ParseBindTextResult[]): boolean {\n return results.some(r => r.bindingType === 'spread');\n}\n","\nexport function resolveNodePath(root: Node, path: number[]): Node | null {\n let currentNode = root;\n if (path.length === 0) return currentNode;\n // path.reduce()だと途中でnullになる可能性があるので、\n for(let i = 0; i < path.length; i++) {\n currentNode = currentNode?.childNodes[path[i]] ?? null;\n if (currentNode === null) break;\n }\n return currentNode;\n}","import { IBindingInfo } from \"../binding/types\";\n\nconst bindingsByNode = new WeakMap<Node, IBindingInfo[]>();\n\nexport function getBindingsByNode(node: Node): IBindingInfo[] | null {\n return bindingsByNode.get(node) || null;\n}\n\nexport function setBindingsByNode(node: Node, bindings: IBindingInfo[]): void {\n bindingsByNode.set(node, bindings);\n}\n\nexport function addBindingByNode(node: Node, binding: IBindingInfo): void {\n const bindings = getBindingsByNode(node);\n if (bindings === null) {\n setBindingsByNode(node, [binding]);\n } else {\n bindings.push(binding);\n }\n}","import { BindingType } from \"../types.js\";\n\nexport const STRUCTURAL_BINDING_TYPE_SET: Set<BindingType> = new Set([\n \"if\",\n \"elseif\",\n \"else\",\n \"for\",\n]);\n","/**\n * errorMessages.ts\n *\n * Error message generation utilities used by filter functions.\n *\n * Main responsibilities:\n * - Throws clear error messages when filter options or value type checks fail\n * - Takes function name as argument to specify which filter caused the error\n *\n * Design points:\n * - optionsRequired: Error when required option is not specified\n * - optionMustBeNumber: Error when option value is not a number\n * - valueMustBeNumber: Error when value is not a number\n * - valueMustBeBoolean: Error when value is not boolean\n * - valueMustBeDate: Error when value is not a Date\n */\nimport { raiseError } from \"../raiseError\";\n\n/**\n * Throws error when filter requires at least one option but none provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function optionsRequired(fnName:string): never {\n raiseError(`filter ${fnName} requires at least one option`);\n}\n\n/**\n * Throws error when filter option must be a number but invalid value provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function optionMustBeNumber(fnName:string): never {\n raiseError(`filter ${fnName} requires a number as option`);\n}\n\n/**\n * Throws error when filter requires numeric value but non-number provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeNumber(fnName:string): never {\n raiseError(`filter ${fnName} requires a number value`);\n}\n\n/**\n * Throws error when filter requires numeric value but non-number provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeString(fnName:string): never {\n raiseError(`filter ${fnName} requires a string value`);\n}\n\n/**\n * Throws error when filter requires boolean value but non-boolean provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeBoolean(fnName:string): never {\n raiseError(`filter ${fnName} requires a boolean value`);\n} \n\n/**\n * Throws error when filter requires Date value but non-Date provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeDate(fnName:string): never {\n raiseError(`filter ${fnName} requires a date value`);\n}","/**\n * builtinFilters.ts\n *\n * Implementation file for built-in filter functions available in Structive.\n *\n * Main responsibilities:\n * - Provides filters for conversion, comparison, formatting, and validation of numbers, strings, dates, booleans, etc.\n * - Defines functions with options for each filter name, enabling flexible use during binding\n * - Designed for common use as both input and output filters\n *\n * Design points:\n * - Comprehensive coverage of diverse filters: eq, ne, lt, gt, inc, fix, locale, uc, lc, cap, trim, slice, pad, int, float, round, date, time, ymd, falsy, truthy, defaults, boolean, number, string, null, etc.\n * - Rich type checking and error handling for option values\n * - Centralized management of filter functions with FilterWithOptions type, easy to extend\n * - Dynamic retrieval of filter functions from filter names and options via builtinFilterFn\n */\nimport { config } from \"../config.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { optionMustBeNumber, optionsRequired, valueMustBeBoolean, valueMustBeDate, valueMustBeNumber } from \"./errorMessages.js\";\nimport { FilterFn, FilterWithOptions } from \"./types\";\n\nfunction validateNumberString(value: string): boolean {\n if (!value || isNaN(Number(value))) {\n return false;\n }\n return true;\n}\n\n/**\n * Equality filter - compares value with option.\n * \n * @param options - Array with comparison value as first element\n * @returns Filter function that returns boolean\n */\nconst eq = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('eq');\n return (value: unknown): boolean => {\n // Align types for comparison\n if (typeof value === 'number') {\n if (!validateNumberString(opt)) {optionMustBeNumber('eq');}\n return value === Number(opt);\n }\n if (typeof value === 'string') {\n return value === opt;\n }\n // Strict equality for others\n return value === opt;\n }\n}\n\n/**\n * Inequality filter - compares value with option.\n * \n * @param options - Array with comparison value as first element\n * @returns Filter function that returns boolean\n */\nconst ne = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('ne');\n return (value: unknown): boolean => {\n // Align types for comparison\n if (typeof value === 'number') {\n if (!validateNumberString(opt)) {optionMustBeNumber('ne');}\n return value !== Number(opt);\n }\n if (typeof value === 'string') {\n return value !== opt;\n }\n // Strict equality for others\n return value !== opt;\n }\n}\n\n/**\n * Boolean NOT filter - inverts boolean value.\n * \n * @param options - Unused\n * @returns Filter function that returns inverted boolean\n */\nconst not = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => {\n if (typeof value !== 'boolean') {valueMustBeBoolean('not');}\n return !value;\n }\n}\n\n/**\n * Less than filter - checks if value is less than option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst lt = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('lt');\n if (!validateNumberString(opt)) {optionMustBeNumber('lt');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('lt');}\n return value < Number(opt);\n }\n}\n\n/**\n * Less than or equal filter - checks if value is less than or equal to option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst le = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('le');\n if (!validateNumberString(opt)) {optionMustBeNumber('le');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('le');}\n return value <= Number(opt);\n }\n}\n\n/**\n * Greater than filter - checks if value is greater than option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst gt = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('gt');\n if (!validateNumberString(opt)) {optionMustBeNumber('gt');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('gt');}\n return value > Number(opt);\n }\n}\n\n/**\n * Greater than or equal filter - checks if value is greater than or equal to option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst ge = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('ge');\n if (!validateNumberString(opt)) {optionMustBeNumber('ge');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('ge');}\n return value >= Number(opt);\n }\n}\n\n/**\n * Increment filter - adds option value to input value.\n * \n * @param options - Array with increment number as first element\n * @returns Filter function that returns incremented number\n */\nconst inc = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('inc');\n if (!validateNumberString(opt)) {optionMustBeNumber('inc');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('inc');}\n return value + Number(opt);\n }\n}\n\n/**\n * Decrement filter - subtracts option value from input value.\n * \n * @param options - Array with decrement number as first element\n * @returns Filter function that returns decremented number\n */\nconst dec = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('dec');\n if (!validateNumberString(opt)) {optionMustBeNumber('dec');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('dec');}\n return value - Number(opt);\n }\n}\n\n/**\n * Multiply filter - multiplies value by option.\n * \n * @param options - Array with multiplier number as first element\n * @returns Filter function that returns multiplied number\n */\nconst mul = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('mul');\n if (!validateNumberString(opt)) {optionMustBeNumber('mul');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('mul');}\n return value * Number(opt);\n }\n}\n\n/**\n * Divide filter - divides value by option.\n * \n * @param options - Array with divisor number as first element\n * @returns Filter function that returns divided number\n */\nconst div = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('div');\n if (!validateNumberString(opt)) {optionMustBeNumber('div');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('div');}\n return value / Number(opt);\n }\n}\n\n/**\n * Modulo filter - returns remainder of division.\n * \n * @param options - Array with divisor number as first element\n * @returns Filter function that returns remainder\n */\nconst mod = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('mod');\n if (!validateNumberString(opt)) {optionMustBeNumber('mod');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('mod');}\n return value % Number(opt);\n }\n}\n\n/**\n * Fixed decimal filter - formats number to fixed decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns formatted string\n */\nconst fix = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? \"0\";\n if (!validateNumberString(opt)) {optionMustBeNumber('fix');}\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('fix');}\n return value.toFixed(Number(opt));\n }\n}\n\n/**\n * Locale number filter - formats number according to locale.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns localized number string\n */\nconst locale = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('locale');}\n return value.toLocaleString(opt);\n }\n}\n\n/**\n * Uppercase filter - converts string to uppercase.\n * \n * @param options - Unused\n * @returns Filter function that returns uppercase string\n */\nconst uc = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).toUpperCase();\n }\n}\n\n/**\n * Lowercase filter - converts string to lowercase.\n * \n * @param options - Unused\n * @returns Filter function that returns lowercase string\n */\nconst lc = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).toLowerCase();\n }\n}\n\n/**\n * Capitalize filter - capitalizes first character of string.\n * \n * @param options - Unused\n * @returns Filter function that returns capitalized string\n */\nconst cap = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n const v = String(value);\n if (v.length === 0) {return v;}\n if (v.length === 1) {return v.toUpperCase();}\n return v.charAt(0).toUpperCase() + v.slice(1);\n }\n}\n\n/**\n * Trim filter - removes whitespace from both ends of string.\n * \n * @param options - Unused\n * @returns Filter function that returns trimmed string\n */\nconst trim = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).trim();\n }\n}\n\n/**\n * Slice filter - extracts portion of string from specified index.\n * \n * @param options - Array with start index and optional end index\n * @returns Filter function that returns sliced string\n */\nconst slice = (options?:string[]): FilterFn<string> => {\n const numberedOpts: number[] = [];\n const opt1 = options?.[0] ?? optionsRequired('slice');\n if (!validateNumberString(opt1)) {optionMustBeNumber('slice');}\n numberedOpts.push(Number(opt1));\n const opt2 = options?.[1];\n if (typeof opt2 !== 'undefined') {\n if (!validateNumberString(opt2)) {optionMustBeNumber('slice');}\n numberedOpts.push(Number(opt2));\n }\n return (value: unknown): string => {\n return String(value).slice(...numberedOpts);\n }\n}\n\n/**\n * Substring filter - extracts substring from specified position and length.\n * \n * @param options - Array with start index and length\n * @returns Filter function that returns substring\n */\nconst substr = (options?:string[]): FilterFn<string> => {\n const opt1 = options?.[0] ?? optionsRequired('substr');\n if (!validateNumberString(opt1)) {optionMustBeNumber('substr');}\n const opt2 = options?.[1] ?? optionsRequired('substr');\n if (!validateNumberString(opt2)) {optionMustBeNumber('substr');}\n return (value: unknown): string => {\n return String(value).substr(Number(opt1), Number(opt2));\n }\n}\n\n/**\n * Pad filter - pads string to specified length from start.\n * \n * @param options - Array with target length and pad string (default: '0')\n * @returns Filter function that returns padded string\n */\nconst pad = (options?:string[]): FilterFn<string> => {\n const opt1 = options?.[0] ?? optionsRequired('pad');\n if (!validateNumberString(opt1)) {optionMustBeNumber('pad');}\n const opt2 = options?.[1] ?? '0';\n return (value: unknown): string => {\n return String(value).padStart(Number(opt1), opt2);\n }\n}\n\n/**\n * Repeat filter - repeats string specified number of times.\n * \n * @param options - Array with repeat count as first element\n * @returns Filter function that returns repeated string\n */\nconst rep = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? optionsRequired('rep');\n if (!validateNumberString(opt)) {optionMustBeNumber('rep');}\n return (value: unknown): string => {\n return String(value).repeat(Number(opt));\n }\n}\n\n/**\n * Reverse filter - reverses character order in string.\n * \n * @param options - Unused\n * @returns Filter function that returns reversed string\n */\nconst rev = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).split('').reverse().join('');\n }\n}\n\n/**\n * Integer filter - parses value to integer.\n * \n * @param options - Unused\n * @returns Filter function that returns integer\n */\nconst int = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return parseInt(String(value), 10);\n }\n}\n\n/**\n * Float filter - parses value to floating point number.\n * \n * @param options - Unused\n * @returns Filter function that returns float\n */\nconst float = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return parseFloat(String(value));\n }\n}\n\n/**\n * Round filter - rounds number to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns rounded number\n */\nconst round = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('round');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('round');}\n const optValue = Math.pow(10, Number(opt));\n return Math.round(value * optValue) / optValue;\n }\n}\n\n/**\n * Floor filter - rounds number down to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns floored number\n */\nconst floor = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('floor');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('floor');}\n const optValue = Math.pow(10, Number(opt));\n return Math.floor(value * optValue) / optValue;\n }\n}\n\n/**\n * Ceiling filter - rounds number up to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns ceiled number\n */\nconst ceil = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('ceil');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('ceil');}\n const optValue = Math.pow(10, Number(opt));\n return Math.ceil(value * optValue) / optValue;\n }\n}\n\n/**\n * Percent filter - formats number as percentage string.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns percentage string with '%'\n */\nconst percent = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('percent');}\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('percent');}\n return `${(value * 100).toFixed(Number(opt))}%`;\n }\n}\n\n/**\n * Date filter - formats Date object as localized date string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns date string\n */\nconst date = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('date');}\n return value.toLocaleDateString(opt);\n }\n}\n\n/**\n * Time filter - formats Date object as localized time string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns time string\n */\nconst time = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('time');}\n return value.toLocaleTimeString(opt);\n }\n}\n\n/**\n * DateTime filter - formats Date object as localized date and time string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns datetime string\n */\nconst datetime = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('datetime');}\n return value.toLocaleString(opt);\n }\n}\n\n/**\n * Year-Month-Day filter - formats Date object as YYYY-MM-DD string.\n * \n * @param options - Array with separator string as first element (default: '-')\n * @returns Filter function that returns formatted date string\n */\nconst ymd = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? '-';\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('ymd');}\n const year = value.getFullYear().toString();\n const month = (value.getMonth() + 1).toString().padStart(2, '0');\n const day = value.getDate().toString().padStart(2, '0');\n return `${year}${opt}${month}${opt}${day}`;\n }\n}\n\n/**\n * Falsy filter - checks if value is falsy.\n * \n * @param options - Unused\n * @returns Filter function that returns true for false/null/undefined/0/''/NaN\n */\nconst falsy = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value);\n}\n\n/**\n * Truthy filter - checks if value is truthy.\n * \n * @param options - Unused\n * @returns Filter function that returns true for non-falsy values\n */\nconst truthy = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean =>value !== false && value !== null && value !== undefined && value !== 0 && value !== '' && !Number.isNaN(value);\n}\n\n/**\n * Default filter - returns default value if input is falsy.\n * \n * @param options - Array with default value as first element\n * @returns Filter function that returns value or default\n */\nconst defaults = (options?:string[]): FilterFn<unknown> => {\n const opt = options?.[0] ?? optionsRequired('defaults');\n return (value: unknown): unknown => {\n if (value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value)) {return opt;}\n return value;\n }\n}\n\n/**\n * Boolean filter - converts value to boolean.\n * \n * @param options - Unused\n * @returns Filter function that returns boolean\n */\nconst boolean = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => {\n return Boolean(value);\n }\n}\n\n/**\n * Number filter - converts value to number.\n * \n * @param options - Unused\n * @returns Filter function that returns number\n */\nconst number = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return Number(value);\n }\n}\n\n/**\n * String filter - converts value to string.\n * \n * @param options - Unused\n * @returns Filter function that returns string\n */\nconst string = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value);\n }\n}\n\n/**\n * Null filter - converts empty string to null.\n * \n * @param options - Unused\n * @returns Filter function that returns null for empty string, otherwise original value\n */\nconst _null = (_options?:string[]): FilterFn<unknown> => {\n return (value: unknown): unknown => {\n return (value === \"\") ? null : value;\n } \n}\n\nconst builtinFilters: FilterWithOptions = {\n \"eq\": eq,\n \"ne\": ne,\n \"not\": not,\n\n \"lt\": lt,\n \"le\": le,\n \"gt\": gt,\n \"ge\": ge,\n\n \"inc\": inc,\n \"dec\": dec,\n \"mul\": mul,\n \"div\": div,\n \"mod\": mod,\n\n \"fix\": fix,\n \"locale\": locale,\n \"uc\": uc,\n \"lc\": lc,\n \"cap\": cap,\n \"trim\": trim,\n \"slice\": slice,\n \"substr\": substr,\n \"pad\": pad,\n \"rep\": rep,\n \"rev\": rev,\n\n \"int\": int,\n \"float\": float,\n \"round\": round,\n \"floor\": floor,\n \"ceil\": ceil,\n \"percent\": percent,\n\n \"date\": date,\n \"time\": time,\n \"datetime\": datetime,\n \"ymd\": ymd,\n\n \"falsy\": falsy,\n \"truthy\": truthy,\n \"defaults\": defaults,\n\n \"boolean\": boolean,\n \"number\": number,\n \"string\": string,\n \"null\": _null,\n};\n\nexport const outputBuiltinFilters = builtinFilters;\nexport const inputBuiltinFilters = builtinFilters;\n\nexport const builtinFiltersByFilterIOType = {\n \"input\": inputBuiltinFilters,\n \"output\": outputBuiltinFilters,\n} as const;\n\n/**\n * Retrieves built-in filter function by name and options.\n * \n * @param name - Filter name\n * @param options - Array of option strings\n * @returns Function that takes FilterWithOptions and returns filter function\n */\nexport const builtinFilterFn = (name:string, options: string[]) => (filters: FilterWithOptions) => {\n const filter = filters[name];\n if (!filter) {\n raiseError(`filter not found: ${name}`);\n }\n return filter(options);\n}\n\n","import { builtinFilterFn, builtinFiltersByFilterIOType } from \"../filters/builtinFilters\";\nimport { FilterFn, FilterIOType } from \"../filters/types\";\nimport { raiseError } from \"../raiseError\";\nimport { IFilterInfo } from \"../types\";\nimport { parseFilterArgs } from \"./parseFilterArgs\";\n\nconst filterFnByKey: Map<string, FilterFn<unknown>> = new Map();\n\n// format: filterName(arg1,arg2) or filterName\n\nexport function parseFilters(filterTextList: string[], filterIOType: FilterIOType): IFilterInfo[] {\n const builtinFilters = builtinFiltersByFilterIOType[filterIOType];\n const filters: IFilterInfo[] = filterTextList.map((filterText) => {\n const openParenIndex = filterText.indexOf('(');\n const closeParenIndex = filterText.lastIndexOf(')');\n // check parentheses\n if (openParenIndex !== -1 && closeParenIndex === -1) {\n raiseError(`Invalid filter format: missing closing parenthesis in \"${filterText}\"`);\n }\n if (closeParenIndex !== -1 && openParenIndex === -1) {\n raiseError(`Invalid filter format: missing opening parenthesis in \"${filterText}\"`);\n }\n if (openParenIndex === -1) {\n // no arguments\n const filterName = filterText.trim();\n const filterKey = `${filterName}():${filterIOType}`;\n let filterFn = filterFnByKey.get(filterKey);\n if (typeof filterFn === 'undefined') {\n filterFn = builtinFilterFn(filterName, [])(builtinFilters);\n filterFnByKey.set(filterKey, filterFn);\n }\n return {\n filterName: filterName,\n args: [],\n filterFn: filterFn,\n };\n } else {\n const argsText = filterText.substring(openParenIndex + 1, closeParenIndex);\n const filterName = filterText.substring(0, openParenIndex).trim();\n const args = parseFilterArgs(argsText);\n const filterKey = `${filterName}(${args.join(',')}):${filterIOType}`;\n let filterFn = filterFnByKey.get(filterKey);\n if (typeof filterFn === 'undefined') {\n filterFn = builtinFilterFn(filterName, args)(builtinFilters);\n filterFnByKey.set(filterKey, filterFn);\n }\n return {\n filterName,\n args,\n filterFn,\n };\n }\n });\n return filters;\n}","export function parseFilterArgs(argsText: string): string[] {\n const args: string[] = [];\n let current = '';\n let inQuote: string | null = null;\n let hasQuote = false;\n\n for (let i = 0; i < argsText.length; i++) {\n const char = argsText[i];\n\n if (inQuote) {\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuote = char;\n hasQuote = true;\n } else if (char === ',') {\n args.push(current.trim());\n current = '';\n hasQuote = false;\n } else {\n current += char;\n }\n }\n\n const last = current.trim();\n if (last || hasQuote) {\n args.push(last);\n }\n\n return args;\n}\n","\nexport const trimFn = (s: string): string => s.trim();\n","import { DELIMITER, FILTER_SEPARATOR, MODIFIER_SEPARATOR } from \"../define\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { parseFilters } from \"./parseFilters\";\nimport { trimFn } from \"./utils\";\n\ntype PropPartParseResult = Pick<IBindingInfo, 'propName' | 'propSegments' | 'propModifiers' | 'inFilters'>;\n\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\n\n// format: propName#moodifier1,modifier2\n// propName-format: path.to.property (e.g., textContent, style.color, not include :)\n// special path: \n// 'attr.attributeName' for attributes (e.g., attr.href, attr.data-id)\n// 'style.propertyName' for style properties (e.g., style.backgroundColor, style.fontSize)\n// 'class.className' for class names (e.g., class.active, class.hidden)\n// 'onclick', 'onchange' etc. for event listeners\n\nexport function parsePropPart(propPart: string): PropPartParseResult {\n const pos = propPart.indexOf(FILTER_SEPARATOR);\n let propText: string = '';\n let filterTexts: string[] = [];\n let filtersText = '';\n let filters: IFilterInfo[] = [];\n if (pos !== -1) {\n propText = propPart.slice(0, pos).trim();\n filtersText = propPart.slice(pos + 1).trim();\n if (cacheFilterInfos.has(filtersText)) {\n filters = cacheFilterInfos.get(filtersText)!;\n } else {\n filterTexts = filtersText.split(FILTER_SEPARATOR).map(trimFn);\n filters = parseFilters(filterTexts, \"input\");\n cacheFilterInfos.set(filtersText, filters);\n }\n } else {\n propText = propPart.trim();\n }\n\n const [propName, propModifiersText] = propText.split(MODIFIER_SEPARATOR).map(trimFn);\n const propSegments = propName.split(DELIMITER).map(trimFn);\n const propModifiers = propModifiersText\n ? propModifiersText.split(',').map(trimFn)\n : [];\n return {\n propName,\n propSegments,\n propModifiers,\n inFilters: filters,\n };\n}","import { getPathInfo } from \"../address/PathInfo\";\nimport { FILTER_SEPARATOR, STATE_NAME_SEPARATOR } from \"../define\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { parseFilters } from \"./parseFilters\";\nimport { trimFn } from \"./utils\";\n\ntype StatePartParseResult = Pick<IBindingInfo, \n 'stateName' | 'statePathName' | 'statePathInfo' | 'outFilters'>;\n\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\n\n// format: statePath@stateName|filter|filter\n// statePath-format: path.to.property (e.g., user.name.first, users.*.name, users.0.name, not include @)\n// stateName: optional, default is 'default'\n// filters-format: filterName or filterName(arg1,arg2)\nexport function parseStatePart(statePart: string): StatePartParseResult {\n const pos = statePart.indexOf(FILTER_SEPARATOR);\n let stateAndPath: string = '';\n let filterTexts: string[] = [];\n let filtersText = '';\n let filters: IFilterInfo[] = [];\n if (pos !== -1) {\n stateAndPath = statePart.slice(0, pos).trim();\n filtersText = statePart.slice(pos + 1).trim();\n if (cacheFilterInfos.has(filtersText)) {\n filters = cacheFilterInfos.get(filtersText)!;\n } else {\n filterTexts = filtersText.split(FILTER_SEPARATOR).map(trimFn);\n filters = parseFilters(filterTexts, \"output\");\n cacheFilterInfos.set(filtersText, filters);\n }\n } else {\n stateAndPath = statePart.trim();\n }\n const [statePathName, stateName = 'default'] = stateAndPath.split(STATE_NAME_SEPARATOR).map(trimFn);\n const pathInfo = getPathInfo(statePathName);\n return {\n stateName,\n statePathName,\n statePathInfo: pathInfo,\n outFilters: filters,\n };\n}\n","import { getPathInfo } from \"../address/PathInfo.js\";\nimport { BINDING_SEPARATOR, PROP_VALUE_SEPARATOR } from \"../define.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { STRUCTURAL_BINDING_TYPE_SET } from \"../structural/define.js\";\nimport { parsePropPart } from \"./parsePropPart.js\";\nimport { parseStatePart } from \"./parseStatePart.js\";\nimport { ParseBindTextResult } from \"./types.js\";\nimport { trimFn } from \"./utils.js\";\n\n// format: propPart:statePart; propPart:statePart; ...\n// special-propPart:\n// if: statePart (single binding for conditional rendering)\n// else: (single binding for conditional rendering, and statePart is ignored)\n// elseif: statePart only (single binding for conditional rendering)\n// for: statePart only (single binding for loop rendering)\n// onclick: statePart, onchange: statePart etc. (event listeners)\n// ...: statePart (spread — expand wcBindable properties+inputs of target object)\n\nexport function parseBindTextsForElement(bindText: string): ParseBindTextResult[] {\n const [ ...bindTexts ] = bindText.split(BINDING_SEPARATOR).map(trimFn).filter(s => s.length > 0);\n const results = bindTexts.map((bindText): ParseBindTextResult => {\n const separatorIndex = bindText.indexOf(PROP_VALUE_SEPARATOR);\n if (separatorIndex === -1) {\n raiseError(`Invalid bindText: \"${bindText}\". Missing ':' separator between propPart and statePart.`);\n }\n const propPart = bindText.slice(0, separatorIndex).trim();\n const statePart = bindText.slice(separatorIndex + 1).trim();\n if (propPart === 'else') {\n const pathInfo = getPathInfo('#else');\n return {\n propName: 'else',\n propSegments: ['else'],\n propModifiers: [],\n statePathName: '#else',\n statePathInfo: pathInfo,\n stateName: '',\n inFilters: [],\n outFilters: [],\n bindingType: 'else',\n };\n } else if (propPart === '...') {\n const stateResult = parseStatePart(statePart);\n if (stateResult.outFilters.length > 0) {\n raiseError(`Invalid spread binding \"${bindText}\": filters are not allowed on spread targets.`);\n }\n if (stateResult.statePathName.length === 0) {\n raiseError(`Invalid spread binding \"${bindText}\": spread target path is required.`);\n }\n return {\n propName: '...',\n propSegments: ['...'],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: 'spread',\n };\n } else if (propPart === 'if'\n || propPart === 'elseif'\n || propPart === 'for'\n || propPart === 'radio'\n || propPart === 'checkbox'\n ) {\n const stateResult = parseStatePart(statePart);\n return {\n propName: propPart,\n propSegments: [propPart],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: propPart,\n };\n } else {\n const stateResult = parseStatePart(statePart);\n const propResult = parsePropPart(propPart);\n // eventToken.<prop>: <name> は要素 dispatch を state へ流す pub/sub 配線。\n // 値適用ではないため bindingType 'event' として listener attach 経路に乗せる。\n if (propResult.propSegments[0] === 'eventToken') {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'event',\n };\n }\n if (propResult.propSegments[0].startsWith('on')) {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'event',\n };\n } else {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'prop',\n };\n }\n }\n });\n // check for sigle binding for 'if', 'elseif', 'else', 'for'\n if (results.length > 1) {\n const isIncludeSingleBinding = results.some(r => STRUCTURAL_BINDING_TYPE_SET.has(r.bindingType));\n if (isIncludeSingleBinding) {\n raiseError(`Invalid bindText: \"${bindText}\". 'if', 'elseif', 'else', and 'for' bindings must be single binding.`);\n }\n }\n return results;\n}\n\n","import { config } from \"../config\";\n\nconst bindTextByNode = new WeakMap<Node, string>();\n\n// format: <!--@@wcs-text:path-->\n// bind-stateはconfig.commentTextPrefixで変更可能\n// format: <!--@@wcs-for:UUID-->\n// bind-stateはconfig.commentForPrefixで変更可能\n// format: <!--@@wcs-if:UUID-->\n// bind-stateはconfig.commentIfPrefixで変更可能\n// format: <!--@@wcs-else:UUID-->\n// bind-stateはconfig.commentElsePrefixで変更可能\n// format: <!--@@wcs-elseif:UUID-->\n// bind-stateはconfig.commentElseIfPrefixで変更可能\nconst bindingTypeKeywordSet: Set<string> = new Set<string>([\n config.commentTextPrefix,\n config.commentForPrefix,\n config.commentIfPrefix,\n config.commentElseIfPrefix,\n config.commentElsePrefix,\n]);\n\n// format: <!--@@:path-->は<!--@@wcs-text:path-->と同義にする\nconst EMBEDDED_REGEX = new RegExp(`^\\\\s*@@\\\\s*(.*?)\\\\s*:\\\\s*(.+?)\\\\s*$`);\n\nexport function parseCommentNode(node: Node): string | null {\n const savedText = bindTextByNode.get(node);\n if (typeof savedText === \"string\") {\n return savedText;\n }\n if (node.nodeType !== Node.COMMENT_NODE) {\n return null;\n }\n const commentNode = node as Comment;\n const text = commentNode.data.trim();\n const match = EMBEDDED_REGEX.exec(text);\n if (match === null) {\n return null;\n }\n // 空の場合は wcs-text として扱う\n const keyword = match[1] || config.commentTextPrefix;\n if (!bindingTypeKeywordSet.has(keyword)) {\n return null;\n }\n bindTextByNode.set(node, match[2]);\n return match[2];\n}\n\nexport function getCommentNodeBindText(node: Node): string | null {\n return bindTextByNode.get(node) || null;\n}","import { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IFragmentInfo } from \"./types\";\n\nconst fragmentInfoByUUID = new Map<string, IFragmentInfo>();\n\nexport function setFragmentInfoByUUID(uuid: string, rootNode: Node, fragmentInfo: IFragmentInfo | null): void {\n if (fragmentInfo === null) {\n fragmentInfoByUUID.delete(uuid);\n } else {\n fragmentInfoByUUID.set(uuid, fragmentInfo);\n const bindingPartial = fragmentInfo.parseBindTextResult;\n const stateElement = getStateElementByName(rootNode, bindingPartial.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${bindingPartial.stateName}\" not found for fragment info.`);\n }\n stateElement.setPathInfo(bindingPartial.statePathName, bindingPartial.bindingType);\n for(const nodeInfo of fragmentInfo.nodeInfos) {\n for(const nodeBindingPartial of nodeInfo.parseBindTextResults) {\n const nodeStateElement = getStateElementByName(rootNode, nodeBindingPartial.stateName);\n if (nodeStateElement === null) {\n raiseError(`State element with name \"${nodeBindingPartial.stateName}\" not found for fragment info node.`);\n }\n nodeStateElement.setPathInfo(nodeBindingPartial.statePathName, nodeBindingPartial.bindingType);\n }\n }\n }\n}\n\nexport function getFragmentInfoByUUID(uuid: string): IFragmentInfo | null {\n return fragmentInfoByUUID.get(uuid) || null;\n}\n\nexport function getAllFragmentUUIDs(): string[] {\n return Array.from(fragmentInfoByUUID.keys());\n}","import { config } from \"../config\";\nimport { raiseError } from \"../raiseError\";\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\nimport { parseCommentNode } from \"./parseCommentNode\";\nimport { parseBindTextForEmbeddedNode } from \"../bindTextParser/parseBindTextForEmbeddedNode\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\n\nexport function getParseBindTextResults(node: Node): ParseBindTextResult[] {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n const bindText = element.getAttribute(config.bindAttributeName) || '';\n return parseBindTextsForElement(bindText);\n } else if (node.nodeType === Node.COMMENT_NODE) {\n const bindTextOrUUID = parseCommentNode(node);\n if (bindTextOrUUID === null) {\n raiseError(`Comment node binding text not found.`);\n }\n const fragmentInfo = getFragmentInfoByUUID(bindTextOrUUID);\n let parseBindingTextResult = fragmentInfo?.parseBindTextResult ?? null;\n let uuid: string | null = null;\n if (parseBindingTextResult === null) {\n // It is not a structural fragment UUID, so treat it as bindText\n parseBindingTextResult = parseBindTextForEmbeddedNode(bindTextOrUUID);\n uuid = null;\n } else {\n uuid = bindTextOrUUID;\n }\n return [{\n ...parseBindingTextResult,\n uuid: uuid,\n }]\n }\n return [];\n}","import { parseStatePart } from \"./parseStatePart.js\";\nimport { ParseBindTextResult } from \"./types.js\";\n\nexport function parseBindTextForEmbeddedNode(bindText: string): ParseBindTextResult {\n const stateResult = parseStatePart(bindText);\n return {\n propName: 'textContent',\n propSegments: ['textContent'],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: 'text',\n }\n}","import { config } from \"../config\";\nimport { parseCommentNode } from \"./parseCommentNode\";\n\n/**\n * data-wcs 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する\n * @param root \n * @returns \n */\n\nexport function getSubscriberNodes(root: Document | Element | DocumentFragment): Node[] {\n const subscriberNodes: Node[] = [];\n const walker = document.createTreeWalker(\n root, \n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, \n {\n acceptNode(node: Node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n const hasBinding = element.hasAttribute(config.bindAttributeName);\n return hasBinding\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP;\n } else {\n // Comment node\n return parseCommentNode(node) !== null\n ? NodeFilter.FILTER_ACCEPT \n : NodeFilter.FILTER_SKIP;\n }\n }\n }\n );\n \n while (walker.nextNode()) {\n subscriberNodes.push(walker.currentNode);\n }\n return subscriberNodes;\n}","import { expandSpread, hasUnresolvedSpread } from \"../bindTextParser/expandSpread\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { raiseError } from \"../raiseError\";\nimport { resolveNodePath } from \"../structural/resolveNodePath\";\nimport { IFragmentNodeInfo } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { getBindingInfos } from \"./getBindingInfos\";\nimport { setBindingsByNode } from \"./getBindingsByNode\";\nimport { getParseBindTextResults } from \"./getParseBindTextResults\";\nimport { getSubscriberNodes } from \"./getSubscriberNodes\";\nimport { resolveInitializedBinding } from \"./initializeBindingPromiseByNode\";\n\nconst registeredNodeSet = new WeakSet<Node>();\n\nexport interface IDeferredSpreadEntry {\n readonly node: Node;\n readonly tagName: string;\n readonly parseResults: ParseBindTextResult[];\n}\n\nfunction processParseResultsForNode(\n node: Node,\n parseResults: ParseBindTextResult[],\n options: { allowDeferred: boolean },\n): { bindings: IBindingInfo[], deferred: IDeferredSpreadEntry | null } {\n const expanded = expandSpread(node, parseResults, { allowDeferred: options.allowDeferred });\n if (hasUnresolvedSpread(expanded)) {\n const tagName = node.nodeType === Node.ELEMENT_NODE\n ? getCustomElement(node as Element)\n : null;\n if (tagName === null) {\n raiseError(`Spread binding deferred but element is not a custom element.`);\n }\n return { bindings: [], deferred: { node, tagName, parseResults } };\n }\n registeredNodeSet.add(node);\n const bindings = getBindingInfos(node, expanded);\n setBindingsByNode(node, bindings);\n resolveInitializedBinding(node);\n return { bindings, deferred: null };\n}\n\nexport function collectNodesAndBindingInfos(\n root: Document | Element | DocumentFragment\n): [ Node[], IBindingInfo[], IDeferredSpreadEntry[] ] {\n const subscriberNodes = getSubscriberNodes(root);\n const allBindings: IBindingInfo[] = [];\n const deferredSpreads: IDeferredSpreadEntry[] = [];\n for(const node of subscriberNodes) {\n if (registeredNodeSet.has(node)) continue;\n const parseResults = getParseBindTextResults(node);\n const result = processParseResultsForNode(node, parseResults, { allowDeferred: true });\n if (result.deferred !== null) {\n deferredSpreads.push(result.deferred);\n continue;\n }\n allBindings.push(...result.bindings);\n }\n return [subscriberNodes, allBindings, deferredSpreads];\n}\n\nexport function collectNodesAndBindingInfosByFragment(\n root: DocumentFragment,\n nodeInfos: IFragmentNodeInfo[],\n): [ Node[], IBindingInfo[] ] {\n const nodes: Node[] = [];\n const allBindings: IBindingInfo[] = [];\n for(const nodeInfo of nodeInfos) {\n const node = resolveNodePath(root, nodeInfo.nodePath);\n if (node === null) {\n raiseError(`Node not found by path [${nodeInfo.nodePath.join(', ')}] in fragment.`);\n }\n if (registeredNodeSet.has(node)) continue;\n const result = processParseResultsForNode(node, nodeInfo.parseBindTextResults, { allowDeferred: false });\n // deferred is impossible when allowDeferred=false (expandSpread raises instead)\n allBindings.push(...result.bindings);\n nodes.push(node);\n }\n return [nodes, allBindings];\n}\n\nexport function unregisterNode(node: Node): void {\n registeredNodeSet.delete(node);\n}\n\n/**\n * RowPlan 経路(createContent のプラン実体化)用。パース・spread 展開を経ずに\n * binding を組み立てた subscriber ノードを二重処理防止台帳へ載せる\n * (後続の collectNodesAndBindingInfos による再スキャンから保護)。\n */\nexport function markNodeRegistered(node: Node): void {\n registeredNodeSet.add(node);\n}\n\n/**\n * Re-process a deferred spread entry once the custom element class is\n * registered. Expands the captured parseResults, installs bindings, and\n * returns them so the caller can attach handlers and apply state values.\n */\nexport function processDeferredNode(entry: IDeferredSpreadEntry): IBindingInfo[] {\n const { node, parseResults } = entry;\n unregisterNode(node);\n const result = processParseResultsForNode(node, parseResults, { allowDeferred: false });\n return result.bindings;\n}\n","import { IBindingInfo } from \"../types\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\n\nexport function getBindingInfos(node: Node, parseBindingTextResults: ParseBindTextResult[]): IBindingInfo[] {\n const bindingInfos: IBindingInfo[] = [];\n for (const parseBindingTextResult of parseBindingTextResults) {\n if (parseBindingTextResult.bindingType !== 'text') {\n bindingInfos.push({\n ...parseBindingTextResult,\n node: node,\n replaceNode: node,\n });\n } else {\n // フラグメント登録時に事前正規化済みの Text ノードはそのまま replaceNode に\n // 使う(node === replaceNode なら replaceToReplaceNode は no-op)。\n // 実 DOM 上の wcs-text コメント(非フラグメント経路)は従来どおり\n // 空 Text を生成して実行時に差し替える。\n const replaceNode = node.nodeType === Node.TEXT_NODE\n ? node\n : document.createTextNode('');\n bindingInfos.push({\n ...parseBindingTextResult,\n node: node,\n replaceNode: replaceNode,\n });\n }\n }\n return bindingInfos;\n}\n","import { ILoopContext } from \"./types\";\n\nconst loopContextByNode = new WeakMap<Node, ILoopContext>();\n\nexport function getLoopContextByNode(node: Node): ILoopContext | null {\n let paramNode: Node | null = node;\n while (paramNode) {\n const loopContext = loopContextByNode.get(paramNode);\n if (loopContext) {\n return loopContext;\n }\n paramNode = paramNode.parentNode;\n }\n return null;\n}\n\nexport function setLoopContextByNode(node: Node, loopContext: ILoopContext | null): void {\n if (loopContext === null) {\n loopContextByNode.delete(node);\n return;\n }\n loopContextByNode.set(node, loopContext);\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\n\nconst lastListValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, readonly unknown[]> = new WeakMap();\n\nexport function getLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): readonly unknown[] {\n return lastListValueByAbsoluteStateAddress.get(address) ?? [];\n}\n\nexport function setLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress, value: readonly unknown[]): void {\n lastListValueByAbsoluteStateAddress.set(address, value);\n}\n\nexport function clearLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): void {\n lastListValueByAbsoluteStateAddress.delete(address);\n}\n\nexport function hasLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): boolean {\n return lastListValueByAbsoluteStateAddress.has(address);\n}\n","\nexport const setLoopContextAsyncSymbol: unique symbol = Symbol(\"$$setLoopContextAsync\");\nexport const setLoopContextSymbol: unique symbol = Symbol(\"$$setLoopContext\");\nexport const getByAddressSymbol: unique symbol = Symbol(\"$$getByAddress\");\nexport const hasByAddressSymbol: unique symbol = Symbol(\"$$hasByAddress\");\nexport const setByAddressSymbol: unique symbol = Symbol(\"$$setByAddress\");\nexport const connectedCallbackSymbol: unique symbol = Symbol(\"$$connectedCallback\");\nexport const disconnectedCallbackSymbol: unique symbol = Symbol(\"$$disconnectedCallback\");\nexport const updatedCallbackSymbol: unique symbol = Symbol(\"$$updatedCallback\");\n","import { IStateElement } from \"../components/types\";\nimport { IAbsolutePathInfo, IPathInfo } from \"./types\";\n\nconst _cache: WeakMap<IStateElement, WeakMap<IPathInfo, IAbsolutePathInfo>> = new WeakMap();\n\nexport function getAbsolutePathInfo(stateElement: IStateElement, pathInfo: IPathInfo): IAbsolutePathInfo {\n if (_cache.has(stateElement)) {\n const pathMap = _cache.get(stateElement)!;\n if (pathMap.has(pathInfo)) {\n return pathMap.get(pathInfo)!;\n }\n } else {\n _cache.set(stateElement, new WeakMap());\n }\n const absolutePathInfo = Object.freeze(new AbsolutePathInfo(stateElement, pathInfo));\n _cache.get(stateElement)!.set(pathInfo, absolutePathInfo);\n return absolutePathInfo;\n}\n\nclass AbsolutePathInfo implements IAbsolutePathInfo {\n readonly pathInfo: IPathInfo;\n readonly stateName: string;\n readonly stateElement: IStateElement;\n readonly parentAbsolutePathInfo: IAbsolutePathInfo | null;\n constructor(stateElement: IStateElement, pathInfo: IPathInfo) {\n this.pathInfo = pathInfo;\n this.stateName = stateElement.name;\n this.stateElement = stateElement;\n if (pathInfo.parentPathInfo === null) {\n this.parentAbsolutePathInfo = null;\n } else {\n this.parentAbsolutePathInfo = getAbsolutePathInfo(stateElement, pathInfo.parentPathInfo);\n }\n }\n}","import { WILDCARD } from \"../define\";\nimport { IListIndex } from \"../list/types\";\nimport { IAbsolutePathInfo, IAbsoluteStateAddress } from \"./types\";\n\nconst _cache: WeakMap<IListIndex, WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>> = new WeakMap();\nconst _cacheNullListIndex: WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress> = new WeakMap();\n\nclass AbsoluteStateAddress implements IAbsoluteStateAddress {\n readonly absolutePathInfo: IAbsolutePathInfo;\n readonly listIndex: IListIndex | null;\n private _parentAbsoluteAddress: IAbsoluteStateAddress | null | undefined;\n\n constructor(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null) {\n this.absolutePathInfo = absolutePathInfo;\n this.listIndex = listIndex;\n }\n\n get parentAbsoluteAddress(): IAbsoluteStateAddress | null {\n if (typeof this._parentAbsoluteAddress !== 'undefined') {\n return this._parentAbsoluteAddress;\n }\n const parentAbsolutePathInfo = this.absolutePathInfo.parentAbsolutePathInfo;\n if (parentAbsolutePathInfo === null) {\n return null;\n }\n const lastSegment = this.absolutePathInfo.pathInfo.segments[this.absolutePathInfo.pathInfo.segments.length - 1];\n let parentListIndex: IListIndex | null = null;\n if (lastSegment === WILDCARD) {\n parentListIndex = this.listIndex?.parentListIndex ?? null;\n } else {\n parentListIndex = this.listIndex;\n }\n return this._parentAbsoluteAddress = createAbsoluteStateAddress(\n parentAbsolutePathInfo,\n parentListIndex\n );\n }\n}\n\nexport function createAbsoluteStateAddress(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null): IAbsoluteStateAddress {\n if (listIndex === null) {\n let cached = _cacheNullListIndex.get(absolutePathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new AbsoluteStateAddress(absolutePathInfo, null);\n _cacheNullListIndex.set(absolutePathInfo, cached);\n return cached;\n } else {\n let cacheByAbsolutePathInfo = _cache.get(listIndex);\n if (typeof cacheByAbsolutePathInfo === \"undefined\") {\n cacheByAbsolutePathInfo = new WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>();\n _cache.set(listIndex, cacheByAbsolutePathInfo);\n }\n let cached = cacheByAbsolutePathInfo.get(absolutePathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new AbsoluteStateAddress(absolutePathInfo, listIndex);\n cacheByAbsolutePathInfo.set(absolutePathInfo, cached);\n return cached;\n }\n}\n","\nconst rootNodeByFragment: WeakMap<DocumentFragment, Node> = new WeakMap();\n\nexport function setRootNodeByFragment(fragment: DocumentFragment, rootNode: Node | null): void {\n if (rootNode === null) {\n rootNodeByFragment.delete(fragment);\n } else {\n rootNodeByFragment.set(fragment, rootNode);\n }\n}\n\nexport function getRootNodeByFragment(fragment: DocumentFragment): Node | null {\n return rootNodeByFragment.get(fragment) || null;\n}\n","import { IPathInfo } from \"./types.js\";\n\nconst cacheCalcWildcardLen: Map<string, number> = new Map(); \n\nexport function calcWildcardLen(pathInfo: IPathInfo, targetPathInfo: IPathInfo): number {\n let path1: IPathInfo;\n let path2: IPathInfo;\n if (pathInfo.wildcardCount === 0 || targetPathInfo.wildcardCount === 0) {\n return 0;\n }\n if (pathInfo.wildcardCount === 1 \n && targetPathInfo.wildcardCount > 0 \n && targetPathInfo.wildcardPathSet.has(pathInfo.path)) {\n return 1;\n }\n if (pathInfo.id < targetPathInfo.id) {\n path1 = pathInfo;\n path2 = targetPathInfo;\n } else {\n path1 = targetPathInfo;\n path2 = pathInfo;\n }\n const key = `${path1.path}\\t${path2.path}`;\n let len = cacheCalcWildcardLen.get(key);\n if (typeof len !== \"undefined\") {\n return len;\n }\n const matchPath = path1.wildcardPathSet.intersection(path2.wildcardPathSet);\n len = matchPath.size;\n cacheCalcWildcardLen.set(key, len);\n return len;\n}\n\n","import { calcWildcardLen } from \"../address/calcWildcardLen\";\nimport { IBindingInfo } from \"../types\";\nimport { getLoopContextByNode } from \"./loopContextByNode\";\nimport { IListIndex, ILoopContext } from \"./types\";\n\nconst listIndexByBindingInfoByLoopContext: WeakMap<ILoopContext, WeakMap<IBindingInfo, IListIndex | null>> = new WeakMap();\n\nexport function getListIndexByBindingInfo(bindingInfo: IBindingInfo): IListIndex | null {\n const loopContext = getLoopContextByNode(bindingInfo.node);\n if (loopContext === null) {\n return null;\n }\n let listIndexByBindingInfo = listIndexByBindingInfoByLoopContext.get(loopContext);\n if (typeof listIndexByBindingInfo === \"undefined\") {\n listIndexByBindingInfo = new WeakMap<IBindingInfo, IListIndex | null>();\n listIndexByBindingInfoByLoopContext.set(loopContext, listIndexByBindingInfo);\n } else {\n const listIndex = listIndexByBindingInfo.get(bindingInfo);\n if (typeof listIndex !== \"undefined\") {\n return listIndex;\n }\n }\n\n let listIndex: IListIndex | null = null;\n try {\n const wildcardLen = calcWildcardLen(loopContext.pathInfo, bindingInfo.statePathInfo);\n if (wildcardLen > 0) {\n listIndex = loopContext.listIndex.at(wildcardLen - 1);\n }\n return listIndex;\n } finally {\n listIndexByBindingInfo.set(bindingInfo, listIndex);\n }\n\n}\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { IAbsoluteStateAddress } from \"../address/types\";\nimport { getRootNodeByFragment } from \"../apply/rootNodeByFragment\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"./types\";\n\nconst absoluteStateAddressByBinding: WeakMap<IBindingInfo, IAbsoluteStateAddress> = new WeakMap();\n\n/**\n * binding の解決済み root を返す。knownRootNode があれば getRootNode() と\n * fragment フォールバックを省略する(リスト行活性化のホットパス)。\n */\nexport function resolveBindingRootNode(binding: IBindingInfo, knownRootNode?: Node | null): Node {\n if (knownRootNode != null) {\n return knownRootNode;\n }\n let rootNode: Node = binding.replaceNode.getRootNode() as Node;\n // binding.replaceNodeはisConnected=trueになっていることが前提、切断されている場合はraiseErrorを返す\n if (binding.replaceNode.isConnected === false) {\n // DocumentFragmentでバッファリングされている場合は、ルートノードをDocumentFragmentから実際のルートノードに切り替える\n const rootNodeByFragment = getRootNodeByFragment(rootNode as DocumentFragment);\n if (rootNodeByFragment === null) {\n raiseError(`Cannot get absolute state address for disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`);\n } else {\n rootNode = rootNodeByFragment;\n }\n }\n return rootNode;\n}\n\nexport function getAbsoluteStateAddressByBinding(binding: IBindingInfo, knownRootNode?: Node | null): IAbsoluteStateAddress {\n // 切断されていても、キャッシュされていれば絶対状態アドレスを返す。\n let absoluteStateAddress: IAbsoluteStateAddress | null = null;\n absoluteStateAddress = absoluteStateAddressByBinding.get(binding) || null;\n if (absoluteStateAddress !== null) {\n return absoluteStateAddress;\n }\n\n const rootNode: Node = resolveBindingRootNode(binding, knownRootNode);\n\n const listIndex = getListIndexByBindingInfo(binding);\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n const absolutePathInfo = getAbsolutePathInfo(stateElement, binding.statePathInfo);\n absoluteStateAddress = \n createAbsoluteStateAddress(absolutePathInfo, listIndex);\n absoluteStateAddressByBinding.set(binding, absoluteStateAddress);\n return absoluteStateAddress;\n}\n\nexport function clearAbsoluteStateAddressByBinding(binding: IBindingInfo) {\n absoluteStateAddressByBinding.delete(binding);\n}","/**\n * devtools/sink.ts\n *\n * 計装点が参照するホットパス唯一の接点。依存ゼロの葉モジュールにすることで、\n * 計装される側(stateElementByName / setByAddress / binding / token)と\n * bridge の間の循環 import を避ける。\n *\n * コスト規範(protocol §1-1): フック未接続時、計装点のコストは\n * `devtoolsSink !== null` の分岐 1 個。イベントオブジェクトの生成は\n * 必ずこのチェックの内側で行うこと。\n */\n\nimport type { DevtoolsSink } from \"./types\";\n\n/** live binding としてエクスポート。計装点は `if (devtoolsSink !== null)` で参照する */\nexport let devtoolsSink: DevtoolsSink | null = null;\n\nexport function setDevtoolsSink(sink: DevtoolsSink | null): void {\n devtoolsSink = sink;\n}\n","import { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { IAbsolutePathInfo, IAbsoluteStateAddress } from \"../address/types\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { IListIndex } from \"../list/types\";\nimport { IBindingInfo } from \"./types\";\n\n/**\n * 絶対アドレス → 登録 binding の台帳。\n *\n * リスト行の絶対アドレスは (absolutePathInfo, listIndex) の組ごとに一意で、\n * 登録される binding は通常 1 本しかない。アドレスごとに Set を確保すると\n * 行×binding の数だけ Set アロケーションが積み上がるため、単一値で持ち\n * 2 本目から Set に昇格する(interestedSessionsByNode と同じ前例)。\n */\nconst bindingsByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, IBindingInfo | Set<IBindingInfo>> = new WeakMap();\n\n/**\n * 参照専用の取得。未登録アドレスにエントリを生成・キャッシュしない\n * (リスト置換の drain は大量のバインディング無しアドレスを照会するため、\n * 生成すると空エントリが溜まり続ける)。\n * 戻り値は単一 binding(登録 1 本)か Set(2 本以上)のどちらか。\n * 呼び出し側は Set を変異してはならない(instanceof で分岐できるよう\n * ReadonlySet でなく Set 型で返す)。\n */\nexport function peekBindingsByAbsoluteStateAddress(\n absoluteStateAddress: IAbsoluteStateAddress,\n): IBindingInfo | Set<IBindingInfo> | undefined {\n return bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n}\n\nexport function addBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\n const current = bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n if (typeof current === \"undefined\") {\n bindingsByAbsoluteStateAddress.set(absoluteStateAddress, binding);\n } else if (current instanceof Set) {\n current.add(binding);\n } else if (current !== binding) {\n bindingsByAbsoluteStateAddress.set(absoluteStateAddress, new Set([current, binding]));\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-added\", absoluteAddress: absoluteStateAddress, binding });\n }\n}\n\nexport function clearBindingSetByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): void {\n bindingsByAbsoluteStateAddress.delete(absoluteStateAddress);\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-cleared\", absoluteAddress: absoluteStateAddress });\n }\n}\n\nexport function removeBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\n const current = bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n if (typeof current === \"undefined\") {\n return;\n }\n if (current instanceof Set) {\n current.delete(binding);\n } else if (current === binding) {\n bindingsByAbsoluteStateAddress.delete(absoluteStateAddress);\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-removed\", absoluteAddress: absoluteStateAddress, binding });\n }\n}\n\n/**\n * パターン索引台帳(リスト行バインディング専用・docs/state-row-instantiation-redesign.md §3-3)。\n *\n * 行バインディングは (absolutePathInfo, listIndex) の 2 段キーで登録し、登録側では\n * AbsoluteStateAddress の intern(アドレスオブジェクト割当 + listIndex ごとの\n * intern 用 WeakMap)を一切行わない。書き込み側(setByAddress → enqueue)は従来\n * どおり intern 済みアドレスを使うため、drain はアドレスの構成要素\n * (absolutePathInfo / listIndex — どちらもオブジェクト同一性が保証済み)で\n * このパターン台帳を引ける。リオーダーは listIndex 同一性キーの帰結として\n * 従来同様ゼロタッチ。wholesale destroy は従来同様削除ゼロ(listIndex ごと GC 崩壊)。\n *\n * devtools 計装(state:binding-added/removed)はプロトコル契約なので、sink 接続時に\n * 限りアドレスを intern してイベントを流す(フック未接続時のコストは分岐 1 個の規範を維持)。\n */\nconst patternLedger: WeakMap<IAbsolutePathInfo, WeakMap<IListIndex, IBindingInfo | Set<IBindingInfo>>> = new WeakMap();\n\nexport function addBindingByPattern(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex, binding: IBindingInfo): void {\n let rowMap = patternLedger.get(absolutePathInfo);\n if (typeof rowMap === \"undefined\") {\n rowMap = new WeakMap();\n patternLedger.set(absolutePathInfo, rowMap);\n }\n const current = rowMap.get(listIndex);\n if (typeof current === \"undefined\") {\n rowMap.set(listIndex, binding);\n } else if (current instanceof Set) {\n current.add(binding);\n } else if (current !== binding) {\n rowMap.set(listIndex, new Set([current, binding]));\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-added\", absoluteAddress: createAbsoluteStateAddress(absolutePathInfo, listIndex), binding });\n }\n}\n\nexport function removeBindingByPattern(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex, binding: IBindingInfo): void {\n const rowMap = patternLedger.get(absolutePathInfo);\n if (typeof rowMap === \"undefined\") {\n return;\n }\n const current = rowMap.get(listIndex);\n if (typeof current === \"undefined\") {\n return;\n }\n if (current instanceof Set) {\n current.delete(binding);\n } else if (current === binding) {\n rowMap.delete(listIndex);\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-removed\", absoluteAddress: createAbsoluteStateAddress(absolutePathInfo, listIndex), binding });\n }\n}\n\n/**\n * drain(updater)用の統合参照。従来台帳 → パターン台帳の順に引く。\n * 従来台帳を先に引くのは、listIndex 付きでも旧経路(SSR ハイドレーション等)で\n * アドレス台帳に登録される可能性を許容するため(取りこぼし防止)。\n */\nexport function peekBindingsForAddress(\n absoluteStateAddress: IAbsoluteStateAddress,\n): IBindingInfo | Set<IBindingInfo> | undefined {\n const entry = bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n if (typeof entry !== \"undefined\") {\n return entry;\n }\n if (absoluteStateAddress.listIndex === null) {\n return undefined;\n }\n return patternLedger.get(absoluteStateAddress.absolutePathInfo)?.get(absoluteStateAddress.listIndex);\n}\n","import { WILDCARD } from \"../define\";\nimport { IListIndex } from \"../list/types\";\nimport { IPathInfo, IStateAddress } from \"./types\";\n\nconst _cache: WeakMap<IListIndex, WeakMap<IPathInfo, IStateAddress>> = new WeakMap();\nconst _cacheNullListIndex: WeakMap<IPathInfo, IStateAddress> = new WeakMap();\n\nclass StateAddress implements IStateAddress {\n readonly pathInfo: IPathInfo;\n readonly listIndex: IListIndex | null;\n private _parentAddress: IStateAddress | null | undefined;\n\n constructor(pathInfo: IPathInfo, listIndex: IListIndex | null) {\n this.pathInfo = pathInfo;\n this.listIndex = listIndex;\n }\n\n get parentAddress(): IStateAddress | null {\n if (typeof this._parentAddress !== 'undefined') {\n return this._parentAddress;\n }\n const parentPathInfo = this.pathInfo.parentPathInfo;\n if (parentPathInfo === null) {\n return null;\n }\n const lastSegment = this.pathInfo.segments[this.pathInfo.segments.length - 1];\n let parentListIndex: IListIndex | null = null;\n if (lastSegment === WILDCARD) {\n parentListIndex = this.listIndex?.parentListIndex ?? null;\n } else {\n parentListIndex = this.listIndex;\n }\n return this._parentAddress = createStateAddress(parentPathInfo, parentListIndex);\n }\n}\n\nexport function createStateAddress(pathInfo: IPathInfo, listIndex: IListIndex | null): IStateAddress {\n if (listIndex === null) {\n let cached = _cacheNullListIndex.get(pathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new StateAddress(pathInfo, null);\n _cacheNullListIndex.set(pathInfo, cached);\n return cached;\n } else {\n let cacheByPathInfo = _cache.get(listIndex);\n if (typeof cacheByPathInfo === \"undefined\") {\n cacheByPathInfo = new WeakMap<IPathInfo, IStateAddress>();\n _cache.set(listIndex, cacheByPathInfo);\n }\n let cached = cacheByPathInfo.get(pathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new StateAddress(pathInfo, listIndex);\n cacheByPathInfo.set(pathInfo, cached);\n return cached;\n }\n}","import { createStateAddress } from \"../address/StateAddress\";\nimport { IStateAddress } from \"../address/types\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\n\nconst stateAddressByBindingInfo: WeakMap<IBindingInfo, IStateAddress> = new WeakMap();\n\nexport function getStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\n let stateAddress: IStateAddress | null = null;\n stateAddress = stateAddressByBindingInfo.get(bindingInfo) || null;\n if (stateAddress !== null) {\n return stateAddress;\n }\n if (bindingInfo.statePathInfo.wildcardCount > 0) {\n const listIndex = getListIndexByBindingInfo(bindingInfo);\n if (listIndex === null) {\n raiseError(`Cannot resolve state address for binding with wildcard statePathName \"${bindingInfo.statePathName}\" because list index is null.`);\n }\n stateAddress = createStateAddress(bindingInfo.statePathInfo, listIndex);\n } else {\n stateAddress = createStateAddress(bindingInfo.statePathInfo, null);\n }\n stateAddressByBindingInfo.set(bindingInfo, stateAddress);\n return stateAddress;\n}\n\n// call for change loopContext\nexport function clearStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\n stateAddressByBindingInfo.delete(bindingInfo);\n}","import { IBindingInfo } from \"../types\";\n\n/**\n * イベントハンドラ登録の台帳。\n *\n * 旧実装は Map<string, Set<IBindingInfo>>(文字列キーの強参照 Map)で binding を\n * 保持していたため、binding.node → 行 DOM サブツリー全体が解放不能だった\n * (detach 系はほぼ呼ばれないため、リスト削除後も全イベントバインディングが\n * 永久保持されるリーク。clear-10k 後に 10k 行分の detached DOM が残留していた)。\n *\n * WeakSet(帰属判定・冪等性)と件数カウンタ(「最後の 1 件が外れたらハンドラを\n * 掃除する」判定)に分離し、binding を強参照しない。GC で binding が消えた場合\n * カウンタは減らないが、残るのはキー文字列と数値のみで実害はない。\n */\nexport interface IHandlerBindingRegistry {\n /** binding を key に登録する。新規登録なら true を返す(既登録は冪等に false) */\n add(key: string, binding: IBindingInfo): boolean;\n /** binding を key から外す。key の登録件数が 0 になったら true を返す */\n remove(key: string, binding: IBindingInfo): boolean;\n has(key: string, binding: IBindingInfo): boolean;\n countOf(key: string): number;\n readonly keyCount: number;\n clear(): void;\n}\n\nexport function createHandlerBindingRegistry(): IHandlerBindingRegistry {\n const attachedByKey = new Map<string, WeakSet<IBindingInfo>>();\n const countByKey = new Map<string, number>();\n return {\n add(key: string, binding: IBindingInfo): boolean {\n let attached = attachedByKey.get(key);\n if (typeof attached === \"undefined\") {\n attached = new WeakSet<IBindingInfo>();\n attachedByKey.set(key, attached);\n }\n if (attached.has(binding)) {\n return false;\n }\n attached.add(binding);\n countByKey.set(key, (countByKey.get(key) ?? 0) + 1);\n return true;\n },\n remove(key: string, binding: IBindingInfo): boolean {\n const attached = attachedByKey.get(key);\n if (typeof attached === \"undefined\" || !attached.has(binding)) {\n return false;\n }\n attached.delete(binding);\n const next = (countByKey.get(key) ?? 1) - 1;\n if (next <= 0) {\n attachedByKey.delete(key);\n countByKey.delete(key);\n return true;\n }\n countByKey.set(key, next);\n return false;\n },\n has(key: string, binding: IBindingInfo): boolean {\n return attachedByKey.get(key)?.has(binding) ?? false;\n },\n countOf(key: string): number {\n return countByKey.get(key) ?? 0;\n },\n get keyCount(): number {\n return countByKey.size;\n },\n clear(): void {\n attachedByKey.clear();\n countByKey.clear();\n },\n };\n}\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n let eventName = 'input';\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nconst checkboxEventHandlerFunction = (\n stateName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n) => (event: Event): any => {\n const node = event.target as HTMLInputElement;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n if (node.type !== 'checkbox') {\n console.warn(`[@wcstack/state] event.target is not a checkbox input element.`);\n return;\n }\n const checked = node.checked;\n const newValue = node.value;\n let filteredNewValue: unknown = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n let currentValue = state[statePathName];\n if (Array.isArray(currentValue)) {\n if (checked) {\n if (currentValue.indexOf(filteredNewValue) === -1) {\n state[statePathName] = currentValue.concat(filteredNewValue);\n }\n } else {\n const index = currentValue.indexOf(filteredNewValue);\n if (index !== -1) {\n state[statePathName] = currentValue.toSpliced(index, 1);\n }\n }\n } else {\n if (checked) {\n state[statePathName] = [filteredNewValue];\n } else {\n state[statePathName] = [];\n }\n }\n });\n });\n}\n\nexport function attachCheckboxEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n let checkboxEventHandler = handlerByHandlerKey.get(key);\n if (typeof checkboxEventHandler === \"undefined\") {\n checkboxEventHandler = checkboxEventHandlerFunction(\n binding.stateName,\n binding.statePathName,\n binding.inFilters\n );\n handlerByHandlerKey.set(key, checkboxEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, checkboxEventHandler);\n bindingRegistry.add(key, binding);\n return true;\n }\n return false;\n}\n\nexport function detachCheckboxEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n const checkboxEventHandler = handlerByHandlerKey.get(key);\n if (typeof checkboxEventHandler === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(eventName, checkboxEventHandler);\n\n if (bindingRegistry.countOf(key) === 0) {\n return false;\n }\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n return true;\n }\n return false;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n getHandlerKey,\n getEventName,\n checkboxEventHandlerFunction,\n};\n","// command-token / event-token が共有する pub/sub プリミティブ。\n// _subscribers は Set のため挿入順を保持する。\n// emit() は subscribe() された順に呼び出され、戻り値配列も同じ順序で返る。\n//\n// 「誰が subscribe し誰が emit するか」だけが command / event の違い:\n// - command-token: element が subscribe / state が emit\n// - event-token: state(`$on`) が subscribe / element(listener) が emit\n\nexport type TokenSubscriber = (...args: unknown[]) => unknown;\n\nexport interface IToken {\n readonly name: string;\n readonly size: number;\n subscribe(fn: TokenSubscriber): () => void;\n unsubscribe(fn: TokenSubscriber): boolean;\n emit(...args: unknown[]): unknown[];\n}\n\nexport class Token implements IToken {\n private _name: string;\n private _subscribers: Set<TokenSubscriber> = new Set();\n\n constructor(name: string) {\n this._name = name;\n }\n\n get name(): string {\n return this._name;\n }\n\n get size(): number {\n return this._subscribers.size;\n }\n\n subscribe(fn: TokenSubscriber): () => void {\n this._subscribers.add(fn);\n return () => {\n this._subscribers.delete(fn);\n };\n }\n\n unsubscribe(fn: TokenSubscriber): boolean {\n return this._subscribers.delete(fn);\n }\n\n emit(...args: unknown[]): unknown[] {\n const results: unknown[] = [];\n for (const fn of this._subscribers) {\n results.push(fn(...args));\n }\n return results;\n }\n}\n","import { devtoolsSink } from \"../devtools/sink\";\nimport { Token } from \"../token/Token\";\n\n// EventToken は共有 pub/sub プリミティブ Token の薄い特化(element→state 方向)。\n// instanceof による型判別を成立させるため独立クラスとして維持する。\n//\n// ownerStateName は devtools 計装(protocol §4.5)のための内部 optional 引数。\n// event-token-protocol の外部仕様は不変更。\nexport class EventToken extends Token {\n private _ownerStateName: string | null;\n\n constructor(name: string, ownerStateName?: string) {\n super(name);\n this._ownerStateName = ownerStateName ?? null;\n }\n\n emit(...args: unknown[]): unknown[] {\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"state:token-emit\",\n kind: \"event\",\n stateName: this._ownerStateName,\n tokenName: this.name,\n args,\n subscriberCount: this.size,\n });\n }\n return super.emit(...args);\n }\n}\n\nexport function isEventToken(value: unknown): value is EventToken {\n return value instanceof EventToken;\n}\n","import { IStateElement } from \"../components/types\";\nimport { EventToken } from \"./EventToken\";\n\nconst registryByStateElement: WeakMap<IStateElement, Map<string, EventToken>> = new WeakMap();\n\nexport function getOrCreateEventToken(stateElement: IStateElement, name: string): EventToken {\n let registry = registryByStateElement.get(stateElement);\n if (typeof registry === \"undefined\") {\n registry = new Map<string, EventToken>();\n registryByStateElement.set(stateElement, registry);\n }\n let token = registry.get(name);\n if (typeof token === \"undefined\") {\n token = new EventToken(name, stateElement.name);\n registry.set(name, token);\n }\n return token;\n}\n\nexport function clearEventTokenRegistry(stateElement: IStateElement): void {\n registryByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n registryByStateElement,\n};\n","/**\n * eventToken.<propertyName>: <eventTokenName> バインディングの attach ハンドラ。\n *\n * command-token の双対(element→state)。要素が dispatch する CustomEvent を受けて\n * event-token を emit し、state 側の `$on` ハンドラ群へ pub/sub で配送する。\n *\n * 設計(MVP スコープ: wc-bindable カスタム要素のみ):\n * - キーは生イベント名ではなく **wcBindable property 名**。実 DOM イベント名は\n * wcBindable.properties[].event から解決する(command-token が wcBindable.commands で\n * 検証するのと対称。コロンを含む namespaced event 名と binding 構文の `:` 衝突も回避)。\n * - <prop> が wcBindable.properties に宣言されていることは attach 時に検証する\n * (要素クラス参照のみで DOM 接続に非依存。fail-fast / typo 耐性)。\n * - <eventTokenName> が $eventTokens に宣言されていることは **発火時** に検証する\n * (state 解決が必要なため。詳細は下記の fire-time 解決の注記を参照)。\n * - subscriber 引数規約は `(state, event, ...listIndexes)`。\n * - modifier `#prevent` / `#stop` は既存イベント binding と同等にサポート。\n *\n * token はイベント発火ごとに registry から解決する(getOrCreateEventToken)。これにより\n * state の再 set で registry が作り直されても最新の subscriber 群へ配送できる。\n *\n * state element の解決と `$eventTokens` 検証は **発火時** に行う(attach 時ではない)。\n * 構造ブロック(for/if)や SSR hydration では、binding 初期化時にノードが detached な\n * DocumentFragment / wrapper 上にあり、その時点では element.getRootNode() から state を\n * 解決できないため。onclick / two-way ハンドラと同じく fire-time 解決に揃えている。\n */\n\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration, ReadBindableResult } from \"../protocol/wcBindableReader\";\nimport { IBindingInfo } from \"../types\";\nimport { getOrCreateEventToken } from \"./eventTokenRegistry\";\n\ninterface IEventTokenListener {\n readonly eventName: string;\n readonly handler: (event: Event) => void;\n}\n\nconst listenerByBinding: WeakMap<IBindingInfo, IEventTokenListener> = new WeakMap();\n\nfunction getWcBindable(element: Element): ReadBindableResult | null {\n const customTagName = getCustomElement(element);\n if (customTagName === null) {\n return null;\n }\n // attach 側で未定義要素は whenDefined 後に再試行するため、ここに来る時点で customClass は定義済み。\n return readBindableDeclaration(element);\n}\n\nexport function attachEventTokenHandler(binding: IBindingInfo): boolean {\n if (binding.propSegments[0] !== \"eventToken\") {\n return false;\n }\n const element = binding.node as Element;\n\n // カスタム要素が未定義なら定義後に再試行(wcBindable が必要なため)。\n const customTagName = getCustomElement(element);\n const registry = getCustomElementRegistry();\n if (customTagName !== null && registry?.get(customTagName) === undefined) {\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${customTagName}>.`);\n }\n return true;\n }\n\n // 再評価で二重 attach しない。\n if (listenerByBinding.has(binding)) {\n return true;\n }\n\n const propertyName = binding.propSegments[1];\n if (typeof propertyName !== \"string\" || propertyName.length === 0) {\n raiseError(`eventToken binding requires a property name (e.g., \"eventToken.error\").`);\n }\n\n const bindable = getWcBindable(element);\n if (bindable === null) {\n raiseError(`eventToken binding requires a wc-bindable custom element. <${element.tagName.toLowerCase()}> is not wc-bindable.`);\n }\n const propDesc = bindable.knownProperties.get(propertyName);\n if (typeof propDesc === \"undefined\") {\n raiseError(`Property \"${propertyName}\" is not declared in wcBindable.properties of <${element.tagName.toLowerCase()}>.`);\n }\n const eventName = propDesc.event;\n\n const tokenName = binding.statePathName;\n const stateName = binding.stateName;\n const modifiers = binding.propModifiers;\n const handler = (event: Event): void => {\n if (modifiers.includes(\"prevent\")) event.preventDefault();\n if (modifiers.includes(\"stop\")) event.stopPropagation();\n\n // state は発火時の live root から解決する(attach 時は detached の可能性があるため)。\n const rootNode = element.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for eventToken handler.`);\n }\n if (!stateElement.eventTokenNames.has(tokenName)) {\n raiseError(`eventToken \"${tokenName}\" is not declared in $eventTokens of state \"${stateName}\".`);\n }\n const loopContext = getLoopContextByNode(element);\n stateElement.createStateAsync(\"writable\", async (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n const indexes = loopContext?.listIndex.indexes ?? [];\n const token = getOrCreateEventToken(stateElement, tokenName);\n return token.emit(state, event, ...indexes);\n });\n });\n };\n\n element.addEventListener(eventName, handler);\n listenerByBinding.set(binding, { eventName, handler });\n return true;\n}\n\nexport function detachEventTokenHandler(binding: IBindingInfo): boolean {\n if (binding.propSegments[0] !== \"eventToken\") {\n return false;\n }\n const listener = listenerByBinding.get(binding);\n if (typeof listener === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(listener.eventName, listener.handler);\n listenerByBinding.delete(binding);\n return true;\n}\n\nexport const __private__ = {\n listenerByBinding,\n};\n","import { devtoolsSink } from \"../devtools/sink\";\nimport { Token } from \"../token/Token\";\nimport { ICommandToken } from \"./types\";\n\n// CommandToken は共有 pub/sub プリミティブ Token の薄い特化。\n// instanceof による型判別を成立させるため独立クラスとして維持する。\n//\n// ownerStateName は devtools 計装(protocol §4.5)のための内部 optional 引数。\n// command-token-protocol の外部仕様は不変更(registry が渡すだけで、\n// subscribe/emit の意味論には一切影響しない)。\nexport class CommandToken extends Token implements ICommandToken {\n private _ownerStateName: string | null;\n\n constructor(name: string, ownerStateName?: string) {\n super(name);\n this._ownerStateName = ownerStateName ?? null;\n }\n\n emit(...args: unknown[]): unknown[] {\n if (devtoolsSink !== null) {\n // subscriberCount 0 の emit(空撃ち)もそのまま流す — whenDefined 前の\n // command 空撃ちレース類をタイムラインで可視化するため\n devtoolsSink({\n type: \"state:token-emit\",\n kind: \"command\",\n stateName: this._ownerStateName,\n tokenName: this.name,\n args,\n subscriberCount: this.size,\n });\n }\n return super.emit(...args);\n }\n}\n\nexport function isCommandToken(value: unknown): value is ICommandToken {\n return value instanceof CommandToken;\n}\n","import { createStateAddress } from \"../address/StateAddress\";\nimport { IPathInfo } from \"../address/types\";\nimport { isCommandToken } from \"../command/CommandToken\";\nimport { ICommandToken } from \"../command/types\";\nimport { STATE_COMMAND_NAMESPACE_NAME } from \"../define\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { getByAddressSymbol, setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\n// onclick: $command.<name> のように、DOM イベントから command token を直接 emit する形式かを判定する。\n// 右辺が $command 名前空間配下のパス($command.<token>)のときに true。\nfunction isCommandTokenPath(statePathName: string): boolean {\n return statePathName.startsWith(STATE_COMMAND_NAMESPACE_NAME + \".\");\n}\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\n\nfunction getHandlerKey(binding: IBindingInfo): string {\n const modifierKey = binding.propModifiers.filter(m => m === 'prevent' || m === 'stop').sort().join(',');\n return `${binding.stateName}::${binding.statePathName}::${modifierKey}`;\n}\n\nconst stateEventHandlerFunction = (\n stateName: string,\n handlerName: string,\n modifiers: string[],\n statePathInfo: IPathInfo\n) => (event: Event): any => {\n if (modifiers.includes('prevent')) event.preventDefault();\n if (modifiers.includes('stop')) event.stopPropagation();\n\n const node = event.target as Element;\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for event handler.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n const isCommand = isCommandTokenPath(handlerName);\n stateElement.createStateAsync(\"writable\", async (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n const indexes = loopContext?.listIndex.indexes ?? [];\n if (isCommand) {\n // command token を解決して emit。引数はハンドラ呼び出しと同じく (event, ...listIndexes) を透過する。\n const token = state[getByAddressSymbol](createStateAddress(statePathInfo, null));\n if (!isCommandToken(token)) {\n raiseError(`Event binding \"${handlerName}\" did not resolve to a CommandToken. Declare the name in $commandTokens and reference it as $command.<name>.`);\n }\n return (token as ICommandToken).emit(event, ...indexes);\n }\n const handler = state[handlerName];\n if (typeof handler !== \"function\") {\n raiseError(`Handler \"${handlerName}\" is not a function on state \"${stateName}\".`);\n }\n return Reflect.apply(handler, state, [event, ...indexes]);\n });\n });\n}\n\nexport function attachEventHandler(binding: IBindingInfo): boolean {\n if (!binding.propName.startsWith(\"on\")) {\n return false;\n }\n const key = getHandlerKey(binding);\n let stateEventHandler = handlerByHandlerKey.get(key);\n if (typeof stateEventHandler === \"undefined\") {\n stateEventHandler = stateEventHandlerFunction(binding.stateName, binding.statePathName, binding.propModifiers, binding.statePathInfo);\n handlerByHandlerKey.set(key, stateEventHandler);\n }\n\n const eventName = binding.propName.slice(2);\n (binding.node as Element).addEventListener(eventName, stateEventHandler);\n\n bindingRegistry.add(key, binding);\n return true;\n}\n\nexport function detachEventHandler(binding: IBindingInfo): boolean {\n if (!binding.propName.startsWith(\"on\")) {\n return false;\n }\n const key = getHandlerKey(binding);\n const stateEventHandler = handlerByHandlerKey.get(key);\n if (typeof stateEventHandler === \"undefined\") {\n return false;\n }\n const eventName = binding.propName.slice(2);\n (binding.node as Element).removeEventListener(eventName, stateEventHandler);\n\n if (bindingRegistry.countOf(key) === 0) {\n return false;\n }\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n return true;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n getHandlerKey,\n};\n\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n let eventName = 'input';\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nconst radioEventHandlerFunction = (\n stateName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n) => (event: Event): any => {\n const node = event.target as HTMLInputElement;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n if (node.type !== 'radio') {\n console.warn(`[@wcstack/state] event.target is not a radio input element.`);\n return;\n }\n if (node.checked === false) {\n return;\n }\n const newValue = node.value;\n let filteredNewValue: unknown = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[statePathName] = filteredNewValue;\n });\n });\n}\n\nexport function attachRadioEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n let radioEventHandler = handlerByHandlerKey.get(key);\n if (typeof radioEventHandler === \"undefined\") {\n radioEventHandler = radioEventHandlerFunction(\n binding.stateName,\n binding.statePathName,\n binding.inFilters\n );\n handlerByHandlerKey.set(key, radioEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, radioEventHandler);\n bindingRegistry.add(key, binding);\n return true;\n }\n return false;\n}\n\nexport function detachRadioEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n const radioEventHandler = handlerByHandlerKey.get(key);\n if (typeof radioEventHandler === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(eventName, radioEventHandler);\n\n if (bindingRegistry.countOf(key) === 0) {\n return false;\n }\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n return true;\n }\n return false;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n getHandlerKey,\n getEventName,\n radioEventHandlerFunction,\n};\n","import { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\n\nconst CHECK_TYPES = new Set([ 'radio', 'checkbox' ]);\nconst DEFAULT_VALUE_PROP_NAMES = new Set([ 'value', 'valueAsNumber', 'valueAsDate' ]);\n\nexport function isPossibleTwoWay(node: Node, propName: string): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'input') {\n const inputType = (element.getAttribute('type') || 'text').toLowerCase();\n if (inputType === 'button') {\n return false;\n }\n if (CHECK_TYPES.has(inputType) && propName === 'checked') {\n return true;\n }\n if (DEFAULT_VALUE_PROP_NAMES.has(propName)) {\n return true;\n }\n }\n if (tagName === 'select' && propName === 'value') {\n return true;\n }\n if (tagName === 'textarea' && propName === 'value') {\n return true;\n }\n const customTagName = getCustomElement(element);\n if (customTagName !== null) {\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine if property \"${propName}\" is suitable for two-way binding.`);\n }\n const bindable = readBindableDeclaration(element);\n if (bindable?.knownProperties.has(propName)) {\n return true;\n }\n }\n return false;\n}\n","/**\n * propagation/propagation.ts\n *\n * Phase 3 の因果伝播コア(feature flag `enablePropagationContext` 下)。\n * 依存は types のみの葉モジュールとし、twowayHandler / applyChangeToProperty /\n * setByAddress / updater の計装点から循環 import なしで参照できるようにする。\n *\n * wire 識別は (node × member × stateName × statePathName) で行う。設計書の\n * WriteReceipt は bindingId + generation を持つが、twoway handler は共有\n * handler(handlerByHandlerKey)で binding インスタンスに到達できないため、\n * runtime の edge / receipt 照合キーは wire 単位とする。BindingSession\n * generation との統合(再 attach 後の edge ID 非再利用)は session 側の\n * 計装が揃う段階で bindingGeneration に反映する。\n */\n\nimport { IPropagationContext, IWriteReceipt } from \"./types\";\n\nexport type PropagationEdgeDirection = \"to-element\" | \"to-state\";\n\nlet nextWireId = 1;\nlet nextTransactionId = 1;\nlet nextSynchronousScopeId = 1;\n\n// node を強参照しない wire 台帳。inner key = `${stateName}::${statePathName}::${member}`\nconst wireIdsByNode = new WeakMap<Node, Map<string, number>>();\n\nfunction wireKey(member: string, stateName: string, statePathName: string): string {\n return `${stateName}::${statePathName}::${member}`;\n}\n\n/**\n * wire(配線)の安定 ID を返す。edge ID の基底と receipt の bindingId に使う。\n */\nexport function getWireId(\n node: Node,\n member: string,\n stateName: string,\n statePathName: string,\n): number {\n let byKey = wireIdsByNode.get(node);\n if (typeof byKey === \"undefined\") {\n byKey = new Map();\n wireIdsByNode.set(node, byKey);\n }\n const key = wireKey(member, stateName, statePathName);\n let wireId = byKey.get(key);\n if (typeof wireId === \"undefined\") {\n wireId = nextWireId++;\n byKey.set(key, wireId);\n }\n return wireId;\n}\n\n/** wire × 方向 → edge ID。方向を含めるため再利用されない */\nexport function getEdgeId(wireId: number, direction: PropagationEdgeDirection): number {\n return direction === \"to-element\" ? wireId * 2 : wireId * 2 + 1;\n}\n\nconst EMPTY_EDGES: ReadonlySet<number> = new Set<number>();\n\n/** 外部 event / API update ごとの transaction 開始。current context は変更しない */\nexport function beginPropagationTransaction(originBindingId: number): IPropagationContext {\n return {\n transactionId: nextTransactionId++,\n originBindingId,\n visitedEdges: EMPTY_EDGES,\n hop: 0,\n };\n}\n\n/** edge を 1 つ通過した新しい context を返す(visitedEdges 追加・hop+1) */\nexport function extendPropagationContext(\n context: IPropagationContext,\n edgeId: number,\n): IPropagationContext {\n const visitedEdges = new Set(context.visitedEdges);\n visitedEdges.add(edgeId);\n return {\n transactionId: context.transactionId,\n originBindingId: context.originBindingId,\n visitedEdges,\n hop: context.hop + 1,\n };\n}\n\n// 同期 dynamic scope の current context(updater drain / element 書き込み中に設定)\nlet currentContext: IPropagationContext | null = null;\n\nexport function getCurrentPropagationContext(): IPropagationContext | null {\n return currentContext;\n}\n\nexport function runWithPropagationContext<T>(\n context: IPropagationContext | null,\n callback: () => T,\n): T {\n const previous = currentContext;\n currentContext = context;\n try {\n return callback();\n } finally {\n currentContext = previous;\n }\n}\n\n// WriteReceipt: 同期 scope 限定のスタック。scope 終了時に必ず破棄される\ninterface IActiveWriteReceipt {\n readonly receipt: IWriteReceipt;\n readonly node: Node;\n}\n\nconst receiptStack: IActiveWriteReceipt[] = [];\n\n/**\n * state → element 書き込みを receipt scope で包んで実行する。\n * setter が同期 dispatch する event は matchWriteReceipt でこの receipt を観測できる。\n */\nexport function runWithWriteReceipt<T>(\n node: Node,\n member: string,\n writtenValue: unknown,\n bindingId: number,\n transactionId: number,\n callback: () => T,\n): T {\n const receipt: IWriteReceipt = {\n bindingId,\n bindingGeneration: 0,\n member,\n transactionId,\n synchronousScopeId: nextSynchronousScopeId++,\n writtenValue,\n };\n receiptStack.push({ receipt, node });\n try {\n return callback();\n } finally {\n receiptStack.pop();\n }\n}\n\n/**\n * (node, member) に対する最も内側の active receipt を返す。\n * confirmation / normalization の判定(writtenValue との Object.is 比較)は\n * 呼び出し側が行う。scope 外(非同期に届いた event)では null。\n */\nexport function matchWriteReceipt(node: Node, member: string): IWriteReceipt | null {\n for (let i = receiptStack.length - 1; i >= 0; i--) {\n const active = receiptStack[i];\n if (active.node === node && active.receipt.member === member) {\n return active.receipt;\n }\n }\n return null;\n}\n\n// テスト用\nexport const __private__ = {\n receiptStack,\n};\n","import { isPossibleTwoWay } from \"./isPossibleTwoWay\";\nimport { config } from \"../config\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { beginPropagationTransaction, extendPropagationContext, getCurrentPropagationContext, getEdgeId, getWireId, matchWriteReceipt, runWithPropagationContext } from \"../propagation/propagation\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\nconst producerValueObserversByNode = new WeakMap<Node, Map<string, Set<(value: unknown) => void>>>();\n\nconst DEFAULT_GETTER = (e: Event) => (e as CustomEvent).detail;\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string, hasGetter: boolean): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.propName}::${binding.statePathName}::${eventName}::${filterKey}::${hasGetter ? 'g' : 'n'}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n const tagName = (binding.node as Element).tagName.toLowerCase();\n // 1.default event name\n let eventName = (tagName === 'select') ? 'change' : 'input';\n // 2.wcBindable protocol\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine event name for two-way binding.`);\n }\n const propDesc = readBindableDeclaration(binding.node)?.knownProperties.get(binding.propName);\n if (propDesc) {\n eventName = propDesc.event;\n }\n }\n // 3.modifier\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nfunction getValueGetter(binding: IBindingInfo): ((event: Event) => any) | null {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const propDesc = readBindableDeclaration(binding.node)?.knownProperties.get(binding.propName);\n if (propDesc) {\n return propDesc.getter ?? DEFAULT_GETTER;\n }\n }\n return null;\n}\n\nconst twowayEventHandlerFunction = (\n stateName: string,\n propName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n valueGetter: ((event: Event) => any) | null,\n) => (event: Event): any => {\n const node = event.target as Element;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n let newValue: any;\n if (valueGetter !== null) {\n newValue = valueGetter(event);\n } else {\n if (!(propName in node)) {\n console.warn(`[@wcstack/state] Property \"${propName}\" does not exist on target element.`);\n return;\n }\n newValue = (node as any)[propName];\n }\n let filteredNewValue = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n const producerObservers = producerValueObserversByNode.get(node)?.get(propName);\n if (typeof producerObservers !== \"undefined\") {\n for (const observer of producerObservers) observer(filteredNewValue);\n }\n\n let propagationContext: ReturnType<typeof getCurrentPropagationContext> = null;\n if (config.enablePropagationContext) {\n // Phase 3: element → state edge の因果判定(設計書 §4)。\n const wireId = getWireId(node, propName, stateName, statePathName);\n const receipt = matchWriteReceipt(node, propName);\n if (receipt !== null && Object.is(receipt.writtenValue, newValue)) {\n // 規則 4: 同じ setter call stack 内で同じ member から Object.is 同値の\n // 通知が戻った場合だけ confirmation として再伝播を抑止する。\n // shadow diagnostic(§8): primitive なら same-value guard も同じ結論に\n // なるため、provenance だけが守っている非 primitive の echo を可視化する。\n if (config.debug) {\n console.debug(`[@wcstack/state] propagation: write confirmation suppressed echo.`, {\n node,\n propName,\n statePathName,\n transactionId: receipt.transactionId,\n coveredBySameValueGuard: config.sameValueGuard\n && (filteredNewValue === null || typeof filteredNewValue !== \"object\"),\n });\n }\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:suppressed\",\n reason: \"confirmation\",\n transactionId: receipt.transactionId,\n edgeId: getEdgeId(wireId, \"to-state\"),\n node,\n member: propName,\n });\n }\n return;\n }\n // receipt があるが値が異なる場合は正規化差分: element の確定値として受理し、\n // 新しい edge を通る変更として継続する(規則 5・decision gate)。\n const toStateEdgeId = getEdgeId(wireId, \"to-state\");\n const baseContext = getCurrentPropagationContext();\n if (baseContext !== null && baseContext.visitedEdges.has(toStateEdgeId)) {\n // 規則 2: 同じ transaction が同じ edge を再度通ろうとした場合だけ抑止\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:suppressed\",\n reason: \"visited-edge\",\n transactionId: baseContext.transactionId,\n edgeId: toStateEdgeId,\n node,\n member: propName,\n });\n }\n return;\n }\n // 規則 1: 外部 event(受け皿の context が無い)なら新しい transaction を開始\n propagationContext = extendPropagationContext(\n baseContext ?? beginPropagationTransaction(wireId),\n toStateEdgeId,\n );\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n const commitToState = (): void => {\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[statePathName] = filteredNewValue;\n });\n });\n };\n if (propagationContext !== null) {\n runWithPropagationContext(propagationContext, commitToState);\n } else {\n commitToState();\n }\n}\n\nexport function addTwowayValueObserver(\n node: Node,\n propName: string,\n observer: (value: unknown) => void,\n): () => void {\n let byProperty = producerValueObserversByNode.get(node);\n if (typeof byProperty === \"undefined\") {\n byProperty = new Map();\n producerValueObserversByNode.set(node, byProperty);\n }\n let observers = byProperty.get(propName);\n if (typeof observers === \"undefined\") {\n observers = new Set();\n byProperty.set(propName, observers);\n }\n observers.add(observer);\n return () => {\n observers?.delete(observer);\n if (observers?.size === 0) byProperty?.delete(propName);\n if (byProperty?.size === 0) producerValueObserversByNode.delete(node);\n };\n}\n\nexport function attachTwowayEventHandler(binding: IBindingInfo): void {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const registry = getCustomElementRegistry();\n const customClass = registry?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${customTagName}>.`);\n }\n return;\n }\n }\n\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const valueGetter = getValueGetter(binding);\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\n let twowayEventHandler = handlerByHandlerKey.get(key);\n if (typeof twowayEventHandler === \"undefined\") {\n twowayEventHandler = twowayEventHandlerFunction(\n binding.stateName,\n binding.propName,\n binding.statePathName,\n binding.inFilters,\n valueGetter\n );\n handlerByHandlerKey.set(key, twowayEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, twowayEventHandler);\n bindingRegistry.add(key, binding);\n }\n}\n\nexport function detachTwowayEventHandler(binding: IBindingInfo): void {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const registry = getCustomElementRegistry();\n const customClass = registry?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n if (registry === null) {\n return;\n }\n return;\n }\n }\n\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const valueGetter = getValueGetter(binding);\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\n const twowayEventHandler = handlerByHandlerKey.get(key);\n if (typeof twowayEventHandler === \"undefined\") {\n return;\n }\n (binding.node as Element).removeEventListener(eventName, twowayEventHandler);\n\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n }\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n producerValueObserversByNode,\n getHandlerKey,\n getEventName,\n getValueGetter,\n twowayEventHandlerFunction,\n DEFAULT_GETTER,\n};\n","// framework 自身が detach し明示的に解体(deactivate/unmount)したノード。\n// BindingOwner の MutationObserver は削除サブツリー走査でこれらをスキップする。\n//\n// 根拠: 削除時の handleRemovedNode は binding を dispose するだけ(DOM 構造変更も\n// connect-snapshot 依存も無い)で、framework が unmount 経路で既に dispose 済みの\n// content に対しては純粋な冗長走査(forEachInclusive で削除サブツリー全体を歩く)に\n// なる。create(追加)経路は two-way の connect-time snapshot を observer に依存する\n// ため対象外だが、削除は依存が無いため安全に飛ばせる。\n//\n// マークは observer が削除を配送した時点で消費(削除)する。マーク〜配送の間隔は\n// 単一 microtask であり、その間に外部 DOM 変異は割り込めない(framework の drain は\n// 同期)ため、マークは framework 由来の削除にしか一致しない。\nconst observerSkipNodes = new WeakSet<Node>();\n\nexport function markObserverSkipOnRemove(node: Node): void {\n observerSkipNodes.add(node);\n}\n\n// マーク済みなら true を返しつつマークを消費する。未マークなら false。\nexport function consumeObserverSkipOnRemove(node: Node): boolean {\n if (!observerSkipNodes.has(node)) {\n return false;\n }\n observerSkipNodes.delete(node);\n return true;\n}\n\n// framework 自身がマウント(Content.appendTo / mountAfter)したノード。\n// 追加サブツリー走査の実質の仕事は connect-snapshot 待ち(observationPending)の\n// record への配送だけで、record 自体は同期マウント(activateContent → start)で\n// observer flush より先に active 済み。よって待ちがグローバルに 1 つも無ければ\n// 追加側走査も冗長であり丸ごとスキップできる(削除側スキップの対称形)。\n// マーク〜配送が単一 microtask で外部変異が割り込めない前提も削除側と同じ。\nconst observerSkipAddedNodes = new WeakSet<Node>();\n\nexport function markObserverSkipOnAdd(node: Node): void {\n observerSkipAddedNodes.add(node);\n}\n\n// マーク済みなら true を返しつつマークを消費する(削除側と同じ one-shot 契約)。\nexport function consumeObserverSkipOnAdd(node: Node): boolean {\n if (!observerSkipAddedNodes.has(node)) {\n return false;\n }\n observerSkipAddedNodes.delete(node);\n return true;\n}\n\n// connect-snapshot 待ち(two-way sync=connect で未接続のまま activate された record)の\n// グローバル件数。> 0 の間は追加側スキップを無効化して従来走査に戻す。\n// increment は settleInitialRecord、decrement は readProducerSnapshot(消化時)と\n// runTeardowns(未消化のまま終端した record のリーク防止)が担う。\nlet pendingObservationCount = 0;\n\nexport function incrementPendingObservation(): void {\n pendingObservationCount++;\n}\n\nexport function decrementPendingObservation(): void {\n pendingObservationCount--;\n}\n\nexport function hasPendingObservation(): boolean {\n return pendingObservationCount > 0;\n}\n","import { ICustomElementRegistryAdapter } from \"../platform/customElementRegistry\";\n\ninterface IDefinitionWaiter {\n active: boolean;\n readonly resolve: () => void;\n readonly reject: (error: unknown) => void;\n}\n\ninterface IDefinitionEntry {\n readonly waiters: Set<IDefinitionWaiter>;\n}\n\n/**\n * Shares one CustomElementRegistry.whenDefined() continuation per registry/tag.\n * Waiters can be removed independently, so a never-defined tag does not retain\n * binding records or their DOM nodes after teardown.\n */\nexport class DefinitionCoordinator {\n private readonly entries = new Map<string, IDefinitionEntry>();\n\n constructor(private readonly registry: ICustomElementRegistryAdapter) {}\n\n wait(\n tagName: string,\n resolve: () => void,\n reject: (error: unknown) => void = () => undefined,\n ): () => void {\n const normalizedTagName = tagName.toLowerCase();\n let entry = this.entries.get(normalizedTagName);\n if (typeof entry === \"undefined\") {\n entry = { waiters: new Set() };\n this.entries.set(normalizedTagName, entry);\n this.registry.whenDefined(normalizedTagName).then(\n () => this.settle(normalizedTagName, null),\n (error: unknown) => this.settle(normalizedTagName, error),\n );\n }\n\n const waiter: IDefinitionWaiter = { active: true, resolve, reject };\n entry.waiters.add(waiter);\n return () => {\n if (!waiter.active) return;\n waiter.active = false;\n entry?.waiters.delete(waiter);\n };\n }\n\n pendingCount(tagName: string): number {\n return this.entries.get(tagName.toLowerCase())?.waiters.size ?? 0;\n }\n\n private settle(tagName: string, error: unknown): void {\n const entry = this.entries.get(tagName);\n if (typeof entry === \"undefined\") return;\n this.entries.delete(tagName);\n const waiters = Array.from(entry.waiters);\n entry.waiters.clear();\n for (const waiter of waiters) {\n if (!waiter.active) continue;\n waiter.active = false;\n if (error === null) waiter.resolve();\n else waiter.reject(error);\n }\n }\n}\n\nconst coordinatorByRegistry = new WeakMap<ICustomElementRegistryAdapter, DefinitionCoordinator>();\n\nexport function getDefinitionCoordinator(\n registry: ICustomElementRegistryAdapter,\n): DefinitionCoordinator {\n let coordinator = coordinatorByRegistry.get(registry);\n if (typeof coordinator === \"undefined\") {\n coordinator = new DefinitionCoordinator(registry);\n coordinatorByRegistry.set(registry, coordinator);\n }\n return coordinator;\n}\n","import { getStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { config } from \"../config\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { hasByAddressSymbol, setLoopContextSymbol } from \"../proxy/symbols\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\n\nexport type InitialAuthority = \"state\" | \"element\" | \"auto\" | \"none\";\nexport type ResolvedInitialAuthority = Exclude<InitialAuthority, \"auto\">;\nexport type InitialSyncOn = \"call\" | \"connect\";\n\nexport interface IInitialSyncPolicy {\n readonly authority: InitialAuthority;\n readonly syncOn: InitialSyncOn;\n readonly observable: boolean;\n /**\n * wcBindable 宣言が properties のみ(output-only member)であること。\n * authority は初期同期のみを支配する(docs/architecture-hardening/09 §3.6)が、\n * output-only member への state→element 書き込みは初期に限らず契約として\n * 恒久ブロックする。その判定を authority と分離してここに持つ。\n */\n readonly outputOnly: boolean;\n}\n\nfunction readOption(\n binding: IBindingInfo,\n key: \"init\" | \"sync\",\n): string | null {\n let result: string | null = null;\n for (const modifier of binding.propModifiers) {\n const separator = modifier.indexOf(\"=\");\n if (separator < 0) continue;\n const modifierKey = modifier.slice(0, separator).trim();\n const value = modifier.slice(separator + 1).trim();\n if (modifierKey !== \"init\" && modifierKey !== \"sync\") {\n raiseError(`Unknown binding modifier \"${modifierKey}\" in \"${modifier}\".`);\n }\n if (modifierKey !== key) continue;\n if (result !== null) {\n raiseError(`Binding modifier \"${key}\" may only be specified once.`);\n }\n result = value;\n }\n return result;\n}\n\nfunction parseAuthority(value: string | null): InitialAuthority | null {\n if (value === null) return null;\n if (value === \"state\" || value === \"element\" || value === \"auto\" || value === \"none\") {\n return value;\n }\n return raiseError(`Invalid init modifier value \"${value}\".`);\n}\n\nfunction parseSyncOn(value: string | null): InitialSyncOn {\n if (value === null || value === \"call\") return \"call\";\n if (value === \"connect\") return \"connect\";\n return raiseError(`Invalid sync modifier value \"${value}\".`);\n}\n\nexport function hasInitialSyncModifier(binding: IBindingInfo): boolean {\n return binding.propModifiers.some((modifier) => modifier.includes(\"=\"));\n}\n\n// 頻出ポリシー(修飾子なしの通常バインディング)の凍結シングルトン。リスト行では\n// binding ごとに resolveInitialSyncPolicy が走るため、毎回のオブジェクト割り当てを\n// 避ける(record.initialPolicy は読み取り専用でしか使われない)。\nconst STATE_CALL_POLICY: IInitialSyncPolicy = Object.freeze({ authority: \"state\", syncOn: \"call\", observable: false, outputOnly: false });\nconst NONE_CALL_POLICY: IInitialSyncPolicy = Object.freeze({ authority: \"none\", syncOn: \"call\", observable: false, outputOnly: false });\n\nfunction statePolicy(authority: InitialAuthority, syncOn: IInitialSyncPolicy[\"syncOn\"]): IInitialSyncPolicy {\n if (authority === \"state\" && syncOn === \"call\") return STATE_CALL_POLICY;\n return { authority, syncOn, observable: false, outputOnly: false };\n}\n\nexport function resolveInitialSyncPolicy(binding: IBindingInfo): IInitialSyncPolicy {\n if (!config.enableDirectionalInitialSync) {\n if (hasInitialSyncModifier(binding)) {\n raiseError(\"init=/sync= modifiers require enableDirectionalInitialSync.\");\n }\n return STATE_CALL_POLICY;\n }\n\n const explicitAuthority = parseAuthority(readOption(binding, \"init\"));\n const syncOn = parseSyncOn(readOption(binding, \"sync\"));\n if (binding.bindingType === \"event\") {\n if (explicitAuthority !== null && explicitAuthority !== \"none\") {\n raiseError(\"Event bindings only allow init=none.\");\n }\n return syncOn === \"call\" ? NONE_CALL_POLICY : { authority: \"none\", syncOn, observable: false, outputOnly: false };\n }\n // command.<name>: $command.<method> は命令的な command-token 配線。bindingType は\n // \"prop\" だが propName (\"command.<name>\") は wcBindable property ではないため、下の\n // property authority 検証(未宣言なら raiseError)に掛けてはならない。値の初期同期を\n // 持たない配線なので、現行互換の \"state\" authority を返す(command token は従来通り\n // 初期 apply で配線される)。\n if (binding.propSegments[0] === \"command\") {\n return statePolicy(\"state\", syncOn);\n }\n if (binding.bindingType !== \"prop\") {\n if (explicitAuthority !== null && explicitAuthority !== \"state\" && explicitAuthority !== \"none\") {\n raiseError(`Binding type \"${binding.bindingType}\" does not support init=${explicitAuthority}.`);\n }\n return statePolicy(explicitAuthority ?? \"state\", syncOn);\n }\n\n const declaration = readBindableDeclaration(binding.node);\n if (declaration === null) {\n return statePolicy(explicitAuthority ?? \"state\", syncOn);\n }\n const hasOutput = declaration.knownProperties.has(binding.propName);\n const hasInput = declaration.declaredInputs.has(binding.propName);\n if (!hasOutput && !hasInput) {\n raiseError(`Property \"${binding.propName}\" is not declared by wcBindable.`);\n }\n\n const allowed = hasOutput && hasInput\n ? new Set<InitialAuthority>([\"state\", \"element\", \"auto\", \"none\"])\n : hasOutput\n ? new Set<InitialAuthority>([\"element\", \"none\"])\n : new Set<InitialAuthority>([\"state\", \"none\"]);\n const defaultAuthority: InitialAuthority = hasOutput && !hasInput ? \"element\" : \"state\";\n const authority = explicitAuthority ?? defaultAuthority;\n if (!allowed.has(authority)) {\n raiseError(`init=${authority} is incompatible with wcBindable member \"${binding.propName}\".`);\n }\n if (syncOn === \"connect\" && !hasOutput) {\n raiseError(`sync=connect requires observable property \"${binding.propName}\".`);\n }\n return { authority, syncOn, observable: hasOutput, outputOnly: hasOutput && !hasInput };\n}\n\nexport function isBindingStateInitialized(binding: IBindingInfo): boolean {\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n const address = getStateAddressByBindingInfo(binding);\n let initialized = false;\n stateElement.createState(\"readonly\", (state) => {\n initialized = state[hasByAddressSymbol](address);\n });\n return initialized;\n}\n\nexport function resolveInitialAuthority(\n binding: IBindingInfo,\n authority: InitialAuthority,\n): ResolvedInitialAuthority {\n if (authority !== \"auto\") return authority;\n return isBindingStateInitialized(binding) ? \"state\" : \"element\";\n}\n\nexport function commitProducerValue(binding: IBindingInfo, value: unknown): void {\n let filteredValue = value;\n for (const filter of binding.inFilters) {\n filteredValue = filter.filterFn(filteredValue);\n }\n const rootNode = binding.node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for initial binding sync.`);\n }\n const loopContext = getLoopContextByNode(binding.node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[binding.statePathName] = filteredValue;\n });\n });\n}\n","import { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { IAbsoluteStateAddress } from \"../address/types\";\nimport { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { IAbsolutePathInfo } from \"../address/types\";\nimport { clearAbsoluteStateAddressByBinding, getAbsoluteStateAddressByBinding, resolveBindingRootNode } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { addBindingByAbsoluteStateAddress, addBindingByPattern, removeBindingByAbsoluteStateAddress, removeBindingByPattern } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { IListIndex } from \"../list/types\";\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { config } from \"../config\";\nimport { detachCheckboxEventHandler, attachCheckboxEventHandler } from \"../event/checkboxHandler\";\nimport { detachEventTokenHandler, attachEventTokenHandler } from \"../event/eventTokenHandler\";\nimport { detachEventHandler, attachEventHandler } from \"../event/handler\";\nimport { detachRadioEventHandler, attachRadioEventHandler } from \"../event/radioHandler\";\nimport { detachTwowayEventHandler, attachTwowayEventHandler, addTwowayValueObserver } from \"../event/twowayHandler\";\nimport { isPossibleTwoWay } from \"../event/isPossibleTwoWay\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry, upgradeCustomElement } from \"../platform/customElementRegistry\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\nimport { consumeObserverSkipOnAdd, consumeObserverSkipOnRemove, decrementPendingObservation, hasPendingObservation, incrementPendingObservation } from \"./observerSkip\";\nimport { DefinitionCoordinator, getDefinitionCoordinator } from \"./DefinitionCoordinator\";\nimport { commitProducerValue, hasInitialSyncModifier, IInitialSyncPolicy, ResolvedInitialAuthority, resolveInitialAuthority, resolveInitialSyncPolicy } from \"./initialSync\";\nimport { replaceToReplaceNode } from \"./replaceToReplaceNode\";\nimport type { IRowPlan } from \"../structural/types\";\n\nexport type BindingPhase =\n | \"discovered\"\n | \"waiting-definition\"\n | \"ready-to-attach\"\n | \"attaching\"\n | \"synchronizing\"\n | \"active\"\n | \"failed\"\n | \"disposed\";\n\nexport interface IBindingRecord {\n readonly id: number;\n readonly info: IBindingInfo;\n readonly generation: number;\n phase: BindingPhase;\n /**\n * 追加の後始末クロージャ(radio/checkbox/observer/定義キャンセル等の希少ケース)。\n * 頻出の後始末(イベント detach・双方向 detach・アドレス台帳解除)はクロージャで\n * なく record のフラグ/フィールドから runTeardowns がデータ駆動で実行するため、\n * 大多数の record では null のまま(行あたり Set×5 + クロージャ×10 の割当を排除)。\n */\n teardowns: Set<() => void> | null;\n}\n\ninterface IBindingOptions {\n registerAddress: boolean;\n registerPathInfo: boolean;\n applyOnReconnect: boolean;\n}\n\ninterface IInternalBindingRecord extends IBindingRecord {\n /**\n * generation はプラン行のプール再利用(record オブジェクト再利用)で更新するため\n * 内部表現では書き込み可能にする(IBindingRecord 公開面は readonly のまま)\n */\n generation: number;\n readonly session: BindingSession;\n readonly anchor: Node;\n readonly options: IBindingOptions;\n address: IAbsoluteStateAddress | null;\n /**\n * パターン索引台帳((absolutePathInfo, listIndex) 2 段キー)への登録。リスト行の\n * binding は address を intern せずこちらに登録する。address とは排他。\n */\n patternPathInfo: IAbsolutePathInfo | null;\n patternListIndex: IListIndex | null;\n pendingDefinitions: number;\n initialPolicy: IInitialSyncPolicy | null;\n resolvedAuthority: ResolvedInitialAuthority | null;\n initialSettled: boolean;\n /**\n * 最初の shouldApplyState 相談(= 初期 state sweep / 初回 render の選別)を\n * 消費済みか。authority は初期同期のみを支配する(09 §3.6)ため、初回相談は\n * authority で答え、以降の定常 apply は output-only 契約と connect-snapshot\n * 未解決だけをブロックする。\n */\n initialApplyDone: boolean;\n /** initialPolicy.outputOnly のミラー(settle 時確定・定常ゲートの分岐を総域にする) */\n outputOnlyMember: boolean;\n observationPending: boolean;\n eventSequence: number;\n hasProducerValue: boolean;\n producerValue: unknown;\n /** attachEventHandler 済み(dispose 時に detachEventHandler をデータ駆動実行) */\n eventAttached: boolean;\n /** attachTwowayEventHandler 済み(dispose 時に detachTwowayEventHandler をデータ駆動実行) */\n twowayAttached: boolean;\n}\n\ninterface IDeferredDefinition {\n readonly node: Node;\n active: boolean;\n cancel: (() => void) | null;\n}\n\ninterface IObservableRoot extends Node {\n contains(other: Node | null): boolean;\n}\n\nlet nextRecordId = 0;\nlet nextGeneration = 0;\n\nconst recordByBinding = new WeakMap<IBindingInfo, IInternalBindingRecord>();\nconst sessionByRoot = new WeakMap<Node, BindingSession>();\n\n// binding の構造キーは不変フィールドのみから決まる。リスト行の初期化では同一 binding に\n// 対し remember() が2回呼ばれる(createContent 内 initializeBindingsByFragment と\n// activateContent の registerAddress 目的の initialize)ため、2度目の文字列生成を避けるべく\n// binding 単位でメモ化する。プロファイル上 bindingKey は create-10k の JS 自己時間で上位。\nconst bindingKeyByBinding = new WeakMap<IBindingInfo, string>();\n\n// node → その node に関心を持つ session(anchor として binding を覚えている、\n// または定義待ちタスクを抱えている)。BindingOwner は mutation で増減した\n// サブツリーを1回だけ走査し、ここに登録された session だけへ per-node 配送する。\n// 全 session ブロードキャストだと、リスト行の逐次 append などで\n// 「session 数 × 変異ノード数」の O(n²) ファンアウトになるため、その正本台帳。\n// 大多数の node は関心 session が1つなので単一値で持ち、2つ目から Set に昇格する。\nconst interestedSessionsByNode = new WeakMap<Node, BindingSession | Set<BindingSession>>();\n\nfunction addInterestedSession(node: Node, session: BindingSession): void {\n const current = interestedSessionsByNode.get(node);\n if (typeof current === \"undefined\") {\n interestedSessionsByNode.set(node, session);\n return;\n }\n if (current === session) return;\n if (current instanceof Set) {\n current.add(session);\n return;\n }\n interestedSessionsByNode.set(node, new Set([current, session]));\n}\n\nfunction forEachInterestedSession(node: Node, callback: (session: BindingSession) => void): void {\n const current = interestedSessionsByNode.get(node);\n if (typeof current === \"undefined\") return;\n if (current instanceof Set) {\n for (const session of Array.from(current)) callback(session);\n return;\n }\n callback(current);\n}\n\nfunction forEachInclusive(root: Node, callback: (node: Node) => void): void {\n callback(root);\n // 葉ノード(fragment 一括挿入時のテキスト・空セル等が大多数)では\n // Array.from(childNodes) の空配列アロケーションを避ける。callback が子を\n // 追加しうるため firstChild は callback 後に判定する(従来と同一意味論)。\n if (root.firstChild === null) return;\n for (const child of Array.from(root.childNodes)) {\n forEachInclusive(child, callback);\n }\n}\n\nfunction isObservableRoot(value: unknown): value is IObservableRoot {\n if (typeof value !== \"object\" || value === null) return false;\n const node = value as Node;\n return node.nodeType === 9 || (node.nodeType === 11 && \"host\" in (node as object));\n}\n\nfunction observableRootFor(node: Node): IObservableRoot | null {\n const root = node.getRootNode();\n return isObservableRoot(root) ? root : null;\n}\n\nclass BindingOwner {\n private readonly observer: MutationObserver | null;\n\n constructor(readonly root: IObservableRoot) {\n const Observer = (globalThis as { MutationObserver?: typeof MutationObserver }).MutationObserver;\n this.observer = typeof Observer === \"function\"\n ? new Observer((mutations) => this.handleMutations(mutations))\n : null;\n this.observer?.observe(root, { childList: true, subtree: true });\n }\n\n private handleMutations(mutations: MutationRecord[]): void {\n const removed: Node[] = [];\n const added: Node[] = [];\n for (const mutation of mutations) {\n removed.push(...Array.from(mutation.removedNodes));\n added.push(...Array.from(mutation.addedNodes));\n }\n // 走査は owner が1回だけ行い、関心 session が居る node だけを配送・contains\n // 検査へ進める。contains は O(木の深さ) なので、関心の無い node で呼ばない。\n const reconnected: IBindingInfo[] = [];\n for (const subtree of removed) {\n // framework が unmount した削除サブツリーは binding を明示 dispose 済みなので\n // observer 側の冗長走査(forEachInclusive で全 node を歩き handleRemovedNode を\n // 呼ぶ)を丸ごとスキップする。clear/大量 delete のホットスポット短縮。\n if (consumeObserverSkipOnRemove(subtree)) continue;\n forEachInclusive(subtree, (node) => {\n forEachInterestedSession(node, (session) => {\n if (this.root.contains(node)) return;\n session.handleRemovedNode(node);\n });\n });\n }\n for (const subtree of added) {\n // framework がマウントしたサブツリーは record が同期 activate 済みで、追加側\n // 走査の実質の仕事は connect-snapshot 待ちへの配送だけ。待ちがグローバルに\n // 無ければ丸ごとスキップする(待ちがあればマークだけ消費して従来走査に戻す)。\n if (consumeObserverSkipOnAdd(subtree) && !hasPendingObservation()) continue;\n forEachInclusive(subtree, (node) => {\n forEachInterestedSession(node, (session) => {\n if (!this.root.contains(node)) return;\n session.handleAddedNode(node, reconnected);\n });\n });\n }\n if (reconnected.length > 0) applyChangeFromBindings(reconnected);\n }\n}\n\nconst ownerByRoot = new WeakMap<IObservableRoot, BindingOwner>();\n\nfunction getBindingOwner(root: IObservableRoot): BindingOwner {\n let owner = ownerByRoot.get(root);\n if (typeof owner === \"undefined\") {\n owner = new BindingOwner(root);\n ownerByRoot.set(root, owner);\n }\n return owner;\n}\n\nfunction bindingKey(binding: IBindingInfo): string {\n const inFilters = binding.inFilters.map((filter) => `${filter.filterName}(${filter.args.join(\",\")})`).join(\"|\");\n const outFilters = binding.outFilters.map((filter) => `${filter.filterName}(${filter.args.join(\",\")})`).join(\"|\");\n return [\n binding.bindingType,\n binding.propName,\n binding.propModifiers.join(\",\"),\n binding.stateName,\n binding.statePathName,\n inFilters,\n outFilters,\n binding.uuid ?? \"\",\n ].join(\"\\u0000\");\n}\n\nfunction addRecordTeardown(record: IInternalBindingRecord, teardown: () => void): void {\n if (record.teardowns === null) {\n record.teardowns = new Set();\n }\n record.teardowns.add(teardown);\n}\n\nexport class BindingSession {\n private readonly records = new Set<IInternalBindingRecord>();\n /**\n * initializeRow で設定される行プラン。非 null のとき activate は\n * スロット整列の高速経路(activatePlanRows)を使う。\n */\n private rowPlan: IRowPlan | null = null;\n // anchor ノードが持つ binding は大多数が 1 本なので単一値で持ち、2 本目から\n // Map(remember 経路のキー照合用)に昇格する(台帳・興味 session と同じ前例)\n private readonly knownBindingsByNode = new WeakMap<Node, IBindingInfo | Map<string, IBindingInfo>>();\n private readonly optionsByBinding = new WeakMap<IBindingInfo, IBindingOptions>();\n private readonly deferredByNode = new WeakMap<Node, Set<IDeferredDefinition>>();\n private readonly deferred = new Set<IDeferredDefinition>();\n\n constructor(root: Node | null = null) {\n if (root !== null) this.observe(root);\n }\n\n /**\n * knownRoot: 呼び出し側が root を確定済みのときの per-binding observe 省略。\n * - undefined: 従来どおり binding ごとに anchor から root を導出して observe\n * - null: detached fragment 上(createContent)の初期化。observableRootFor が\n * 必ず null を返す状況なので observe(= getRootNode)を丸ごと省略する\n * - Node: 呼び出し側で owner 保証済み(activate 経由のみ。initialize へは未使用)\n */\n initialize(\n bindings: readonly IBindingInfo[],\n options: Partial<IBindingOptions> = {},\n knownRoot?: Node | null,\n ): IBindingInfo[] {\n const registerAddress = options.registerAddress ?? true;\n const resolvedOptions: IBindingOptions = {\n registerAddress,\n registerPathInfo: options.registerPathInfo ?? registerAddress,\n applyOnReconnect: options.applyOnReconnect ?? true,\n };\n const initialized: IBindingInfo[] = [];\n for (const candidate of bindings) {\n const binding = this.remember(candidate, resolvedOptions);\n const existing = recordByBinding.get(binding);\n if (typeof existing !== \"undefined\" && existing.phase !== \"disposed\" && existing.phase !== \"failed\") {\n this.observe(existing.anchor);\n if (resolvedOptions.registerAddress && existing.address === null && existing.patternListIndex === null) {\n existing.options.registerAddress = true;\n this.registerAddress(existing);\n }\n if (existing.phase === \"active\") this.settleInitialRecord(existing);\n this.settleConnectedSnapshot(existing);\n continue;\n }\n this.start(binding, resolvedOptions, knownRoot);\n initialized.push(binding);\n }\n return initialized.filter((binding) => this.shouldApplyState(binding));\n }\n\n /**\n * activateContent 専用の再活性化パス。createContent 側の initialize で\n * remember 済みの binding 配列(bindingsByContent がそのまま保持する同一オブジェクト)\n * にだけ使える前提で、remember の再実行(キー照合・options マージ・興味登録)を省き、\n * 必要な仕事だけ行う: 初回活性化はアドレス登録+初期同期、pool 再利用(disposed)は\n * start による再構築、未知の binding は防御的に従来 initialize へ倒す。\n *\n * knownRoot は呼び出し側(applyChangeToFor / applyChangeToIf の apply context)が\n * 確定済みの root。owner(root ごとの MutationObserver)の保証を呼び出しあたり\n * 1 回に集約し、binding ごとの observe(= getRootNode)とアドレス解決の\n * getRootNode を丸ごと省略する。\n */\n activate(bindings: readonly IBindingInfo[], knownRoot: Node): void {\n if (isObservableRoot(knownRoot)) getBindingOwner(knownRoot);\n if (this.rowPlan !== null) {\n this.activatePlanRows(this.rowPlan, bindings, knownRoot);\n return;\n }\n for (const binding of bindings) {\n const record = recordByBinding.get(binding);\n if (typeof record !== \"undefined\" && record.session === this\n && record.phase !== \"disposed\" && record.phase !== \"failed\") {\n if (record.address === null && record.patternListIndex === null) {\n // 初回活性化(owner は冒頭で保証済み)\n record.options.registerAddress = true;\n this.registerAddress(record, knownRoot);\n }\n if (record.phase === \"active\") this.settleInitialRecord(record);\n this.settleConnectedSnapshot(record);\n continue;\n }\n const options = this.optionsByBinding.get(binding);\n if (typeof options === \"undefined\") {\n // この session で remember されていない binding(防御): 従来経路\n this.initialize([binding], { registerAddress: true, registerPathInfo: false, applyOnReconnect: false });\n continue;\n }\n // pool 再利用: record は disposed。活性化要件(アドレス登録)を昇格して再構築\n options.registerAddress = true;\n this.start(binding, options, knownRoot);\n }\n }\n\n shouldApplyState(binding: IBindingInfo): boolean {\n if (!config.enableDirectionalInitialSync) {\n if (hasInitialSyncModifier(binding)) resolveInitialSyncPolicy(binding);\n return true;\n }\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || record.session !== this) return true;\n if (!record.options.registerAddress || record.phase === \"waiting-definition\") return true;\n if (record.phase === \"failed\") return false;\n if (record.phase === \"active\") this.settleInitialRecord(record);\n // authority は初期同期のみを支配する(09 §3.6: init=element は「snapshot を\n // state へ入れる」、init=none は「次の変更から扱う」)。settle 後の最初の相談\n // = 初期 state sweep / 初回 render / deferred initial apply の選別なので\n // authority で答え、ここで初期適用を消費する。\n if (!record.initialApplyDone) {\n record.initialApplyDone = true;\n return record.resolvedAuthority === \"state\";\n }\n if (record.resolvedAuthority === \"state\") return true;\n // 定常: two-way / input member は authority と無関係に state→element を流す。\n // 恒久ブロックは (1) output-only member の契約(書き込み無意味・DCC/router の\n // conformance が依存)と (2) sync=connect の接続 snapshot が未解決の間\n //(初期競合が未決着のうちは state push が element 初期値を潰しうる)だけ。\n return !record.outputOnlyMember && !record.observationPending;\n }\n\n getRecord(binding: IBindingInfo): IBindingRecord | null {\n const record = recordByBinding.get(binding);\n return record?.session === this ? record : null;\n }\n\n addTeardown(binding: IBindingInfo, teardown: () => void): boolean {\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || !this.isAlive(record, record.generation)) {\n return false;\n }\n addRecordTeardown(record, teardown);\n return true;\n }\n\n deferUntilDefined(\n node: Node,\n tagName: string,\n callback: () => void,\n reject: (error: unknown) => void = () => undefined,\n ): () => void {\n const registry = getCustomElementRegistry();\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${tagName}>.`);\n }\n this.observe(node);\n addInterestedSession(node, this);\n const task: IDeferredDefinition = { node, active: true, cancel: null };\n let tasks = this.deferredByNode.get(node);\n if (typeof tasks === \"undefined\") {\n tasks = new Set();\n this.deferredByNode.set(node, tasks);\n }\n tasks.add(task);\n this.deferred.add(task);\n const finish = (): boolean => {\n if (!task.active) return false;\n task.active = false;\n tasks?.delete(task);\n this.deferred.delete(task);\n return true;\n };\n task.cancel = getDefinitionCoordinator(registry).wait(\n tagName,\n () => {\n if (!finish()) return;\n try {\n upgradeCustomElement(registry, node);\n callback();\n } catch (error) {\n reject(error);\n }\n },\n (error) => {\n if (!finish()) return;\n reject(error);\n },\n );\n return () => {\n if (!finish()) return;\n task.cancel?.();\n };\n }\n\n disposeBinding(binding: IBindingInfo): void {\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || record.session !== this) return;\n this.disposeRecord(record);\n }\n\n dispose(): void {\n for (const record of Array.from(this.records)) this.disposeRecord(record);\n for (const task of Array.from(this.deferred)) {\n task.active = false;\n task.cancel?.();\n this.deferred.delete(task);\n this.deferredByNode.get(task.node)?.delete(task);\n }\n }\n\n /**\n * wholesale destroy(全行クリアで teardown を GC に任せる高速経路)を適用して\n * よいか。定義待ち(DefinitionCoordinator の waiter / deferred spread タスク)は\n * 強参照 Map に閉包が残り、connect-snapshot 待ちは pending カウンタが戻らなく\n * なるため、1 つでもあれば従来経路(teardown 実行)に倒す。\n */\n canWholesaleDestroy(): boolean {\n if (this.deferred.size > 0) return false;\n for (const record of this.records) {\n if (record.pendingDefinitions > 0 || record.observationPending) return false;\n }\n return true;\n }\n\n /**\n * 全 record を teardown を走らせずに終端化する(canWholesaleDestroy が true の\n * content 専用)。イベント listener・loopContext・パターン台帳(listIndex キー)は\n * ノード/binding もろとも GC で崩壊する(recordByBinding 以下は全て弱参照)。\n * 例外は null-listIndex の従来台帳(record.address): キーの intern 済み\n * AbsoluteStateAddress が PathInfo キャッシュ経由で生涯生存するため GC で\n * 崩壊せず、共有エントリに残った binding が binding.node 経由で行 DOM 全体を\n * 永久リークする。ここだけ明示除去する(行イベント binding が典型で行あたり\n * 高々数件・Set.delete のみなので wholesale の速度特性は保たれる)。\n * handlerBindingRegistry のカウンタは減らないが、残るのはキー文字列と数値のみで\n * 実害はない設計(handlerBindingRegistry.ts の弱参照化コメント参照)。\n */\n destroyRecords(): void {\n for (const record of this.records) {\n if (record.address !== null) {\n removeBindingByAbsoluteStateAddress(record.address, record.info);\n record.address = null;\n }\n record.phase = \"disposed\";\n record.teardowns = null;\n }\n this.records.clear();\n }\n\n observe(node: Node): void {\n const root = observableRootFor(node);\n if (root === null) return;\n // owner(root ごとの MutationObserver)の存在だけ保証する。session の配送先\n // 登録は node 単位(interestedSessionsByNode)で行い、owner は session を\n // 直接は保持しない。\n getBindingOwner(root);\n }\n\n handleMutations(root: IObservableRoot, removed: readonly Node[], added: readonly Node[]): void {\n for (const subtree of removed) {\n forEachInclusive(subtree, (node) => {\n if (root.contains(node)) return;\n this.handleRemovedNode(node);\n });\n }\n const reconnected: IBindingInfo[] = [];\n for (const subtree of added) {\n forEachInclusive(subtree, (node) => {\n if (!root.contains(node)) return;\n this.handleAddedNode(node, reconnected);\n });\n }\n if (reconnected.length > 0) applyChangeFromBindings(reconnected);\n }\n\n handleRemovedNode(node: Node): void {\n const known = this.knownBindingsByNode.get(node);\n if (typeof known !== \"undefined\") {\n if (known instanceof Map) {\n for (const binding of known.values()) this.disposeBinding(binding);\n } else {\n this.disposeBinding(known);\n }\n }\n const tasks = this.deferredByNode.get(node);\n if (typeof tasks !== \"undefined\") {\n for (const task of Array.from(tasks)) {\n task.active = false;\n task.cancel?.();\n tasks.delete(task);\n this.deferred.delete(task);\n }\n }\n }\n\n handleAddedNode(node: Node, reconnected: IBindingInfo[]): void {\n const known = this.knownBindingsByNode.get(node);\n if (typeof known === \"undefined\") return;\n const bindings = known instanceof Map ? known.values() : [known];\n for (const binding of bindings) {\n const record = recordByBinding.get(binding);\n if (record?.phase === \"active\") {\n this.settleConnectedSnapshot(record);\n continue;\n }\n if (record?.phase !== \"disposed\") continue;\n const options = this.optionsByBinding.get(binding);\n if (typeof options === \"undefined\") continue;\n try {\n this.start(binding, options);\n if (options.applyOnReconnect && this.shouldApplyState(binding)) reconnected.push(binding);\n } catch {\n // Mutation delivery cannot surface initialization errors to a caller.\n }\n }\n }\n\n /**\n * anchor の known 台帳を Map 形へ正規化して返す(remember のキー照合用)。\n * 単一値(プラン行 or 既存単独 binding)は実キーを引いて昇格する。\n */\n private knownMapFor(anchor: Node): Map<string, IBindingInfo> {\n const current = this.knownBindingsByNode.get(anchor);\n if (current instanceof Map) {\n return current;\n }\n const map = new Map<string, IBindingInfo>();\n if (typeof current !== \"undefined\") {\n let key = bindingKeyByBinding.get(current);\n if (typeof key === \"undefined\") {\n key = bindingKey(current);\n bindingKeyByBinding.set(current, key);\n }\n map.set(key, current);\n }\n this.knownBindingsByNode.set(anchor, map);\n return map;\n }\n\n private remember(binding: IBindingInfo, options: IBindingOptions): IBindingInfo {\n const anchor = binding.replaceNode;\n // detached fragment 上でも登録しておく(node 単位の台帳なので root 非依存)。\n // fragment 一括マウントで後から接続された行にも mutation 配送が届くようにする。\n addInterestedSession(anchor, this);\n const known = this.knownMapFor(anchor);\n let key = bindingKeyByBinding.get(binding);\n if (typeof key === \"undefined\") {\n key = bindingKey(binding);\n bindingKeyByBinding.set(binding, key);\n }\n const remembered = known.get(key);\n if (typeof remembered !== \"undefined\") {\n const rememberedOptions = this.optionsByBinding.get(remembered);\n if (typeof rememberedOptions !== \"undefined\") {\n rememberedOptions.registerAddress ||= options.registerAddress;\n rememberedOptions.registerPathInfo ||= options.registerPathInfo;\n rememberedOptions.applyOnReconnect ||= options.applyOnReconnect;\n }\n return remembered;\n }\n known.set(key, binding);\n this.optionsByBinding.set(binding, { ...options });\n return binding;\n }\n\n /**\n * RowPlan 経路の一括初期化(createContent 専用・docs/state-row-instantiation-redesign.md §3-2)。\n * プラン行の binding はこの呼び出しでのみ生成されるため remember(キー照合・\n * options マージ)を丸ごと省略し、policy/authority はテンプレート時に解決済みの\n * 値を焼き込む。options は行内共有の 1 オブジェクト(activate が\n * registerAddress を昇格するとき行内全 binding が同時に昇格する — 従来も\n * activate は全 binding を同順で昇格するため観測可能な差はない)。\n */\n initializeRow(plan: IRowPlan, bindings: readonly IBindingInfo[]): void {\n this.rowPlan = plan;\n const rowOptions: IBindingOptions = { registerAddress: false, registerPathInfo: false, applyOnReconnect: false };\n const slots = plan.slots;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n const slot = slots[i];\n const anchor = binding.replaceNode;\n addInterestedSession(anchor, this);\n this.addKnownRowBinding(anchor, binding, i);\n this.optionsByBinding.set(binding, rowOptions);\n const record: IInternalBindingRecord = {\n id: ++nextRecordId,\n info: binding,\n generation: ++nextGeneration,\n phase: \"active\",\n teardowns: null,\n session: this,\n anchor,\n options: rowOptions,\n address: null,\n patternPathInfo: null,\n patternListIndex: null,\n pendingDefinitions: 0,\n initialPolicy: slot.policy,\n resolvedAuthority: slot.authority,\n initialSettled: true,\n initialApplyDone: false,\n outputOnlyMember: slot.policy.outputOnly,\n observationPending: false,\n eventSequence: 0,\n hasProducerValue: false,\n producerValue: undefined,\n eventAttached: false,\n twowayAttached: false,\n };\n recordByBinding.set(binding, record);\n this.records.add(record);\n if (slot.isEvent) {\n try {\n attachEventHandler(binding);\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n record.eventAttached = true;\n }\n // 非 event スロットはプラン適格性により双方向不能・radio/checkbox 不能・\n // token 配線不能が確定しているため attach 系を一切呼ばない\n }\n }\n\n /**\n * プラン行の活性化(activate の高速経路)。bindings は initializeRow と同一の\n * スロット整列配列(bindingsByContent がそのまま保持)である前提。\n * プラン行の record は policy/authority 解決済み・observable なし・\n * connect-snapshot なしが構造的に保証されているため、settleInitialRecord /\n * settleConnectedSnapshot の呼び出し自体を省略できる。\n * プール再利用(disposed/failed)では record オブジェクトを再利用し、\n * 世代だけ進めて listener attach とアドレス登録をやり直す(record 再割当なし)。\n */\n private activatePlanRows(plan: IRowPlan, bindings: readonly IBindingInfo[], knownRoot: Node): void {\n const slots = plan.slots;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || record.session !== this) {\n // この session の record を持たない binding(防御): 従来経路\n this.initialize([binding], { registerAddress: true, registerPathInfo: false, applyOnReconnect: false });\n continue;\n }\n record.options.registerAddress = true;\n if (record.phase === \"disposed\" || record.phase === \"failed\") {\n // pool 再利用: dispose 済み record を initializeRow と同じ内容で再充填\n const slot = slots[i];\n record.generation = ++nextGeneration;\n record.phase = \"active\";\n record.initialPolicy = slot.policy;\n record.resolvedAuthority = slot.authority;\n record.initialSettled = true;\n record.initialApplyDone = false;\n record.outputOnlyMember = slot.policy.outputOnly;\n this.records.add(record);\n if (slot.isEvent) {\n try {\n attachEventHandler(binding);\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n record.eventAttached = true;\n }\n this.registerAddress(record, knownRoot);\n continue;\n }\n if (record.address === null && record.patternListIndex === null) {\n // 初回活性化\n this.registerAddress(record, knownRoot);\n }\n }\n }\n\n private addKnownRowBinding(anchor: Node, binding: IBindingInfo, slotIndex: number): void {\n const current = this.knownBindingsByNode.get(anchor);\n if (typeof current === \"undefined\") {\n this.knownBindingsByNode.set(anchor, binding);\n return;\n }\n // 同一 anchor に複数スロット(複数エントリの data-wcs): Map へ昇格。\n // プラン行はキー照合されないため添字ベースの合成キーで一意性だけ担保する\n if (current instanceof Map) {\n current.set(\"@plan:\" + slotIndex, binding);\n return;\n }\n const map = new Map<string, IBindingInfo>();\n map.set(\"@plan:first\", current);\n map.set(\"@plan:\" + slotIndex, binding);\n this.knownBindingsByNode.set(anchor, map);\n }\n\n private start(binding: IBindingInfo, options: IBindingOptions, knownRoot?: Node | null): void {\n replaceToReplaceNode(binding);\n const recordOptions = this.optionsByBinding.get(binding) ?? { ...options };\n const record: IInternalBindingRecord = {\n id: ++nextRecordId,\n info: binding,\n generation: ++nextGeneration,\n phase: \"discovered\",\n teardowns: null,\n session: this,\n anchor: binding.replaceNode,\n options: recordOptions,\n address: null,\n patternPathInfo: null,\n patternListIndex: null,\n pendingDefinitions: 0,\n initialPolicy: null,\n resolvedAuthority: null,\n initialSettled: false,\n initialApplyDone: false,\n outputOnlyMember: false,\n observationPending: false,\n eventSequence: 0,\n hasProducerValue: false,\n producerValue: undefined,\n eventAttached: false,\n twowayAttached: false,\n };\n recordByBinding.set(binding, record);\n this.records.add(record);\n // knownRoot が渡されたときは observe を省略する(null = detached fragment 上で\n // observableRootFor が必ず null、Node = activate 冒頭で owner 保証済み)\n if (typeof knownRoot === \"undefined\") this.observe(record.anchor);\n\n try {\n record.phase = \"attaching\";\n this.attachListeners(record);\n if (record.options.registerAddress) this.registerAddress(record, knownRoot);\n if (record.pendingDefinitions === 0) record.phase = \"active\";\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n }\n\n private attachListeners(record: IInternalBindingRecord): void {\n const binding = record.info;\n if (attachEventHandler(binding)) {\n record.eventAttached = true;\n return;\n }\n\n if (binding.propSegments[0] === \"eventToken\") {\n this.attachAfterDefinition(record, () => {\n if (attachEventTokenHandler(binding)) {\n addRecordTeardown(record, () => detachEventTokenHandler(binding));\n }\n });\n return;\n }\n\n if (attachRadioEventHandler(binding)) {\n addRecordTeardown(record, () => detachRadioEventHandler(binding));\n }\n if (attachCheckboxEventHandler(binding)) {\n addRecordTeardown(record, () => detachCheckboxEventHandler(binding));\n }\n this.attachAfterDefinition(record, () => {\n // directional initial sync の producer-value observer は twowayEventHandlerFunction\n // からのみ呼ばれる(唯一の consumer)。その handler が attach されるのは\n // isPossibleTwoWay かつ非 ro の binding だけ(attachTwowayEventHandler と同条件)\n // なので、one-way / event / eventToken / radio(非value) 等では observer は決して\n // fire しない。以前は attachListeners 冒頭で全 binding に無条件登録していたが、\n // fire しえない大多数の binding に対する setup 死荷重だった。ここへ移すことで\n // 「twoway handler が付く binding のみ observer 登録」を構造的に保証する\n // (undefined custom element は attachAfterDefinition が定義後まで遅延するので\n // isPossibleTwoWay の未定義 CE raiseError も踏まない)。\n if (\n config.enableDirectionalInitialSync\n && isPossibleTwoWay(binding.node, binding.propName)\n && binding.propModifiers.indexOf(\"ro\") === -1\n ) {\n const removeObserver = addTwowayValueObserver(binding.node, binding.propName, (value) => {\n if (!this.isAlive(record, record.generation)) return;\n record.eventSequence += 1;\n record.hasProducerValue = true;\n record.producerValue = value;\n });\n addRecordTeardown(record, removeObserver);\n }\n attachTwowayEventHandler(binding);\n record.twowayAttached = true;\n });\n }\n\n private attachAfterDefinition(record: IInternalBindingRecord, attach: () => void): void {\n const tagName = getCustomElement(record.info.node);\n if (tagName === null) {\n attach();\n return;\n }\n const registry = getCustomElementRegistry();\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${tagName}>.`);\n }\n if (typeof registry.get(tagName) !== \"undefined\") {\n attach();\n return;\n }\n\n record.phase = \"waiting-definition\";\n record.pendingDefinitions += 1;\n const generation = record.generation;\n const coordinator: DefinitionCoordinator = getDefinitionCoordinator(registry);\n const cancel = coordinator.wait(tagName, () => {\n if (!this.isAlive(record, generation)) return;\n try {\n upgradeCustomElement(registry, record.info.node);\n attach();\n record.pendingDefinitions -= 1;\n if (record.pendingDefinitions === 0) {\n record.phase = \"active\";\n this.settleInitialRecord(record);\n }\n } catch {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n }\n }, () => {\n if (!this.isAlive(record, generation)) return;\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n });\n addRecordTeardown(record, cancel);\n }\n\n private settleInitialRecord(record: IInternalBindingRecord): void {\n if (!config.enableDirectionalInitialSync || record.initialSettled || !record.options.registerAddress) return;\n record.phase = \"synchronizing\";\n try {\n const policy = resolveInitialSyncPolicy(record.info);\n const authority = resolveInitialAuthority(record.info, policy.authority);\n record.initialPolicy = policy;\n record.resolvedAuthority = authority;\n record.initialSettled = true;\n record.outputOnlyMember = policy.outputOnly;\n record.phase = \"active\";\n if (!policy.observable) return;\n if (\n policy.syncOn === \"connect\"\n && record.info.node instanceof HTMLElement\n && !record.info.node.isConnected\n ) {\n record.observationPending = true;\n // 待ちが 1 件でもある間は追加側 observer スキップを無効化する\n incrementPendingObservation();\n return;\n }\n this.readProducerSnapshot(record, policy.syncOn === \"call\");\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n }\n\n private readProducerSnapshot(record: IInternalBindingRecord, eventWins: boolean): void {\n if (!this.isAlive(record, record.generation)) return;\n const target = record.info.node as Node & Record<string, unknown>;\n const name = record.info.propName;\n if (!(name in target)) return;\n const sequence = record.eventSequence;\n const value = target[name];\n if (record.observationPending) {\n record.observationPending = false;\n decrementPendingObservation();\n }\n if (eventWins && record.eventSequence !== sequence) return;\n record.hasProducerValue = true;\n record.producerValue = value;\n if (record.resolvedAuthority === \"element\") {\n commitProducerValue(record.info, value);\n }\n }\n\n private settleConnectedSnapshot(record: IInternalBindingRecord): void {\n if (\n !config.enableDirectionalInitialSync\n || !record.observationPending\n || !(record.info.node instanceof HTMLElement)\n || !record.info.node.isConnected\n ) return;\n try {\n this.readProducerSnapshot(record, false);\n } catch {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n }\n }\n\n private registerAddress(record: IInternalBindingRecord, knownRoot?: Node | null): void {\n if (record.address !== null || record.patternListIndex !== null) return;\n const binding = record.info;\n const listIndex = getListIndexByBindingInfo(binding);\n if (listIndex !== null) {\n // リスト行: (absolutePathInfo, listIndex) のパターン台帳に登録し、\n // AbsoluteStateAddress の intern(アドレス割当 + intern 用 WeakMap)を省略する\n const rootNode = resolveBindingRootNode(binding, knownRoot);\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n const absolutePathInfo = getAbsolutePathInfo(stateElement, binding.statePathInfo);\n addBindingByPattern(absolutePathInfo, listIndex, binding);\n record.patternPathInfo = absolutePathInfo;\n record.patternListIndex = listIndex;\n } else {\n const address = getAbsoluteStateAddressByBinding(binding, knownRoot);\n addBindingByAbsoluteStateAddress(address, binding);\n record.address = address;\n }\n // 台帳解除は runTeardowns が record.address / pattern フィールドから\n // データ駆動で行う(クロージャ不要)\n if (!record.options.registerPathInfo) return;\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n if (binding.bindingType !== \"event\") {\n stateElement.setPathInfo(binding.statePathName, binding.bindingType);\n }\n }\n\n private isAlive(record: IInternalBindingRecord, generation: number): boolean {\n return record.generation === generation\n && recordByBinding.get(record.info) === record\n && record.phase !== \"disposed\"\n && record.phase !== \"failed\";\n }\n\n private disposeRecord(record: IInternalBindingRecord): void {\n if (record.phase === \"disposed\") return;\n record.phase = \"disposed\";\n this.runTeardowns(record);\n this.records.delete(record);\n }\n\n private runTeardowns(record: IInternalBindingRecord): void {\n // runTeardowns は record の終端(disposed / failed)でのみ呼ばれる。未消化の\n // connect-snapshot 待ちが残っていれば必ずカウンタを戻す(スキップ再有効化)。\n if (record.observationPending) {\n record.observationPending = false;\n decrementPendingObservation();\n }\n const binding = record.info;\n // データ駆動の後始末(従来はクロージャで積んでいた頻出3種)。実行順は従来の\n // 逆順実行と同じ: アドレス台帳解除(最後に積まれていた)→ 双方向 detach →\n // 希少クロージャ群(逆順)→ イベント detach。各 detach は互いに独立した資源を\n // 対象とするため、この順序で意味論は変わらない。\n if (record.address !== null) {\n try {\n removeBindingByAbsoluteStateAddress(record.address, binding);\n record.address = null;\n clearStateAddressByBindingInfo(binding);\n clearAbsoluteStateAddressByBinding(binding);\n } catch {\n // Cleanup is best-effort; one faulty resource must not retain the rest.\n }\n } else if (record.patternListIndex !== null) {\n try {\n removeBindingByPattern(record.patternPathInfo!, record.patternListIndex, binding);\n record.patternPathInfo = null;\n record.patternListIndex = null;\n // 相対アドレス(getValue)と絶対アドレス(applyChangeToFor / updatedCallback 経由の\n // 遅延 intern)のメモは pattern 登録でも作られうるため対称にクリアする\n clearStateAddressByBindingInfo(binding);\n clearAbsoluteStateAddressByBinding(binding);\n } catch {\n // Cleanup is best-effort.\n }\n }\n if (record.twowayAttached) {\n record.twowayAttached = false;\n try {\n detachTwowayEventHandler(binding);\n } catch {\n // Cleanup is best-effort.\n }\n }\n if (record.teardowns !== null) {\n const teardowns = Array.from(record.teardowns).reverse();\n record.teardowns = null;\n for (const teardown of teardowns) {\n try {\n teardown();\n } catch {\n // Cleanup is best-effort; one faulty resource must not retain the rest.\n }\n }\n }\n if (record.eventAttached) {\n record.eventAttached = false;\n try {\n detachEventHandler(binding);\n } catch {\n // Cleanup is best-effort.\n }\n }\n }\n}\n\nexport function getOrCreateBindingSession(root: Node): BindingSession {\n let session = sessionByRoot.get(root);\n if (typeof session === \"undefined\") {\n session = new BindingSession(root);\n sessionByRoot.set(root, session);\n }\n return session;\n}\n\nexport function getBindingSession(binding: IBindingInfo): BindingSession | null {\n return recordByBinding.get(binding)?.session ?? null;\n}\n","import { IBindingInfo } from \"../types.js\";\n\nexport function replaceToReplaceNode(bindingInfo: IBindingInfo): void {\n const node = bindingInfo.node;\n const replaceNode = bindingInfo.replaceNode;\n if (node === replaceNode) {\n return;\n }\n if (node.parentNode === null) {\n // already replaced\n return;\n }\n node.parentNode.replaceChild(replaceNode, node);\n}\n","import { IStateElement } from \"../components/types\";\n\nconst completeByStateElementByWebComponent = new WeakMap<Element, WeakMap<IStateElement, boolean>>();\n\nexport function markWebComponentAsComplete(webComponent: Element, stateElement: IStateElement): void {\n let completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\n if (!completeByStateElement) {\n completeByStateElement = new WeakMap<IStateElement, boolean>();\n completeByStateElementByWebComponent.set(webComponent, completeByStateElement);\n }\n completeByStateElement.set(stateElement, true);\n}\n\nexport function isWebComponentComplete(webComponent: Element, stateElement: IStateElement): boolean {\n const completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\n if (!completeByStateElement) {\n return false;\n }\n return completeByStateElement.get(stateElement) === true;\n}\n","import { IFilterInfo } from \"../binding/types.js\";\n\nexport function getFilteredValue(value: any, filters: IFilterInfo[]) {\n let filteredValue = value;\n for(const filter of filters) {\n filteredValue = filter.filterFn(filteredValue);\n }\n return filteredValue;\n}\n","import { createEmptyArray } from \"../createEmptyArray\";\nimport { IBindingInfo } from \"../types\";\nimport { getFilteredValue } from \"./getFilteredValue\";\nimport { IApplyContext } from \"./types\";\n\nconst EMPTY_ARRAY = createEmptyArray<unknown>();\n\nexport function applyChangeToCheckbox(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as HTMLInputElement;\n const elementValue = element.value;\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\n const normalizedNewValue = Array.isArray(newValue) ? newValue : EMPTY_ARRAY;\n element.checked = normalizedNewValue.includes(elementFilteredValue);\n}\n","\nexport function createEmptyArray<T>(): Readonly<Array<T>> {\n return Object.freeze<Array<T>>([]);\n}\n","/**\n * command.<methodName>: <commandToken-path> バインディングの適用ハンドラ。\n *\n * subscribe lifecycle:\n * - 同一 binding に同じ token が再評価された場合は no-op。\n * - 異なる token が来た場合は古い subscription を解除し、新しい token に subscribe し直す。\n * 旧解除は新しい binding 妥当性検証(methodName・wcBindable.commands チェック)を\n * 通過した後に行うため、再評価が validation で失敗しても旧購読は温存される(fail-fast)。\n * - element は WeakRef で保持し、subscriber 経由で element を強参照しないようにする。\n * これにより、element が DOM から消えた後に subscriber が token._subscribers に\n * 残っていても element 本体は GC 可能。\n * - emit 時に下記いずれかなら自動で subscription を破棄する(lazy purge):\n * - WeakRef.deref() が undefined(element が既に GC 済み)\n * - element.isConnected が false(DOM から取り外されている)\n *\n * 既知の制約:\n * - emit が来なければ stale subscriber は token に残り続ける(要素が GC されても subscriber 関数自体は残る)。\n * state インスタンスが disconnect されたタイミングで registry ごとクリアされるため、最終的には解放される。\n * element ライフサイクルに直接フックする手段が現状の binding 機構に無いため、能動的な purge は将来課題。\n */\n\nimport { isCommandToken } from \"../command/CommandToken\";\nimport { ICommandToken } from \"../command/types\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration, ReadBindableResult } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\ninterface ICommandSubscription {\n readonly token: ICommandToken;\n readonly unsubscribe: () => void;\n readonly elementRef: WeakRef<Element>;\n}\n\nconst subscribedBindings: WeakMap<IBindingInfo, ICommandSubscription> = new WeakMap();\n\nfunction getWcBindable(element: Element): ReadBindableResult | null {\n const customTagName = getCustomElement(element);\n if (customTagName === null) {\n return null;\n }\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined for command binding.`);\n }\n return readBindableDeclaration(element);\n}\n\nexport function applyChangeToCommand(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n if (!isCommandToken(newValue)) {\n raiseError(`command binding requires a CommandToken value (use $command.<tokenName> with a name declared in $commandTokens).`);\n }\n const token = newValue as ICommandToken;\n\n const existing = subscribedBindings.get(binding);\n if (existing && existing.token === token) {\n return;\n }\n\n // 新しい binding 妥当性検証は、旧 subscription を解除する前に通す(fail-fast)。\n const element = binding.node as Element;\n const methodName = binding.propSegments[1];\n if (typeof methodName !== \"string\" || methodName.length === 0) {\n raiseError(`command binding requires a method name (e.g., \"command.fetch\").`);\n }\n\n const bindable = getWcBindable(element);\n if (bindable === null) {\n raiseError(`command binding requires a wc-bindable custom element. <${element.tagName.toLowerCase()}> is not wc-bindable.`);\n }\n if (!bindable.declaredCommands.has(methodName)) {\n raiseError(`Command \"${methodName}\" is not declared in wcBindable.commands of <${element.tagName.toLowerCase()}>.`);\n }\n\n // ここまで来たら旧解除して新 subscribe に切り替える。\n if (existing) {\n existing.unsubscribe();\n subscribedBindings.delete(binding);\n }\n\n const elementRef = new WeakRef(element);\n let unsubscribe: (() => void) | null = null;\n const subscriber = (...args: unknown[]): unknown => {\n const el = elementRef.deref();\n if (!el || !el.isConnected) {\n unsubscribe?.();\n subscribedBindings.delete(binding);\n return undefined;\n }\n const method = (el as unknown as Record<string, unknown>)[methodName];\n if (typeof method !== \"function\") {\n raiseError(`Method \"${methodName}\" is not a function on <${el.tagName.toLowerCase()}>.`);\n }\n return Reflect.apply(method as (...a: unknown[]) => unknown, el, args);\n };\n unsubscribe = token.subscribe(subscriber);\n subscribedBindings.set(binding, { token, unsubscribe, elementRef });\n}\n\nexport const __private__ = {\n subscribedBindings,\n};\n","import { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\n\nconst indexBindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\n\nexport function getIndexBindingsByContent(content: IContent): IBindingInfo[] {\n return indexBindingsByContent.get(content) ?? [];\n}\n\nexport function setIndexBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\n indexBindingsByContent.set(content, bindings);\n}\n","/* v8 ignore file */\nexport {};\n\ndeclare global {\n interface Set<T> {\n difference(other: Set<T>): Set<T>;\n intersection(other: Set<T>): Set<T>;\n }\n}\n\nif (!Set.prototype.difference) {\n Set.prototype.difference = function <T>(this: Set<T>, other: Set<T>): Set<T> {\n const result = new Set(this);\n for (const elem of other) {\n result.delete(elem);\n }\n return result;\n };\n}\n\nif (!Set.prototype.intersection) {\n Set.prototype.intersection = function <T>(this: Set<T>, other: Set<T>): Set<T> {\n const result = new Set<T>();\n for (const elem of other) {\n if (this.has(elem)) {\n result.add(elem);\n }\n }\n return result;\n };\n}\n","\nlet count = 0;\nexport function getUUID(): string {\n return `u${(count++).toString(36)}`;\n}\n","import { getUUID } from \"../getUUID\";\nimport { IListIndex } from \"./types\";\n\nlet version = 0;\n\nclass ListIndex implements IListIndex {\n readonly uuid = getUUID();\n readonly parentListIndex: IListIndex | null;\n readonly position: number;\n readonly length: number;\n\n private _index: number;\n private _version: number;\n private _indexes: number[] | undefined;\n private _listIndexes: WeakRef<IListIndex>[] | undefined;\n\n /**\n * Creates a new ListIndex instance.\n * \n * @param parentListIndex - Parent list index for nested loops, or null for top-level\n * @param index - Current index value in the loop\n */\n constructor(parentListIndex: IListIndex | null, index: number) {\n this.parentListIndex = parentListIndex;\n this.position = parentListIndex ? parentListIndex.position + 1 : 0;\n this.length = this.position + 1;\n this._index = index;\n this._version = version;\n }\n\n /**\n * Gets current index value.\n * \n * @returns Current index number\n */\n get index() {\n return this._index;\n }\n \n /**\n * Sets index value and updates version.\n * \n * @param value - New index value\n */\n set index(value: number) {\n this._index = value;\n this._version = ++version;\n this.indexes[this.position] = value;\n }\n\n /**\n * Gets current version number for change detection.\n * \n * @returns Version number\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * Checks if parent indexes have changed since last access.\n * \n * @returns true if parent has newer version, false otherwise\n */\n get dirty(): boolean {\n if (this.parentListIndex === null) {\n return false;\n } else {\n return this.parentListIndex.dirty || this.parentListIndex.version > this._version;\n }\n }\n\n /**\n * Gets array of all index values from root to current level.\n * Rebuilds array if parent indexes have changed (dirty).\n * \n * @returns Array of index values\n */\n get indexes(): number[] {\n if (this.parentListIndex === null) {\n if (typeof this._indexes === \"undefined\") {\n this._indexes = [this._index];\n }\n } else {\n if (typeof this._indexes === \"undefined\" || this.dirty) {\n this._indexes = [...this.parentListIndex.indexes, this._index];\n this._version = version;\n }\n }\n return this._indexes;\n }\n\n /**\n * Gets array of WeakRef to all ListIndex instances from root to current level.\n * \n * @returns Array of WeakRef<IListIndex>\n */\n get listIndexes(): WeakRef<IListIndex>[] {\n if (this.parentListIndex === null) {\n if (typeof this._listIndexes === \"undefined\") {\n this._listIndexes = [new WeakRef(this)];\n }\n } else {\n if (typeof this._listIndexes === \"undefined\") {\n this._listIndexes = [...this.parentListIndex.listIndexes, new WeakRef(this)];\n }\n }\n return this._listIndexes;\n }\n\n /**\n * Gets variable name for this loop index ($1, $2, etc.).\n * \n * @returns Variable name string\n */\n get varName(): string {\n return `$${this.position + 1}`;\n }\n\n /**\n * Gets ListIndex at specified position in hierarchy.\n * Supports negative indexing from end.\n * \n * @param pos - Position index (0-based, negative for from end)\n * @returns ListIndex at position or null if not found/garbage collected\n */\n at(pos: number): IListIndex | null {\n if (pos >= 0) {\n return this.listIndexes[pos]?.deref() || null;\n } else {\n return this.listIndexes[this.listIndexes.length + pos]?.deref() || null;\n }\n }\n}\n\n/**\n * Factory function to create ListIndex instance.\n * \n * @param parentListIndex - Parent list index for nested loops, or null for top-level\n * @param index - Current index value in the loop\n * @returns New IListIndex instance\n */\nexport function createListIndex(parentListIndex: IListIndex | null, index: number): IListIndex {\n return new ListIndex(parentListIndex, index);\n}\n","import { IListIndex } from \"./types\";\n\nconst listIndexesByList = new WeakMap<readonly unknown[], IListIndex[]>();\n\nexport function getListIndexesByList(list: readonly unknown[]): IListIndex[] | null {\n return listIndexesByList.get(list) || null;\n}\n\nexport function setListIndexesByList(list: readonly unknown[], listIndexes: IListIndex[] | null): void {\n if (listIndexes === null) {\n listIndexesByList.delete(list);\n return;\n }\n listIndexesByList.set(list, listIndexes);\n}","import \"../polyfills\";\nimport { createListIndex } from \"./createListIndex\";\nimport { getListIndexesByList, setListIndexesByList } from \"./listIndexesByList\";\nimport { IListDiff, IListIndex } from \"./types\";\n\nconst listDiffByOldListByNewList = new WeakMap<readonly unknown[], WeakMap<readonly unknown[], IListDiff>>();\n\nconst EMPTY_LIST = Object.freeze([]);\nconst EMPTY_SET = new Set<IListIndex>();\n\nfunction getListDiff(rawOldList: readonly unknown[], rawNewList: readonly unknown[]): IListDiff | null {\n const oldList = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\n const newList = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\n if (!diffByNewList) {\n return null;\n }\n return diffByNewList.get(newList) || null;\n}\n\nfunction setListDiff(oldList: readonly unknown[], newList: readonly unknown[], diff: IListDiff): void {\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\n if (!diffByNewList) {\n diffByNewList = new WeakMap<readonly unknown[], IListDiff>();\n listDiffByOldListByNewList.set(oldList, diffByNewList);\n }\n diffByNewList.set(newList, diff);\n}\n/**\n * Checks if two lists are identical by comparing length and each element.\n * @param oldList - Previous list to compare\n * @param newList - New list to compare\n * @returns True if lists are identical, false otherwise\n */\nfunction isSameList(oldList: readonly unknown[], newList: readonly unknown[]): boolean {\n if (oldList.length !== newList.length) {\n return false;\n }\n\n for (let i = 0; i < oldList.length; i++) {\n if (oldList[i] !== newList[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Aligns each list index's .index with its position in the new list.\n * A diff only becomes the rendered state once the updater applies it: an\n * earlier diff in the same batch (two replacements in one microtask) may have\n * moved shared indexes toward a list that never got applied, and a cache hit\n * skips recomputation entirely — so every createListDiff return re-aligns.\n */\nfunction syncListIndexes(newIndexes: IListIndex[]): void {\n for (let i = 0; i < newIndexes.length; i++) {\n if (newIndexes[i].index !== i) {\n newIndexes[i].index = i;\n }\n }\n}\n\n/**\n * Creates or updates list indexes by comparing old and new lists.\n * Optimizes by reusing existing list indexes when values match.\n * @param parentListIndex - Parent list index for nested lists, or null for top-level\n * @param oldList - Previous list (will be normalized to array)\n * @param newList - New list (will be normalized to array)\n * @param oldIndexes - Array of existing list indexes to potentially reuse\n * @returns Array of list indexes for the new list\n */\nexport function createListDiff(\n parentListIndex: IListIndex | null,\n rawOldList: unknown,\n rawNewList: unknown,\n): IListDiff {\n const diff = computeListDiff(parentListIndex, rawOldList, rawNewList);\n syncListIndexes(diff.newIndexes);\n return diff;\n}\n\nfunction computeListDiff(\n parentListIndex: IListIndex | null,\n rawOldList: unknown,\n rawNewList: unknown,\n): IListDiff {\n // Normalize inputs to arrays (handles null/undefined)\n const oldList: readonly unknown[] = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\n const newList: readonly unknown[] = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\n const cachedDiff = getListDiff(oldList, newList);\n if (cachedDiff) {\n return cachedDiff;\n }\n const oldIndexes = getListIndexesByList(oldList) || [];\n let retValue: IListDiff | undefined;\n try {\n // Early return for empty list\n if (newList.length === 0) {\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: [] as IListIndex[],\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: new Set<IListIndex>(oldIndexes),\n addIndexSet: EMPTY_SET,\n };\n }\n // If old list was empty, create all new indexes\n let newIndexes: IListIndex[] | null = getListIndexesByList(newList);\n if (oldList.length === 0) {\n if (newIndexes === null) {\n newIndexes = [];\n for(let i = 0; i < newList.length; i++) {\n const newListIndex = createListIndex(parentListIndex, i);\n newIndexes.push(newListIndex);\n }\n }\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: EMPTY_SET,\n addIndexSet: new Set<IListIndex>(newIndexes),\n };\n }\n // If lists are identical, return existing indexes unchanged (optimization)\n if (isSameList(oldList, newList)) {\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: oldIndexes,\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: EMPTY_SET,\n addIndexSet: EMPTY_SET,\n };\n }\n if (newIndexes !== null) {\n return calcDiffIndexes(oldIndexes, newIndexes);\n }\n newIndexes = [];\n\n // Use index-based map for efficiency\n // Supports duplicate values by storing array of indexes\n const indexByValue = new Map<unknown, number[]>();\n for(let i = 0; i < oldList.length; i++) {\n const val = oldList[i];\n let indexes = indexByValue.get(val);\n if (!indexes) {\n indexes = [];\n indexByValue.set(val, indexes);\n }\n indexes.push(i);\n }\n\n // Build new indexes array by matching values with old list\n const changeIndexSet: Set<IListIndex> = new Set();\n const addIndexSet: Set<IListIndex> = new Set();\n for(let i = 0; i < newList.length; i++) {\n const newValue = newList[i];\n const existingIndexes = indexByValue.get(newValue);\n const oldIndex = existingIndexes && existingIndexes.length > 0 ? existingIndexes.shift() : undefined;\n \n if (typeof oldIndex === \"undefined\") {\n // New element\n const newListIndex = createListIndex(parentListIndex, i);\n newIndexes.push(newListIndex);\n addIndexSet.add(newListIndex);\n } else {\n // Reuse existing element\n const existingListIndex = oldIndexes[oldIndex];\n // Judge position change against the old list's order (oldIndexes array\n // order), not the mutable .index — an earlier diff in the same batch\n // may have already moved .index toward a list that was never applied.\n // The .index itself is re-aligned by syncListIndexes on return.\n if (oldIndex !== i) {\n changeIndexSet.add(existingListIndex);\n }\n newIndexes.push(existingListIndex);\n }\n }\n \n const deleteIndexSet: Set<IListIndex> = (new Set(oldIndexes)).difference(new Set(newIndexes));\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: changeIndexSet,\n deleteIndexSet: deleteIndexSet,\n addIndexSet: addIndexSet,\n };\n } finally {\n if (typeof retValue !== \"undefined\") {\n setListDiff(oldList, newList, retValue);\n setListIndexesByList(newList, retValue.newIndexes);\n }\n }\n}\n\n/**\n * Diff between two lists whose listIndex ledgers both already exist.\n * Rows are joined by listIndex identity — the same key applyChangeToFor and\n * walkDependency consume the result sets with. A value-based join could mark\n * oldIndexes-side objects that are absent from newIndexes (ledgers built along\n * unconnected diff chains hold different objects for the same value); such\n * orphan markers never match the consumers' has() lookups and only pollute\n * the dirty set. Rows without shared identity are represented as add+delete.\n */\nfunction calcDiffIndexes(\n oldIndexes: IListIndex[],\n newIndexes: IListIndex[],\n): IListDiff {\n const newIndexSet: Set<IListIndex> = new Set(newIndexes);\n const oldIndexSet: Set<IListIndex> = new Set(oldIndexes);\n const changeIndexSet: Set<IListIndex> = new Set();\n const addIndexSet: Set<IListIndex> = newIndexSet.difference(oldIndexSet);\n const deleteIndexSet: Set<IListIndex> = oldIndexSet.difference(newIndexSet);\n // Old positions come from the oldIndexes array order (.index may have been\n // mutated by an unapplied diff in the same batch).\n const oldPosByIndex = new Map<IListIndex, number>();\n for (let i = 0; i < oldIndexes.length; i++) {\n oldPosByIndex.set(oldIndexes[i], i);\n }\n for (let i = 0; i < newIndexes.length; i++) {\n const index = newIndexes[i];\n if (addIndexSet.has(index)) {\n continue;\n }\n if (oldPosByIndex.get(index) !== i) {\n // 位置が違うことだけを記録\n changeIndexSet.add(index);\n }\n }\n return {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: changeIndexSet,\n deleteIndexSet: deleteIndexSet,\n addIndexSet: addIndexSet,\n };\n}","import { IListDiff, IListIndex } from \"./types\";\n\n/**\n * Indices into `seq` whose values form a longest strictly-increasing\n * subsequence, returned in ascending order. Classic patience-sorting\n * LIS in O(n log n). `seq` values are assumed distinct (old list\n * positions are unique).\n */\nexport function longestIncreasingSubsequence(seq: number[]): number[] {\n const n = seq.length;\n // tails[k] = index into seq of the smallest tail of an increasing\n // subsequence of length k+1; prev[i] = predecessor index to rebuild the chain.\n const tails: number[] = [];\n const prev: number[] = new Array(n).fill(-1);\n for (let i = 0; i < n; i++) {\n const value = seq[i];\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (seq[tails[mid]] < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n if (lo > 0) {\n prev[i] = tails[lo - 1];\n }\n tails[lo] = i;\n }\n const result: number[] = [];\n let k = tails.length > 0 ? tails[tails.length - 1] : -1;\n while (k >= 0) {\n result.push(k);\n k = prev[k];\n }\n result.reverse();\n return result;\n}\n\n/**\n * Determines which reused list indexes can stay where they are when the DOM\n * is brought into the new list order.\n *\n * Returns null when the reused indexes already appear in their old relative\n * order (no inversions) — the caller's existing position guard then performs\n * no moves, so nothing extra is needed. When inversions exist, returns the\n * set of indexes forming a longest increasing subsequence of old positions:\n * leaving exactly those in place and moving every other content yields the\n * correct final order with the fewest content moves (the naive forward walk\n * otherwise cascades: a single swap of rows 2/999 in 1000 rows moves ~997\n * contents instead of 2).\n *\n * Note: IListIndex.index is already mutated to the NEW position by\n * createListDiff, so old positions must come from the oldIndexes array order.\n */\nexport function computeStableIndexSet(diff: IListDiff): ReadonlySet<IListIndex> | null {\n // No reused index changed position, or nothing was reused: relative order\n // is already correct and the walk performs no moves.\n if (diff.changeIndexSet.size === 0 || diff.addIndexSet.size === diff.newIndexes.length) {\n return null;\n }\n const oldPosByIndex = new Map<IListIndex, number>();\n for (let i = 0; i < diff.oldIndexes.length; i++) {\n oldPosByIndex.set(diff.oldIndexes[i], i);\n }\n const reused: IListIndex[] = [];\n const seq: number[] = [];\n let prevPos = -1;\n let sorted = true;\n for (const index of diff.newIndexes) {\n if (diff.addIndexSet.has(index)) {\n continue;\n }\n const pos = oldPosByIndex.get(index);\n if (pos === undefined) {\n // Invariant break (a reused index missing from oldIndexes): fall back\n // to the settle walk rather than compute a stable set from bad data.\n return null;\n }\n if (pos < prevPos) {\n sorted = false;\n }\n prevPos = pos;\n reused.push(index);\n seq.push(pos);\n }\n if (sorted) {\n return null;\n }\n const lis = longestIncreasingSubsequence(seq);\n const stable = new Set<IListIndex>();\n for (const seqIndex of lis) {\n stable.add(reused[seqIndex]);\n }\n return stable;\n}\n","import { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\n\nconst bindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\n\nexport function getBindingsByContent(content: IContent): IBindingInfo[] {\n return bindingsByContent.get(content) ?? [];\n}\n\nexport function setBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\n bindingsByContent.set(content, bindings);\n}\n","import { IContent } from \"../structural/types\";\nimport type { BindingSession } from \"./BindingSession\";\n\nconst bindingSessionByContent = new WeakMap<IContent, BindingSession>();\n\nexport function getBindingSessionByContent(content: IContent): BindingSession | null {\n return bindingSessionByContent.get(content) ?? null;\n}\n\nexport function setBindingSessionByContent(content: IContent, session: BindingSession): void {\n bindingSessionByContent.set(content, session);\n}\n","import { IContent } from \"../structural/types\";\n\nconst nodesByContent: WeakMap<IContent, Node[]> = new WeakMap();\n\nexport function getNodesByContent(content: IContent): Node[] {\n return nodesByContent.get(content) ?? [];\n}\n\nexport function setNodesByContent(content: IContent, nodes: Node[]): void {\n nodesByContent.set(content, nodes);\n}\n","import { setLoopContextByNode } from \"../list/loopContextByNode\";\nimport { ILoopContext } from \"../list/types\";\nimport { IContent } from \"../structural/types\";\nimport { getNodesByContent } from \"./nodesByContent\";\n\nexport function bindLoopContextToContent(content: IContent, loopContext: ILoopContext | null): void {\n const nodes = getNodesByContent(content);\n for(const node of nodes) {\n setLoopContextByNode(node, loopContext);\n }\n}\n\nexport function unbindLoopContextToContent(content: IContent): void {\n const nodes = getNodesByContent(content);\n for(const node of nodes) {\n setLoopContextByNode(node, null);\n }\n}\n","import { applyChange } from \"../apply/applyChange\";\nimport { IApplyContext } from \"../apply/types\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { addBindingByAbsoluteStateAddress, removeBindingByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { getBindingsByContent } from \"../bindings/bindingsByContent\";\nimport { getBindingSessionByContent } from \"../bindings/bindingSessionByContent\";\nimport { bindLoopContextToContent, unbindLoopContextToContent } from \"../bindings/bindLoopContextToContent\";\nimport { ILoopContext } from \"../list/types\";\nimport { IContent } from \"./types\";\n\nexport function activateContent(\n content: IContent,\n loopContext: ILoopContext | null,\n context: IApplyContext,\n): void {\n bindLoopContextToContent(content, loopContext);\n const bindings = getBindingsByContent(content);\n const session = getBindingSessionByContent(content);\n if (session !== null) {\n // createContent 側の initialize で remember 済みの同一 binding 配列なので、\n // remember を再実行しない専用パスで活性化する(リスト行生成のホットパス)。\n // context.rootNode は applyChangeFromBindings が確定済みの root(fragment\n // バッファ中は setRootNodeByFragment の対応先と同一)で、binding ごとの\n // getRootNode を省略できる\n session.activate(bindings, context.rootNode);\n }\n for (const binding of bindings) {\n if (session === null) {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n }\n if (session !== null && !session.shouldApplyState(binding)) {\n continue;\n }\n applyChange(binding, context);\n }\n}\n\nexport function deactivateContent(\n content: IContent,\n): void {\n if (!content.mounted) {\n return;\n }\n const bindings = getBindingsByContent(content);\n const session = getBindingSessionByContent(content);\n for (const binding of bindings) {\n if (session !== null) {\n session.disposeBinding(binding);\n } else {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n removeBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n }\n }\n unbindLoopContextToContent(content);\n}\n","import { createEmptySet } from \"../createEmptySet\";\nimport { IContent } from \"./types\";\n\nconst contentSetByNode = new WeakMap<Node, Set<IContent>>();\n\nconst EMPTY_SET = createEmptySet<IContent>();\n\nexport function setContentByNode(node: Node, content: IContent): void {\n const contents = contentSetByNode.get(node);\n if (contents) {\n contents.add(content);\n } else {\n contentSetByNode.set(node, new Set([content]));\n }\n}\n\nexport function getContentSetByNode(node: Node): Readonly<Set<IContent>> {\n const contents = contentSetByNode.get(node);\n if (typeof contents !== \"undefined\") {\n return contents;\n }\n return EMPTY_SET;\n}\n\nexport function deleteContentByNode(node: Node, content: IContent): void {\n const contents = contentSetByNode.get(node);\n if (contents) {\n contents.delete(content);\n if (contents.size === 0) {\n contentSetByNode.delete(node);\n }\n }\n}","\nexport function createEmptySet<T>(): Readonly<Set<T>> {\n return Object.freeze(new Set<T>());\n}\n","import { clearAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo.js\";\nimport { getBindingsByContent, setBindingsByContent } from \"../bindings/bindingsByContent.js\";\nimport { getBindingSessionByContent, setBindingSessionByContent } from \"../bindings/bindingSessionByContent.js\";\nimport { markNodeRegistered } from \"../bindings/collectNodesAndBindingInfos.js\";\nimport { setIndexBindingsByContent } from \"../bindings/indexBindingsByContent.js\";\nimport { initializeBindingsByFragment, initializeRowBindings } from \"../bindings/initializeBindings.js\";\nimport { resolveInitializedBinding } from \"../bindings/initializeBindingPromiseByNode.js\";\nimport { setNodesByContent } from \"../bindings/nodesByContent.js\";\nimport { markObserverSkipOnAdd, markObserverSkipOnRemove } from \"../bindings/observerSkip.js\";\nimport { config } from \"../config.js\";\nimport { INDEX_BY_INDEX_NAME } from \"../define.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { getContentSetByNode, setContentByNode } from \"./contentsByNode.js\";\nimport { getFragmentInfoByUUID } from \"./fragmentInfoByUUID.js\";\nimport { resolveNodePath } from \"./resolveNodePath.js\";\nimport { compileRowPlan } from \"./rowPlan.js\";\nimport { IContent, IFragmentInfo, IRowPlan } from \"./types.js\";\n\nconst recursiveBindingTypes = new Set(['if', 'elseif', 'else', 'for']);\n\nclass Content implements IContent {\n private _content: DocumentFragment;\n private _childNodeArray: Node[] = [];\n private _firstNode: Node | null = null;\n private _lastNode: Node | null = null;\n private _mounted: boolean = false;\n constructor(content: DocumentFragment) {\n this._content = content;\n this._childNodeArray = Array.from(this._content.childNodes);\n this._firstNode = this._childNodeArray.length > 0 ? this._childNodeArray[0] : null;\n this._lastNode = this._childNodeArray.length > 0 ? this._childNodeArray[this._childNodeArray.length - 1] : null;\n }\n\n get firstNode(): Node | null {\n return this._firstNode;\n }\n\n get lastNode(): Node | null {\n return this._lastNode;\n }\n\n get mounted(): boolean {\n return this._mounted;\n }\n\n appendTo(targetNode: Node): void {\n for(const node of this._childNodeArray) {\n // framework 起点のマウントを observer に伝える。中間 fragment へ append する\n // 経路でも、後続の一括 insertBefore(fragment) の mutation record には\n // この top-level node が addedNodes として現れるため、ここでのマークが届く。\n markObserverSkipOnAdd(node);\n targetNode.appendChild(node);\n }\n this._mounted = true;\n }\n\n mountAfter(targetNode: Node): void {\n const parentNode = targetNode.parentNode;\n if (parentNode) {\n // マウント済み content にも再突入する(if の true→true 再適用・SSR\n // ハイドレーション産 content 等)。固定の nextSibling へ一括 insertBefore\n // すると、マウント済みでは nextSibling が自分の先頭ノードを指すため\n // 先頭ノードが末尾へ回転する。anchor を進めながら位置一致ノードを\n // スキップすることで冪等にする(mutation record も発生させない)。\n let anchor: Node = targetNode;\n for(const node of this._childNodeArray) {\n if (anchor.nextSibling !== node) {\n markObserverSkipOnAdd(node);\n parentNode.insertBefore(node, anchor.nextSibling);\n }\n anchor = node;\n }\n }\n this._mounted = true;\n }\n\n tryDestroy(): boolean {\n const session = getBindingSessionByContent(this);\n // session 無し(SSR ハイドレーション産)や、定義待ち・connect-snapshot 待ちを\n // 抱える content は teardown 省略でリークするため従来経路に倒す。\n if (session === null || !session.canWholesaleDestroy()) {\n return false;\n }\n session.destroyRecords();\n for (const node of this._childNodeArray) {\n // unmount と同じ理由の observer 向け削除マーク(clear の一括削除でも\n // top-level node が mutation record の root に現れる)\n markObserverSkipOnRemove(node);\n if (node.parentNode !== null) {\n node.parentNode.removeChild(node);\n }\n }\n const bindings = getBindingsByContent(this);\n for (const binding of bindings) {\n if (recursiveBindingTypes.has(binding.bindingType)) {\n const contents = getContentSetByNode(binding.node);\n for (const content of contents) {\n if (!content.tryDestroy()) {\n content.unmount();\n }\n }\n }\n }\n this._mounted = false;\n return true;\n }\n\n unmount(): void {\n getBindingSessionByContent(this)?.dispose();\n for(const node of this._childNodeArray) {\n // framework 起点の削除であることを observer に伝える。clear の\n // parentNode.textContent='' 一括削除でも、この top-level node が\n // 削除サブツリーの root として mutation record に現れるため、ここで\n // マークしておけば observer の冗長走査をスキップできる。マークは\n // 同期実行中に立ち、observer は次 microtask で読むので順序は保証される。\n markObserverSkipOnRemove(node);\n if (node.parentNode !== null) {\n node.parentNode.removeChild(node);\n }\n }\n const bindings = getBindingsByContent(this);\n for(const binding of bindings) {\n if (recursiveBindingTypes.has(binding.bindingType)) {\n const contents = getContentSetByNode(binding.node);\n for (const content of contents) {\n content.unmount();\n }\n }\n clearStateAddressByBindingInfo(binding);\n clearAbsoluteStateAddressByBinding(binding);\n }\n this._mounted = false;\n }\n}\n\n/**\n * SSR ハイドレーション用: 既存の DOM ノード配列から Content を生成する。\n * テンプレートからの clone ではなく、SSR で描画済みのノードをそのまま使う。\n */\nexport function createContentFromNodes(\n nodes: Node[],\n): IContent {\n const fragment = document.createDocumentFragment();\n // ノードを fragment に移動せず、参照だけ持つ Content を作る\n const content = new Content(fragment);\n // Content の内部状態を直接設定\n (content as any)._childNodeArray = nodes;\n (content as any)._firstNode = nodes.length > 0 ? nodes[0] : null;\n (content as any)._lastNode = nodes.length > 0 ? nodes[nodes.length - 1] : null;\n (content as any)._mounted = true; // SSR で既にマウント済み\n return content;\n}\n\n/**\n * RowPlan 経路の実体化: clone → nodePath 解決 → スロットから薄い binding を複製 →\n * initializeRowBindings。パース再生(spread 展開・remember・キー文字列・options\n * オブジェクト・policy 再解決)を行ごとに繰り返さない\n * (docs/state-row-instantiation-redesign.md §3-1/§3-2)。\n */\nfunction createPlanContent(\n bindingInfo: IBindingInfo,\n fragmentInfo: IFragmentInfo,\n plan: IRowPlan,\n): IContent {\n const cloneFragment = document.importNode(fragmentInfo.fragment, true);\n const nodeInfos = fragmentInfo.nodeInfos;\n const nodes: Node[] = new Array(nodeInfos.length);\n for (let i = 0; i < nodeInfos.length; i++) {\n const node = resolveNodePath(cloneFragment, nodeInfos[i].nodePath);\n if (node === null) {\n raiseError(`Node not found by path [${nodeInfos[i].nodePath.join(', ')}] in fragment.`);\n }\n // 再スキャン防止と初期化完了マークは従来経路と同じ台帳に載せる\n markNodeRegistered(node);\n resolveInitializedBinding(node);\n nodes[i] = node;\n }\n const slots = plan.slots;\n const bindings: IBindingInfo[] = new Array(slots.length);\n const indexBindings: IBindingInfo[] = [];\n for (let k = 0; k < slots.length; k++) {\n const slot = slots[k];\n const node = nodes[slot.nodeIndex];\n // text スロットは事前正規化済みの Text がそのまま replaceNode(従来経路の\n // getBindingInfos と同じ帰結)。prop/event は node === replaceNode\n const binding: IBindingInfo = { ...slot.template, node, replaceNode: node };\n bindings[k] = binding;\n if (slot.isIndexBinding) {\n indexBindings.push(binding);\n }\n }\n const session = initializeRowBindings(plan, bindings);\n const content = new Content(cloneFragment);\n setBindingSessionByContent(content, session);\n setBindingsByContent(content, bindings);\n setIndexBindingsByContent(content, indexBindings);\n setNodesByContent(content, nodes);\n setContentByNode(bindingInfo.node, content);\n return content;\n}\n\nexport function createContent(\n bindingInfo: IBindingInfo,\n): IContent {\n if (typeof bindingInfo.uuid === 'undefined' || bindingInfo.uuid === null) {\n raiseError(`BindingInfo.uuid is null.`);\n }\n const fragmentInfo = getFragmentInfoByUUID(bindingInfo.uuid);\n if (!fragmentInfo) {\n raiseError(`Fragment with UUID \"${bindingInfo.uuid}\" not found.`);\n }\n let plan = fragmentInfo.rowPlan;\n if (typeof plan === 'undefined' || (plan !== null && plan.directional !== config.enableDirectionalInitialSync)) {\n // 初回 or config(directional)が変わったときだけコンパイル。不適格は null を\n // キャッシュして以後は従来経路へ直行する\n plan = fragmentInfo.rowPlan = compileRowPlan(fragmentInfo);\n }\n if (plan !== null) {\n return createPlanContent(bindingInfo, fragmentInfo, plan);\n }\n const cloneFragment = document.importNode(fragmentInfo.fragment, true);\n const initialInfo = initializeBindingsByFragment(cloneFragment, fragmentInfo.nodeInfos);\n const content = new Content(cloneFragment);\n setBindingSessionByContent(content, initialInfo.bindingSession);\n setBindingsByContent(content, initialInfo.bindingInfos);\n const indexBindings: IBindingInfo[] = [];\n for(const binding of initialInfo.bindingInfos) {\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\n indexBindings.push(binding);\n }\n }\n setIndexBindingsByContent(content, indexBindings);\n setNodesByContent(content, initialInfo.nodes);\n setContentByNode(bindingInfo.node, content);\n return content;\n}\n","import { ILoopContext } from \"../list/types\";\nimport { IBindingInfo } from \"../types\";\nimport {\n collectNodesAndBindingInfos,\n collectNodesAndBindingInfosByFragment,\n IDeferredSpreadEntry,\n processDeferredNode,\n} from \"./collectNodesAndBindingInfos\";\nimport { IFragmentNodeInfo, IRowPlan } from \"../structural/types\";\nimport { setLoopContextByNode } from \"../list/loopContextByNode\";\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { IInitialBindingInfo } from \"./types\";\nimport { BindingSession, getOrCreateBindingSession } from \"./BindingSession\";\n\nfunction scheduleDeferredSpreads(\n deferredSpreads: IDeferredSpreadEntry[],\n parentLoopContext: ILoopContext | null,\n session: BindingSession,\n): void {\n for (const entry of deferredSpreads) {\n session.deferUntilDefined(entry.node, entry.tagName, () => {\n const bindings = processDeferredNode(entry);\n if (bindings.length === 0) return;\n setLoopContextByNode(entry.node, parentLoopContext);\n const initialized = session.initialize(bindings);\n applyChangeFromBindings(initialized);\n }, (error: unknown) => {\n console.error(`[@wcstack/state] deferred spread failed for <${entry.tagName}>.`, error);\n });\n }\n}\n\nexport function initializeBindings(\n root: Document | DocumentFragment | Element,\n parentLoopContext: ILoopContext | null,\n): void {\n const [subscriberNodes, allBindings, deferredSpreads] = collectNodesAndBindingInfos(root);\n const session = getOrCreateBindingSession(root);\n for (const node of subscriberNodes) {\n setLoopContextByNode(node, parentLoopContext);\n }\n const initialized = session.initialize(allBindings);\n applyChangeFromBindings(initialized);\n scheduleDeferredSpreads(deferredSpreads, parentLoopContext, session);\n}\n\nexport function initializeBindingsByFragment(\n root: DocumentFragment,\n nodeInfos: IFragmentNodeInfo[],\n): IInitialBindingInfo {\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfosByFragment(root, nodeInfos);\n const session = new BindingSession();\n // knownRoot=null: detached fragment 上の初期化。observableRootFor が必ず null を\n // 返す(observe は no-op)ため、binding ごとの getRootNode を省略する\n const initialized = session.initialize(allBindings, {\n registerAddress: false,\n applyOnReconnect: false,\n }, null);\n return {\n nodes: subscriberNodes,\n bindingInfos: initialized,\n bindingSession: session,\n };\n}\n\n/**\n * RowPlan 経路の行初期化(createContent 専用)。remember / spread 展開 /\n * shouldApplyState フィルタを経ず、プランのスロットから直接 record を構築する。\n * 返す session は従来経路と同じ活性化(activate)・破棄(dispose/wholesale)\n * インターフェースを持つ。\n */\nexport function initializeRowBindings(plan: IRowPlan, bindings: IBindingInfo[]): BindingSession {\n const session = new BindingSession();\n session.initializeRow(plan, bindings);\n return session;\n}\n","import { IInitialSyncPolicy, resolveInitialSyncPolicy } from \"../bindings/initialSync\";\nimport { config } from \"../config\";\nimport { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { isPossibleTwoWay } from \"../event/isPossibleTwoWay\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { IBindingInfo } from \"../types\";\nimport { resolveNodePath } from \"./resolveNodePath\";\nimport { IFragmentInfo, IRowPlan, IRowPlanSlot } from \"./types\";\n\n/**\n * rowPlan.ts — 行実体化プランのコンパイル(docs/state-row-instantiation-redesign.md §3-1)。\n *\n * テンプレート(fragmentInfo)を初回行生成時に一度だけ検査し、全スロットが\n * 「行不変の判定をテンプレート時に確定できる」種別のときだけプランを返す。\n * 1 スロットでも確定できなければ null(テンプレート丸ごと従来経路 = 部分適用しない。\n * 経路混在のデバッグ困難を避ける設計判断・同 §5)。\n *\n * プラン適格の条件(すべて満たすこと):\n * - bindingType が text / prop / event のみ(構造 for/if・radio/checkbox・spread は不適格)\n * - バインディング先ノードがカスタム要素でない(定義待ち・wcBindable 検証が不要)\n * - prop が command / eventToken 名前空間でない(token 配線 teardown が要るため)\n * - prop が双方向可能(isPossibleTwoWay)でない(connect-snapshot / observer 配線が要るため)\n * - initial-sync policy が観測不要(observable=false)かつ authority が \"auto\" でない\n * - text スロットは事前正規化済みの Text ノードである\n */\nexport function compileRowPlan(fragmentInfo: IFragmentInfo): IRowPlan | null {\n const directional = config.enableDirectionalInitialSync;\n const slots: IRowPlanSlot[] = [];\n const nodeInfos = fragmentInfo.nodeInfos;\n for (let nodeIndex = 0; nodeIndex < nodeInfos.length; nodeIndex++) {\n const nodeInfo = nodeInfos[nodeIndex];\n const node = resolveNodePath(fragmentInfo.fragment, nodeInfo.nodePath);\n if (node === null) {\n return null;\n }\n for (const template of nodeInfo.parseBindTextResults) {\n const bindingType = template.bindingType;\n if (bindingType !== \"text\" && bindingType !== \"prop\" && bindingType !== \"event\") {\n return null;\n }\n // command.<name>(prop 扱い)と eventToken.<prop>(event 扱い)は token 配線の\n // teardown / attach 分岐が要るため不適格\n const namespace = template.propSegments[0];\n if (namespace === \"command\" || namespace === \"eventToken\") {\n return null;\n }\n if (bindingType === \"text\") {\n if (node.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n } else if (getCustomElement(node) !== null) {\n return null;\n }\n if (bindingType === \"prop\" && isPossibleTwoWay(node, template.propName)) {\n return null;\n }\n let policy: IInitialSyncPolicy;\n try {\n // 判定はテンプレートのノードで行う(policy は node の宣言と行不変フィールドの\n // 純関数)。修飾子エラー等の throw は不適格として従来経路に倒し、従来経路が\n // 同じエラーを同じタイミング(初回行生成)で報告する。\n const probe: IBindingInfo = { ...template, node, replaceNode: node };\n policy = resolveInitialSyncPolicy(probe);\n } catch {\n return null;\n }\n if (policy.observable || policy.authority === \"auto\") {\n return null;\n }\n slots.push({\n nodeIndex,\n template,\n isEvent: bindingType === \"event\",\n isIndexBinding: template.statePathName in INDEX_BY_INDEX_NAME,\n policy,\n authority: policy.authority,\n });\n }\n }\n return { directional, slots };\n}\n","import { getPathInfo } from \"../address/PathInfo\";\nimport { createStateAddress } from \"../address/StateAddress\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { getIndexBindingsByContent } from \"../bindings/indexBindingsByContent\";\nimport { inSsr } from \"../config\";\nimport { WILDCARD } from \"../define\";\nimport { createListDiff } from \"../list/createListDiff\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { computeStableIndexSet } from \"../list/stableListOrder\";\nimport { IListIndex } from \"../list/types\";\nimport { raiseError } from \"../raiseError\";\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\nimport { deleteContentByNode } from \"../structural/contentsByNode\";\nimport { createContent } from \"../structural/createContent\";\nimport { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { applyChange } from \"./applyChange\";\nimport { setRootNodeByFragment } from \"./rootNodeByFragment\";\nimport { IApplyContext } from \"./types\";\n\nconst lastNodeByNode: WeakMap<Node, Node> = new WeakMap();\nconst contentByListIndexByNode: WeakMap<Node, WeakMap<IListIndex, IContent>> = new WeakMap();\nconst pooledContentsByNode: WeakMap<Node, IContent[]> = new WeakMap();\nconst isOnlyNodeInParentContentByNode: WeakMap<Node, boolean> = new WeakMap();\n\n// テスト用ヘルパー(内部状態の操作)\nexport function __test_setContentByListIndex(node: Node, index: IListIndex, content: IContent | null): void {\n setContent(node, index, content);\n}\n\nexport function __test_deleteLastNodeByNode(node: Node): void {\n lastNodeByNode.delete(node);\n}\n\n// SSR ハイドレーション用: Content を ListIndex に登録する\nexport function hydrateSetContent(node: Node, index: IListIndex, content: IContent): void {\n setContent(node, index, content);\n}\n\nexport function hydrateSetLastNode(node: Node, lastNode: Node): void {\n lastNodeByNode.set(node, lastNode);\n}\n\nexport function __test_deleteContentByNode(node: Node): void {\n contentByListIndexByNode.delete(node);\n}\n\nfunction getPooledContents(bindingInfo: IBindingInfo): IContent[] {\n return pooledContentsByNode.get(bindingInfo.node) || [];\n}\n\n// プールの上限(アンカーごと)。プールはアンカー(文書に永続するコメントノード)\n// から content とその DOM サブツリー・バインディング群を強参照するため、無制限だと\n// 大きなリストのクリア後もメモリが解放されない(10k 行で 10MB 級)。上限超過分は\n// contentSetByNode の台帳からも外して GC 可能にする。再追加時は createContent で\n// 作り直すコストと引き換えになる。\nconst MAX_POOLED_CONTENTS = 1000;\nlet maxPooledContents = MAX_POOLED_CONTENTS;\n\n// テスト用: プール上限の変更と現在のプールサイズ取得\nexport function __test_setMaxPooledContents(limit: number): number {\n const prev = maxPooledContents;\n maxPooledContents = limit;\n return prev;\n}\n\nexport function __test_getPooledContentsCount(node: Node): number {\n return (pooledContentsByNode.get(node) || []).length;\n}\n\nfunction setPooledContent(bindingInfo: IBindingInfo, content: IContent): void {\n let contents = pooledContentsByNode.get(bindingInfo.node);\n if (typeof contents === 'undefined') {\n contents = [];\n pooledContentsByNode.set(bindingInfo.node, contents);\n }\n if (contents.length < maxPooledContents) {\n contents.push(content);\n } else {\n // 上限超過: content を完全に手放す。contentSetByNode は createContent 時に\n // 追加されたきり解放経路が無いため、ここで外さないと GC できない。\n deleteContentByNode(bindingInfo.node, content);\n }\n}\n\nfunction isOnlyNodeInParentContent(firstNode: Node, lastNode: Node): boolean {\n let prevCheckNode = firstNode.previousSibling;\n let nextCheckNode = lastNode.nextSibling;\n let onlyNode = true;\n while(prevCheckNode !== null) {\n if (prevCheckNode.nodeType === Node.ELEMENT_NODE \n || (prevCheckNode.nodeType === Node.TEXT_NODE && (prevCheckNode.textContent?.trim() ?? '') !== '')) {\n onlyNode = false;\n break;\n }\n prevCheckNode = prevCheckNode.previousSibling;\n }\n while(nextCheckNode !== null) {\n if (nextCheckNode.nodeType === Node.ELEMENT_NODE \n || (nextCheckNode.nodeType === Node.TEXT_NODE && (nextCheckNode.textContent?.trim() ?? '') !== '')) {\n onlyNode = false;\n break;\n }\n nextCheckNode = nextCheckNode.nextSibling;\n }\n return onlyNode;\n}\n\n// A stable content may be left in place only when its first node verifiably\n// follows the settled walk position in the same tree: the listIndexes ledger\n// can lag the physical DOM (element-write swaps reorder listIndexes without\n// moving nodes; hidden regions unmount contents that stay registered). Empty\n// contents (null firstNode) always take the settle walk so their mount\n// bookkeeping matches the pre-LIS behavior.\nfunction isPhysicallyAfter(lastNode: Node, firstNode: Node | null): boolean {\n if (firstNode === null) {\n return false;\n }\n if (lastNode.nextSibling === firstNode) {\n return true;\n }\n const position = lastNode.compareDocumentPosition(firstNode);\n return (position & Node.DOCUMENT_POSITION_FOLLOWING) !== 0\n && (position & Node.DOCUMENT_POSITION_DISCONNECTED) === 0;\n}\n\nfunction setContent(node: Node, listIndex: IListIndex, content: IContent | null): void {\n let contentByListIndex = contentByListIndexByNode.get(node);\n if (typeof contentByListIndex === 'undefined') {\n if (content === null) {\n return;\n }\n contentByListIndex = new WeakMap<IListIndex, IContent>();\n contentByListIndexByNode.set(node, contentByListIndex);\n }\n if (content === null) {\n contentByListIndex.delete(listIndex);\n } else {\n contentByListIndex.set(listIndex, content);\n }\n}\n\nexport function applyChangeToFor(\n bindingInfo: IBindingInfo, \n context: IApplyContext,\n newValue: unknown, \n): void {\n const listPathInfo = bindingInfo.statePathInfo;\n const listIndex = getListIndexByBindingInfo(bindingInfo);\n const absAddress = getAbsoluteStateAddressByBinding(bindingInfo);\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\n const diff = createListDiff(listIndex, lastValue, newValue);\n context.newListValueByAbsAddress.set(absAddress, Array.isArray(newValue) ? newValue : []);\n\n const fullDelete = Array.isArray(lastValue)\n && lastValue.length === diff.deleteIndexSet.size\n && diff.deleteIndexSet.size > 0;\n if (fullDelete && bindingInfo.node.parentNode !== null) {\n let isOnlyNode = isOnlyNodeInParentContentByNode.get(bindingInfo.node);\n if (typeof isOnlyNode === 'undefined') {\n const lastNode = lastNodeByNode.get(bindingInfo.node) || bindingInfo.node;\n isOnlyNode = isOnlyNodeInParentContent(bindingInfo.node, lastNode);\n isOnlyNodeInParentContentByNode.set(bindingInfo.node, isOnlyNode);\n }\n if (isOnlyNode) {\n const parentNode = bindingInfo.node.parentNode;\n parentNode.textContent = '';\n parentNode.appendChild(bindingInfo.node);\n }\n }\n // 全削除時、プールに収まらない content は再利用されないため、per-binding の\n // teardown(listener 解除・アドレス台帳・loopContext 掃除)を丸ごと省略して\n // ノードごと GC に任せる(tryDestroy)。プール行きの分だけ従来どおり解体する\n // (プール行は binding が生存し続けるため address キャッシュのクリアが必須)。\n // content 台帳の WeakMap ビルトインは V8 プロファイルで本関数の self に計上される\n // ホットスポット: 外側の node→map 解決はループ外に持ち上げ、fullDelete(旧全行が\n // deleteIndexSet に載る=台帳の全エントリが消える)では per-index delete を廃して\n // 台帳ごと 1 回で手放す。\n let contentMap = contentByListIndexByNode.get(bindingInfo.node);\n let poolBudget = fullDelete\n ? maxPooledContents - getPooledContents(bindingInfo).length\n : Number.POSITIVE_INFINITY;\n if (typeof contentMap !== 'undefined') {\n for(const deleteIndex of diff.deleteIndexSet) {\n const content = contentMap.get(deleteIndex);\n if (typeof content !== 'undefined') {\n if (poolBudget <= 0 && content.tryDestroy()) {\n deleteContentByNode(bindingInfo.node, content);\n } else {\n deactivateContent(content);\n content.unmount();\n setPooledContent(bindingInfo, content);\n poolBudget -= 1;\n }\n if (!fullDelete) {\n contentMap.delete(deleteIndex);\n }\n }\n }\n if (fullDelete) {\n contentByListIndexByNode.delete(bindingInfo.node);\n contentMap = undefined;\n }\n }\n\n let lastNode = bindingInfo.node;\n const elementPathInfo = getPathInfo(listPathInfo.path + '.' + WILDCARD);\n const loopContextStack = context.stateElement.loopContextStack;\n // When the new order contains inversions, contents in the stable set (an LIS\n // of old positions) keep their relative order and must not be moved; moving\n // only the rest avoids the cascade where one swap relocates every row in\n // between. null = no inversions; the position guard below then does no moves.\n const stableIndexSet = computeStableIndexSet(diff);\n let fragment: DocumentFragment | null = null;\n if (diff.newIndexes.length == diff.addIndexSet.size \n && diff.newIndexes.length > 0\n && lastNode.isConnected\n ) {\n // 全部追加の場合はまとめて処理\n fragment = document.createDocumentFragment();\n setRootNodeByFragment(fragment, context.rootNode);\n }\n const ssrMode = inSsr();\n const uuid = bindingInfo.uuid ?? '';\n // 追加行ごとの WeakMap 解決を避けるためプール配列も 1 回だけ引く(プールの配列\n // 実体は setPooledContent が一度作ったら不変なので、delete ループ後の参照で安定)\n const pooledContents = pooledContentsByNode.get(bindingInfo.node);\n for(const index of diff.newIndexes) {\n let content: IContent | undefined;\n // add\n if (diff.addIndexSet.has(index)) {\n const stateAddress = createStateAddress(elementPathInfo, index);\n loopContextStack.createLoopContext(stateAddress, (loopContext) => {\n content = typeof pooledContents !== 'undefined' ? pooledContents.pop() : undefined;\n if (typeof content === 'undefined') {\n content = createContent(bindingInfo);\n }\n // コンテント活性化の前にDOMツリーに追加しておく必要がある\n if (fragment !== null) {\n if (ssrMode) {\n fragment.appendChild(document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`));\n }\n content.appendTo(fragment);\n if (ssrMode) {\n fragment.appendChild(document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`));\n }\n } else {\n // Update lastNode for next iteration to ensure correct order\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\n if (lastNode.nextSibling !== content.firstNode) {\n if (ssrMode) {\n const startComment = document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`);\n lastNode.parentNode!.insertBefore(startComment, lastNode.nextSibling);\n lastNode = startComment;\n }\n content.mountAfter(lastNode);\n }\n if (ssrMode) {\n const endComment = document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`);\n const afterNode = content.lastNode ?? lastNode;\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\n }\n }\n // コンテントを活性化\n activateContent(content, loopContext, context);\n });\n if (typeof content === 'undefined') {\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\n }\n } else {\n // getContent 相当(undefined→null 正規化は後段の raiseError 判定が null 比較のため維持)\n content = (typeof contentMap !== 'undefined' ? contentMap.get(index) ?? null : null)!;\n if (diff.changeIndexSet.has(index)) {\n // change\n const indexBindings = getIndexBindingsByContent(content);\n for(const indexBinding of indexBindings) {\n applyChange(indexBinding, context);\n }\n }\n // Update lastNode for next iteration to ensure correct order\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\n if (content === null) {\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\n }\n // Stable contents are already in correct relative order — but only\n // trust that after physical verification (see isPhysicallyAfter).\n // Contents out of order (and everything unverifiable) settle via the\n // self-healing mountAfter walk below.\n const stable = stableIndexSet !== null && stableIndexSet.has(index)\n && isPhysicallyAfter(lastNode, content.firstNode);\n if (!stable && lastNode.nextSibling !== content.firstNode) {\n content.mountAfter(lastNode);\n }\n }\n lastNode = content.lastNode || lastNode;\n if (typeof contentMap === 'undefined') {\n contentMap = new WeakMap<IListIndex, IContent>();\n contentByListIndexByNode.set(bindingInfo.node, contentMap);\n }\n contentMap.set(index, content);\n }\n lastNodeByNode.set(bindingInfo.node, lastNode);\n if (fragment !== null) {\n // Mount all at once\n bindingInfo.node.parentNode!.insertBefore(fragment, bindingInfo.node.nextSibling);\n setRootNodeByFragment(fragment, null);\n }\n}\n","import { config, inSsr } from \"../config\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\nimport { getContentSetByNode } from \"../structural/contentsByNode\";\nimport { createContent } from \"../structural/createContent\";\nimport { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nfunction bindingInfoText(bindingInfo: IBindingInfo): string {\n return `${bindingInfo.bindingType} ${bindingInfo.statePathName} ${bindingInfo.outFilters.map(f => f.filterName).join('|')} ${bindingInfo.node.isConnected ? '(connected)' : '(disconnected)'}`;\n}\n\nexport function applyChangeToIf(\n bindingInfo: IBindingInfo,\n context: IApplyContext,\n rawNewValue: unknown,\n): void {\n const newValue = Boolean(rawNewValue);\n let content: IContent | undefined;\n const contents = getContentSetByNode(bindingInfo.node);\n if (contents.size === 0) {\n content = createContent(bindingInfo);\n } else {\n content = contents.values().next().value!;\n }\n const ssrMode = inSsr();\n const uuid = bindingInfo.uuid ?? '';\n const keyword = bindingInfo.bindingType; // if, elseif, else\n if (!newValue) {\n if (config.debug) {\n console.log(`unmount if content : ${bindingInfoText(bindingInfo)}`);\n }\n deactivateContent(content);\n content.unmount();\n }\n if (newValue) {\n if (config.debug) {\n console.log(`mount if content : ${bindingInfoText(bindingInfo)}`);\n }\n if (ssrMode) {\n const startComment = document.createComment(`@@wcs-${keyword}-start:${uuid}:${bindingInfo.statePathName}`);\n bindingInfo.node.parentNode!.insertBefore(startComment, bindingInfo.node.nextSibling);\n content.mountAfter(startComment);\n const endComment = document.createComment(`@@wcs-${keyword}-end:${uuid}:${bindingInfo.statePathName}`);\n const afterNode = content.lastNode ?? startComment;\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\n } else {\n content.mountAfter(bindingInfo.node);\n }\n const loopContext = getLoopContextByNode(bindingInfo.node);\n activateContent(content, loopContext, context);\n }\n}\n\n","/**\n * SSR 時に HTML 属性で表現できないプロパティバインディングを蓄積するストア。\n * ハイドレーション時にクライアント側で復元する。\n */\n\nexport interface ISsrPropertyEntry {\n propName: string;\n value: unknown;\n}\n\n// node → プロパティエントリのリスト\nconst store: WeakMap<Node, ISsrPropertyEntry[]> = new WeakMap();\n\nexport function addSsrProperty(node: Node, propName: string, value: unknown): void {\n let entries = store.get(node);\n if (!entries) {\n entries = [];\n store.set(node, entries);\n }\n // 同じプロパティの既存エントリは上書き\n const existing = entries.find(e => e.propName === propName);\n if (existing) {\n existing.value = value;\n } else {\n entries.push({ propName, value });\n }\n}\n\nexport function getSsrProperties(node: Node): ISsrPropertyEntry[] {\n return store.get(node) ?? [];\n}\n\nexport function getAllSsrPropertyNodes(): Node[] {\n // WeakMap は列挙不可なので、別途トラッキングが必要\n return Array.from(trackedNodes);\n}\n\nconst trackedNodes: Set<Node> = new Set();\n\nexport function trackSsrPropertyNode(node: Node): void {\n trackedNodes.add(node);\n}\n\nexport function clearSsrPropertyStore(): void {\n trackedNodes.clear();\n}\n","import { config, inSsr } from \"../config\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { applyMirrorAttribute, getInputAttributeMirror } from \"../event/getInputAttributeMirror\";\nimport { beginPropagationTransaction, extendPropagationContext, getCurrentPropagationContext, getEdgeId, getWireId, runWithPropagationContext, runWithWriteReceipt } from \"../propagation/propagation\";\nimport { isPossibleTwoWay } from \"../event/isPossibleTwoWay\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\nimport { addSsrProperty, trackSsrPropertyNode } from \"./ssrPropertyStore\";\n\n// SSR 時に HTML 属性で代替可能なプロパティ\n// これら以外のプロパティは ssrPropertyStore に蓄積してハイドレーション時に復元\nconst SSR_ATTR_PROPS: Record<string, (element: Element, value: unknown) => void> = {\n value(element, value) {\n if (element.tagName === 'TEXTAREA') {\n element.textContent = String(value ?? '');\n } else {\n element.setAttribute('value', String(value ?? ''));\n }\n },\n checked(element, value) {\n if (value) element.setAttribute('checked', '');\n else element.removeAttribute('checked');\n },\n selected(element, value) {\n if (value) element.setAttribute('selected', '');\n else element.removeAttribute('selected');\n },\n disabled(element, value) {\n if (value) element.setAttribute('disabled', '');\n else element.removeAttribute('disabled');\n },\n selectedIndex(element, value) {\n const options = element.querySelectorAll('option');\n const idx = Number(value);\n for (let i = 0; i < options.length; i++) {\n if (i === idx) options[i].setAttribute('selected', '');\n else options[i].removeAttribute('selected');\n }\n },\n};\n\nexport function applyChangeToProperty(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n // undefined は「状態が値を持たない=無意見」であり、書き込み自体をスキップして\n // 要素側の既定値を生かす。書き込んでしまうと setter の文字列化で\n // \"undefined\" 属性や removeAttribute が走り要素が壊れる (spread で未初期化\n // slot を配線したときに顕在化)。明示的なクリアは null で表現する。\n // mirror 属性 (applyMirrorAttribute) の「undefined → 属性削除」と同じ語彙。\n if (typeof newValue === \"undefined\") {\n if (config.debug) {\n console.debug(`Skipped property write: state value is undefined.`, {\n element: binding.node,\n propSegments: binding.propSegments,\n statePathName: binding.statePathName,\n });\n }\n return;\n }\n const element = binding.node as Element;\n const propSegments = binding.propSegments;\n if (propSegments.length === 1) {\n const firstSegment = propSegments[0];\n if ((element as any)[firstSegment] !== newValue) {\n const performWrite = (): void => {\n let propertyWriteSucceeded = false;\n try {\n (element as any)[firstSegment] = newValue;\n propertyWriteSucceeded = true;\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to set property '${firstSegment}' on element.`, {\n element,\n newValue,\n error\n });\n }\n }\n // wc-bindable inputs[].attribute ミラー。プロパティ書き込みが成功したときだけ\n // 属性へ反映する。setter が値を拒否した場合に属性だけ進んでしまうと\n // property と attribute が乖離し、attributeChangedCallback や CSS セレクタが\n // 実際のプロパティ値と矛盾した状態で発火するため、ここでガードする。\n if (propertyWriteSucceeded) {\n const mirrorAttr = getInputAttributeMirror(element, firstSegment);\n if (mirrorAttr !== null) {\n try {\n applyMirrorAttribute(element, mirrorAttr, newValue);\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to mirror attribute '${mirrorAttr}' on element.`, {\n element,\n newValue,\n error\n });\n }\n }\n }\n }\n };\n // Zero-cost fast path (§4 最適化): the propagation edge / WriteReceipt\n // machinery only matters when the element write can *echo* — i.e. the setter\n // may synchronously dispatch an event a two-way wire feeds back to state.\n // `isPossibleTwoWay` is the same conservative check the two-way listener\n // registration uses, and it is cheap for the common one-way case (textContent\n // / class / style on plain elements return false fast). One-way bindings can\n // never re-traverse an edge, so skipping the context/receipt is safe and\n // avoids a per-apply Set copy + receipt allocation. Diamond / coalescing are\n // unaffected — those ride the write-transaction context threaded through the\n // updater, not the element edge.\n if (config.enablePropagationContext && isPossibleTwoWay(element, firstSegment)) {\n // Phase 3: state → element edge の通過を記録し、同じ transaction が\n // 同じ edge を再度通ろうとした場合だけ抑止する(設計書 §4 規則 2)。\n // 書き込みは WriteReceipt scope で包み、setter が同期 dispatch する\n // event が confirmation / 正規化を判定できるようにする(規則 3)。\n const wireId = getWireId(element, firstSegment, binding.stateName, binding.statePathName);\n const edgeId = getEdgeId(wireId, \"to-element\");\n const baseContext = _context?.propagationContextByBinding?.get(binding)\n ?? getCurrentPropagationContext()\n ?? beginPropagationTransaction(wireId);\n if (baseContext.visitedEdges.has(edgeId)) {\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:suppressed\",\n reason: \"visited-edge\",\n transactionId: baseContext.transactionId,\n edgeId,\n node: element,\n member: firstSegment,\n });\n }\n } else {\n const extendedContext = extendPropagationContext(baseContext, edgeId);\n runWithPropagationContext(extendedContext, () =>\n runWithWriteReceipt(element, firstSegment, newValue, wireId, extendedContext.transactionId, performWrite));\n }\n } else {\n performWrite();\n }\n }\n if (inSsr()) {\n const attrHandler = SSR_ATTR_PROPS[firstSegment];\n if (attrHandler) {\n // 属性で代替可能 → HTML 属性に反映\n attrHandler(element, newValue);\n } else {\n // 属性で代替不可 → ハイドレーション用ストアに蓄積\n addSsrProperty(element, firstSegment, newValue);\n trackSsrPropertyNode(element);\n }\n }\n return;\n }\n const firstSegment = propSegments[0];\n let subObject = (element as any)[firstSegment];\n for (let i = 1; i < propSegments.length - 1; i++) {\n const segment = propSegments[i];\n if (subObject == null) {\n return;\n }\n subObject = subObject[segment];\n }\n const oldValue = subObject[propSegments[propSegments.length - 1]];\n if (oldValue !== newValue) {\n if (Object.isFrozen(subObject)) {\n if (config.debug) {\n console.warn(`Attempting to set property on frozen object.`, {\n element,\n propSegments,\n oldValue,\n newValue\n });\n }\n return;\n }\n try {\n subObject[propSegments[propSegments.length - 1]] = newValue;\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to set property on sub-object.`, {\n element,\n propSegments,\n oldValue,\n newValue,\n error\n });\n }\n }\n }\n // サブオブジェクトプロパティ (e.g. style.xxx) は属性に反映済みなのでストア不要\n}\n","import { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\n\n/**\n * 要素 `element` の `propName` プロパティ書き込みに対して、\n * wc-bindable inputs の `attribute` ミラー先属性名を返す。\n *\n * - wc-bindable でないネイティブ要素や、inputs 未宣言、attribute フィールド無しは null\n * - inputs に同名宣言があっても `attribute` を持たないものはミラー対象外\n *\n * 戻り値の string がそのまま `setAttribute(name, value)` の name となる。\n */\nexport function getInputAttributeMirror(element: Element, propName: string): string | null {\n const customTagName = getCustomElement(element);\n if (customTagName === null) {\n return null;\n }\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n return null;\n }\n const input = readBindableDeclaration(element)?.declaredInputs.get(propName);\n if (typeof input?.attribute === \"string\" && input.attribute.length > 0) {\n return input.attribute;\n }\n return null;\n}\n\n/**\n * mirror 属性値の表現を決める。\n * - null / undefined → 属性削除\n * - object / array → JSON.stringify (失敗時は String(value))\n * - その他 (string / number / boolean / bigint) → String(value)\n */\nexport function applyMirrorAttribute(element: Element, attributeName: string, value: unknown): void {\n if (value === null || typeof value === \"undefined\") {\n element.removeAttribute(attributeName);\n return;\n }\n let formatted: string;\n if (typeof value === \"object\") {\n try {\n formatted = JSON.stringify(value);\n } catch {\n formatted = String(value);\n }\n } else {\n formatted = String(value);\n }\n element.setAttribute(attributeName, formatted);\n}\n","import { inSsr } from \"../config\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { IApplyContext } from \"./types\";\n\nconst ssrWrappedNodes: WeakSet<Node> = new WeakSet();\n\nexport function applyChangeToText(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n // nodeValue は nullable DOMString(実ブラウザでは null / undefined とも空文字に\n // 正規化される)ため、比較前に同じ規則で文字列化する。生値のまま比較すると\n // 数値など非文字列値は常に不一致になり、同値でも毎回 DOM 書き込みが走る。\n // 注: happy-dom は undefined を \"undefined\" にする非準拠実装なので String() に\n // 頼らず明示的に \"\" へ正規化する。\n const text = newValue === null || newValue === undefined ? \"\" : String(newValue);\n if (binding.replaceNode.nodeValue !== text) {\n binding.replaceNode.nodeValue = text;\n }\n // SSR モード時: テキストノードの前後にコメントを挿入して境界を明示\n if (inSsr() && !ssrWrappedNodes.has(binding.replaceNode)) {\n ssrWrappedNodes.add(binding.replaceNode);\n const parentNode = binding.replaceNode.parentNode;\n if (parentNode) {\n const path = binding.statePathName;\n const startComment = document.createComment(`@@wcs-text-start:${path}`);\n const endComment = document.createComment(`@@wcs-text-end:${path}`);\n parentNode.insertBefore(startComment, binding.replaceNode);\n parentNode.insertBefore(endComment, binding.replaceNode.nextSibling);\n }\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToWebComponent(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const propSegments = binding.propSegments;\n if (propSegments.length <= 1) {\n raiseError(`Invalid propSegments for web component binding: ${propSegments.join(\".\")}`);\n }\n const [ firstSegment, ...restSegments ] = propSegments;\n const subObject = (element as any)[firstSegment] as Record<string, unknown> | undefined;\n if (typeof subObject === \"undefined\") {\n raiseError(`Property \"${firstSegment}\" not found on web component.`);\n }\n subObject[restSegments.join(\".\")] = newValue;\n}\n","import { getStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { getIndexValueByLoopContext } from \"../list/getIndexValueByLoopContext\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { getByAddressSymbol } from \"../proxy/symbols\";\nimport { IStateProxy } from \"../proxy/types\";\nimport { raiseError } from \"../raiseError\";\n\nexport function getValue(state: IStateProxy, binding: IBindingInfo): any {\n const stateAddress = getStateAddressByBindingInfo(binding);\n if (stateAddress.pathInfo.path in INDEX_BY_INDEX_NAME) {\n const loopContext = getLoopContextByNode(binding.node);\n if (loopContext === null) {\n raiseError(`ListIndex not found for binding: ${binding.statePathName}`);\n }\n return getIndexValueByLoopContext(loopContext, stateAddress.pathInfo.path);\n } else {\n return state[getByAddressSymbol](stateAddress);\n }\n}\n","import { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { ILoopContext } from \"./types\";\n\n// indexName ... $1, $2, ...\nexport function getIndexValueByLoopContext(loopContext: ILoopContext, indexName: string): number | null {\n if (loopContext.listIndex === null) {\n raiseError(`ListIndex not found for loopContext:`);\n }\n const indexPos = INDEX_BY_INDEX_NAME[indexName];\n if (typeof indexPos === \"undefined\") {\n raiseError(`Invalid index name: ${indexName}`);\n }\n const listIndex = loopContext.listIndex.at(indexPos);\n if (listIndex === null) {\n raiseError(`Index not found at position ${indexPos} for loopContext:`);\n }\n return listIndex.index;\n}","import { getBindingSession } from \"../bindings/BindingSession.js\";\nimport { getDefinitionCoordinator } from \"../bindings/DefinitionCoordinator.js\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { applyChangeFromBindings } from \"./applyChangeFromBindings.js\";\n\nconst scheduledBindings = new WeakSet<IBindingInfo>();\n\nfunction reportFailure(tagName: string, error: unknown): void {\n console.error(`[@wcstack/state] deferred apply failed for <${tagName}>.`, error);\n}\n\nexport function scheduleDeferredApply(binding: IBindingInfo, tagName: string): void {\n if (scheduledBindings.has(binding)) return;\n scheduledBindings.add(binding);\n\n const applyLatest = (): void => {\n scheduledBindings.delete(binding);\n const currentSession = getBindingSession(binding);\n if (currentSession !== null && !currentSession.shouldApplyState(binding)) {\n return;\n }\n applyChangeFromBindings([binding]);\n };\n const reject = (error: unknown): void => {\n scheduledBindings.delete(binding);\n reportFailure(tagName, error);\n };\n\n const session = getBindingSession(binding);\n if (session !== null) {\n const cancel = session.deferUntilDefined(binding.replaceNode, tagName, applyLatest, reject);\n if (!session.addTeardown(binding, () => {\n scheduledBindings.delete(binding);\n cancel();\n })) {\n scheduledBindings.delete(binding);\n cancel();\n }\n return;\n }\n\n // Compatibility fallback for direct applyChange() callers outside a session.\n const registry = getCustomElementRegistry();\n if (registry === null) {\n scheduledBindings.delete(binding);\n reportFailure(tagName, new Error(\"CustomElementRegistry is unavailable.\"));\n return;\n }\n getDefinitionCoordinator(registry).wait(tagName, () => {\n if (!binding.replaceNode.isConnected) {\n scheduledBindings.delete(binding);\n return;\n }\n applyLatest();\n }, reject);\n}\n","import { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\nimport { getBindingSession } from \"../bindings/BindingSession.js\";\nimport { getCustomElement } from \"../getCustomElement.js\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { getStateElementByName } from \"../stateElementByName.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { isWebComponentComplete } from \"../webComponent/completeWebComponent.js\";\nimport { applyChangeToAttribute } from \"./applyChangeToAttribute.js\";\nimport { applyChangeToCheckbox } from \"./applyChangeToCheckbox.js\";\nimport { applyChangeToClass } from \"./applyChangeToClass.js\";\nimport { applyChangeToCommand } from \"./applyChangeToCommand.js\";\nimport { applyChangeToFor } from \"./applyChangeToFor.js\";\nimport { applyChangeToIf } from \"./applyChangeToIf.js\";\nimport { applyChangeToProperty } from \"./applyChangeToProperty.js\";\nimport { applyChangeToRadio } from \"./applyChangeToRadio.js\";\nimport { applyChangeToStyle } from \"./applyChangeToStyle.js\";\nimport { applyChangeToText } from \"./applyChangeToText.js\";\nimport { applyChangeToWebComponent } from \"./applyChangeToWebComponent.js\";\nimport { getFilteredValue } from \"./getFilteredValue.js\";\nimport { getValue } from \"./getValue.js\";\nimport { getRootNodeByFragment } from \"./rootNodeByFragment.js\";\nimport { scheduleDeferredApply } from \"./scheduleDeferredApply.js\";\nimport { ApplyChangeFn, IApplyContext } from \"./types.js\";\n\nconst applyChangeByFirstSegment: { [key: string]: ApplyChangeFn } = {\n \"class\": applyChangeToClass,\n \"attr\": applyChangeToAttribute,\n \"style\": applyChangeToStyle,\n \"command\": applyChangeToCommand,\n};\n\nconst applyChangeByBindingType: { [key: string]: ApplyChangeFn } = {\n \"text\": applyChangeToText,\n \"for\": applyChangeToFor,\n \"if\": applyChangeToIf,\n \"else\": applyChangeToIf,\n \"elseif\": applyChangeToIf,\n \"radio\": applyChangeToRadio,\n \"checkbox\": applyChangeToCheckbox,\n};\n\nconst fnByBinding: WeakMap<IBindingInfo, ApplyChangeFn> = new WeakMap();\nconst deferredSelectBindingByBinding: WeakMap<IBindingInfo, boolean> = new WeakMap();\n\n// 未 define カスタム要素チェックの確定メモ。customTag が無い、または define 済みを\n// 一度確認したら以後は不変(define は不可逆)なので apply 毎の getCustomElement /\n// registry 照会を省略できる。scoped registry を導入する場合はこの不可逆前提を再検討。\nconst definedApplyVerifiedByBinding: WeakMap<IBindingInfo, boolean> = new WeakMap();\n\nfunction _applyChange(binding: IBindingInfo, context: IApplyContext): void {\n const value = getValue(context.state, binding);\n const filteredValue = getFilteredValue(value, binding.outFilters);\n\n if (deferredSelectBindingByBinding.get(binding) === true) {\n context.deferredSelectBindings.push({ binding, value: filteredValue });\n return;\n }\n let fn = fnByBinding.get(binding);\n if (typeof fn !== 'undefined') {\n fn(binding, context, filteredValue);\n return;\n }\n if (fnByBinding.has(binding)) {\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\n fn = applyChangeToWebComponent;\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\n } else {\n fn = applyChangeToProperty;\n }\n fn(binding, context, filteredValue);\n return;\n }\n\n fn = applyChangeByBindingType[binding.bindingType];\n if (typeof fn === 'undefined') {\n const firstSegment = binding.propSegments[0];\n fn = applyChangeByFirstSegment[firstSegment];\n fnByBinding.set(binding, fn);\n if (typeof fn === 'undefined') {\n const customTag = getCustomElement(binding.replaceNode);\n if (customTag) {\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\n fn = applyChangeToWebComponent;\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\n } else {\n fn = applyChangeToProperty;\n }\n } else {\n fn = applyChangeToProperty;\n fnByBinding.set(binding, fn);\n }\n }\n }\n if (fn === applyChangeToProperty) {\n const element = binding.node as Element;\n if (element.tagName === 'SELECT') {\n const propName = binding.propSegments[0];\n if (propName === 'value' || propName === 'selectedIndex') {\n context.deferredSelectBindings.push({ binding, value: filteredValue });\n deferredSelectBindingByBinding.set(binding, true);\n return;\n }\n }\n }\n fn(binding, context, filteredValue);\n}\n\nexport function applyChange(binding: IBindingInfo, context: IApplyContext): void {\n if (context.appliedBindingSet.has(binding)) {\n return;\n }\n context.appliedBindingSet.add(binding);\n // $updatedCallback が定義されていない state では、更新アドレスの集計自体が\n // 不要(drain 終端の呼び出しごと省略される)。大量バインディング適用時の\n // Set 蓄積を避ける。undefined(テスト用モック等)は従来通り集計する。\n if (context.stateElement.hasUpdatedCallback !== false) {\n const absAddress = getAbsoluteStateAddressByBinding(binding);\n if (context.updatedAbsAddressSetByStateElement.has(context.stateElement)) {\n const addressSet = context.updatedAbsAddressSetByStateElement.get(context.stateElement)!;\n addressSet.add(absAddress);\n } else {\n context.updatedAbsAddressSetByStateElement.set(context.stateElement, new Set([\n absAddress\n ]));\n }\n }\n const bindingSession = getBindingSession(binding);\n if (bindingSession !== null && !bindingSession.shouldApplyState(binding)) {\n return;\n }\n if (binding.bindingType === \"event\") {\n return;\n }\n if (definedApplyVerifiedByBinding.get(binding) !== true) {\n const customTag = getCustomElement(binding.replaceNode);\n if (customTag) {\n if (getCustomElementRegistry()?.get(customTag) === undefined) {\n // 未 define のカスタム要素へは今は適用できない(accessor 未確立の要素に\n // 素の own property を書くと upgrade 後に class accessor を隠してしまう)。\n // whenDefined 後に最新 state 値で再適用する(two-way attach / deferred\n // spread と対称。docs/state-binding-init-races.md §2)。\n scheduleDeferredApply(binding, customTag);\n return;\n }\n }\n // customTag 無し or define 済み確定 → 以後この検査を省略(不可逆)\n definedApplyVerifiedByBinding.set(binding, true);\n }\n // applyChangeFromBindings のグループ化ループが解決済みルートの一致を検証済みの\n // 場合、stateName さえ一致すれば getRootNode の再解決(native 呼び出し)を省略\n // できる。activateContent 経由(フラグメント内の新規 content)も、フラグメントは\n // setRootNodeByFragment で context.rootNode に解決されるため同じ不変条件が成り立つ。\n if (context.sameRootVerified === true && binding.stateName === context.stateName) {\n _applyChange(binding, context);\n return;\n }\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\n rootNode = getRootNodeByFragment(rootNode);\n if (rootNode === null) {\n raiseError(`Root node for fragment not found for binding.`);\n }\n }\n if (binding.stateName !== context.stateName || rootNode !== context.rootNode) {\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n stateElement.createState(\"readonly\", (targetState) => {\n const newContext = {\n stateName: binding.stateName,\n rootNode: rootNode,\n stateElement: stateElement,\n state: targetState,\n appliedBindingSet: context.appliedBindingSet,\n newListValueByAbsAddress: context.newListValueByAbsAddress,\n updatedAbsAddressSetByStateElement: context.updatedAbsAddressSetByStateElement,\n deferredSelectBindings: context.deferredSelectBindings,\n }\n _applyChange(binding, newContext);\n });\n } else {\n _applyChange(binding, context);\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToClass(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const className = binding.propSegments[1];\n if (typeof newValue !== 'boolean') {\n raiseError(`Invalid value for class application: expected boolean, got ${typeof newValue}`);\n }\n element.classList.toggle(className, newValue as boolean);\n}","import { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToAttribute(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const attrName = binding.propSegments[1];\n if (element.getAttribute(attrName) !== newValue) {\n element.setAttribute(attrName, newValue as string);\n }\n}\n","import { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToStyle(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const styleName = binding.propSegments[1];\n const style = (binding.node as HTMLElement).style;\n const currentValue = (style as any)[styleName];\n if (currentValue !== newValue) {\n (style as any)[styleName] = newValue;\n }\n}\n","import { IBindingInfo } from \"../types\";\nimport { getFilteredValue } from \"./getFilteredValue\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToRadio(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as HTMLInputElement;\n const elementValue = element.value;\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\n element.checked = newValue === elementFilteredValue;\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { setLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { updatedCallbackSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IPropagationContext } from \"../propagation/types\";\nimport { IBindingInfo } from \"../types\";\nimport { applyChange } from \"./applyChange\";\nimport { applyChangeToProperty } from \"./applyChangeToProperty\";\nimport { getRootNodeByFragment } from \"./rootNodeByFragment\";\nimport { IApplyContext, IDeferredSelectBinding } from \"./types\";\n\n/**\n * バインディング情報の配列を処理し、各バインディングに対して状態の変更を適用する。\n *\n * 2フェーズで処理:\n * Phase 1: 構造的更新(for/if) + 値更新(select以外) — select.value/selectedIndex は遅延収集\n * Phase 2: 遅延されたselect.value/selectedIndex を適用(option要素の生成後)\n *\n * 最適化のため、以下のグループ化を行う:\n * 同じ stateNameとrootNode を持つバインディングをグループ化 → createState の呼び出しを削減\n */\nexport function applyChangeFromBindings(\n bindings: IBindingInfo[],\n propagationContextByBinding?: ReadonlyMap<IBindingInfo, IPropagationContext | null>,\n): void {\n let bindingIndex = 0;\n const appliedBindingSet: Set<IBindingInfo> = new Set();\n const newListValueByAbsAddress: Map<IAbsoluteStateAddress, readonly unknown[]> = new Map();\n const updatedAbsAddressSetByStateElement: Map<IStateElement, Set<IAbsoluteStateAddress>> = new Map();\n const deferredSelectBindings: IDeferredSelectBinding[] = [];\n\n // Phase 1: 構造的更新 + 値更新(select.value/selectedIndex は遅延)\n while(bindingIndex < bindings.length) {\n let binding = bindings[bindingIndex];\n const stateName = binding.stateName;\n if (binding.replaceNode.isConnected === false) {\n // 切断されているバインディングは無視、本来は事前に除去されているはず\n if (config.debug) {\n console.log(`applyChangeFromBindings: skip disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`, binding);\n }\n bindingIndex++;\n continue;\n }\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\n rootNode = getRootNodeByFragment(rootNode);\n if (rootNode === null) {\n raiseError(`Root node for fragment not found for binding.`);\n }\n }\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for binding.`);\n }\n\n stateElement.createState(\"readonly\", (state) => {\n const context: IApplyContext = {\n rootNode: rootNode,\n stateName: stateName,\n stateElement: stateElement,\n state: state,\n appliedBindingSet: appliedBindingSet,\n newListValueByAbsAddress: newListValueByAbsAddress,\n updatedAbsAddressSetByStateElement: updatedAbsAddressSetByStateElement,\n deferredSelectBindings: deferredSelectBindings,\n // グループ内の binding は下の do/while が「解決済みルート === rootNode」を\n // 検証してから applyChange に渡す(applyChange 側の getRootNode 省略の根拠)\n sameRootVerified: true,\n propagationContextByBinding: propagationContextByBinding,\n };\n\n do {\n applyChange(binding, context);\n bindingIndex++;\n\n const nextBindingInfo: IBindingInfo | undefined = bindings[bindingIndex];\n if (!nextBindingInfo) break; // 終端に到達\n const nextRootNode = nextBindingInfo.replaceNode.getRootNode() as Node;\n if (nextBindingInfo.stateName !== stateName || nextRootNode !== context.rootNode) break; // stateName が変わった\n binding = nextBindingInfo;\n } while(true); // eslint-disable-line no-constant-condition\n });\n }\n // Phase 2: 遅延されたselect.value/selectedIndex を適用\n // applyChangeToProperty は propagationContextByBinding 以外の context を\n // 参照しないため、遅延分は最小 context を渡す\n for (const { binding, value } of deferredSelectBindings) {\n applyChangeToProperty(binding, { propagationContextByBinding } as unknown as IApplyContext, value);\n }\n\n for(const [ absAddress, newListValue ] of newListValueByAbsAddress.entries()) {\n setLastListValueByAbsoluteStateAddress(absAddress, newListValue);\n }\n for(const [ stateElement, absAddressSet ] of updatedAbsAddressSetByStateElement.entries()) {\n stateElement.createState(\"writable\", (state) => {\n state[updatedCallbackSymbol](Array.from(absAddressSet));\n });\n }\n}\n","import { config } from \"../config.js\";\nimport { SVG_NAMESPACE } from \"../define.js\";\n\nconst MUSTACHE_REGEX = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\nconst SKIP_TAGS = new Set([\"SCRIPT\", \"STYLE\"]);\n\nexport function convertMustacheToComments(root: Document | Element | DocumentFragment): void {\n if (!config.enableMustache) {\n return;\n }\n\n convertTextNodes(root);\n\n const templates = Array.from(root.querySelectorAll(\"template\"));\n\n for (const template of templates) {\n if (template.namespaceURI === SVG_NAMESPACE) {\n const newTemplate = document.createElement(\"template\");\n const childNodes = Array.from(template.childNodes);\n for(let i = 0; i < childNodes.length; i++) {\n const childNode = childNodes[i];\n newTemplate.content.appendChild(childNode);\n }\n for(const attr of template.attributes) {\n newTemplate.setAttribute(attr.name, attr.value);\n }\n template.replaceWith(newTemplate);\n convertMustacheToComments(newTemplate.content);\n } else {\n convertMustacheToComments(template.content);\n }\n }\n}\n\nfunction convertTextNodes(root: Document | Element | DocumentFragment): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n const textNodes: Text[] = [];\n\n while (walker.nextNode()) {\n textNodes.push(walker.currentNode as Text);\n }\n\n for (const textNode of textNodes) {\n if (textNode.parentElement && SKIP_TAGS.has(textNode.parentElement.tagName)) {\n continue;\n }\n replaceTextNode(textNode);\n }\n}\n\nfunction replaceTextNode(textNode: Text): void {\n const text = textNode.data;\n MUSTACHE_REGEX.lastIndex = 0;\n\n if (!MUSTACHE_REGEX.test(text)) {\n return;\n }\n\n MUSTACHE_REGEX.lastIndex = 0;\n const fragment = document.createDocumentFragment();\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = MUSTACHE_REGEX.exec(text)) !== null) {\n if (match.index > lastIndex) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\n }\n\n const bindText = match[1];\n fragment.appendChild(document.createComment(`@@: ${bindText}`));\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n\n textNode.parentNode!.replaceChild(fragment, textNode);\n}\n","import { builtinFilterFn, outputBuiltinFilters } from \"../filters/builtinFilters\";\nimport { IFilterInfo } from \"../types\";\n\nlet _notFilterInfo: IFilterInfo | undefined = undefined;\n\nexport function createNotFilter(): IFilterInfo {\n if (_notFilterInfo) {\n return _notFilterInfo;\n }\n const filterName = \"not\"\n const args: string[] = [];\n const filterFn = builtinFilterFn(filterName, args)(outputBuiltinFilters);\n _notFilterInfo = {\n filterName,\n args,\n filterFn,\n }\n return _notFilterInfo;\n}\n","import { config } from \"../config.js\";\nimport { DELIMITER, WILDCARD } from \"../define.js\";\n\nconst COMMENT_REGEX = /^(\\s*@@\\s*(?:.*?)\\s*:\\s*)(.+?)(\\s*)$/;\n\nfunction expandShorthandInStatePart(statePart: string, forPath: string): string {\n const prefix = forPath + DELIMITER + WILDCARD;\n const pipeIndex = statePart.indexOf('|');\n const atIndex = statePart.indexOf('@');\n let pathPart: string;\n let suffix: string;\n if (pipeIndex !== -1) {\n pathPart = statePart.slice(0, pipeIndex).trim();\n suffix = statePart.slice(pipeIndex);\n } else if (atIndex !== -1) {\n pathPart = statePart.slice(0, atIndex).trim();\n suffix = statePart.slice(atIndex);\n } else {\n pathPart = statePart.trim();\n suffix = '';\n }\n if (pathPart === '.') {\n pathPart = prefix;\n } else if (pathPart.startsWith('.')) {\n pathPart = prefix + DELIMITER + pathPart.slice(1);\n } else {\n return statePart;\n }\n if (suffix.length > 0) {\n return pathPart + suffix;\n }\n return pathPart;\n}\n\nfunction expandCommentData(data: string, forPath: string): string {\n const match = COMMENT_REGEX.exec(data);\n if (match === null) {\n return data;\n }\n const commentPrefix = match[1];\n const bindText = match[2];\n const commentSuffix = match[3];\n const expanded = expandShorthandInStatePart(bindText, forPath);\n return commentPrefix + expanded + commentSuffix;\n}\n\nfunction expandBindAttribute(attrValue: string, forPath: string): string {\n const parts = attrValue.split(';');\n let changed = false;\n const result = parts.map(part => {\n const trimmed = part.trim();\n if (trimmed.length === 0) return part;\n const colonIndex = trimmed.indexOf(':');\n if (colonIndex === -1) return part;\n const propPart = trimmed.slice(0, colonIndex).trim();\n const statePart = trimmed.slice(colonIndex + 1).trim();\n const expanded = expandShorthandInStatePart(statePart, forPath);\n if (expanded !== statePart) {\n changed = true;\n return `${propPart}: ${expanded}`;\n }\n return part;\n });\n if (!changed) return attrValue;\n return result.join(';');\n}\n\nexport function expandShorthandInBindAttribute(attrValue: string, forPath: string): string {\n return expandBindAttribute(attrValue, forPath);\n}\n\nexport function expandShorthandPaths(root: DocumentFragment, forPath: string): void {\n const bindAttr = config.bindAttributeName;\n const walker = document.createTreeWalker(\n root,\n NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT,\n );\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node.nodeType === Node.COMMENT_NODE) {\n const comment = node as Comment;\n comment.data = expandCommentData(comment.data, forPath);\n continue;\n }\n const element = node as Element;\n if (element instanceof HTMLTemplateElement) {\n continue;\n }\n const attr = element.getAttribute(bindAttr);\n if (attr !== null) {\n const expanded = expandBindAttribute(attr, forPath);\n if (expanded !== attr) {\n element.setAttribute(bindAttr, expanded);\n }\n }\n }\n}\n","\nexport function getNodePath(node: Node): number[] {\n let currentNode: Node | null = node;\n const path: number[] = [];\n while(currentNode.parentNode !== null) {\n const nodes: Node[] = Array.from(currentNode.parentNode.childNodes);\n const index = nodes.indexOf(currentNode);\n path.unshift(index);\n currentNode = currentNode.parentNode;\n }\n return path;\n}\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\nimport { getSubscriberNodes } from \"../bindings/getSubscriberNodes\";\nimport { getNodePath } from \"./getNodePath\";\nimport { IFragmentNodeInfo } from \"./types\";\n\nexport function getFragmentNodeInfos(fragment: DocumentFragment): IFragmentNodeInfo[] {\n const fragmnentNodeInfos: IFragmentNodeInfo[] = [];\n const subscriberNodes = getSubscriberNodes(fragment);\n for(const subscriberNode of subscriberNodes) {\n const parseBindingTextResults = getParseBindTextResults(subscriberNode);\n let node = subscriberNode;\n // テンプレート登録時の事前正規化: text 専用の wcs-text コメントは、この時点で\n // 空 Text に置き換えておく。行 clone は最初から Text を持ち、getBindingInfos が\n // その Text を replaceNode に使うため、行ごとの createTextNode と start() 時の\n // replaceChild(コメント→Text 差し替え)が丸ごと不要になる。\n // 置換は同じ位置なので nodePath は不変。wcs-for/if 等の構造コメントは\n // アンカーとしてコメントのまま維持する(bindingType で判別)。\n // 非フラグメント経路(実 DOM 上のコメント)は従来どおり実行時に差し替える。\n if (\n subscriberNode.nodeType === Node.COMMENT_NODE\n && parseBindingTextResults.length === 1\n && parseBindingTextResults[0].bindingType === \"text\"\n && subscriberNode.parentNode !== null\n ) {\n const textNode = document.createTextNode(\"\");\n subscriberNode.parentNode.replaceChild(textNode, subscriberNode);\n node = textNode;\n }\n fragmnentNodeInfos.push({\n nodePath: getNodePath(node),\n parseBindTextResults: parseBindingTextResults,\n });\n }\n return fragmnentNodeInfos;\n}","\nexport function optimizeFragment(fragment: DocumentFragment): void {\n const childNodes = Array.from(fragment.childNodes);\n for(const childNode of childNodes) {\n if (childNode.nodeType === Node.TEXT_NODE) {\n const textContent = childNode.textContent || '';\n if (textContent.trim() === '') {\n // Remove empty text nodes\n fragment.removeChild(childNode);\n }\n }\n }\n}\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { config } from \"../config\";\nimport { getUUID } from \"../getUUID\";\nimport { raiseError } from \"../raiseError\";\nimport { BindingType } from \"../types\";\nimport { createNotFilter } from \"./createNotFilter\";\nimport { expandShorthandInBindAttribute, expandShorthandPaths } from \"./expandShorthandPaths\";\nimport { setFragmentInfoByUUID } from \"./fragmentInfoByUUID\";\nimport { getFragmentNodeInfos } from \"./getFragmentNodeInfos\";\nimport { getNodePath } from \"./getNodePath\";\nimport { optimizeFragment } from \"./optimizeFragment\";\nimport { IFragmentInfo } from \"./types\";\n\nconst keywordByBindingType: Map<BindingType, string> = new Map<BindingType, string>([\n [\"for\", config.commentForPrefix],\n [\"if\", config.commentIfPrefix],\n [\"elseif\", config.commentElseIfPrefix],\n [\"else\", config.commentElsePrefix],\n]);\n\nconst notFilter = createNotFilter();\n\nfunction cloneNotParseBindTextResult(\n bindingType: BindingType,\n parseBindTextResult: ParseBindTextResult\n): ParseBindTextResult {\n const filters = parseBindTextResult.outFilters;\n return {\n ...parseBindTextResult,\n outFilters: [...filters, notFilter],\n bindingType: bindingType,\n };\n}\n\nfunction _getFragmentInfo(\n rootNode: Node,\n fragment: DocumentFragment,\n parseBindingTextResult: ParseBindTextResult,\n forPath?: string\n): IFragmentInfo {\n optimizeFragment(fragment);\n if (typeof forPath === \"string\") {\n expandShorthandPaths(fragment, forPath);\n }\n collectStructuralFragments(rootNode, fragment, forPath);\n // after replacing and collect node infos on child fragment\n const fragmentInfo = {\n fragment: fragment,\n parseBindTextResult: parseBindingTextResult,\n nodeInfos: getFragmentNodeInfos(fragment),\n }\n return fragmentInfo;\n}\n\n\nexport function collectStructuralFragments(rootNode: Node, walkRoot: Document | Element | DocumentFragment, forPath?: string): void {\n const elseKeyword = config.commentElsePrefix;\n const walker = document.createTreeWalker(\n walkRoot, \n NodeFilter.SHOW_ELEMENT, \n {\n acceptNode(node: Node) {\n const element = node as Element;\n if (element.tagName.toLowerCase() === 'template') {\n const bindText = element.getAttribute(config.bindAttributeName) || '';\n if (bindText.length > 0) {\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n return NodeFilter.FILTER_SKIP;\n }\n }\n );\n let lastIfFragmentInfo: IFragmentInfo | null = null; // for elseif chaining\n const elseFragmentInfos: IFragmentInfo[] = []; // for elseif chaining\n const templates: HTMLTemplateElement[] = [];\n while (walker.nextNode()) {\n const template = walker.currentNode as HTMLTemplateElement;\n templates.push(template);\n }\n\n for(const template of templates) {\n let bindText = template.getAttribute(config.bindAttributeName) || '';\n if (typeof forPath === \"string\") {\n bindText = expandShorthandInBindAttribute(bindText, forPath);\n }\n const parseBindTextResults = parseBindTextsForElement(bindText);\n let parseBindTextResult = parseBindTextResults[0];\n const keyword = keywordByBindingType.get(parseBindTextResult.bindingType);\n if (typeof keyword === 'undefined') {\n continue;\n }\n\n const bindingType = parseBindTextResult.bindingType;\n const fragment = template.content;\n const uuid = getUUID();\n let fragmentInfo: IFragmentInfo | null = null;\n\n // Determine childForPath for shorthand expansion\n const childForPath = bindingType === \"for\"\n ? parseBindTextResult.statePathName\n : forPath;\n\n if (bindingType === \"else\") {\n // check last 'if' or 'elseif' fragment info\n if (lastIfFragmentInfo === null) {\n raiseError(`'else' binding found without preceding 'if' or 'elseif' binding.`);\n }\n // else condition\n parseBindTextResult = cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult);\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n if (typeof lastElseFragmentInfo !== \"undefined\") {\n template.remove();\n lastElseFragmentInfo.fragment.appendChild(placeHolder);\n lastElseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(placeHolder),\n parseBindTextResults: getParseBindTextResults(placeHolder),\n });\n } else {\n template.replaceWith(placeHolder);\n }\n } else if (bindingType === \"elseif\") {\n // check last 'if' or 'elseif' fragment info\n if (lastIfFragmentInfo === null) {\n raiseError(`'elseif' binding found without preceding 'if' or 'elseif' binding.`);\n }\n\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n\n // create else fragment\n const elseUUID = getUUID();\n const elseFragmentInfo: IFragmentInfo = {\n fragment: document.createDocumentFragment(),\n parseBindTextResult: cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult),\n nodeInfos: [],\n };\n elseFragmentInfo.fragment.appendChild(placeHolder);\n elseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(placeHolder),\n parseBindTextResults: getParseBindTextResults(placeHolder),\n });\n setFragmentInfoByUUID(elseUUID, rootNode, elseFragmentInfo);\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\n elseFragmentInfos.push(elseFragmentInfo);\n const elsePlaceHolder = document.createComment(`@@${elseKeyword}:${elseUUID}`);\n\n if (typeof lastElseFragmentInfo !== \"undefined\") {\n template.remove();\n lastElseFragmentInfo.fragment.appendChild(elsePlaceHolder);\n lastElseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(elsePlaceHolder),\n parseBindTextResults: getParseBindTextResults(elsePlaceHolder),\n });\n } else {\n template.replaceWith(elsePlaceHolder);\n }\n\n } else {\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n template.replaceWith(placeHolder);\n }\n\n // Update lastIfFragmentInfo for if/elseif/else chaining\n if (bindingType === \"if\") {\n elseFragmentInfos.length = 0; // start new if chain\n lastIfFragmentInfo = fragmentInfo;\n } else if (bindingType === \"elseif\") {\n lastIfFragmentInfo = fragmentInfo;\n } else if (bindingType === \"else\") {\n lastIfFragmentInfo = null;\n elseFragmentInfos.length = 0; // end if chain\n }\n }\n}\n","import { State } from \"./components/State\";\nimport { IStateElement } from \"./components/types\";\nimport { config } from \"./config\";\n\nexport async function waitForStateInitialize(root: Document | Element | DocumentFragment): Promise<void> {\n const elements = root.querySelectorAll(config.tagNames.state);\n const promises: Promise<void>[] = [];\n await customElements.whenDefined(config.tagNames.state);\n for(const element of elements) {\n const stateElement = element as State as IStateElement;\n promises.push(stateElement.initializePromise);\n }\n await Promise.all(promises);\n}\n","import { waitInitializeBinding } from \"./bindings/initializeBindingPromiseByNode\";\nimport { initializeBindings } from \"./bindings/initializeBindings\";\nimport { config } from \"./config\";\nimport { convertMustacheToComments } from \"./mustache/convertMustacheToComments\";\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\n\nexport async function buildBindings(root: Document | ShadowRoot): Promise<void> {\n if (root === document) {\n // document配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\n await waitForStateInitialize(document);\n // baindingを取得して、初期値をセットする\n convertMustacheToComments(document);\n collectStructuralFragments(document, document);\n initializeBindings(document.body, null);\n } else {\n const shadowRoot = root as ShadowRoot;\n if (shadowRoot.host.hasAttribute(config.bindAttributeName)) {\n // data-wcsを持つWebComponentは、WebComponentのbindingが完了するまで待機する。\n await waitInitializeBinding(shadowRoot.host);\n }\n // shadowRoot配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\n await waitForStateInitialize(shadowRoot);\n // baindingを取得して、初期値をセットする\n convertMustacheToComments(shadowRoot);\n collectStructuralFragments(shadowRoot, shadowRoot);\n initializeBindings(shadowRoot, null);\n }\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nexport const VERSION = pkg.version;\n","/**\n * Browser builds use the native HTMLElement. Headless runtimes receive an\n * inert base so the public module can be imported without installing DOM\n * globals; constructing components remains a browser-only operation.\n */\nexport const HTMLElementBase = (\n typeof HTMLElement === \"undefined\" ? class {} : HTMLElement\n) as typeof HTMLElement;\n","import { config } from \"../config\";\nimport { IState } from \"../types\";\nimport { VERSION } from \"../version\";\nimport { getAllFragmentUUIDs, getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\nimport { getAllSsrPropertyNodes, getSsrProperties, clearSsrPropertyStore } from \"../apply/ssrPropertyStore\";\nimport { HTMLElementBase } from \"../platform/HTMLElementBase\";\n\nexport interface ISsrElement {\n readonly name: string;\n readonly version: string;\n readonly stateData: IState;\n readonly templates: Map<string, HTMLTemplateElement>;\n readonly hydrateProps: Record<string, Record<string, unknown>>;\n getTemplate(uuid: string): HTMLTemplateElement | null;\n verifyVersion(): boolean;\n}\n\n// SSR コメントパターン\nconst SSR_PLACEHOLDER_COMMENT = /^@@wcs-(?:for|if|elseif|else):[^-]/;\nconst SSR_BLOCK_START = /^@@wcs-(for|if|elseif|else)-start:(.+)$/;\nconst SSR_BLOCK_END = /^@@wcs-(for|if|elseif|else)-end:(.+)$/;\nconst SSR_TEXT_START = /^@@wcs-text-start:(.+)$/;\n\nexport {\n SSR_PLACEHOLDER_COMMENT,\n SSR_BLOCK_START,\n SSR_BLOCK_END,\n SSR_TEXT_START,\n};\n\n/**\n * script 要素へ埋め込む JSON を HTML パーサから保護する。\n * HTML 直列化時、script の中身は生のまま出力されるため、state 値に\n * \"</script>\" や \"<!--\" を含む文字列があると script を脱出できてしまう。\n * \"<\" \">\" \"&\" と U+2028/U+2029 を JSON の \\uXXXX エスケープへ置換する\n * (JSON.parse では元の文字列と等価に復元される)。\n */\nfunction escapeJsonForScript(json: string): string {\n return json\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nexport class Ssr extends HTMLElementBase implements ISsrElement {\n private _stateData: IState | null = null;\n private _templates: Map<string, HTMLTemplateElement> | null = null;\n private _hydrateProps: Record<string, Record<string, unknown>> | null = null;\n\n get name(): string {\n return this.getAttribute('name') || 'default';\n }\n\n get version(): string {\n return this.getAttribute('version') || '';\n }\n\n get stateData(): IState {\n if (this._stateData === null) {\n this._stateData = this._loadStateData();\n }\n return this._stateData;\n }\n\n get templates(): Map<string, HTMLTemplateElement> {\n if (this._templates === null) {\n this._templates = this._loadTemplates();\n }\n return this._templates;\n }\n\n get hydrateProps(): Record<string, Record<string, unknown>> {\n if (this._hydrateProps === null) {\n this._hydrateProps = this._loadHydrateProps();\n }\n return this._hydrateProps;\n }\n\n getTemplate(uuid: string): HTMLTemplateElement | null {\n return this.templates.get(uuid) ?? null;\n }\n\n /**\n * サーバーの SSR バージョンとクライアントの state バージョンを検証する。\n * メジャー・マイナーバージョンが一致すればtrue。\n * version 属性がない場合は検証スキップ(true)。\n */\n verifyVersion(): boolean {\n const serverVersion = this.version;\n if (!serverVersion) return true;\n const serverParts = serverVersion.split('.');\n const clientParts = VERSION.split('.');\n // メジャー・マイナーが一致すれば互換\n return serverParts[0] === clientParts[0] && serverParts[1] === clientParts[1];\n }\n\n setStateData(data: IState): void {\n this._stateData = data;\n }\n\n setHydrateProps(props: Record<string, Record<string, unknown>>): void {\n this._hydrateProps = props;\n }\n\n private _loadStateData(): IState {\n const script = this.querySelector(\n `script[type=\"application/json\"]:not([data-wcs-ssr-props])`\n );\n if (!script) return {};\n try {\n return JSON.parse(script.textContent || '{}');\n } catch {\n return {};\n }\n }\n\n private _loadTemplates(): Map<string, HTMLTemplateElement> {\n const map = new Map<string, HTMLTemplateElement>();\n const templates = this.querySelectorAll<HTMLTemplateElement>('template[id]');\n for (const tpl of templates) {\n const id = tpl.getAttribute('id');\n if (id) {\n map.set(id, tpl);\n }\n }\n return map;\n }\n\n private _loadHydrateProps(): Record<string, Record<string, unknown>> {\n const script = this.querySelector('script[data-wcs-ssr-props]');\n if (!script) return {};\n try {\n return JSON.parse(script.textContent || '{}');\n } catch {\n return {};\n }\n }\n\n static findByName(root: Node, name: string): ISsrElement | null {\n const tagName = config.tagNames.ssr;\n const parentEl = root instanceof Element\n ? root\n : root instanceof Document\n ? root.documentElement\n : null;\n if (!parentEl) return null;\n const el = parentEl.querySelector(`${tagName}[name=\"${name}\"]`);\n return el as ISsrElement | null;\n }\n\n /**\n * stateData と構造テンプレート・プロパティから <wcs-ssr> の中身を構築する。\n * server パッケージの renderToString から呼ばれる。\n */\n /**\n * wcs-state 要素から $ プレフィックスや関数を除いたデータを抽出する。\n */\n static extractStateData(stateEl: Element): Record<string, any> {\n const raw = (stateEl as any).__state;\n if (!raw || typeof raw !== 'object') return {};\n const data: Record<string, any> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (!key.startsWith('$') && typeof value !== 'function') {\n data[key] = value;\n }\n }\n return data;\n }\n\n static buildContent(ssrEl: Element, stateData: Record<string, any>): void {\n // 初期データ JSON\n const jsonScript = document.createElement('script');\n jsonScript.setAttribute('type', 'application/json');\n jsonScript.textContent = escapeJsonForScript(JSON.stringify(stateData));\n ssrEl.appendChild(jsonScript);\n\n // UUID で管理されているテンプレートを復元して格納\n const uuids = getAllFragmentUUIDs();\n for (const uuid of uuids) {\n const fragmentInfo = getFragmentInfoByUUID(uuid);\n if (!fragmentInfo) continue;\n\n const tpl = document.createElement('template');\n tpl.setAttribute('id', uuid);\n\n const bindResult = fragmentInfo.parseBindTextResult;\n const bindText = bindResult.bindingType === 'else'\n ? 'else:'\n : `${bindResult.bindingType}: ${bindResult.statePathName}`;\n tpl.setAttribute(config.bindAttributeName, bindText);\n\n const content = fragmentInfo.fragment.cloneNode(true) as DocumentFragment;\n tpl.content.appendChild(content);\n\n ssrEl.appendChild(tpl);\n }\n\n // 属性で代替不可なプロパティをハイドレーション用に格納\n const ssrNodes = getAllSsrPropertyNodes();\n if (ssrNodes.length > 0) {\n const propsData: Record<string, Record<string, unknown>> = {};\n for (let i = 0; i < ssrNodes.length; i++) {\n const node = ssrNodes[i];\n const entries = getSsrProperties(node);\n if (entries.length === 0) continue;\n const id = `wcs-ssr-${i}`;\n (node as Element).setAttribute('data-wcs-ssr-id', id);\n const props: Record<string, unknown> = {};\n for (const entry of entries) {\n props[entry.propName] = entry.value;\n }\n propsData[id] = props;\n }\n if (Object.keys(propsData).length > 0) {\n const propsScript = document.createElement('script');\n propsScript.setAttribute('type', 'application/json');\n propsScript.setAttribute('data-wcs-ssr-props', '');\n propsScript.textContent = escapeJsonForScript(JSON.stringify(propsData));\n ssrEl.appendChild(propsScript);\n }\n }\n\n clearSsrPropertyStore();\n }\n\n /**\n * SSR ブロック境界コメント (@@wcs-*-start/end) を除去する\n */\n static removeBlockBoundaryComments(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const toRemove: Comment[] = [];\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (SSR_BLOCK_START.test(comment.data) || SSR_BLOCK_END.test(comment.data)) {\n toRemove.push(comment);\n }\n }\n for (const comment of toRemove) {\n comment.remove();\n }\n }\n\n /**\n * SSR の構造プレースホルダーコメント (@@wcs-for:uuid 等) を除去する\n */\n static removeStructuralComments(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const toRemove: Comment[] = [];\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\n toRemove.push(comment);\n }\n }\n for (const comment of toRemove) {\n comment.remove();\n }\n }\n\n /**\n * SSR テキストバインディングコメントを復元する。\n * <!--@@wcs-text-start:path-->text<!--@@wcs-text-end:path-->\n * → <!--@@: path--> (バインディングシステムが認識する形式)\n */\n static restoreTextBindings(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const startComments: { comment: Comment, path: string }[] = [];\n\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n const match = SSR_TEXT_START.exec(comment.data);\n if (match) {\n startComments.push({ comment, path: match[1] });\n }\n }\n\n for (const { comment, path } of startComments) {\n const bindComment = document.createComment(`@@: ${path}`);\n comment.parentNode!.insertBefore(bindComment, comment);\n\n let sibling: Node | null = comment.nextSibling;\n comment.remove();\n\n const endPattern = `@@wcs-text-end:${path}`;\n while (sibling) {\n const next: Node | null = sibling.nextSibling;\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n sibling.parentNode!.removeChild(sibling);\n break;\n }\n sibling.parentNode!.removeChild(sibling);\n sibling = next;\n }\n }\n }\n\n /**\n * SSR DOM をクリーンアップし、buildBindings が動作できる状態に戻す。\n * バージョン不一致時のフォールバック用。\n *\n * 1. SSR ブロック境界コメント間のレンダリング済みノードを除去\n * 2. SSR テキストバインディングを @@: 形式に復元\n * 3. プレースホルダーコメントを <wcs-ssr> 内のテンプレートで差し替え\n * 4. data-wcs-ssr-id 属性を除去\n * 5. <wcs-ssr> を除去\n */\n static cleanupDom(root: Document): void {\n const body = document.body;\n\n // <wcs-ssr> からテンプレート UUID マップを構築(カスタム要素未定義でも動作するよう DOM 直接走査)\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\n const templateByUuid = new Map<string, HTMLTemplateElement>();\n for (const ssrNode of ssrElements) {\n const templates = ssrNode.querySelectorAll<HTMLTemplateElement>('template[id]');\n for (const tpl of templates) {\n const id = tpl.getAttribute('id');\n if (id) {\n templateByUuid.set(id, tpl);\n }\n }\n }\n\n // SSR ブロック境界コメント間のレンダリング済みノードと境界コメントを除去\n const walker1 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\n const startComments: Comment[] = [];\n while (walker1.nextNode()) {\n const comment = walker1.currentNode as Comment;\n if (SSR_BLOCK_START.test(comment.data)) {\n startComments.push(comment);\n }\n }\n for (const startComment of startComments) {\n const match = SSR_BLOCK_START.exec(startComment.data)!;\n const type = match[1];\n const info = match[2];\n const endPattern = `@@wcs-${type}-end:${info}`;\n let sibling = startComment.nextSibling;\n while (sibling) {\n const next = sibling.nextSibling;\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n sibling.remove();\n break;\n }\n sibling.remove();\n sibling = next;\n }\n startComment.remove();\n }\n\n // SSR テキストバインディングを @@: 形式に復元\n Ssr.restoreTextBindings(body);\n\n // プレースホルダーコメント (@@wcs-for:uuid 等) をテンプレートに差し替え\n const walker2 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\n const placeholders: { comment: Comment, uuid: string }[] = [];\n while (walker2.nextNode()) {\n const comment = walker2.currentNode as Comment;\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\n const uuid = comment.data.split(':')[1];\n placeholders.push({ comment, uuid });\n }\n }\n for (const { comment, uuid } of placeholders) {\n const tpl = templateByUuid.get(uuid);\n if (tpl) {\n const restored = document.createElement('template') as HTMLTemplateElement;\n const bindAttr = tpl.getAttribute(config.bindAttributeName);\n if (bindAttr) restored.setAttribute(config.bindAttributeName, bindAttr);\n const imported = document.importNode(tpl.content, true);\n if (imported.childNodes.length > 0) {\n restored.content.appendChild(imported);\n } else {\n for (const child of Array.from(tpl.childNodes)) {\n restored.content.appendChild(document.importNode(child, true));\n }\n }\n comment.parentNode!.replaceChild(restored, comment);\n }\n }\n\n // data-wcs-ssr-id 属性を除去\n const ssrIdElements = root.querySelectorAll('[data-wcs-ssr-id]');\n for (const el of ssrIdElements) {\n el.removeAttribute('data-wcs-ssr-id');\n }\n\n // <wcs-ssr> を除去\n for (const el of ssrElements) {\n el.remove();\n }\n }\n}\n","import { getAbsoluteStateAddressByBinding } from \"./binding/getAbsoluteStateAddressByBinding\";\nimport { setLastListValueByAbsoluteStateAddress } from \"./list/lastListValueByAbsoluteStateAddress\";\nimport { parseBindTextsForElement } from \"./bindTextParser/parseBindTextsForElement\";\nimport { ParseBindTextResult } from \"./bindTextParser/types\";\nimport { BindingSession, getOrCreateBindingSession } from \"./bindings/BindingSession\";\nimport { collectNodesAndBindingInfos } from \"./bindings/collectNodesAndBindingInfos\";\nimport { setBindingsByContent } from \"./bindings/bindingsByContent\";\nimport { setBindingSessionByContent } from \"./bindings/bindingSessionByContent\";\nimport { setIndexBindingsByContent } from \"./bindings/indexBindingsByContent\";\nimport { setNodesByContent } from \"./bindings/nodesByContent\";\nimport { bindLoopContextToContent } from \"./bindings/bindLoopContextToContent\";\nimport { config } from \"./config\";\nimport { WILDCARD, INDEX_BY_INDEX_NAME } from \"./define\";\nimport { Ssr, SSR_BLOCK_START } from \"./components/Ssr\";\nimport { getStateElementByName } from \"./stateElementByName\";\nimport { setLoopContextByNode } from \"./list/loopContextByNode\";\nimport { applyChangeFromBindings } from \"./apply/applyChangeFromBindings\";\nimport { hydrateSetContent, hydrateSetLastNode } from \"./apply/applyChangeToFor\";\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\nimport { setFragmentInfoByUUID, getFragmentInfoByUUID } from \"./structural/fragmentInfoByUUID\";\nimport { setContentByNode } from \"./structural/contentsByNode\";\nimport { createContentFromNodes } from \"./structural/createContent\";\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\nimport { createNotFilter } from \"./structural/createNotFilter\";\nimport { getFragmentNodeInfos } from \"./structural/getFragmentNodeInfos\";\nimport { optimizeFragment } from \"./structural/optimizeFragment\";\nimport { expandShorthandPaths } from \"./structural/expandShorthandPaths\";\nimport { createListIndex } from \"./list/createListIndex\";\nimport { IListIndex } from \"./list/types\";\nimport { setListIndexesByList } from \"./list/listIndexesByList\";\nimport { getPathInfo } from \"./address/PathInfo\";\nimport { createStateAddress } from \"./address/StateAddress\";\nimport { IBindingInfo } from \"./types\";\nimport { VERSION } from \"./version\";\n\n// ハイドレーション時にスキップするバインディングタイプ\nconst STRUCTURAL_TYPES = new Set(['for', 'if', 'elseif', 'else']);\n\n\ninterface ISsrBlock {\n type: string; // for, if, elseif, else\n uuid: string;\n path: string;\n index: number | null; // for のみ\n nodes: Node[]; // start〜end 間のノード\n}\n\n/**\n * SSR ブロック境界コメントを走査して、start〜end 間のノードを収集する\n */\nfunction collectSsrBlocks(root: Node): ISsrBlock[] {\n const blocks: ISsrBlock[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const startComments: Comment[] = [];\n\n // まず全コメントを収集\n while (walker.nextNode()) {\n startComments.push(walker.currentNode as Comment);\n }\n\n for (const comment of startComments) {\n const startMatch = SSR_BLOCK_START.exec(comment.data);\n if (!startMatch) continue;\n\n const type = startMatch[1];\n const info = startMatch[2]; // \"uuid:path:index\" or \"uuid:path\"\n const parts = info.split(':');\n\n let uuid: string;\n let path: string;\n let index: number | null = null;\n\n if (type === 'for') {\n // uuid:path:index\n uuid = parts[0];\n path = parts[1];\n index = parseInt(parts[2], 10);\n } else {\n // uuid:path\n uuid = parts[0];\n path = parts.slice(1).join(':');\n }\n\n // start と end の間のノードを収集\n const nodes: Node[] = [];\n let sibling = comment.nextSibling;\n const endPattern = `@@wcs-${type}-end:${info}`;\n while (sibling) {\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n break;\n }\n nodes.push(sibling);\n sibling = sibling.nextSibling;\n }\n\n blocks.push({ type, uuid, path, index, nodes });\n }\n\n return blocks;\n}\n\n/**\n * live DOM ノード群からバインディングを収集する。\n * ノードを一時的に DocumentFragment に移動して collectNodesAndBindingInfos を実行し、\n * 元の位置に戻す。\n */\nfunction collectBindingsFromLiveNodes(\n nodes: Node[],\n): { bindingInfos: IBindingInfo[], subscriberNodes: Node[], bindingSession: BindingSession } {\n const bindingSession = new BindingSession();\n if (nodes.length === 0) {\n return { bindingInfos: [], subscriberNodes: [], bindingSession };\n }\n\n // ノードの元の位置を記録\n const parent = nodes[0].parentNode;\n const nextSibling = nodes[nodes.length - 1].nextSibling;\n\n // 一時的に wrapper 要素に移動(collectNodesAndBindingInfos は Element を受け付ける)\n const wrapper = document.createElement('div');\n for (const node of nodes) {\n wrapper.appendChild(node);\n }\n\n // バインディング収集\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(wrapper);\n\n const bindingInfos = bindingSession.initialize(allBindings, {\n registerAddress: false,\n applyOnReconnect: false,\n });\n\n // 元の位置に戻す\n if (parent) {\n while (wrapper.firstChild) {\n parent.insertBefore(wrapper.firstChild, nextSibling);\n }\n }\n\n return {\n bindingInfos,\n subscriberNodes,\n bindingSession,\n };\n}\n\n/**\n * SSR ブロックの DOM ノードを Content 化し、バインディングを登録する。\n */\nfunction hydrateBlocks(root: Node, blocks: ISsrBlock[]): void {\n // for ブロックの listIndex を UUID ごとに収集\n const listIndexesByUuid: Map<string, IListIndex[]> = new Map();\n\n for (const block of blocks) {\n if (block.nodes.length === 0) continue;\n\n const content = createContentFromNodes(block.nodes);\n\n // Content のバインディングを収集\n const { bindingInfos, subscriberNodes, bindingSession } = collectBindingsFromLiveNodes(block.nodes);\n setBindingSessionByContent(content, bindingSession);\n\n // Content 内のノードに data-wcs-completed を付与\n // (メインの collectNodesAndBindingInfos で重複登録されないようにする)\n for (const node of subscriberNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n (node as Element).setAttribute('data-wcs-completed', '');\n }\n }\n setBindingsByContent(content, bindingInfos);\n setNodesByContent(content, subscriberNodes);\n\n const indexBindings: IBindingInfo[] = [];\n for (const binding of bindingInfos) {\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\n indexBindings.push(binding);\n }\n }\n setIndexBindingsByContent(content, indexBindings);\n\n if (block.type === 'for' && block.index !== null) {\n const placeholderComment = findPlaceholderComment(root, 'for', block.uuid);\n if (placeholderComment) {\n const listIndex = createListIndex(null, block.index);\n hydrateSetContent(placeholderComment, listIndex, content);\n const lastNode = block.nodes[block.nodes.length - 1];\n hydrateSetLastNode(placeholderComment, lastNode);\n setContentByNode(placeholderComment, content);\n\n // ループコンテキストをバインドし、バインディングをアドレスに登録\n const pathInfo = getPathInfo(block.path + '.' + WILDCARD);\n const stateAddress = createStateAddress(pathInfo, listIndex);\n // ILoopContext は IStateAddress + listIndex なので、stateAddress をそのまま使う\n bindLoopContextToContent(content, stateAddress as any);\n\n bindingSession.initialize(bindingInfos, {\n registerAddress: true,\n registerPathInfo: false,\n applyOnReconnect: false,\n });\n\n // listIndex を UUID ごとに収集(後で setListIndexesByList に渡す)\n let indexes = listIndexesByUuid.get(block.uuid);\n if (!indexes) {\n indexes = [];\n listIndexesByUuid.set(block.uuid, indexes);\n }\n indexes.push(listIndex);\n }\n } else {\n const placeholderComment = findPlaceholderComment(root, block.type, block.uuid);\n if (placeholderComment) {\n setContentByNode(placeholderComment, content);\n\n bindingSession.initialize(bindingInfos, {\n registerAddress: true,\n registerPathInfo: false,\n applyOnReconnect: false,\n });\n }\n }\n }\n\n // for ブロックの listIndex を state のリスト値に紐づける\n for (const [uuid, indexes] of listIndexesByUuid) {\n const placeholderComment = findPlaceholderComment(root, 'for', uuid);\n if (!placeholderComment) continue;\n // state から現在のリスト値を取得して listIndexes を設定\n const rootNode = placeholderComment.getRootNode() as Node;\n // structuralBindings はまだ登録前なので、getParseBindTextResults を直接使う\n const fragmentInfo = getFragmentInfoByUUID(uuid);\n if (!fragmentInfo) continue;\n const stateName = fragmentInfo.parseBindTextResult.stateName;\n const statePathName = fragmentInfo.parseBindTextResult.statePathName;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (!stateElement) continue;\n stateElement.createState(\"readonly\", (state) => {\n const list = state[statePathName];\n if (Array.isArray(list)) {\n setListIndexesByList(list, indexes);\n }\n });\n }\n}\n\nfunction findPlaceholderComment(root: Node, type: string, uuid: string): Comment | null {\n const keywordMap: Record<string, string> = {\n 'for': config.commentForPrefix,\n 'if': config.commentIfPrefix,\n 'elseif': config.commentElseIfPrefix,\n 'else': config.commentElsePrefix,\n };\n const keyword = keywordMap[type];\n if (!keyword) return null;\n\n const pattern = `@@${keyword}:${uuid}`;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (comment.data === pattern) {\n return comment;\n }\n }\n return null;\n}\n\n/**\n * <wcs-ssr> 内のテンプレートを fragmentInfoByUUID に復帰させる。\n */\nfunction restoreFragments(root: Document, ssrEl: Ssr): void {\n const rootNode = root as Node;\n let lastIfParseResult: ParseBindTextResult | null = null;\n\n for (const [uuid, tpl] of ssrEl.templates) {\n const bindText = tpl.getAttribute(config.bindAttributeName) || '';\n const parseBindTextResults = parseBindTextsForElement(bindText);\n let parseBindTextResult = parseBindTextResults[0];\n const bindingType = parseBindTextResult.bindingType;\n\n // else: 直前の if 条件の not → 条件反転\n // elseif: 独自条件を持つが stateName は if から引き継ぐ\n if (bindingType === 'else' && lastIfParseResult) {\n parseBindTextResult = {\n ...lastIfParseResult,\n outFilters: [...lastIfParseResult.outFilters, createNotFilter()],\n bindingType: 'else',\n };\n } else if (bindingType === 'elseif' && lastIfParseResult) {\n parseBindTextResult = {\n ...parseBindTextResult,\n stateName: lastIfParseResult.stateName,\n };\n }\n\n // if chain の追跡\n if (bindingType === 'if') {\n lastIfParseResult = parseBindTextResult;\n } else if (bindingType === 'elseif') {\n lastIfParseResult = parseBindTextResult;\n } else if (bindingType === 'else') {\n lastIfParseResult = null;\n }\n\n const fragment = document.importNode(tpl.content, true);\n const forPath = bindingType === \"for\" ? parseBindTextResult.statePathName : undefined;\n optimizeFragment(fragment);\n if (typeof forPath === \"string\") {\n expandShorthandPaths(fragment, forPath);\n }\n collectStructuralFragments(rootNode, fragment, forPath);\n\n const fragmentInfo = {\n fragment,\n parseBindTextResult,\n nodeInfos: getFragmentNodeInfos(fragment),\n };\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n }\n}\n\n/**\n * SSR ハイドレーション用バインディング初期化。\n * バージョン不一致時は DOM をクリーンアップして false を返す\n * (呼び出し元で buildBindings にフォールバック)。\n */\nexport async function hydrateBindings(root: Document): Promise<boolean> {\n await waitForStateInitialize(root);\n\n // バージョン検証\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\n for (const ssrNode of ssrElements) {\n const ssrEl = ssrNode as Ssr;\n if (!ssrEl.verifyVersion()) {\n console.warn(\n `[@wcstack/state] SSR version mismatch: server=\"${ssrEl.version}\", client=\"${VERSION}\". Falling back to full render.`\n );\n Ssr.cleanupDom(root);\n return false;\n }\n }\n\n // <wcs-ssr> からテンプレートを fragmentInfoByUUID に復帰\n for (const ssrNode of ssrElements) {\n restoreFragments(root, ssrNode as Ssr);\n }\n\n // SSR ブロック境界コメントから既存 DOM を Content 化\n const blocks = collectSsrBlocks(document.body);\n hydrateBlocks(document.body, blocks);\n\n // ブロック境界コメント (start/end) を除去\n Ssr.removeBlockBoundaryComments(document.body);\n\n // <wcs-ssr> を一時除去(バインディング走査に含めない)\n const ssrParents: { el: Element, parent: Node, next: Node | null }[] = [];\n for (const el of ssrElements) {\n if (el.parentNode) {\n ssrParents.push({ el, parent: el.parentNode, next: el.nextSibling });\n el.remove();\n }\n }\n\n // 構造プレースホルダーコメント (@@wcs-for:uuid 等) は残す\n // → バインディング走査で拾われ、状態変化時の再レンダリングに使われる\n\n // SSR テキストバインディングを @@: 形式に復元\n Ssr.restoreTextBindings(document.body);\n\n // ノードとバインディングを収集\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(document.body);\n\n // 収集完了したノードに data-wcs-completed 属性を付与\n // for ブロック内ノード(hydrateBlocks で登録済み)にはループコンテキストをリセットしない\n for (const node of subscriberNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n if (!el.hasAttribute('data-wcs-completed')) {\n setLoopContextByNode(node, null);\n el.setAttribute('data-wcs-completed', '');\n }\n } else {\n // コメントノード等\n setLoopContextByNode(node, null);\n }\n }\n\n // バインディングを構造系とそれ以外に分離\n const normalBindings: IBindingInfo[] = [];\n const structuralBindings: IBindingInfo[] = [];\n const bindingSession = getOrCreateBindingSession(document.body);\n const initializedBindings = bindingSession.initialize(allBindings);\n\n for (const binding of initializedBindings) {\n if (binding.bindingType === \"event\") continue;\n if (STRUCTURAL_TYPES.has(binding.bindingType)) {\n structuralBindings.push(binding);\n } else if (binding.statePathName.includes(WILDCARD)) {\n // for ブロック内のバインディング → Content のバインディングとして登録済み\n continue;\n } else {\n normalBindings.push(binding);\n }\n }\n\n // for バインディングの lastListValue を初期値として設定\n // (次回の状態変化時に差分計算の基準になる)\n for (const binding of structuralBindings) {\n if (binding.bindingType === 'for') {\n const absAddr = getAbsoluteStateAddressByBinding(binding);\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement) {\n stateElement.createState(\"readonly\", (state) => {\n const value = state[binding.statePathName];\n if (Array.isArray(value)) {\n setLastListValueByAbsoluteStateAddress(absAddr, value);\n }\n });\n }\n }\n }\n\n // 通常バインディングのみ初回値適用(構造バインディングはSSR描画済み)\n applyChangeFromBindings(normalBindings);\n\n // <wcs-ssr> を元に戻す\n for (const { el, parent, next } of ssrParents) {\n parent.insertBefore(el, next);\n }\n\n // hydrateProps 復元\n const restoredSsrElements = root.querySelectorAll(config.tagNames.ssr);\n for (const ssrNode of restoredSsrElements) {\n const ssrEl = ssrNode as Ssr;\n const props = ssrEl.hydrateProps;\n for (const [id, propMap] of Object.entries(props)) {\n const target = root.querySelector(`[data-wcs-ssr-id=\"${id}\"]`);\n if (!target) continue;\n for (const [propName, value] of Object.entries(propMap)) {\n (target as any)[propName] = value;\n }\n }\n }\n\n // ハイドレーション中の重複登録防止用属性を除去\n const completedEls = root.querySelectorAll('[data-wcs-completed]');\n for (const el of completedEls) {\n el.removeAttribute('data-wcs-completed');\n }\n\n return true;\n}\n\n/** @internal テスト用 */\nexport const __test = {\n collectSsrBlocks,\n collectBindingsFromLiveNodes,\n hydrateBlocks,\n findPlaceholderComment,\n restoreFragments,\n};\n","import { buildBindings } from \"./buildBindings\";\nimport { hydrateBindings } from \"./hydrateBindings\";\nimport { IStateElement } from \"./components/types\";\nimport { config, inSsr } from \"./config\";\nimport { raiseError } from \"./raiseError\";\nimport { devtoolsSink } from \"./devtools/sink\";\n\nconst stateElementByNameByNode: WeakMap<Node, Map<string, IStateElement>> = new WeakMap();\nconst bindingsReadyByNode: WeakMap<Node, Promise<void>> = new WeakMap();\n\n// devtools 用の列挙可能な登録簿(protocol §4.1 — 唯一の常時 ON 台帳)。\n// サイズは <wcs-state> 要素数に拘束され、unregister(disconnectedCallback)で\n// 必ず削除されるためリークしない。\nconst liveStateElements: Set<IStateElement> = new Set();\n\nexport function getLiveStateElements(): ReadonlySet<IStateElement> {\n return liveStateElements;\n}\n\nexport function getStateElementByName(rootNode:Node, name: string): IStateElement | null {\n let stateElementByName = stateElementByNameByNode.get(rootNode);\n if (!stateElementByName) {\n return null;\n }\n return stateElementByName.get(name) || null;\n}\n\n/**\n * 指定された rootNode のバインディング初期化が完了するまで待機する Promise を返す。\n */\nexport function getBindingsReady(rootNode: Node): Promise<void> {\n return bindingsReadyByNode.get(rootNode) ?? Promise.resolve();\n}\n\nexport function setStateElementByName(rootNode:Node, name: string, element: IStateElement | null): void {\n\n let stateElementByName = stateElementByNameByNode.get(rootNode);\n\n if (element === null) {\n // 削除の場合、Mapが存在しない場合は何もしない\n if (!stateElementByName) {\n return;\n }\n const removed = stateElementByName.get(name);\n stateElementByName.delete(name);\n if (stateElementByName.size === 0) {\n stateElementByNameByNode.delete(rootNode);\n }\n if (removed !== undefined) {\n liveStateElements.delete(removed);\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:element-unregistered\", name, rootNode, element: removed });\n }\n }\n if (config.debug) {\n console.debug(`State element unregistered: name=\"${name}\"`);\n }\n } else {\n // 登録の場合\n if (!stateElementByName) {\n stateElementByName = new Map<string, IStateElement>();\n stateElementByNameByNode.set(rootNode, stateElementByName);\n // 初めてルートノードに登録する場合\n // enable-ssr 属性があり、サーバーサイドでない場合はハイドレーション\n const enableSsr = !inSsr() && (element as unknown as Element).hasAttribute?.('enable-ssr');\n if (rootNode.constructor.name === 'HTMLDocument' || rootNode.constructor.name === 'Document') {\n const ready = new Promise<void>((resolve) => {\n queueMicrotask(async () => {\n if (enableSsr) {\n const success = await hydrateBindings(rootNode as Document);\n if (!success) {\n await buildBindings(rootNode as Document);\n }\n } else {\n await buildBindings(rootNode as Document);\n }\n resolve();\n });\n });\n bindingsReadyByNode.set(rootNode, ready);\n } else if (rootNode.constructor.name === 'ShadowRoot') {\n const ready = new Promise<void>((resolve) => {\n queueMicrotask(async () => {\n await buildBindings(rootNode as ShadowRoot);\n resolve();\n });\n });\n bindingsReadyByNode.set(rootNode, ready);\n }\n }\n if (stateElementByName.has(name)) {\n raiseError(`State element with name \"${name}\" is already registered.`);\n }\n stateElementByName.set(name, element);\n liveStateElements.add(element);\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:element-registered\", name, rootNode, element });\n }\n if (config.debug) {\n console.debug(`State element registered: name=\"${name}\"`, element);\n }\n }\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { peekBindingsForAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { MAX_PROPAGATION_HOPS } from \"../define\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { IPropagationContext } from \"../propagation/types\";\nimport { IBindingInfo } from \"../types\";\n\n/**\n * drain(_applyChange)終了通知のリスナー(docs/state-streams-design.md §3-2)。\n * バッチ内の更新アドレス(AbsoluteStateAddress のインスタンス同一性で\n * dedup 済みの Set)を受け取る。stream runtime の依存駆動 restart が\n * この通知を交差判定の入力にする。\n */\nexport type UpdateBatchListener = (batch: ReadonlySet<IAbsoluteStateAddress>) => void;\n\nconst updateBatchListeners: Set<UpdateBatchListener> = new Set();\n\n/**\n * drain 終了リスナーを登録する。\n */\nexport function registerUpdateBatchListener(listener: UpdateBatchListener): void {\n updateBatchListeners.add(listener);\n}\n\n/**\n * drain 終了リスナーを解除する(テスト間の分離用)。\n */\nexport function unregisterUpdateBatchListener(listener: UpdateBatchListener): void {\n updateBatchListeners.delete(listener);\n}\n\n/**\n * 全リスナーに drain のバッチを通知する。\n * リスナーの throw は握りつぶさない(内部バグの隠蔽防止)。\n * stream 側リスナーが entry ごとに自前で try/catch する契約(設計書 §3-2)。\n */\nfunction notifyUpdateBatchListeners(batch: ReadonlySet<IAbsoluteStateAddress>): void {\n for (const listener of updateBatchListeners) {\n listener(batch);\n }\n}\n\n/** queue に積まれる update record(address + 書き込み時点の因果 context) */\ninterface IQueuedUpdateRecord {\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly context: IPropagationContext | null;\n}\n\nclass Updater {\n private _queueUpdateRecords: IQueuedUpdateRecord[] = [];\n constructor() {\n }\n\n enqueueAbsoluteAddress(\n absoluteAddress: IAbsoluteStateAddress,\n context: IPropagationContext | null = null,\n ): void {\n const requireStartProcess = this._queueUpdateRecords.length === 0;\n this._queueUpdateRecords.push({ absoluteAddress, context });\n if (requireStartProcess) {\n queueMicrotask(() => {\n const updateRecords = this._queueUpdateRecords;\n this._queueUpdateRecords = [];\n this._applyChange(updateRecords);\n });\n }\n }\n\n // テスト用に公開\n testApplyChange(\n absoluteAddresses: IAbsoluteStateAddress[],\n contexts?: readonly (IPropagationContext | null)[],\n ): void {\n this._applyChange(absoluteAddresses.map((absoluteAddress, index) => ({\n absoluteAddress,\n context: contexts?.[index] ?? null,\n })));\n }\n\n private _applyChange(updateRecords: IQueuedUpdateRecord[]): void {\n // Note: AbsoluteStateAddress はキャッシュされているため、\n // 同一の (stateName, address) は同じインスタンスとなり、\n // Map / Set による重複排除が正しく機能する。\n // coalescing は last-write-wins: 同じ address は最後の update の\n // (値は state 側が既に保持) context をそのまま採用する(設計書 §4.1)。\n // visitedEdges の合成や synthetic transaction への置換は行わない。\n const contextByAbsoluteAddress = new Map<IAbsoluteStateAddress, IPropagationContext | null>();\n for (const record of updateRecords) {\n const previous = contextByAbsoluteAddress.get(record.absoluteAddress);\n if (\n devtoolsSink !== null\n && typeof previous !== \"undefined\" && previous !== null\n && record.context !== null\n && previous.transactionId !== record.context.transactionId\n ) {\n devtoolsSink({\n type: \"propagation:coalesced\",\n absoluteAddress: record.absoluteAddress,\n droppedTransactionId: previous.transactionId,\n winnerTransactionId: record.context.transactionId,\n });\n }\n contextByAbsoluteAddress.set(record.absoluteAddress, record.context);\n }\n const processBindings: IBindingInfo[] = [];\n const propagationContextByBinding = new Map<IBindingInfo, IPropagationContext | null>();\n for (const [absoluteAddress, context] of contextByAbsoluteAddress) {\n if (context !== null && context.hop >= MAX_PROPAGATION_HOPS) {\n // hop 上限超過: この transaction の未処理 record だけを quarantine する。\n // 既に適用した値は戻さず、updater から例外は投げない(設計書 §4 規則 6)。\n console.error(`[@wcstack/state] propagation hop limit exceeded; update record quarantined.`, {\n path: absoluteAddress.absolutePathInfo.pathInfo.path,\n stateName: absoluteAddress.absolutePathInfo.stateName,\n transactionId: context.transactionId,\n hop: context.hop,\n maxHops: MAX_PROPAGATION_HOPS,\n });\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:hop-limit\",\n absoluteAddress,\n transactionId: context.transactionId,\n hop: context.hop,\n });\n }\n continue;\n }\n // peek: バインディングの無いアドレス(リスト置換で enqueue される中間\n // アドレス等)に空エントリを生成・蓄積しない。エントリは単一 binding\n // (通常ケース)か Set(同一アドレスに 2 本以上)のどちらか。\n // 従来台帳 → パターン台帳(リスト行)の順で引く。\n const entry = peekBindingsForAddress(absoluteAddress);\n if (entry === undefined) {\n continue;\n }\n if (entry instanceof Set) {\n for(const binding of entry) {\n if (binding.replaceNode.isConnected === false) {\n // 切断されているバインディングは無視\n continue;\n }\n processBindings.push(binding);\n if (context !== null) {\n propagationContextByBinding.set(binding, context);\n }\n }\n } else if (entry.replaceNode.isConnected !== false) {\n processBindings.push(entry);\n if (context !== null) {\n propagationContextByBinding.set(entry, context);\n }\n }\n }\n // context が無い場合は従来どおり 1 引数で呼ぶ(呼び出し契約の互換維持)\n if (propagationContextByBinding.size > 0) {\n applyChangeFromBindings(processBindings, propagationContextByBinding);\n } else {\n applyChangeFromBindings(processBindings);\n }\n // drain 終了フック: binding 適用後に dedup 済みバッチを通知する(設計書 §3-2)。\n // testApplyChange も同じ _applyChange を通るため、テストから同期に駆動できる。\n // quarantine された address も state 値は適用済みのため通知対象に含める。\n notifyUpdateBatchListeners(new Set(contextByAbsoluteAddress.keys()));\n }\n\n}\n\nconst updater = new Updater();\n\nexport function getUpdater(): Updater {\n return updater;\n}\n\n// テスト用にprivateメソッドを公開\nexport const __private__ = {\n Updater,\n};\n","/**\n * devtools/types.ts\n *\n * DevTools Hook Protocol (docs/devtools-hook-protocol.md) の型定義。\n *\n * イベント payload はランタイム内部オブジェクト(IAbsoluteStateAddress /\n * IBindingInfo 等)への生参照を含む(同一 realm・オーバーレイ前提、protocol 原則 4)。\n * 消費者はこれらを変異してはならない。\n */\n\nimport type { IAbsoluteStateAddress } from \"../address/types\";\nimport type { IBindingInfo } from \"../binding/types\";\nimport type { IStateElement } from \"../components/types\";\n\n/** グローバル registry のプロパティ名 */\nexport const DEVTOOLS_HOOK_GLOBAL = \"__WCSTACK_DEVTOOLS_HOOK__\";\n\n/** プロトコル版。additive change では上げない(protocol §2) */\nexport const DEVTOOLS_PROTOCOL_VERSION = 1;\n\nexport type DevtoolsEvent =\n | {\n readonly type: \"state:element-registered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: IStateElement;\n }\n | {\n readonly type: \"state:element-unregistered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: IStateElement;\n }\n | {\n readonly type: \"state:write\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly value: unknown;\n /** same-value guard が既に取得していた場合のみ意味を持つ(protocol §4.2) */\n readonly oldValue: unknown;\n readonly hasOldValue: boolean;\n }\n | {\n readonly type: \"state:update-batch\";\n readonly addresses: ReadonlySet<IAbsoluteStateAddress>;\n }\n | {\n readonly type: \"state:binding-added\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly binding: IBindingInfo;\n }\n | {\n readonly type: \"state:binding-removed\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly binding: IBindingInfo;\n }\n | {\n readonly type: \"state:binding-cleared\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n }\n | {\n readonly type: \"state:token-emit\";\n readonly kind: \"command\" | \"event\";\n readonly stateName: string | null;\n readonly tokenName: string;\n readonly args: readonly unknown[];\n readonly subscriberCount: number;\n }\n | {\n readonly type: \"propagation:suppressed\";\n readonly reason: \"confirmation\" | \"visited-edge\";\n readonly transactionId: number;\n readonly edgeId: number;\n readonly node: Node;\n readonly member: string;\n }\n | {\n readonly type: \"propagation:coalesced\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly droppedTransactionId: number;\n readonly winnerTransactionId: number;\n }\n | {\n readonly type: \"propagation:hop-limit\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly transactionId: number;\n readonly hop: number;\n }\n // --- contract analyzer (Phase 5b, §6 contract category) ---\n | {\n // sidecar manifest から 1 コンポーネント契約を読んだ(dev-time analyzer)。\n readonly type: \"contract:manifest-read\";\n readonly tag: string;\n /** 実行時に該当タグが登録済みか(未登録なら drift の起点)。 */\n readonly loaded: boolean;\n }\n | {\n // manifest の未知 namespace / extension(runtime analyzer が解釈しない)。\n readonly type: \"contract:unsupported-extension\";\n readonly namespace: string;\n }\n | {\n // sidecar と live wcBindable 宣言の drift。live 宣言が正本。\n readonly type: \"contract:drift\";\n readonly reason: \"component-not-loaded\" | \"missing-member\" | \"event-mismatch\";\n readonly tag: string;\n readonly member?: string;\n /** event-mismatch のとき: sidecar 宣言 event / live event。 */\n readonly sidecarEvent?: string;\n readonly liveEvent?: string;\n };\n\nexport type DevtoolsSink = (event: DevtoolsEvent) => void;\n\n/** contract analyzer(Phase 5b)が生成しうる event だけの狭い union(公開 API の戻り型)。 */\nexport type ContractEvent = Extract<\n DevtoolsEvent,\n { readonly type: \"contract:manifest-read\" | \"contract:unsupported-extension\" | \"contract:drift\" }\n>;\n\nexport interface IStateElementSummary {\n readonly name: string;\n readonly rootNode: Node;\n readonly element: IStateElement;\n readonly paths: {\n readonly list: ReadonlySet<string>;\n readonly element: ReadonlySet<string>;\n readonly getter: ReadonlySet<string>;\n readonly setter: ReadonlySet<string>;\n };\n readonly commandTokenNames: ReadonlySet<string>;\n readonly eventTokenNames: ReadonlySet<string>;\n readonly staticDependency: ReadonlyMap<string, readonly string[]>;\n readonly dynamicDependency: ReadonlyMap<string, readonly string[]>;\n}\n\nexport interface IDevtoolsSource {\n readonly id: string;\n readonly kind: \"state\";\n readonly packageVersion: string;\n getStateElements(): IStateElementSummary[];\n /**\n * state のトップレベルキー(データプロパティ + 実行可能な getter)を列挙する。\n * メソッド・`$` 始まり・ワイルドカードを含むキーは除外。\n * 状態ツリー UI の描画起点(protocol §3)。\n */\n keys(name: string, rootNode: Node): string[];\n read(name: string, rootNode: Node, path: string, indexes?: number[]): unknown;\n write(name: string, rootNode: Node, path: string, value: unknown, indexes?: number[]): void;\n /** registry 専用。listener の有無に応じて registry が差し替える */\n _setSink(sink: DevtoolsSink | null): void;\n}\n\nexport interface IDevtoolsListener {\n onSourceRegistered?(source: IDevtoolsSource): void;\n onSourceUnregistered?(sourceId: string): void;\n onEvent?(sourceId: string, event: DevtoolsEvent): void;\n}\n\nexport interface IDevtoolsHookRegistry {\n readonly version: number;\n readonly sources: Map<string, IDevtoolsSource>;\n register(source: IDevtoolsSource): void;\n unregister(sourceId: string): void;\n /** 戻り値は解除関数。既登録 source は onSourceRegistered で即時リプレイされる */\n addListener(listener: IDevtoolsListener): () => void;\n}\n","/**\n * devtools/bridge.ts\n *\n * DevTools Hook Protocol (docs/devtools-hook-protocol.md) の state 側実装。\n *\n * - registry 最小実装: `globalThis.__WCSTACK_DEVTOOLS_HOOK__` を create-if-missing で\n * 確保する(ロード順非依存・先勝ち。devtools 側 client も同一仕様の実装を持つ)。\n * - source: この state モジュールコピーを 1 source として登録する。同一ページに\n * コピーが複数あれば複数 source になる(正常系、protocol §5)。\n * - sink 切替: listener の有無に応じて registry が `_setSink` を呼び、ここで\n * updater の drain リスナー登録/解除も連動させる(protocol §4.3)。\n */\n\nimport { inSsr } from \"../config\";\nimport { getStateElementByName, getLiveStateElements } from \"../stateElementByName\";\nimport { registerUpdateBatchListener, unregisterUpdateBatchListener, UpdateBatchListener } from \"../updater/updater\";\nimport { raiseError } from \"../raiseError\";\nimport { VERSION } from \"../version\";\nimport { IStateElement } from \"../components/types\";\nimport { devtoolsSink, setDevtoolsSink } from \"./sink\";\nimport {\n DEVTOOLS_HOOK_GLOBAL,\n DEVTOOLS_PROTOCOL_VERSION,\n DevtoolsSink,\n IDevtoolsHookRegistry,\n IDevtoolsListener,\n IDevtoolsSource,\n IStateElementSummary,\n} from \"./types\";\n\n/**\n * registry の最小実装(protocol §2)。30 行程度に抑え、振る舞いは\n * 「source/listener の管理と sink の配線」のみ。台帳・整形は devtools 側の責務。\n */\nfunction createMinimalRegistry(): IDevtoolsHookRegistry {\n const sources = new Map<string, IDevtoolsSource>();\n const listeners = new Set<IDevtoolsListener>();\n const applySink = (source: IDevtoolsSource): void => {\n if (listeners.size === 0) {\n source._setSink(null);\n return;\n }\n const sourceId = source.id;\n source._setSink((event) => {\n for (const listener of listeners) {\n listener.onEvent?.(sourceId, event);\n }\n });\n };\n return {\n version: DEVTOOLS_PROTOCOL_VERSION,\n sources,\n register(source: IDevtoolsSource): void {\n if (sources.has(source.id)) {\n return;\n }\n sources.set(source.id, source);\n applySink(source);\n for (const listener of listeners) {\n listener.onSourceRegistered?.(source);\n }\n },\n unregister(sourceId: string): void {\n const source = sources.get(sourceId);\n if (source === undefined) {\n return;\n }\n source._setSink(null);\n sources.delete(sourceId);\n for (const listener of listeners) {\n listener.onSourceUnregistered?.(sourceId);\n }\n },\n addListener(listener: IDevtoolsListener): () => void {\n listeners.add(listener);\n // 既登録 source をリプレイ(遅延アタッチの起点、protocol §6)\n for (const source of sources.values()) {\n applySink(source);\n listener.onSourceRegistered?.(source);\n }\n return () => {\n if (!listeners.delete(listener)) {\n return;\n }\n for (const source of sources.values()) {\n applySink(source);\n }\n };\n },\n };\n}\n\nexport function getOrCreateHookRegistry(): IDevtoolsHookRegistry {\n const globals = globalThis as unknown as Record<string, unknown>;\n const existing = globals[DEVTOOLS_HOOK_GLOBAL] as IDevtoolsHookRegistry | undefined;\n if (existing !== undefined) {\n if (existing.version !== DEVTOOLS_PROTOCOL_VERSION) {\n // 先勝ち固定。振る舞いは差し替えない(protocol §2)\n console.warn(\n `[wcstack/state] devtools hook registry version mismatch: found ${existing.version}, expected ${DEVTOOLS_PROTOCOL_VERSION}. Keeping the existing registry (first-wins).`\n );\n }\n return existing;\n }\n const registry = createMinimalRegistry();\n globals[DEVTOOLS_HOOK_GLOBAL] = registry;\n return registry;\n}\n\n/**\n * drain 終了バッチの転送リスナー。sink 接続中のみ updater に登録される。\n */\nconst onUpdateBatch: UpdateBatchListener = (batch) => {\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:update-batch\", addresses: batch });\n }\n};\n\n/**\n * registry からの sink 差し替え。updater の drain リスナー登録/解除を連動させる。\n * detach 時に登録が残らないこと(protocol §7-2)。\n */\nfunction setSink(sink: DevtoolsSink | null): void {\n const wasActive = devtoolsSink !== null;\n setDevtoolsSink(sink);\n const isActive = sink !== null;\n if (isActive && !wasActive) {\n registerUpdateBatchListener(onUpdateBatch);\n } else if (!isActive && wasActive) {\n unregisterUpdateBatchListener(onUpdateBatch);\n }\n}\n\nfunction createStateElementSummary(element: IStateElement): IStateElementSummary {\n return {\n name: element.name,\n rootNode: element.rootNode,\n element,\n paths: {\n list: element.listPaths,\n element: element.elementPaths,\n getter: element.getterPaths,\n setter: element.setterPaths,\n },\n commandTokenNames: element.commandTokenNames,\n eventTokenNames: element.eventTokenNames,\n staticDependency: element.staticDependency,\n dynamicDependency: element.dynamicDependency,\n };\n}\n\nfunction requireStateElement(name: string, rootNode: Node): IStateElement {\n return getStateElementByName(rootNode, name) ??\n raiseError(`devtools: state element not found: name=\"${name}\"`);\n}\n\nfunction createSourceId(): string {\n // getUUID() はモジュールローカル連番のため、state コピーが複数ある\n // ページで source id が衝突する。ランダム採番で回避する。\n return \"state:\" + Math.random().toString(36).slice(2, 10);\n}\n\nlet registeredSource: IDevtoolsSource | null = null;\n\n/**\n * この state ランタイムを 1 source として registry に登録する。\n * bootstrapState() から呼ばれる。冪等・SSR では何もしない(protocol 原則 6)。\n */\nexport function registerDevtoolsSource(): void {\n if (inSsr()) {\n return;\n }\n if (registeredSource !== null) {\n return;\n }\n const source: IDevtoolsSource = {\n id: createSourceId(),\n kind: \"state\",\n packageVersion: VERSION,\n getStateElements(): IStateElementSummary[] {\n const summaries: IStateElementSummary[] = [];\n for (const element of getLiveStateElements()) {\n summaries.push(createStateElementSummary(element));\n }\n return summaries;\n },\n keys(name: string, rootNode: Node): string[] {\n const element = requireStateElement(name, rootNode);\n const result: string[] = [];\n element.createState(\"readonly\", (state) => {\n // Object.keys は Proxy の ownKeys 経由で target の own key を返す。\n // メソッド判別の typeof アクセスは getter を 1 回実行する副作用があるため、\n // ループ文脈依存で throw する getter は catch して「キーとしては存在する」\n // 側に倒す(値の表示可否は UI 側の責務)。\n for (const key of Object.keys(state)) {\n if (key.includes(\"*\") || key.startsWith(\"$\")) {\n continue;\n }\n try {\n if (typeof (state as unknown as Record<string, unknown>)[key] === \"function\") {\n continue;\n }\n } catch {\n // 読めない getter もキーとしては列挙する\n }\n result.push(key);\n }\n });\n return result;\n },\n read(name: string, rootNode: Node, path: string, indexes?: number[]): unknown {\n const element = requireStateElement(name, rootNode);\n let result: unknown;\n element.createState(\"readonly\", (state) => {\n result = (state as unknown as Record<string, (p: string, i: number[]) => unknown>)[\"$resolve\"](path, indexes ?? []);\n });\n return result;\n },\n write(name: string, rootNode: Node, path: string, value: unknown, indexes?: number[]): void {\n const element = requireStateElement(name, rootNode);\n element.createState(\"writable\", (state) => {\n if (indexes !== undefined && indexes.length > 0) {\n // Note: $resolve は value===undefined を「取得」と解釈するため、\n // ワイルドカードパスへの undefined 書き込みは非サポート\n // (spread undefined 規範と同じ側に倒す)\n (state as unknown as Record<string, (p: string, i: number[], v: unknown) => void>)[\"$resolve\"](path, indexes, value);\n } else {\n (state as unknown as Record<string, unknown>)[path] = value;\n }\n });\n },\n _setSink: setSink,\n };\n registeredSource = source;\n getOrCreateHookRegistry().register(source);\n}\n\n/**\n * テスト専用: sink を解除し source 登録状態をリセットする。\n * グローバル registry 自体の掃除(delete globalThis[DEVTOOLS_HOOK_GLOBAL])は\n * テスト側の責務。アプリケーションからの利用は想定しない。\n */\nexport function __resetDevtoolsBridgeForTest(): void {\n setSink(null);\n registeredSource = null;\n}\n\n/** テスト専用: 現在登録済みの source を返す */\nexport function __getRegisteredSourceForTest(): IDevtoolsSource | null {\n return registeredSource;\n}\n","import { IState } from \"../types\";\n\ntype ScriptModule = { default?: unknown };\n\nexport async function loadFromInnerScript(script: HTMLScriptElement, name: string): Promise<IState> {\n let scriptModule: ScriptModule | null = null;\n const uniq_comment = `\\n//# sourceURL=${name}\\n`;\n if (typeof URL.createObjectURL === 'function') {\n // Create a blob URL for the script and dynamically import it\n const blob = new Blob([script.text + uniq_comment], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n try {\n scriptModule = await import(url) as ScriptModule;\n } finally {\n // Clean up blob URL to prevent memory leak\n URL.revokeObjectURL(url);\n }\n } else {\n // Fallback: Base64 encoding method (for test environment)\n // Convert script to Base64 and import via data: URL\n const b64 = btoa(String.fromCodePoint(...new TextEncoder().encode(script.text + uniq_comment)));\n scriptModule = await import(`data:application/javascript;base64,${b64}`) as ScriptModule;\n }\n return (scriptModule && typeof scriptModule.default === 'object') ? scriptModule.default as IState : {};\n}\n","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport async function loadFromScriptFile(url: string): Promise<IState> {\n try {\n const module = await import(/* @vite-ignore */ url);\n return module.default || {};\n } catch (e) {\n raiseError(`Failed to load script file: ${e}`);\n }\n}\n","import { IStateAddress } from \"../address/types\";\nimport { MAX_LOOP_DEPTH } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { ILoopContext, ILoopContextStack } from \"./types\";\n\ntype LoopContextCallback<T> = (loopContext: ILoopContext) => T | Promise<T>;\n\nclass LoopContextStack {\n private _loopContextStack: (ILoopContext | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\n private _length: number = 0;\n\n createLoopContext(\n elementStateAddress: IStateAddress,\n callback: LoopContextCallback<void>\n ): void | Promise<void> {\n if (elementStateAddress.listIndex === null) {\n raiseError(`Cannot create loop context for a state address that does not have a list index.`);\n }\n const loopContext = elementStateAddress as ILoopContext;\n if (this._length >= MAX_LOOP_DEPTH) {\n raiseError(`Exceeded maximum loop context stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\n }\n const lastLoopContext = this._loopContextStack[this._length - 1];\n if (typeof lastLoopContext !== \"undefined\" ) {\n if (lastLoopContext.pathInfo.wildcardCount + 1 !== loopContext.pathInfo.wildcardCount) {\n raiseError(`Cannot push loop context for a list whose wildcard count is not exactly one more than the current active loop context.`);\n }\n // \n const prevWildcardPathInfo = loopContext.pathInfo.wildcardPathInfos[loopContext.pathInfo.wildcardPathInfos.length - 2];\n if (lastLoopContext.pathInfo !== prevWildcardPathInfo) {\n raiseError(`Cannot push loop context for a list whose parent wildcard path info does not match the current active loop context.`);\n }\n } else {\n // With no active loop context the address must be self-contained: the\n // listIndex chain supplies one index per wildcard. Top-level lists\n // (wildcardCount 1) always satisfy this. A nested list re-rendered\n // directly (e.g. replaced via $resolve from outside the loop) also\n // satisfies it — the for binding's listIndex carries the full ancestor\n // chain.\n if (loopContext.listIndex.length !== loopContext.pathInfo.wildcardCount) {\n raiseError(`Cannot push loop context when there is no active loop context: the list index chain (length ${loopContext.listIndex.length}) does not cover the wildcard path (wildcard count ${loopContext.pathInfo.wildcardCount}).`);\n }\n }\n this._loopContextStack[this._length] = loopContext;\n this._length++;\n let retValue : void | Promise<void> = void 0;\n try {\n retValue = callback(loopContext);\n } finally {\n if (retValue instanceof Promise) {\n retValue.finally(() => {\n this._length--;\n this._loopContextStack[this._length] = undefined;\n });\n } else {\n this._length--;\n this._loopContextStack[this._length] = undefined;\n }\n }\n return retValue;\n } \n}\n\nexport function createLoopContextStack(): ILoopContextStack {\n return new LoopContextStack();\n}\n\n","import { IStateElement } from \"../components/types\";\nimport { CommandToken } from \"./CommandToken\";\nimport { ICommandToken } from \"./types\";\n\nconst registryByStateElement: WeakMap<IStateElement, Map<string, ICommandToken>> = new WeakMap();\n\nexport function getOrCreateCommandToken(stateElement: IStateElement, name: string): ICommandToken {\n let registry = registryByStateElement.get(stateElement);\n if (typeof registry === \"undefined\") {\n registry = new Map<string, ICommandToken>();\n registryByStateElement.set(stateElement, registry);\n }\n let token = registry.get(name);\n if (typeof token === \"undefined\") {\n token = new CommandToken(name, stateElement.name);\n registry.set(name, token);\n }\n return token;\n}\n\nexport function clearCommandTokenRegistry(stateElement: IStateElement): void {\n registryByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n registryByStateElement,\n};\n","/**\n * `state.$command` でアクセスされる command token の namespace proxy を提供する。\n *\n * - state element 単位で memo 化し、同一 stateElement なら同じ proxy が返る。\n * - 宣言された名前 (`$commandTokens` に列挙されたもの) のみ token を返す。\n * 宣言外の名前にアクセスした場合は undefined を返す。\n * (`constructor` / `Symbol.toPrimitive` / `then` など内部システムが触るキーで\n * 例外を投げないため。typo は subsequent な `.emit()` 呼び出しで TypeError として\n * 間接的に表面化する。)\n * - token そのものの memo は `getOrCreateCommandToken` 側に集約されており、\n * namespace proxy は薄いゲートウェイとして振る舞う。\n */\n\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getOrCreateCommandToken } from \"./commandTokenRegistry\";\nimport { ICommandToken } from \"./types\";\n\nconst namespaceProxyByStateElement: WeakMap<IStateElement, object> = new WeakMap();\n\nexport function getCommandNamespace(stateElement: IStateElement): object {\n const cached = namespaceProxyByStateElement.get(stateElement);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n const proxy = new Proxy(Object.create(null), {\n get(_target: object, prop: PropertyKey): ICommandToken | undefined {\n if (typeof prop !== \"string\") {\n return undefined;\n }\n if (!stateElement.commandTokenNames.has(prop)) {\n return undefined;\n }\n return getOrCreateCommandToken(stateElement, prop);\n },\n has(_target: object, prop: PropertyKey): boolean {\n return typeof prop === \"string\" && stateElement.commandTokenNames.has(prop);\n },\n ownKeys(): string[] {\n return Array.from(stateElement.commandTokenNames);\n },\n getOwnPropertyDescriptor(_target: object, prop: PropertyKey): PropertyDescriptor | undefined {\n if (typeof prop === \"string\" && stateElement.commandTokenNames.has(prop)) {\n return {\n configurable: true,\n enumerable: true,\n value: getOrCreateCommandToken(stateElement, prop),\n };\n }\n return undefined;\n },\n set(): boolean {\n raiseError(`$command namespace is read-only; assigning to it is not allowed.`);\n },\n deleteProperty(): boolean {\n raiseError(`$command namespace is read-only; deleting from it is not allowed.`);\n },\n });\n namespaceProxyByStateElement.set(stateElement, proxy);\n return proxy;\n}\n\nexport function clearCommandNamespace(stateElement: IStateElement): void {\n namespaceProxyByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n namespaceProxyByStateElement,\n};\n","/**\n * stream/lastNotified.ts\n *\n * 「最後に通知した観測値」台帳 — DOM binding / $updatedCallback(観測層)が\n * 最後に見た status・error(docs/state-streams-design.md §4-3)。\n *\n * 通知の same-value 判定を entry フィールドとの比較で行うと、再 set\n * (clearStreamRegistry → 新 entry 生成)を跨いだ陳腐化を検出できない\n * (error 表示中に再 set すると新 entry は error=null で生まれるため\n * null → null と誤判定して $postUpdate が落ち、DOM に旧 error が残る)。\n * そのため通知 dedup は entry の寿命ではなく stateElement の寿命で持つ\n * (ただし再 set で新宣言から消えた名前のエントリは pruneLastNotified で削除する —\n * 同名にしか dedup は要らず、放置すると台帳が単調増加するため)。\n * 未通知(初回)の基準値は宣言直後の観測初期値と同じ { idle, null }。\n *\n * さらに abortAllStreams(§5-1)は registry entry を通知なしで idle / null に\n * 直接ミューテーションするため、観測層が「台帳の値」と「idle / null」の\n * どちらを見たか確定できなくなる(binding / computed の fresh 読みは通知が\n * なくても他パスの drain で走る)。その乖離フィールドは invalidateLastNotified\n * で UNCERTAIN に無効化し、次回 updateStreamStatus の同値判定が必ず\n * 「変化あり」になるようにする(再接続ウィンドウ内の idle 描画が恒久陳腐化\n * しないための不変条件、§4-3)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport type { StreamStatus } from \"./types\";\n\n/**\n * 無通知ミューテーション後の「観測値が確定できない」印。\n * どの実値とも一致しないため、次回の通知 dedup(`!==` / `Object.is`)を強制的に解除する。\n */\nconst UNCERTAIN: unique symbol = Symbol(\"wcs-stream-last-notified-uncertain\");\n\nexport interface ILastNotified {\n status: StreamStatus | typeof UNCERTAIN;\n error: unknown;\n}\n\nconst lastNotifiedByStateElement = new WeakMap<IStateElement, Map<string, ILastNotified>>();\n\n/**\n * 最後に通知した観測値を返す。未通知なら基準値 { idle, null }。\n */\nexport function getLastNotified(stateElement: IStateElement, name: string): ILastNotified {\n return (\n lastNotifiedByStateElement.get(stateElement)?.get(name) ?? { status: \"idle\", error: null }\n );\n}\n\n/**\n * 通知した観測値を記録する(updateStreamStatus が $postUpdate 発行と同時に呼ぶ)。\n */\nexport function setLastNotified(\n stateElement: IStateElement,\n name: string,\n status: StreamStatus,\n error: unknown,\n): void {\n let lastMap = lastNotifiedByStateElement.get(stateElement);\n if (typeof lastMap === \"undefined\") {\n lastMap = new Map();\n lastNotifiedByStateElement.set(stateElement, lastMap);\n }\n lastMap.set(name, { status, error });\n}\n\n/**\n * 再 set(clearStreamRegistry → processStreamsDeclaration)後に呼び、新宣言に\n * 存在しない名前の台帳エントリを削除する。台帳は stateElement の寿命で生存するが\n * (§4-3 の再 set・再接続跨ぎ dedup)、それが必要なのは同名エントリのみで、\n * 旧宣言にしか無い名前は以後どの通知経路(updateStreamStatus)からも参照されない。\n * prune しないと、再 set のたびに異なる stream 名を使うステートで台帳が\n * stateElement の寿命の間単調増加する。\n * 既知の許容: prune 後に同名を再宣言した場合、dedup は基準値 { idle, null } から\n * やり直しになる(宣言削除時の binding 陳腐化が §4-4 の既知エッジである以上、\n * 再宣言は新規宣言と同じ扱いでよい)。\n */\nexport function pruneLastNotified(stateElement: IStateElement, liveNames: ReadonlySet<string>): void {\n const lastMap = lastNotifiedByStateElement.get(stateElement);\n if (typeof lastMap === \"undefined\") {\n return;\n }\n for (const name of lastMap.keys()) {\n if (!liveNames.has(name)) {\n lastMap.delete(name);\n }\n }\n}\n\n/**\n * 無通知ミューテーション(abortAllStreams の idle / null 直接書き換え)の直後に呼び、\n * 台帳のうちミューテーション後の値と一致しないフィールドを UNCERTAIN に無効化する。\n * 一致しているフィールド(観測層がどちらを見ても同じ値)は dedup を維持する\n * (例: error が null のままなら再接続時に $streamError.<name> の余計な通知は出ない)。\n */\nexport function invalidateLastNotified(stateElement: IStateElement, name: string): void {\n const lastMap = lastNotifiedByStateElement.get(stateElement);\n if (typeof lastMap === \"undefined\") {\n return;\n }\n const last = lastMap.get(name);\n if (typeof last === \"undefined\") {\n // 未通知: 基準値 { idle, null } はミューテーション後の値と一致するため乖離しない\n return;\n }\n lastMap.set(name, {\n status: last.status === \"idle\" ? last.status : UNCERTAIN,\n error: Object.is(last.error, null) ? null : UNCERTAIN,\n });\n}\n\nexport const __private__ = {\n lastNotifiedByStateElement,\n UNCERTAIN,\n};\n","/**\n * stream/activeStateElements.ts\n *\n * 起動中(startStreams 済み・未切断)の stateElement の列挙用 Set\n * (docs/state-streams-design.md §3-2)。\n *\n * streamRegistry の WeakMap は列挙不能のため、updater の drain リスナーが\n * 「どの stateElement の entry と batch を交差させるか」を知るには\n * 列挙可能な strong Set が別途必要になる。lastNotified.ts と同じ\n * 「import 循環回避の小モジュール」パターン\n * (streamRegistry → activeStateElements ← streamRuntime の一方向依存に保つ)。\n *\n * リーク防止の不変条件(strong Set が切断済み要素の GC を妨げないための連動):\n * - add は startStreams(streamRuntime.ts)だけが行う\n * (eager 起動=connect 時、および接続中の `_state` 再 set 時の再起動)。\n * - delete は abortAllStreams / clearStreamRegistry(streamRegistry.ts)が行う。\n * disconnect(disconnectedCallback → abortAllStreams)と `_state` 再 set\n * (clearStreamRegistry → processStreamsDeclaration → 接続中なら startStreams で\n * 再 add)の両経路が必ずここを通るため、「Set に居る = 接続中かつ起動済み」が\n * 常に保たれ、切断済み stateElement への強参照は残らない。\n * 設計書 §3-2 の「未接続(disconnect 済み)の stateElement の entry は restart\n * しない」はこの不変条件で担保される。\n */\n\nimport type { IStateElement } from \"../components/types\";\n\nconst activeStateElements = new Set<IStateElement>();\n\n/**\n * 起動中 stateElement として登録する(startStreams 専用。不変条件はモジュールヘッダ参照)。\n */\nexport function addActiveStateElement(stateElement: IStateElement): void {\n activeStateElements.add(stateElement);\n}\n\n/**\n * 起動中 stateElement から外す(abortAllStreams / clearStreamRegistry 専用)。\n */\nexport function deleteActiveStateElement(stateElement: IStateElement): void {\n activeStateElements.delete(stateElement);\n}\n\n/**\n * 起動中 stateElement を列挙する(drain リスナーの交差判定用)。\n */\nexport function getActiveStateElements(): ReadonlySet<IStateElement> {\n return activeStateElements;\n}\n\nexport const __private__ = {\n activeStateElements,\n};\n","/**\n * stream/streamRegistry.ts\n *\n * `$streams` の registry(docs/state-streams-design.md §2-1 / §5)。\n * eventTokenRegistry と対称の WeakMap registry。\n *\n * - status / error の正本は registry entry(state オブジェクト上に実プロパティは持たない)。\n * - disconnect 時は abortAllStreams(abort のみ・registry 保持)、\n * `_state` 再 set 時のみ clearStreamRegistry(abort + 全削除)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport { deleteActiveStateElement } from \"./activeStateElements\";\nimport { invalidateLastNotified } from \"./lastNotified\";\nimport type { IStreamEntry } from \"./types\";\n\nconst registryByStateElement: WeakMap<IStateElement, Map<string, IStreamEntry>> = new WeakMap();\n\n/**\n * stream entry 群を置換登録する(`_state` セッターからの再構築で丸ごと差し替える)。\n */\nexport function setStreamEntries(stateElement: IStateElement, entries: Map<string, IStreamEntry>): void {\n registryByStateElement.set(stateElement, entries);\n}\n\n/**\n * 登録済みの stream entry 群を返す。未登録なら空 Map を返す(registry への登録はしない)。\n */\nexport function getStreamEntries(stateElement: IStateElement): Map<string, IStreamEntry> {\n return registryByStateElement.get(stateElement) ?? new Map<string, IStreamEntry>();\n}\n\n/**\n * 全 stream を abort して idle に戻す(設計書 §5-1)。registry は保持する。\n *\n * disconnectedCallback(切断時)に呼ばれるため、status / error の反映は\n * proxy / $postUpdate を使わず entry への直接ミューテーションで行う\n * (切断済みで binding 更新は不要かつ rootNode が無い)。\n *\n * 無通知ミューテーションは「最後に通知した観測値」台帳(stream/lastNotified.ts)\n * と registry を乖離させるため、同時に台帳側を invalidate する。これを怠ると\n * 再接続ウィンドウ内の fresh 読み(他パスの drain での getter 再計算など)が\n * 描画した idle に対し、restart の updateStreamStatus(\"active\") が切断前の\n * 通知値と同値判定されて skip され、DOM が恒久的に陳腐化する(設計書 §4-3)。\n */\nexport function abortAllStreams(stateElement: IStateElement): void {\n // 依存駆動 restart の対象から外す(切断済み stateElement は restart しない、\n // 設計書 §3-2。add 側は startStreams — stream/activeStateElements.ts の\n // リーク防止不変条件を参照)。registry の有無に関わらず必ず外す。\n deleteActiveStateElement(stateElement);\n const entries = registryByStateElement.get(stateElement);\n if (typeof entries === \"undefined\") {\n return;\n }\n for (const entry of entries.values()) {\n entry.controller?.abort();\n entry.controller = null;\n entry.status = \"idle\";\n entry.error = null;\n invalidateLastNotified(stateElement, entry.name);\n }\n}\n\n/**\n * 全 stream を abort したうえで registry から削除する(`_state` 再 set 時の再配線用、設計書 §5-2)。\n */\nexport function clearStreamRegistry(stateElement: IStateElement): void {\n abortAllStreams(stateElement);\n // abortAllStreams が既に delete 済みだが、「clear = 全削除でも必ず restart 対象から\n // 外れる」不変条件を将来の abortAllStreams の変更から独立に保証するため明示的に呼ぶ。\n deleteActiveStateElement(stateElement);\n registryByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n registryByStateElement,\n};\n","/**\n * stream/processStreamsDeclaration.ts\n *\n * `$streams: { <name>: { args?, source, fold?, initial? } }` 宣言マップを解析し、\n * IStreamEntry を構築して streamRegistry に一括登録する\n * (docs/state-streams-design.md §1-1 / §1-2 / §1-3)。\n *\n * - バリデーション(§1-2): 違反は raiseError。\n * - 名前はフラットなプロパティ名のみ(空文字 / `.`(DELIMITER)/ `*`(WILDCARD)/ 先頭 `$` を禁止)。\n * - Object.prototype の継承名(`__proto__` / `constructor` / `toString` 等)を禁止\n * (own key でなくても `in` 判定が真になり、実体化 skip + 起動時 Reflect.set の\n * 継承 setter 化 — `__proto__` は prototype 差し替え — を引き起こすため)。\n * - getter / setter として宣言済みのパスとの衝突を禁止(getterPaths / setterPaths を検査)。\n * - `source` は関数必須。`fold` は(あれば)関数。`fold` があるのに `initial` が無ければエラー\n * (reduce は initial 必須。`initial` の有無は in 演算子で判定)。`args` は(あれば)関数。\n * - fold 省略時は latest(`(_acc, chunk) => chunk`)を注入する(§0 決定レコード)。\n * - 値プロパティ実体化(§1-3): `state[name]` が未定義なら `initial`\n * (fold 無しなら undefined)でデータプロパティとして初期化する。\n * ユーザーが同名プロパティを先に宣言していた場合は上書きしない\n * (起動時の initial リセットは streamRuntime 側の責務)。\n * - 通知 dedup 台帳の prune(§4-3): 新宣言に存在しない名前の lastNotified エントリを\n * 削除する(台帳は stateElement 寿命 — 再 set 跨ぎ dedup が必要なのは同名のみ)。\n *\n * 呼び出しは stateElement.getterPaths / setterPaths の確定後であること\n * (State の `_state` セッターが getStateInfo の反映より後に呼ぶことで保証する)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport { DELIMITER, STATE_STREAMS_NAME, WILDCARD } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport type { IState } from \"../types\";\nimport { pruneLastNotified } from \"./lastNotified\";\nimport { setStreamEntries } from \"./streamRegistry\";\nimport type { IStreamDefinition, IStreamEntry, StreamFold, StreamSource } from \"./types\";\n\n/** fold 省略時に注入される既定 fold(latest = 最新チャンクで置換) */\nconst latestFold: StreamFold = (_acc, chunk) => chunk;\n\n/** `$streams` 無し宣言の prune 用(旧宣言の全名前が残骸になる) */\nconst NO_STREAM_NAMES: ReadonlySet<string> = new Set<string>();\n\nexport function processStreamsDeclaration(stateElement: IStateElement, state: IState): void {\n const declared = (state as Record<string, unknown>)[STATE_STREAMS_NAME];\n if (typeof declared === \"undefined\") {\n // $streams 無しの再 set でも旧宣言の名前は通知 dedup 台帳の残骸になるため prune する\n pruneLastNotified(stateElement, NO_STREAM_NAMES);\n return;\n }\n if (typeof declared !== \"object\" || declared === null) {\n raiseError(`${STATE_STREAMS_NAME} must be an object mapping stream names to stream definitions.`);\n }\n const entries = new Map<string, IStreamEntry>();\n for (const [name, def] of Object.entries(declared as Record<string, unknown>)) {\n if (name.length === 0) {\n raiseError(`${STATE_STREAMS_NAME} entry name must be a non-empty string.`);\n }\n if (name.includes(DELIMITER)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must be a flat property name (\"${DELIMITER}\" is not allowed).`);\n }\n if (name.includes(WILDCARD)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must be a flat property name (\"${WILDCARD}\" is not allowed).`);\n }\n if (name.startsWith(\"$\")) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must not start with \"$\" (reserved namespace).`);\n }\n // Object.prototype の継承名(__proto__ / constructor / toString 等)は一律拒否する。\n // own key でないのに `name in state` が真になるため実体化(§1-3)が skip され、\n // 起動時の initial リセット(Reflect.set)が継承 setter に化ける\n // (特に __proto__ は state の prototype を差し替える)ため、名前検査の防衛線で落とす(§1-2)。\n if (name in Object.prototype) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must not be a property name inherited from Object.prototype (e.g. \"__proto__\", \"constructor\").`);\n }\n if (stateElement.getterPaths.has(name)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" conflicts with a getter declared on the state.`);\n }\n if (stateElement.setterPaths.has(name)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" conflicts with a setter declared on the state.`);\n }\n if (typeof def !== \"object\" || def === null) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must be an object ({ args?, source, fold?, initial? }).`);\n }\n const definition = def as Record<string, unknown>;\n if (typeof definition.source !== \"function\") {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" source must be a function.`);\n }\n const hasFold = typeof definition.fold !== \"undefined\";\n if (hasFold && typeof definition.fold !== \"function\") {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" fold must be a function.`);\n }\n if (hasFold && !(\"initial\" in definition)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" requires \"initial\" when fold is specified (reduce needs a seed value).`);\n }\n const hasArgs = typeof definition.args !== \"undefined\";\n if (hasArgs && typeof definition.args !== \"function\") {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" args must be a function.`);\n }\n const entry: IStreamEntry = {\n name,\n definition: {\n args: (definition.args as IStreamDefinition[\"args\"] | undefined) ?? null,\n source: definition.source as StreamSource,\n fold: (definition.fold as StreamFold | undefined) ?? latestFold,\n initial: definition.initial,\n },\n status: \"idle\",\n error: null,\n controller: null,\n depAddresses: new Set(),\n };\n // 値プロパティ実体化(§1-3): ユーザーが同名プロパティを先に宣言していたら上書きしない\n if (!(name in state)) {\n state[name] = entry.definition.initial;\n }\n entries.set(name, entry);\n }\n setStreamEntries(stateElement, entries);\n // 新宣言に存在しない名前の通知 dedup 台帳エントリを prune する\n // (同名は保持 = §4-3 の再 set 跨ぎ dedup 契約を維持。stream/lastNotified.ts 参照)\n pruneLastNotified(stateElement, new Set(entries.keys()));\n}\n","/**\n * stream/streamNamespace.ts\n *\n * `$streamStatus` / `$streamError` の read-only namespace proxy\n * (docs/state-streams-design.md §4-1 / §4-2)。commandNamespace と対称。\n *\n * - state element 単位で memo 化し、同一 stateElement なら同じ proxy が返る。\n * - 宣言された stream 名(`$streams` に列挙されたもの)のみ registry entry の\n * status / error を返す。宣言外の名前・Symbol キーは undefined\n * (`then` / `constructor` 等を内部機構が触っても throw しない寛容規約、\n * $command と同じ)。\n * - 値は memo しない: proxy は getStreamEntries を毎回読む thin gateway\n * (status / error は runtime が随時書き換えるため。registry entry が正本、§2-1)。\n * - set / deleteProperty は raiseError。setByAddress の親走査が namespace proxy に\n * 到達したときの Reflect.set もここで落ちる(書き込み防御 S11 の終端)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport {\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n} from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { getStreamEntries } from \"./streamRegistry\";\nimport type { IStreamEntry } from \"./types\";\n\nconst statusNamespaceByStateElement: WeakMap<IStateElement, object> = new WeakMap();\nconst errorNamespaceByStateElement: WeakMap<IStateElement, object> = new WeakMap();\n\nfunction createStreamNamespaceProxy(\n stateElement: IStateElement,\n namespaceName: string,\n pick: (entry: IStreamEntry) => unknown,\n): object {\n return new Proxy(Object.create(null), {\n get(_target: object, prop: PropertyKey): unknown {\n if (typeof prop !== \"string\") {\n return undefined;\n }\n const entry = getStreamEntries(stateElement).get(prop);\n if (typeof entry === \"undefined\") {\n return undefined;\n }\n return pick(entry);\n },\n has(_target: object, prop: PropertyKey): boolean {\n return typeof prop === \"string\" && getStreamEntries(stateElement).has(prop);\n },\n ownKeys(): string[] {\n return Array.from(getStreamEntries(stateElement).keys());\n },\n getOwnPropertyDescriptor(_target: object, prop: PropertyKey): PropertyDescriptor | undefined {\n if (typeof prop !== \"string\") {\n return undefined;\n }\n const entry = getStreamEntries(stateElement).get(prop);\n if (typeof entry === \"undefined\") {\n return undefined;\n }\n return {\n configurable: true,\n enumerable: true,\n value: pick(entry),\n };\n },\n set(): boolean {\n raiseError(`${namespaceName} namespace is read-only; assigning to it is not allowed.`);\n },\n deleteProperty(): boolean {\n raiseError(`${namespaceName} namespace is read-only; deleting from it is not allowed.`);\n },\n });\n}\n\nexport function getStreamStatusNamespace(stateElement: IStateElement): object {\n const cached = statusNamespaceByStateElement.get(stateElement);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n const proxy = createStreamNamespaceProxy(\n stateElement,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n (entry) => entry.status,\n );\n statusNamespaceByStateElement.set(stateElement, proxy);\n return proxy;\n}\n\nexport function getStreamErrorNamespace(stateElement: IStateElement): object {\n const cached = errorNamespaceByStateElement.get(stateElement);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n const proxy = createStreamNamespaceProxy(\n stateElement,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n (entry) => entry.error,\n );\n errorNamespaceByStateElement.set(stateElement, proxy);\n return proxy;\n}\n\n/**\n * 両 namespace proxy の memo を破棄する(clearCommandNamespace と対称)。\n * disconnectedCallback と `_state` 再 set 時に呼ばれる。\n */\nexport function clearStreamNamespace(stateElement: IStateElement): void {\n statusNamespaceByStateElement.delete(stateElement);\n errorNamespaceByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n statusNamespaceByStateElement,\n errorNamespaceByStateElement,\n};\n","/**\n * stream/argsTrace.ts\n *\n * `$streams` の args トレース(依存捕捉、docs/state-streams-design.md §3-1)。\n *\n * - モジュールスコープの collector を立てて readonly proxy 上で args を評価し、\n * getByAddress を通った読みを絶対アドレス(IAbsoluteStateAddress)として捕捉する。\n * AbsolutePathInfo / AbsoluteStateAddress は両方キャッシュ済みのため、捕捉した\n * アドレスは drain バッチと Set.has のインスタンス同一性で O(1) 照合できる(§2-1)。\n * - collectStreamDependency は getByAddress のホットパスから毎読み呼ばれるため、\n * collector === null なら即 return し、それ以外の計算を一切しない。\n * - 起動・restart のたびに traceArgs が呼ばれ、成功時は entry.depAddresses を\n * 丸ごと置換する(per-run の動的再捕捉)。失敗時は前回成功 run の検証済み\n * 捕捉を保持する(§2-2 の「error からも依存変化で restart」を保つ)。\n * - lastNotified.ts と同じく import 循環回避のための小モジュール\n * (getByAddress → argsTrace ← streamRuntime の一方向依存に保つ)。\n */\n\nimport { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport type { IAbsoluteStateAddress, IStateAddress } from \"../address/types\";\nimport type { IStateElement } from \"../components/types\";\nimport {\n DELIMITER,\n STATE_STREAMS_NAME,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n} from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport type { IStreamEntry } from \"./types\";\n\n/** トレース中のみ非 null。getByAddress を通った読みの絶対アドレスが溜まる。 */\nlet collector: Set<IAbsoluteStateAddress> | null = null;\n\n/**\n * getByAddress の入口(checkDependency 直後)から毎読み呼ばれるフック。\n * トレース外(collector === null)では何もしない。\n */\nexport function collectStreamDependency(stateElement: IStateElement, address: IStateAddress): void {\n if (collector === null) {\n return;\n }\n const absolutePathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n collector.add(createAbsoluteStateAddress(absolutePathInfo, address.listIndex));\n}\n\n/**\n * args を readonly proxy で同期評価し、読まれたパスを entry.depAddresses に\n * 丸ごと置換で再捕捉する(§3-1)。評価値(source の第 1 引数になる)を返す。\n *\n * - args === null(宣言で省略)なら depAddresses を clear して undefined\n * (依存なし = 起動後 restart しない)。\n * - 検査(違反は raiseError):\n * (a) 評価値が Promise(同期契約違反)\n * (b) 自己依存 — `<name>` / `$streamStatus.<name>` / `$streamError.<name>` の読み\n * (restart の自己書き込みで再発火する無限ループ、S8)\n * (c) wildcard を含むパスの読み(`$getAll` 等も同様。第 1 段スコープ外)\n * - 失敗時(args のユーザー例外・検査違反)は今回の捕捉(captured)を採用せず\n * 伝播し、entry.depAddresses には**前回成功 run の検証済み捕捉を保持する**。\n * これにより drain リスナーが throw を error 経路に正規化したあとも、依存の\n * 書き込みで再試行できる(§2-2「done / error からも依存変化で restart」——\n * 一時的な args throw で stream が恒久固着しない)。ループ安全性:\n * 保持されるのは前回**成功** run の捕捉のみ(自己依存・wildcard 検査済み)で\n * 自分の `<name>` / `$streamStatus.<name>` / `$streamError.<name>` を含み得ず、\n * traceArgs throw 時の startStream は initial リセットに到達しないため、\n * error 正規化の書き込みが保持 deps に再 hit することはない。再試行は依存\n * 書き込み 1 回につき高々 1 回で有界。未検査の captured を採用しないことが\n * ループ防止の要件であり、前回検証済み捕捉の保持はそれを侵さない。\n * - collector は finally で必ず復元する(例外・再入安全。ネスト評価は想定しないが\n * 防御的に「前の collector を復元」の形にしておく — コストは同等)。\n */\nexport function traceArgs(stateElement: IStateElement, entry: IStreamEntry): unknown {\n const argsFn = entry.definition.args;\n if (argsFn === null) {\n entry.depAddresses.clear();\n return undefined;\n }\n const previousCollector = collector;\n const captured = new Set<IAbsoluteStateAddress>();\n collector = captured;\n let argsValue: unknown = undefined;\n try {\n stateElement.createState(\"readonly\", (state) => {\n argsValue = argsFn(state);\n });\n } finally {\n // args のユーザー例外時は captured を採用せずそのまま伝播する\n // (entry.depAddresses は前回成功 run の検証済み捕捉を保持)\n collector = previousCollector;\n }\n if (argsValue instanceof Promise) {\n raiseError(\n `${STATE_STREAMS_NAME} entry \"${entry.name}\" args must be synchronous (it returned a Promise).`,\n );\n }\n const selfStatusPath = `${STATE_STREAM_STATUS_NAMESPACE_NAME}${DELIMITER}${entry.name}`;\n const selfErrorPath = `${STATE_STREAM_ERROR_NAMESPACE_NAME}${DELIMITER}${entry.name}`;\n for (const dep of captured) {\n const pathInfo = dep.absolutePathInfo.pathInfo;\n if (\n dep.absolutePathInfo.stateElement === stateElement &&\n (pathInfo.path === entry.name || pathInfo.path === selfStatusPath || pathInfo.path === selfErrorPath)\n ) {\n raiseError(\n `${STATE_STREAMS_NAME} entry \"${entry.name}\" args must not read the stream itself (\"${pathInfo.path}\"): a self-dependency would restart the stream on its own writes (infinite loop).`,\n );\n }\n if (pathInfo.wildcardCount > 0) {\n raiseError(\n `${STATE_STREAMS_NAME} entry \"${entry.name}\" args must not read wildcard paths (\"${pathInfo.path}\"): wildcard dependencies are out of scope.`,\n );\n }\n }\n entry.depAddresses = captured;\n return argsValue;\n}\n","/**\n * stream/consumeSource.ts\n *\n * `$streams` のチャンク消費ループ(docs/state-streams-design.md §3-3)。\n * packages/signals/src/streamResource.ts の consume / iterate /\n * readableToAsyncIterable の移植(パッケージ間依存は持たない自己完結原則)。\n *\n * 唯一の構造差分は状態書き込みの IConsumeSink への委譲:\n * value.set(fold(value.peek(), chunk)) → sink.fold(chunk)\n * status.set(\"done\") → sink.done()\n * error.set(e) + status.set(\"error\") → sink.fail(e)\n *\n * sink.fold() が throw した場合(fold throw)もループ内の throw として\n * 既存の catch に流れ、signal.aborted なら return、でなければ sink.fail(e)。\n * consumeSource 自体は fold throw と source throw を区別しない\n * (producer の掃除 = controller.abort() は呼び出し側 runtime が fail 内で行う)。\n * consumeSource は reject しない(全経路 catch 済み)。\n *\n * ---------------------------------------------------------------------------\n * 以下、移植元モジュールヘッダの契約(原文英語のまま維持):\n *\n * CONTRACT (cooperative cancellation — STRONG REQUIREMENT): the `source` MUST honor\n * the `AbortSignal` it is given. Honoring it is what drives switchMap restart/dispose;\n * a source that ignores it cannot be reliably cancelled.\n *\n * Rescue levels on abort:\n * - ReadableStream: FULLY rescued. A parked read() is force-unwound via\n * reader.cancel(), which both releases the underlying source and settles the\n * pending read() so the loop unwinds. Anything getReader-bearing is routed\n * through this path even when it is ALSO natively async-iterable (Node 18+ /\n * Chrome 124+ / Firefox): the spec serializes asyncIterator.return() behind\n * the pending next() ([[ongoingPromise]]), so the AsyncIterable rescue below\n * cannot force-unwind a parked read on a native ReadableStream.\n * - AsyncIterable / async generator: PARTIALLY rescued. On abort we call\n * iterator.return() to trigger the generator's finally/cleanup. But a parked\n * `await` (the producer stalling before its next yield while IGNORING `signal`)\n * cannot be force-unwound from outside — return() only takes effect when the\n * generator next resumes. So a source that parks forever and never observes\n * `signal` still leaks its consume task. Honor `signal` to bound this.\n * The `if (signal.aborted) return` check only runs after a chunk arrives, not while\n * parked — it drops stale chunks but is not, by itself, a cancellation mechanism.\n */\n\nimport type { IConsumeSink, StreamProducer, StreamSource } from \"./types\";\n\nexport async function consumeSource(\n source: StreamSource,\n args: unknown,\n signal: AbortSignal,\n sink: IConsumeSink,\n): Promise<void> {\n // Obtain the iterator EXPLICITLY (not via `for await`'s implicit one) so abort can\n // call `iterator.return()` to trigger an AsyncIterable / async generator's\n // `finally`/cleanup. A `for await` only calls `.return()` when the loop itself exits;\n // if the producer is PARKED (awaiting before the next yield while ignoring `signal`),\n // the loop never advances, so the implicit `.return()` never runs and the task leaks\n // past restart/dispose. Calling `.return()` on abort is the PARTIAL rescue: the\n // parked `await` cannot be force-unwound from outside, but once the generator resumes\n // (its next tick), `.return()` makes it run its `finally` and stop — recovering the\n // common \"generator wakes up after abort\" case. The ReadableStream path is fully\n // rescued via `reader.cancel()` (see `readableToAsyncIterable`).\n let iterator: AsyncIterator<unknown> | null = null;\n // Guard against returning the SAME iterator twice. `onAbort` is reachable two ways:\n // the abort listener, and the explicit call below when abort raced the\n // `await source(...)`. The guard keys on the iterator instance (not a plain \"ran\"\n // flag): the listener firing with iterator still null must NOT consume the single\n // real cleanup that the explicit call performs once the iterator exists. So we only\n // mark an iterator returned once we have actually called `.return()` on it.\n let returned: AsyncIterator<unknown> | null = null;\n const onAbort = (): void => {\n if (!iterator || iterator === returned) {\n return; // nothing to release yet, or already released this iterator\n }\n returned = iterator;\n // Fire the iterator's cleanup. Swallow any throw/rejection from `.return()` — we\n // are tearing down; a producer that rejects on return must not surface here.\n try {\n void iterator.return?.()?.then?.(undefined, () => {});\n } catch {\n // `.return()` threw synchronously while tearing down — ignore.\n }\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const produced = await source(args, signal);\n iterator = iterate(produced, signal)[Symbol.asyncIterator]();\n if (signal.aborted) {\n // Aborted while awaiting the source: the abort listener already ran (iterator\n // was still null then), so explicitly release the just-produced iterator now —\n // this fires a generator's finally / a ReadableStream's cancel for the\n // resource we created but will never iterate.\n onAbort();\n return;\n }\n for (;;) {\n const result = await iterator.next();\n if (result.done) {\n break;\n }\n if (signal.aborted) {\n return; // stale chunk from a superseded/disposed run — drop it\n }\n sink.fold(result.value);\n }\n if (signal.aborted) {\n return; // stream ended but this run was aborted — don't mark done\n }\n sink.done();\n } catch (e) {\n if (signal.aborted) {\n return; // an abort that surfaced as a throw is not an error\n }\n sink.fail(e); // keep the last folded value (do not reset)\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\nfunction iterate(produced: StreamProducer, signal: AbortSignal): AsyncIterable<unknown> {\n // Anything ReadableStream-shaped (has getReader) takes the reader path FIRST —\n // even when it is also async-iterable. On runtimes where ReadableStream\n // implements native async iteration (Node 18+ / Chrome 124+ / Firefox), the\n // spec serializes `iterator.return()` behind the pending `next()`\n // ([[ongoingPromise]]), so the AsyncIterable rescue cannot force-unwind a\n // parked read: abort would hang the consume task until the producer's next\n // chunk (or forever on a silent stream), leaking the underlying source.\n // `reader.cancel()` has no such ordering — routing every getReader-bearing\n // source through it keeps the FULL rescue promised for ReadableStream.\n // Optional chaining: a null/undefined source return value must fall through to\n // the explicit TypeError below, not throw an opaque property access error.\n if (typeof (produced as ReadableStream<unknown>)?.getReader === \"function\") {\n return readableToAsyncIterable(produced as ReadableStream<unknown>, signal);\n }\n if (typeof (produced as AsyncIterable<unknown>)?.[Symbol.asyncIterator] === \"function\") {\n return produced as AsyncIterable<unknown>;\n }\n throw new TypeError(\n \"[@wcstack/state] $streams: source must return an AsyncIterable or a ReadableStream (got neither).\",\n );\n}\n\nasync function* readableToAsyncIterable(\n stream: ReadableStream<unknown>,\n signal: AbortSignal,\n): AsyncGenerator<unknown> {\n const reader = stream.getReader();\n // A ReadableStream read() does NOT observe an AbortSignal on its own. Without\n // this, a switchMap restart / dispose leaves the previous reader parked in a\n // pending read() forever, leaking the underlying source. Cancelling on abort\n // both releases the source AND settles the pending read() so the for-await\n // unwinds and the finally below can release the lock. Abort is the only\n // early-exit path for this generator (the consumer never calls .return()\n // without aborting), so this is the sole place a non-drained stream is cancelled.\n const onAbort = (): void => {\n void reader.cancel().catch(() => {}); // tearing down; swallow a rejected cancel\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n yield value;\n }\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n reader.releaseLock();\n }\n}\n","/**\n * stream/streamRuntime.ts\n *\n * `$streams` の起動・チャンク反映・status 遷移(docs/state-streams-design.md\n * §2-2 / §3-3 / §4-3)。\n *\n * スコープ:\n * - eager 起動(startStreams)と start = restart の共通手順(startStream)。\n * - args は traceArgs(stream/argsTrace.ts)で readonly proxy 評価と同時に依存を\n * per-run 再捕捉する(§3-1)。\n * - 依存駆動 restart(§3-2): モジュール初期化時に updater の drain 終了リスナーを\n * 1 つ登録し(restartStreamsOnUpdateBatch)、起動中 stateElement\n * (stream/activeStateElements.ts — startStreams で add・abortAllStreams /\n * clearStreamRegistry で delete)の各 entry について depAddresses と batch を\n * 交差させ、hit した entry を restart する。\n *\n * 切断後の後始末について(不変条件):\n * - disconnect(abortAllStreams)は registry entry を直接ミューテーションして\n * idle に戻す($postUpdate は呼ばない — 切断済みで binding 更新は不要かつ\n * rootNode が無い)。\n * - abort 済み run の sink コールバック(fold / done / fail)は consumeSource の\n * stale-drop(全経路の signal.aborted チェック)が createState 到達前に\n * 落とすため、runtime 側に切断後ガードは不要。\n * 「runtime が createState を呼ぶのは自分の controller が生きている間だけ」が\n * この 2 つの組み合わせで常に保たれる。\n */\n\nimport type { IAbsoluteStateAddress } from \"../address/types\";\nimport type { IStateElement } from \"../components/types\";\nimport {\n DELIMITER,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n} from \"../define\";\nimport { registerUpdateBatchListener } from \"../updater/updater\";\nimport { addActiveStateElement, getActiveStateElements } from \"./activeStateElements\";\nimport { traceArgs } from \"./argsTrace\";\nimport { consumeSource } from \"./consumeSource\";\nimport { getLastNotified, setLastNotified } from \"./lastNotified\";\nimport { getStreamEntries } from \"./streamRegistry\";\nimport type { IConsumeSink, IStreamEntry, StreamStatus } from \"./types\";\n\n/**\n * 登録済みの全 stream を起動する(eager 起動、設計書 §2-3)。\n * State.connectedCallback($connectedCallback 完了後)と接続中の `_state` 再 set\n * から呼ばれる想定。\n *\n * 同時に依存駆動 restart(§3-2)の対象として activeStateElements に登録する\n * (delete 側は abortAllStreams / clearStreamRegistry —\n * stream/activeStateElements.ts のリーク防止不変条件を参照)。\n * eager 起動の throw(args のユーザー例外等)はここでは正規化せず loud fail のまま\n * (既存の $connectedCallback と同じ扱い。正規化は drain リスナー側の restart のみ)。\n */\nexport function startStreams(stateElement: IStateElement): void {\n const entries = getStreamEntries(stateElement);\n if (entries.size === 0) {\n return;\n }\n addActiveStateElement(stateElement);\n for (const entry of entries.values()) {\n startStream(stateElement, entry);\n }\n}\n\n/**\n * stream を起動する。start = restart の共通手順(設計書 §2-2):\n *\n * 1. 旧 run を abort(restart 時)→ 新 AbortController\n * 2. traceArgs で args を readonly proxy 評価し依存を丸ごと再捕捉\n * (Promise / 自己依存 / wildcard 読みは raiseError、§3-1)\n * 3. 値を initial にリセット(起動 = 最初の run も restart と同一セマンティクス、§1-3)\n * 4. status=\"active\"・error=null を反映\n * 5. consumeSource で消費開始\n */\nexport function startStream(stateElement: IStateElement, entry: IStreamEntry): void {\n entry.controller?.abort();\n const controller = new AbortController();\n entry.controller = controller;\n\n // args 評価 + 依存の per-run 再捕捉(args === null なら depAddresses を clear して\n // undefined。Promise / 自己依存 / wildcard 読みは raiseError、§3-1)\n const argsValue = traceArgs(stateElement, entry);\n\n // 値リセット: setByAddress を通すことで updater coalesce・sameValueGuard・\n // walkDependency(stream 値に依存する computed の dirty 化)がすべて乗る(§3-3)\n stateElement.createState(\"writable\", (state) => {\n state[entry.name] = entry.definition.initial;\n });\n\n updateStreamStatus(stateElement, entry, \"active\", null);\n\n const definition = entry.definition;\n const sink: IConsumeSink = {\n fold(chunk: unknown): void {\n // fold の throw はそのまま伝播させる(consumeSource が fail 経路に回す)\n stateElement.createState(\"writable\", (state) => {\n state[entry.name] = definition.fold(state[entry.name], chunk);\n });\n },\n done(): void {\n updateStreamStatus(stateElement, entry, \"done\", null);\n },\n fail(error: unknown): void {\n // 値は直前の fold 結果を保持(リセットしない)\n updateStreamStatus(stateElement, entry, \"error\", error);\n // fold-throw 時の producer 掃除(iterator.return() / reader.cancel() を発火)。\n // source-throw 時は producer が既に終了しているので abort は無害(§3-3)。\n controller.abort();\n },\n };\n void consumeSource(definition.source, argsValue, controller.signal, sink);\n}\n\n/**\n * status / error の反映ヘルパ(設計書 §4-3)。\n *\n * - registry entry が正本。常に最新値へ書き換える。\n * - 「最後に通知した観測値」(stream/lastNotified.ts — 再 set・再接続を跨いで\n * stateElement の寿命で生存する台帳)から変化した項目に対応する名前空間パス\n * (`$streamStatus.<name>` / `$streamError.<name>`)だけを writable proxy の\n * $postUpdate で通知する(updater enqueue + walkDependency)。\n * - 両方不変なら通知しない(名前空間パスは setByAddress を通らないため\n * sameValueGuard が効かず、同等の same-value 判定を runtime 側が持つ)。\n * abortAllStreams の無通知ミューテーションで台帳が invalidate されている場合は\n * 同値扱いにならず必ず通知される(再接続ウィンドウ内の fresh 読みが描画した\n * idle の恒久陳腐化を防ぐ、§4-3)。\n */\nexport function updateStreamStatus(\n stateElement: IStateElement,\n entry: IStreamEntry,\n status: StreamStatus,\n error: unknown,\n): void {\n entry.status = status;\n entry.error = error;\n const last = getLastNotified(stateElement, entry.name);\n const statusChanged = last.status !== status;\n const errorChanged = !Object.is(last.error, error);\n if (!statusChanged && !errorChanged) {\n return;\n }\n setLastNotified(stateElement, entry.name, status, error);\n stateElement.createState(\"writable\", (state) => {\n if (statusChanged) {\n state.$postUpdate(`${STATE_STREAM_STATUS_NAMESPACE_NAME}${DELIMITER}${entry.name}`);\n }\n if (errorChanged) {\n state.$postUpdate(`${STATE_STREAM_ERROR_NAMESPACE_NAME}${DELIMITER}${entry.name}`);\n }\n });\n}\n\n/**\n * 依存駆動 restart の drain リスナー(設計書 §3-2)。\n * モジュール初期化時に registerUpdateBatchListener で 1 つだけ登録される。\n *\n * - 起動中の各 stateElement の各 entry について、depAddresses と batch の交差を\n * Set.has のインスタンス同一性で判定する(小さい方 = depAddresses を回して\n * batch.has(dep)。AbsoluteStateAddress はキャッシュにより同一 (stateName, path,\n * listIndex) が同一インスタンス、§2-1)。args なし(depAddresses 空)の entry は\n * 自然にスキップされる。\n * - status は問わず restart する(done / error からも依存の叩き直しで再試行、§2-2)。\n * - hit は収集してから一括で restart する(イテレーション中の registry 変更を避ける。\n * entry ごとに最初の hit で break するため「1 drain につき 1 entry 最大 1 restart」\n * もここで自然に成立する — 同一 tick 内の複数依存書き込みは 1 restart に畳まれる)。\n * - hits の実行時にも active + entry identity を再チェックする: 先行 restart の\n * source / args は consumeSource / traceArgs の同期プレフィックスで同期実行される\n * ため、そこで (a) 他の stateElement(や自分自身のホスト)の同期切断、(b) 同一要素の\n * _state 同期再 set(clearStreamRegistry → startStreams で Set に再 add される)が\n * 起こり得る。(a) は切断済み要素への startStream が rootNode 不在で throw する経路、\n * (b) は registry から置換済みの旧 entry を restart して到達不能な孤児 consume run を\n * リークする経路(§3-2「未接続の stateElement の entry は restart しない」・\n * §5-1「切断後は idle」に違反)で、いずれも「entry が現行 registry の live entry で\n * あること」の再検証で skip する。startStream **実行中**の自己切断・再 set は事前\n * チェックではガードできないため、catch 側でも同じ再検証を行ってから error に\n * 正規化する(切断済みでの正規化は createState が再 throw して drain リスナー外へ\n * 漏れ、後続 hits の restart を巻き添えにするため)。\n * - restart(startStream)は entry ごとに try/catch し、throw(args のユーザー例外・\n * Promise 同期契約違反等)は controller.abort() → status=\"error\"・$streamError 格納\n * に正規化する(§3-2 規範 3)。updater の drain を壊さず、他 entry の restart も\n * 継続する。eager 起動(connect 時の startStreams)の throw は従来どおり loud fail。\n * - restart 内の書き込み(initial リセット・status 通知)は updater への enqueue のみで\n * 新しい microtask バッチを作る(drain 再入ではない)。自己依存は traceArgs が\n * 宣言時に raiseError で検出するため、restart 書き込みが自分の依存に再 hit する\n * ループは起きない(§3-1)。\n */\nfunction restartStreamsOnUpdateBatch(batch: ReadonlySet<IAbsoluteStateAddress>): void {\n const activeStateElements = getActiveStateElements();\n if (activeStateElements.size === 0) {\n // stream 未使用アプリの drain に配列・イテレータ割り当てのコストを載せない\n return;\n }\n const hits: { stateElement: IStateElement; entry: IStreamEntry }[] = [];\n for (const stateElement of activeStateElements) {\n for (const entry of getStreamEntries(stateElement).values()) {\n for (const dep of entry.depAddresses) {\n if (batch.has(dep)) {\n hits.push({ stateElement, entry });\n break;\n }\n }\n }\n }\n for (const { stateElement, entry } of hits) {\n // 先行 restart の source / args 同期実行は他要素の切断や同一要素の _state 同期再 set を\n // 行い得るため、実行時に再チェックする(live な Set / registry ビューで即時反映):\n // - 切断済み要素は skip(§3-2「未接続の stateElement の entry は restart しない」)\n // - entry が現行 registry のものでなければ skip — 同期再 set で置換された旧 entry を\n // restart すると、registry から到達不能なため abortAllStreams でも止められない\n // 孤児 consume run がリークする\n if (\n !activeStateElements.has(stateElement) ||\n getStreamEntries(stateElement).get(entry.name) !== entry\n ) {\n continue;\n }\n try {\n startStream(stateElement, entry);\n } catch (e) {\n entry.controller?.abort();\n // startStream 実行中(args / source の同期プレフィックス)の自己切断・同期再 set は\n // 上の再チェックではガードできない。切断済みだと updateStreamStatus の createState が\n // rootNode 不在で再 throw して drain リスナー外へ漏れる(後続 hits の restart を\n // 巻き添えにする)ため、entry がまだ現行の live entry である場合のみ error に\n // 正規化する(切断済みなら abortAllStreams が idle に戻し済み。§3-2 規範 3 / §5-1)。\n if (\n activeStateElements.has(stateElement) &&\n getStreamEntries(stateElement).get(entry.name) === entry\n ) {\n updateStreamStatus(stateElement, entry, \"error\", e);\n }\n }\n }\n}\n\nregisterUpdateBatchListener(restartStreamsOnUpdateBatch);\n","import { IStateElement } from \"../components/types\";\n\ninterface IDCCElement extends HTMLElement {\n readonly stateElement: IStateElement | null;\n}\n\nexport function getterFn(name: string) {\n return function (this: IDCCElement) {\n const stateEl = this.stateElement;\n if (!stateEl) return undefined;\n let value: any;\n try {\n stateEl.createState(\"readonly\", (state) => {\n value = state[name];\n });\n } catch (e) {\n console.warn(`[@wcstack/state] DCC getter \"${name}\" failed:`, e);\n return undefined;\n }\n return value;\n };\n}\n\nexport function setterFn(name: string) {\n return function (this: IDCCElement, value: any) {\n const stateEl = this.stateElement;\n if (!stateEl) return;\n stateEl.initializePromise.then(() => {\n stateEl.createState(\"writable\", (state) => {\n state[name] = value;\n });\n });\n };\n}\n\nexport function callFn(name: string, isAsync: boolean) {\n if (isAsync) {\n return function (this: IDCCElement, ...args: any[]) {\n const stateEl = this.stateElement;\n if (!stateEl) return undefined;\n return stateEl.initializePromise.then(() => {\n let result: any;\n return stateEl.createStateAsync(\"writable\", async (state) => {\n result = await state[name](...args);\n }).then(() => result);\n });\n };\n }\n return function (this: IDCCElement, ...args: any[]) {\n const stateEl = this.stateElement;\n if (!stateEl) return undefined;\n return stateEl.initializePromise.then(() => {\n let result: any;\n stateEl.createState(\"writable\", (state) => {\n result = state[name](...args);\n });\n return result;\n });\n };\n}\n\nexport function isInternalProperty(name: string): boolean {\n return name.startsWith(\"$\");\n}\n","/**\n * getResolvedPathInfo.ts\n *\n * Utility for parsing and generating detailed path information (IResolvedPathInfo)\n * from State property names (path strings), including wildcard and index information.\n *\n * Main responsibilities:\n * - Breaks down property names to determine presence and type of wildcards and indexes\n * - Automatically determines wildcard type: context/all/partial/none\n * - Caches by path for reusability and performance\n * - Retrieves structured path information via getStructuredPathInfo\n *\n * Design points:\n * - Caches using Map to handle reserved words like \"constructor\" and \"toString\"\n * - Flexibly determines wildcards (*) and numeric indexes, storing them in wildcardIndexes\n * - context type indicates unresolved indexes, all type indicates all resolved indexes, partial type indicates mixed\n * - ResolvedPathInfo class centralizes path parsing and information management\n */\nimport { IResolvedAddress, WildcardType } from './types';\nimport { getPathInfo } from './PathInfo';\n\n/**\n * Cache for resolved path information.\n * Uses Map to safely handle property names including reserved words like \"constructor\" and \"toString\".\n */\nconst _cache: Map<string, IResolvedAddress> = new Map();\n\n/**\n * Class that parses and stores resolved path information.\n * \n * Analyzes property path strings to extract:\n * - Path segments and their hierarchy\n * - Wildcard locations and types\n * - Numeric indexes vs unresolved wildcards\n * - Wildcard type classification (none/context/all/partial)\n */\nclass ResolvedAddress implements IResolvedAddress {\n readonly path;\n readonly segments;\n readonly wildcardCount;\n readonly wildcardType;\n readonly wildcardIndexes;\n readonly pathInfo;\n \n /**\n * Constructs resolved path information from a property path string.\n * \n * Parses the path to identify wildcards (*) and numeric indexes,\n * classifies the wildcard type, and generates structured path information.\n * \n * @param name - Property path string (e.g., \"items.*.name\" or \"data.0.value\")\n */\n constructor(path: string) {\n // Split path into individual segments\n const segments = path.split(\".\");\n const tmpPatternSegments = segments.slice();\n let incompleteCount = 0; // Count of unresolved wildcards (*)\n let completeCount = 0; // Count of resolved wildcards (numeric indexes)\n let wildcardCount = 0;\n let wildcardType: WildcardType = \"none\";\n const wildcardIndexes: (number | null)[] = [];\n\n // Process each segment to identify wildcards and indexes\n for(let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (segment === \"*\") {\n // Unresolved wildcard\n tmpPatternSegments[i] = \"*\";\n wildcardIndexes.push(null);\n incompleteCount++;\n wildcardCount++;\n } else {\n const number = Number(segment);\n if (!Number.isNaN(number)) {\n // Numeric index - treat as resolved wildcard\n tmpPatternSegments[i] = \"*\";\n wildcardIndexes.push(number);\n completeCount++;\n wildcardCount++;\n }\n }\n }\n // Generate pattern string with wildcards normalized\n const structuredPath = tmpPatternSegments.join(\".\");\n const pathInfo = getPathInfo(structuredPath);\n \n // Classify wildcard type based on resolved vs unresolved counts\n if (incompleteCount > 0 || completeCount > 0) {\n if (incompleteCount === wildcardCount) {\n // All wildcards are unresolved - need context to resolve\n wildcardType = \"context\";\n } else if (completeCount === wildcardCount) {\n // All wildcards are resolved with numeric indexes\n wildcardType = \"all\";\n } else {\n // Mix of resolved and unresolved wildcards\n wildcardType = \"partial\";\n }\n }\n this.path = path;\n this.segments = segments;\n this.wildcardCount = wildcardCount;\n this.wildcardType = wildcardType;\n this.wildcardIndexes = wildcardIndexes;\n this.pathInfo = pathInfo;\n }\n}\n\n/**\n * Retrieves or creates resolved path information for a property path.\n * \n * This function caches resolved path information for performance.\n * On first access, it parses the path and creates a ResolvedPathInfo instance.\n * Subsequent accesses return the cached result.\n * \n * @param name - Property path string (e.g., \"items.*.name\", \"data.0.value\")\n * @returns Resolved path information containing segments, wildcards, and type classification\n */\nexport function getResolvedAddress(name:string):IResolvedAddress {\n let nameInfo: IResolvedAddress | undefined;\n // Return cached value or create, cache, and return new instance\n return _cache.get(name) ?? (_cache.set(name, nameInfo = new ResolvedAddress(name)), nameInfo);\n}","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { ICacheEntry } from \"./types\";\n\nconst cacheEntryByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, ICacheEntry> = new WeakMap();\n\nexport function getCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress\n): ICacheEntry | null {\n return cacheEntryByAbsoluteStateAddress.get(address) ?? null;\n}\n\nexport function setCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress,\n cacheEntry: ICacheEntry | null\n): void {\n if (cacheEntry === null) {\n cacheEntryByAbsoluteStateAddress.delete(address);\n } else {\n cacheEntryByAbsoluteStateAddress.set(address, cacheEntry);\n }\n}\n\nexport function dirtyCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress\n): void {\n const cacheEntry = cacheEntryByAbsoluteStateAddress.get(address);\n if (cacheEntry) {\n cacheEntry.dirty = true;\n }\n}","/**\n * getByAddress.ts\n *\n * StateClassの内部APIとして、構造化パス情報(IStructuredPathInfo)とリストインデックス(IListIndex)を指定して\n * 状態オブジェクト(target)から値を取得するための関数(getByAddress)の実装です。\n *\n * 主な役割:\n * - 指定されたパス・インデックスに対応するState値を取得(多重ループやワイルドカードにも対応)\n * - 依存関係の自動登録(checkDependencyで登録)\n * - キャッシュ機構(リストもキャッシュ対象)\n * - getter経由で値取得時はpushAddressでスコープを一時設定\n * - 存在しない場合は親pathAddressやlistIndexを辿って再帰的に値を取得\n *\n * 設計ポイント:\n * - checkDependencyで依存追跡を実行 \n * - キャッシュ有効時はstateAddressで値をキャッシュし、取得・再利用を最適化\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値取得を実現\n * - finallyでキャッシュへの格納を保証\n */\n\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { IStateAddress } from \"../../address/types\";\nimport { getCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { getCommandNamespace } from \"../../command/commandNamespace\";\nimport { IStateElement } from \"../../components/types\";\nimport { STATE_COMMAND_NAMESPACE_NAME, STATE_STREAM_ERROR_NAMESPACE_NAME, STATE_STREAM_STATUS_NAMESPACE_NAME, WILDCARD } from \"../../define\";\nimport { raiseError } from \"../../raiseError\";\nimport { collectStreamDependency } from \"../../stream/argsTrace\";\nimport { getStreamErrorNamespace, getStreamStatusNamespace } from \"../../stream/streamNamespace\";\nimport { IStateHandler } from \"../types\";\nimport { checkDependency } from \"./checkDependency\";\n\n/**\n * namespace 配下のパスは raw state を持たないため、proxy の get トラップと同じ\n * namespace オブジェクトを辿る。1セグメント目は namespace 本体、2セグメント目以降は\n * namespace 上のキーを順に走査する。走査値が object / function 以外(null /\n * undefined / primitive の葉)になったら undefined を返す — 葉より深い読み\n * (例: `$streamStatus.<name>.<key>`、error が primitive throw のときの\n * `$streamError.<name>.message`)は宣言外アクセスと同じ undefined 解決とし、\n * Reflect.get の non-object TypeError を updater の drain に漏らさない\n * (§4-1 の throw しない寛容規約)。\n */\nfunction walkNamespace(namespace: object, segments: string[]): any {\n let value: any = namespace;\n for (let i = 1; i < segments.length; i++) {\n // Object(v) !== v は「v が object / function でない」(= primitive / null / undefined)判定\n if (Object(value) !== value) {\n return undefined;\n }\n value = Reflect.get(value, segments[i]);\n }\n return value;\n}\n\nfunction _getByAddress(\n target : object,\n address : IStateAddress,\n receiver : any,\n handler : IStateHandler,\n stateElement: IStateElement,\n): any {\n const firstSegment = address.pathInfo.segments[0];\n if (firstSegment === STATE_COMMAND_NAMESPACE_NAME) {\n // $command 名前空間: キーは宣言済み command token 名\n return walkNamespace(getCommandNamespace(stateElement), address.pathInfo.segments);\n }\n if (firstSegment === STATE_STREAM_STATUS_NAMESPACE_NAME) {\n // $streamStatus / $streamError 名前空間: キーは宣言済み stream 名\n // (registry entry が正本の thin gateway、docs/state-streams-design.md §4-2)。\n // setByAddress の親走査もここを通るため、子への Reflect.set が namespace proxy の\n // raiseError に到達する = 書き込み防御(S11)もこの分岐で成立する。\n return walkNamespace(getStreamStatusNamespace(stateElement), address.pathInfo.segments);\n }\n if (firstSegment === STATE_STREAM_ERROR_NAMESPACE_NAME) {\n return walkNamespace(getStreamErrorNamespace(stateElement), address.pathInfo.segments);\n }\n if (address.pathInfo.path in target) {\n // getterの中で参照の可能性があるので、addressをプッシュする\n if (stateElement.getterPaths.has(address.pathInfo.path)) {\n handler.pushAddress(address);\n try {\n return Reflect.get(target, address.pathInfo.path, receiver);\n } finally {\n handler.popAddress();\n }\n } else {\n return Reflect.get(target, address.pathInfo.path);\n }\n } else {\n const parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\n return Reflect.get(parentValue, index);\n } else {\n return Reflect.get(parentValue, lastSegment);\n }\n }\n}\n\nfunction _getByAddressWithCache(\n target : object, \n address : IStateAddress,\n receiver : any,\n handler : IStateHandler,\n stateElement: IStateElement\n): any {\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const cacheEntry = getCacheEntryByAbsoluteStateAddress(absAddress);\n if (cacheEntry !== null && cacheEntry.dirty === false) {\n return cacheEntry.value;\n }\n const value = _getByAddress(target, address, receiver, handler, stateElement);\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n return value;\n}\n\nexport function getByAddress(\n target : object,\n address : IStateAddress,\n receiver : any,\n handler : IStateHandler\n): any {\n checkDependency(handler, address);\n // $streams の args トレース中のみ絶対アドレスを捕捉(collector 非活性なら即 return)\n collectStreamDependency(handler.stateElement, address);\n const stateElement = handler.stateElement;\n const cacheable = address.pathInfo.wildcardCount > 0 || \n stateElement.getterPaths.has(address.pathInfo.path);\n if (cacheable) {\n return _getByAddressWithCache(target, address, receiver, handler, stateElement);\n } else {\n return _getByAddress(target, address, receiver, handler, stateElement);\n }\n}\n","import { calcWildcardLen } from \"../../address/calcWildcardLen\";\nimport { IStateAddress } from \"../../address/types\";\nimport { IStateHandler } from \"../types\";\n\nexport function checkDependency(\n handler: IStateHandler,\n address: IStateAddress,\n): void {\n // $untrackDependency スコープ中/setter 実行中は依存を張らない\n if (handler.untracking) {\n return;\n }\n // 動的依存関係の登録\n if (handler.addressStackLength > 0) {\n const lastAddress = handler.lastAddressStack;\n const lastInfo = lastAddress?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null) {\n if (stateElement.getterPaths.has(lastInfo.path) &&\n lastInfo.path !== address.pathInfo.path) {\n // lastInfo.pathはgetterの名前であり、address.pathInfo.pathは\n // そのgetterが参照している値のパスである\n stateElement.addDynamicDependency(address.pathInfo.path, lastInfo.path);\n // 他行読み取りの検出: 評価中の getter と読み取り先が同じワイルドカード親\n // (リスト)を共有し、その階層の listIndex が異なる場合、この getter は\n // 自行の外に依存する(隣接項目参照など)。該当リストを crossRowListPaths に\n // 記録し、walkDependency の diff-filter 展開を全行展開へフォールバックさせる。\n if (address.pathInfo.wildcardCount > 0 && lastInfo.wildcardCount > 0) {\n const sharedLen = calcWildcardLen(address.pathInfo, lastInfo);\n if (sharedLen > 0) {\n let crossRow = false;\n for (let level = 0; level < sharedLen; level++) {\n if (address.listIndex?.at(level) !== lastAddress!.listIndex?.at(level)) {\n crossRow = true;\n break;\n }\n }\n if (crossRow) {\n for (let level = 0; level < sharedLen; level++) {\n stateElement.addCrossRowListPath?.(address.pathInfo.wildcardParentPaths[level]);\n }\n }\n }\n }\n }\n }\n }\n}","/**\n * getContextListIndex.ts\n *\n * Stateの内部APIとして、現在のプロパティ参照スコープにおける\n * 指定したstructuredPath(ワイルドカード付きプロパティパス)に対応する\n * リストインデックス(IListIndex)を取得する関数です。\n *\n * 主な役割:\n * - handlerの最後にアクセスされたAddressから、指定パスに対応するリストインデックスを取得\n * - ワイルドカード階層に対応し、多重ループやネストした配列バインディングにも利用可能\n *\n * 設計ポイント:\n * - 直近のプロパティ参照情報を取得\n * - info.indexByWildcardPathからstructuredPathのインデックスを特定\n * - listIndex.at(index)で該当階層のリストインデックスを取得\n * - パスが一致しない場合や参照が存在しない場合はnullを返す\n */\n\nimport { IListIndex } from \"../../list/types\";\nimport { IStateHandler } from \"../types\";\n\nexport function getContextListIndex(\n handler: IStateHandler,\n structuredPath: string\n): IListIndex | null {\n if (handler.addressStackLength === 0) {\n return null;\n }\n const address = handler.lastAddressStack;\n if (address === null) {\n return null;\n }\n const index: number | undefined = address.pathInfo.indexByWildcardPath[structuredPath];\n if (typeof index === \"undefined\") {\n return null;\n }\n return address.listIndex?.at(index) ?? null;\n}\n","import { IStateAddress } from \"../../address/types\";\nimport { WILDCARD } from \"../../define\";\nimport { IStateHandler } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\n\n/**\n * Reports whether an address has been initialized, independently of its value.\n * In particular, an own slot containing `undefined` is initialized while a\n * missing slot is not.\n */\nexport function hasByAddress(\n target: object,\n address: IStateAddress,\n receiver: unknown,\n handler: IStateHandler,\n): boolean {\n if (address.pathInfo.path in target) return true;\n const parentAddress = address.parentAddress;\n if (parentAddress === null) return false;\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n if (parentValue === null || (typeof parentValue !== \"object\" && typeof parentValue !== \"function\")) {\n return false;\n }\n const lastSegment = address.pathInfo.lastSegment;\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index;\n return typeof index === \"number\" && index in parentValue;\n }\n return lastSegment in parentValue;\n}\n","import { IStateAddress } from \"../../address/types\";\nimport { ISwapInfo } from \"./types\";\n\nconst swapInfoByStateAddress: WeakMap<IStateAddress, ISwapInfo> = new WeakMap();\n\nexport function getSwapInfoByAddress(address: IStateAddress): ISwapInfo | null {\n return swapInfoByStateAddress.get(address) ?? null;\n}\n\nexport function setSwapInfoByAddress(address: IStateAddress, swapInfo: ISwapInfo | null): void {\n if (swapInfo === null) {\n swapInfoByStateAddress.delete(address);\n } else {\n swapInfoByStateAddress.set(address, swapInfo);\n }\n}\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { calcWildcardLen } from \"../address/calcWildcardLen\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { createStateAddress } from \"../address/StateAddress\";\nimport { IPathInfo, IStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { WILDCARD } from \"../define\";\nimport { createListDiff } from \"../list/createListDiff\";\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { IListDiff, IListIndex } from \"../list/types\";\nimport { getByAddressSymbol } from \"../proxy/symbols\";\nimport { IStateProxy } from \"../proxy/types\";\nimport { raiseError } from \"../raiseError\";\nimport { SearchType } from \"./types\";\n\nconst MAX_DEPENDENCY_DEPTH = 1000;\n\nfunction getIndexes(listDiff: IListDiff, searchType: SearchType): Iterable<IListIndex> {\n switch (searchType) {\n case \"old\":\n return listDiff.oldIndexes;\n case \"new\":\n return listDiff.newIndexes;\n case \"add\":\n return listDiff.addIndexSet;\n case \"change\":\n return listDiff.changeIndexSet;\n case \"delete\":\n return listDiff.deleteIndexSet;\n default: \n if (config.debug) {\n console.log(`Invalid search type: ${searchType}`);\n }\n return [];\n }\n}\n\ntype ExpandContext = {\n readonly stateName: string,\n readonly stateElement: IStateElement,\n readonly targetPathInfo: IPathInfo,\n readonly targetListIndexes: IListIndex[],\n readonly wildcardPaths: string[],\n readonly wildcardParentPaths: string[],\n readonly stateProxy: IStateProxy,\n readonly searchType: SearchType\n}\n\nfunction _walkExpandWildcard(\n context: ExpandContext, \n currentWildcardIndex: number,\n parentListIndex: IListIndex | null\n): void {\n const parentPath = context.wildcardParentPaths[currentWildcardIndex];\n const parentPathInfo = getPathInfo(parentPath);\n const parentAbsPathInfo = getAbsolutePathInfo(context.stateElement, parentPathInfo);\n const parentAddress = createStateAddress(parentPathInfo, parentListIndex);\n const parentAbsAddress = createAbsoluteStateAddress(parentAbsPathInfo, parentListIndex);\n const lastValue = getLastListValueByAbsoluteStateAddress(parentAbsAddress);\n const newValue = context.stateProxy[getByAddressSymbol](parentAddress);\n const listDiff = createListDiff(parentAddress.listIndex, lastValue, newValue);\n\n const loopIndexes = getIndexes(listDiff, context.searchType);\n if (currentWildcardIndex === context.wildcardPaths.length - 1) {\n context.targetListIndexes.push(...loopIndexes);\n } else {\n for(const listIndex of loopIndexes) {\n _walkExpandWildcard(\n context,\n currentWildcardIndex + 1,\n listIndex\n );\n }\n }\n}\n\n/**\n * 静的子展開(list → list.*)の展開範囲。\n * - \"full\": 新リストの全行を展開する(従来挙動)。\n * - \"diff\": 追加行(addIndexSet)と位置が変わった行(changeIndexSet)のみ展開する。\n * 未変更行は値が変わらないため dirty 化・再適用が不要(リスト置換のコストが\n * 既存行数に比例するスケーリング欠陥の解消。docs/list-replacement-dependency-scaling.md)。\n * 削除時の集計 getter は $getAll / $resolve がリスト本体(コンテナ)を読むことで\n * 登録される動的エッジ(list → 集計 getter)が担う。\n */\nexport type ListExpansion = \"full\" | \"diff\";\n\ntype Context = {\n readonly stateName: string,\n readonly stateElement: IStateElement,\n readonly staticMap: Map<string, string[]>,\n readonly dynamicMap: Map<string, string[]>,\n readonly result: Set<IStateAddress>,\n readonly listPathSet: Set<string>,\n readonly visited: Set<IStateAddress>,\n readonly stateProxy: IStateProxy,\n readonly searchType: SearchType,\n readonly listExpansion: ListExpansion,\n}\n\n/**\n * 静的子展開の対象 listIndex 群。fullRows は行全体(list.* とその subtree)を展開する。\n * movedRows は「位置だけが変わった行」で、index 以外の入力が不変なため展開を\n * index 依存 getter の subtree(getMovedRowExpansionPaths)に限定できる。\n */\ntype ExpansionSelection = {\n readonly fullRows: Iterable<IListIndex>,\n readonly movedRows: Iterable<IListIndex> | null,\n}\n\nconst EMPTY_INDEXES: IListIndex[] = [];\n\n/**\n * 静的子展開で訪問する listIndex 群を選ぶ。\"diff\" でも次の場合は全行に倒す:\n * - diff に変化が一切見えない再代入(同一参照および内容同一コピーの再代入。\n * `arr[0].v = 5; s.items = [...arr]` のような in-place 変異後のリフレッシュ\n * イディオムは diff に映らないため、全行展開で従来挙動を保つ。\n * 削除だけの置換は除く — 残存行に変化は無く、集計はコンテナ動的エッジが担う)\n * - 他行を読む getter が検出されたリスト(隣接項目参照など。未変更行の派生値も変わりうる)\n */\nfunction selectExpansionIndexes(\n context: Context,\n sourcePath: string,\n _lastValue: unknown,\n _newValue: unknown,\n listDiff: IListDiff,\n): ExpansionSelection {\n if (context.listExpansion === \"full\") {\n return { fullRows: listDiff.newIndexes, movedRows: null };\n }\n if (context.stateElement.crossRowListPaths?.has(sourcePath)) {\n return { fullRows: listDiff.newIndexes, movedRows: null };\n }\n if (listDiff.addIndexSet.size === 0 && listDiff.changeIndexSet.size === 0) {\n // 追加も移動も無い。削除も無ければ「変化が見えない再代入」= リフレッシュ意図\n if (listDiff.deleteIndexSet.size === 0) {\n return { fullRows: listDiff.newIndexes, movedRows: null };\n }\n // 削除のみ: 残存行は位置も値も不変なので展開しない\n return { fullRows: EMPTY_INDEXES, movedRows: null };\n }\n return { fullRows: listDiff.addIndexSet, movedRows: listDiff.changeIndexSet };\n}\n\nconst EMPTY_PATH_INFOS: IPathInfo[] = [];\n\n/**\n * 位置だけが変わった行(movedRows)で展開すべきパス群を求める。\n * `${listPath}.*` の静的 subtree を辿り、$1 等を読んだ実績のある getter\n * (indexDependentGetterPaths)だけを返す。行の同一性・listIndex は保たれ\n * index 以外の入力が不変なので、index を読まない getter / 値パスは再評価不要。\n * 戻り値:\n * - IPathInfo[](空可): この各パスだけを行の listIndex で展開する\n * - null: ネストしたワイルドカード配下に index 依存 getter がある\n * (listIndex の階数が合わず個別展開できない)→ 呼び出し側で行全体展開に倒す\n */\nfunction getMovedRowExpansionPaths(\n context: Context,\n wildcardPath: string,\n depPathInfo: IPathInfo,\n): IPathInfo[] | null {\n const indexGetters = context.stateElement.indexDependentGetterPaths;\n if (!indexGetters || indexGetters.size === 0) {\n return EMPTY_PATH_INFOS;\n }\n let result: IPathInfo[] | null = null;\n const queue: string[] = [wildcardPath];\n const seen = new Set<string>(queue);\n for (let i = 0; i < queue.length; i++) {\n const path = queue[i];\n if (indexGetters.has(path)) {\n const pathInfo = getPathInfo(path);\n if (pathInfo.wildcardCount !== depPathInfo.wildcardCount) {\n return null;\n }\n (result ??= []).push(pathInfo);\n }\n const children = context.staticMap.get(path);\n if (children) {\n for (const child of children) {\n if (!seen.has(child)) {\n seen.add(child);\n queue.push(child);\n }\n }\n }\n }\n return result ?? EMPTY_PATH_INFOS;\n}\n\ntype StackEntry = { address: IStateAddress, depth: number };\n\nfunction _walkDependency(\n context: Context,\n startAddress: IStateAddress,\n callback: (address: IStateAddress) => void\n): void {\n const stack: StackEntry[] = [{ address: startAddress, depth: 0 }];\n\n while (stack.length > 0) {\n const { address, depth } = stack.pop()!;\n if (depth > MAX_DEPENDENCY_DEPTH) {\n raiseError(`Maximum dependency depth of ${MAX_DEPENDENCY_DEPTH} exceeded. Possible circular dependency detected at path: ${address.pathInfo.path}`);\n }\n if (context.visited.has(address)) {\n continue;\n }\n context.visited.add(address);\n callback(address);\n const sourcePath = address.pathInfo.path;\n const nextDepth = depth + 1;\n\n // 依存アドレスを逆順でpushするための一時バッファ\n const nextEntries: StackEntry[] = [];\n\n /**\n * パスから依存関係をたどる\n * users.*.name <= users.* <= users\n * ただし、users がリストであれば users.* の依存関係は展開する\n */\n const staticDeps = context.staticMap.get(sourcePath);\n if (staticDeps) {\n for(const dep of staticDeps) {\n const depPathInfo = getPathInfo(dep);\n if (context.listPathSet.has(sourcePath) && depPathInfo.lastSegment === WILDCARD) {\n //expand indexes\n const newValue = context.stateProxy[getByAddressSymbol](address);\n const absPathInfo = getAbsolutePathInfo(context.stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\n const listDiff = createListDiff(address.listIndex, lastValue, newValue);\n const selection = selectExpansionIndexes(context, sourcePath, lastValue, newValue, listDiff);\n for(const listIndex of selection.fullRows) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n if (selection.movedRows !== null) {\n const movedPathInfos = getMovedRowExpansionPaths(context, dep, depPathInfo);\n if (movedPathInfos === null) {\n // ネスト配下に index 依存 getter: 安全側で行全体を展開(従来挙動)\n for(const listIndex of selection.movedRows) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n } else if (movedPathInfos.length > 0) {\n // 位置のみ変わった行は index 依存 getter のパスだけを展開する\n for(const listIndex of selection.movedRows) {\n for(const pathInfo of movedPathInfos) {\n const depAddress = createStateAddress(pathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n // movedPathInfos が空: index を読む getter が subtree に無い =\n // 位置のみ変わった行の値は不変。展開・dirty 化とも不要。\n }\n } else {\n const depAddress = createStateAddress(depPathInfo, address.listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n /**\n * 動的依存関係をたどる\n * 動的依存関係は、getterの実行時に決定される\n *\n * source, target\n *\n * products.*.price => products.*.tax\n * get \"products.*.tax\"() { return this[\"products.*.price\"] * 0.1; }\n *\n * products.*.price => products.summary\n * get \"products.summary\"() { return this.$getAll(\"products.*.price\", []).reduce(sum); }\n *\n * categories.*.name => categories.*.products.*.categoryName\n * get \"categories.*.products.*.categoryName\"() { return this[\"categories.*.name\"]; }\n */\n const dynamicDeps = context.dynamicMap.get(sourcePath);\n if (dynamicDeps) {\n for(const dep of dynamicDeps) {\n const depPathInfo = getPathInfo(dep);\n const listIndexes: (IListIndex | null)[] = [];\n if (depPathInfo.wildcardCount > 0) {\n // ワイルドカードを含む依存関係の処理\n // 同じ親を持つかをパスの集合積で判定する\n // polyfills.tsにてSetのintersectionメソッドを定義している\n const wildcardLen = calcWildcardLen(address.pathInfo, depPathInfo);\n const expandable = (depPathInfo.wildcardCount - wildcardLen) >= 1;\n if (expandable) {\n let listIndex: IListIndex | null;\n if (wildcardLen > 0) {\n // categories.*.name => categories.*.products.*.categoryName\n // ワイルドカードを含む同じ親(products.*)を持つのが、\n // さらに下位にワイルドカードがあるので展開する\n if (address.listIndex === null) {\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\n }\n listIndex = address.listIndex!.at(wildcardLen - 1);\n } else {\n // selectedIndex => items.*.selected\n // 同じ親を持たない場合はnullから開始\n listIndex = null;\n }\n const expandContext: ExpandContext = {\n stateName: context.stateName,\n stateElement: context.stateElement,\n targetPathInfo: depPathInfo,\n targetListIndexes: [],\n wildcardPaths: depPathInfo.wildcardPaths,\n wildcardParentPaths: depPathInfo.wildcardParentPaths,\n stateProxy: context.stateProxy,\n searchType: context.searchType,\n };\n _walkExpandWildcard(expandContext, wildcardLen, listIndex);\n listIndexes.push(...expandContext.targetListIndexes);\n } else {\n // products.*.price => products.*.tax\n // ワイルドカードを含む同じ親(products.*)を持つので、リストインデックスは引き継ぐ\n if (address.listIndex === null) {\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\n }\n const listIndex = address.listIndex.at(wildcardLen - 1);\n listIndexes.push(listIndex);\n }\n } else {\n // products.*.tax => currentTaxRate\n // 同じ親を持たないので、リストインデックスはnull\n listIndexes.push(null);\n }\n for(const listIndex of listIndexes) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n\n // 逆順でpushして、元の再帰と同じ探索順序を保つ\n for(let i = nextEntries.length - 1; i >= 0; i--) {\n stack.push(nextEntries[i]);\n }\n }\n}\n\nexport function walkDependency(\n stateName: string,\n stateElement: IStateElement,\n startAddress: IStateAddress,\n staticDependency: Map<string, string[]>,\n dynamicDependency: Map<string, string[]>,\n listPathSet: Set<string>,\n stateProxy: IStateProxy,\n searchType: SearchType,\n callback: (address: IStateAddress) => void,\n options?: { listExpansion?: ListExpansion }\n): IStateAddress[] {\n // 依存ゼロの葉パス(staticMap / dynamicMap にエントリ無し)は context や Set を\n // 割り当てず、開始アドレスの callback だけで完結する。リスト行の値書き込み\n // (update ホットパス)は set 毎にここを通る。開始アドレスへの callback は\n // 従来の walk 先頭と同一で、戻り値(依存アドレス群)も従来どおり空。\n const startPath = startAddress.pathInfo.path;\n if (!staticDependency.has(startPath) && !dynamicDependency.has(startPath)) {\n callback(startAddress);\n return [];\n }\n const context: Context = {\n stateName: stateName,\n stateElement: stateElement,\n staticMap: staticDependency,\n dynamicMap: dynamicDependency,\n result: new Set<IStateAddress>(),\n listPathSet: listPathSet,\n visited: new Set<IStateAddress>(),\n stateProxy: stateProxy,\n searchType: searchType,\n listExpansion: options?.listExpansion ?? \"full\",\n };\n _walkDependency(context, startAddress, callback);\n return Array.from(context.result);\n}\n","/**\n * setByAddress.ts\n *\n * Stateの内部APIとして、アドレス情報(IStateAddress)を指定して\n * 状態オブジェクト(target)に値を設定するための関数(setByAddress)の実装です。\n *\n * 主な役割:\n * - 指定されたパス・インデックスに対応するState値を設定(多重ループやワイルドカードにも対応)\n * - getter/setter経由で値設定時はpushAddressでスコープを一時設定\n * - 存在しない場合は親pathInfoやlistIndexを辿って再帰的に値を設定\n * - 設定後はupdater.enqueueUpdateAddressで更新情報を登録\n *\n * 設計ポイント:\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値設定を実現\n * - finallyで必ず更新情報を登録し、再描画や依存解決に利用\n * - getter/setter経由のスコープ切り替えも考慮した設計\n */\n\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\nimport { WILDCARD } from \"../../define\";\nimport { createListIndex } from \"../../list/createListIndex\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { raiseError } from \"../../raiseError\";\nimport { getUpdater } from \"../../updater/updater\";\nimport { IStateHandler, IStateProxy } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\nimport { hasByAddress } from \"./hasByAddress\";\nimport { getSwapInfoByAddress, setSwapInfoByAddress } from \"./swapInfo\";\nimport { walkDependency } from \"../../dependency/walkDependency\";\nimport { dirtyCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { config } from \"../../config\";\nimport { devtoolsSink } from \"../../devtools/sink\";\nimport { beginPropagationTransaction, getCurrentPropagationContext } from \"../../propagation/propagation\";\n\n// Phase 3: 書き込み時点の因果 context を update record に付与する。\n// binding 経由の書き込みは呼び出し元の dynamic scope から context を引き継ぎ、\n// binding 外からの API update は新しい transaction を開始する(設計書 §4 規則 1)。\n// 依存 walk で enqueue される派生アドレスも同じ書き込みの因果に属する。\nfunction notifyWrite(\n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n receiver : any,\n handler : IStateHandler\n): void {\n const propagationContext = config.enablePropagationContext\n ? (getCurrentPropagationContext() ?? beginPropagationTransaction(-1))\n : null;\n const updater = getUpdater();\n updater.enqueueAbsoluteAddress(absAddress, propagationContext);\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\n walkDependency(\n handler.stateName,\n handler.stateElement,\n address,\n handler.stateElement.staticDependency,\n handler.stateElement.dynamicDependency,\n handler.stateElement.listPaths,\n receiver as IStateProxy,\n \"new\",\n (depAddress: IStateAddress) => {\n // キャッシュを無効化(ダーティ)\n if (depAddress === address) return;\n const absDepPathInfo = getAbsolutePathInfo(handler.stateElement, depAddress.pathInfo);\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\n // 更新対象として登録\n updater.enqueueAbsoluteAddress(absDepAddress, propagationContext);\n },\n // リスト置換時は追加行・位置変更行のみ展開する(未変更行の再訪を省く。\n // $postUpdate の手動リフレッシュは従来通り全行展開のまま)\n { listExpansion: \"diff\" }\n )\n}\n\nfunction _setByAddress(\n target : object,\n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n value : any,\n receiver : any,\n handler : IStateHandler\n): any {\n try {\n if (address.pathInfo.path in target) {\n if (handler.stateElement.setterPaths.has(address.pathInfo.path)) {\n // setterの中で参照の可能性があるので、addressをプッシュする。\n // setter は命令的な代入であって派生(getter)ではないため、実行中の\n // 読み取り(同値ガードの旧値読み・$1 参照等)で依存を張らない。\n // アクセサペア(get/set 同名パス)では、抑止しないと setter 内の内部\n // 書き込みの同値ガード読みが「getter の依存」として誤登録される。\n handler.pushAddress(address);\n handler.beginUntrack();\n try {\n return Reflect.set(target, address.pathInfo.path, value, receiver);\n } finally {\n handler.endUntrack();\n handler.popAddress();\n }\n } else {\n return Reflect.set(target, address.pathInfo.path, value);\n }\n } else {\n const parentAddress = address.parentAddress;\n if (parentAddress === null) {\n return Reflect.set(target, address.pathInfo.path, value);\n }\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\n return Reflect.set(parentValue, index, value);\n } else {\n return Reflect.set(parentValue, lastSegment, value);\n }\n }\n } finally {\n notifyWrite(address, absAddress, receiver, handler);\n }\n}\n\nfunction _setByAddressWithSwap(\n target : object, \n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n value : any, \n receiver : any,\n handler : IStateHandler\n) {\n // elementsの場合はswapInfoを準備\n let parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\n let swapInfo = getSwapInfoByAddress(parentAddress);\n if (swapInfo === null) {\n const parentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\n const listIndexes = getListIndexesByList(parentValue) ?? [];\n swapInfo = {\n value: [...parentValue], listIndexes: [...listIndexes]\n }\n setSwapInfoByAddress(parentAddress, swapInfo);\n }\n try {\n return _setByAddress(target, address, absAddress, value, receiver, handler);\n } finally {\n const index = swapInfo.value.indexOf(value);\n const currentParentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\n const currentListIndexes = Array.isArray(currentParentValue) ? (getListIndexesByList(currentParentValue) ?? []) : [];\n const curIndex = address.listIndex!.index;\n const listIndex = (index !== -1) ? \n swapInfo!.listIndexes[index] : \n createListIndex(parentAddress.listIndex, -1);\n currentListIndexes[curIndex] = listIndex;\n // 重複チェック\n // 重複していない場合、swapが完了したとみなし、インデックスを更新\n const listValueSet = new Set(currentParentValue);\n if (listValueSet.size === swapInfo!.value.length) {\n for(let i = 0; i < currentListIndexes.length; i++) {\n currentListIndexes[i].index = i;\n }\n // 完了したのでswapInfoを削除\n setSwapInfoByAddress(parentAddress, null);\n }\n }\n}\n\nexport function setByAddress(\n target : object,\n address : IStateAddress,\n value : any,\n receiver : any,\n handler : IStateHandler\n): any {\n const stateElement = handler.stateElement;\n const path = address.pathInfo.path;\n\n // --- fast path: 宣言済み getter/setter でも swap 対象でもない、親を持つ葉パス ---\n // 従来は same-value guard の値読み・hasByAddress・実書き込みがそれぞれ親チェーンを\n // 解決していた(キャッシュヒットでも getByAddress 呼び出しの固定費 ×3)。\n // 親を 1 回だけ解決し、同じ親オブジェクトに対して guard 判定と Reflect.set を行う。\n // 非オブジェクト親などの例外形は従来経路へ倒し、挙動差を作らない。\n if (!(path in target) && address.parentAddress !== null && !stateElement.elementPaths.has(path)) {\n const parentValue = getByAddress(target, address.parentAddress, receiver, handler);\n if (typeof parentValue === \"object\" && parentValue !== null) {\n // ワイルドカード末尾で listIndex が無い不正アドレスは、従来どおり\n // 書き込み時(enqueue 済みの try 内)に raiseError する → key は undefined のまま持ち回す\n const lastSegment = address.pathInfo.lastSegment;\n const key: PropertyKey | undefined = lastSegment === WILDCARD\n ? address.listIndex?.index\n : lastSegment;\n let devOldValue: unknown;\n let devHasOldValue = false;\n if (config.sameValueGuard && (value === null || typeof value !== \"object\")) {\n // hasByAddress と同じ「初期化済みスロットか」判定(undefined 格納と未初期化を区別)\n const has = key !== undefined && key in parentValue;\n const oldValue = key !== undefined ? (parentValue as Record<PropertyKey, unknown>)[key] : undefined;\n if (has && Object.is(oldValue, value)) {\n return true;\n }\n devOldValue = oldValue;\n devHasOldValue = true;\n }\n const cacheable = address.pathInfo.wildcardCount > 0 ||\n stateElement.getterPaths.has(path);\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"state:write\",\n absoluteAddress: absAddress,\n value,\n oldValue: devOldValue,\n hasOldValue: devHasOldValue,\n });\n }\n try {\n if (key === undefined) {\n raiseError(`address.listIndex?.index is undefined path: ${path}`);\n }\n return Reflect.set(parentValue, key, value);\n } finally {\n notifyWrite(address, absAddress, receiver, handler);\n if (cacheable) {\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n }\n // DCC bindable イベントディスパッチ\n const eventName = stateElement.bindableEventMap[path];\n if (eventName) {\n const rootNode = stateElement.rootNode;\n if (rootNode instanceof ShadowRoot) {\n rootNode.host.dispatchEvent(new CustomEvent(eventName, {\n detail: value,\n bubbles: true,\n }));\n }\n }\n }\n }\n }\n // --- end fast path ---\n\n // --- same-value guard (config.sameValueGuard・既定 ON) ---\n // primitive 値かつ Object.is 同値なら、set / enqueue / walkDependency / DOM 適用 /\n // $updatedCallback / DCC イベントを丸ごとスキップ(標準的なリアクティブ no-op)。\n // 参照型(object/array)は in-place mutation 取りこぼし防止のため素通し(ガードしない)。\n // devtools write イベント用: guard が既に取得した旧値のみ流用する\n // (参照型のために追加の get はしない — protocol §4.2)\n let devOldValue: unknown;\n let devHasOldValue = false;\n if (config.sameValueGuard && (value === null || typeof value !== \"object\")) {\n const oldValue = getByAddress(target, address, receiver, handler);\n if (hasByAddress(target, address, receiver, handler) && Object.is(oldValue, value)) {\n return true;\n }\n devOldValue = oldValue;\n devHasOldValue = true;\n }\n // --- end same-value guard ---\n const isSwappable = stateElement.elementPaths.has(address.pathInfo.path);\n const cacheable = address.pathInfo.wildcardCount > 0 ||\n stateElement.getterPaths.has(address.pathInfo.path);\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"state:write\",\n absoluteAddress: absAddress,\n value,\n oldValue: devOldValue,\n hasOldValue: devHasOldValue,\n });\n }\n try {\n if (isSwappable) {\n return _setByAddressWithSwap(target, address, absAddress, value, receiver, handler);\n } else {\n return _setByAddress(target, address, absAddress, value, receiver, handler);\n }\n } finally {\n if (cacheable) {\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n }\n // DCC bindable イベントディスパッチ\n const eventName = stateElement.bindableEventMap[address.pathInfo.path];\n if (eventName) {\n const rootNode = stateElement.rootNode;\n if (rootNode instanceof ShadowRoot) {\n rootNode.host.dispatchEvent(new CustomEvent(eventName, {\n detail: value,\n bubbles: true,\n }));\n }\n }\n }\n}\n\n","/**\n * resolve.ts\n *\n * StateClassのAPIとして、パス(path)とインデックス(indexes)を指定して\n * Stateの値を取得・設定するための関数(resolve)の実装です。\n *\n * 主な役割:\n * - 文字列パス(path)とインデックス配列(indexes)から、該当するState値の取得・設定を行う\n * - ワイルドカードや多重ループを含むパスにも対応\n * - value未指定時は取得(getByRef)、指定時は設定(setByRef)を実行\n *\n * 設計ポイント:\n * - getStructuredPathInfoでパスを解析し、ワイルドカード階層ごとにリストインデックスを解決\n * - handler.engine.getListIndexesSetで各階層のリストインデックス集合を取得\n * - getByRef/setByRefで値の取得・設定を一元的に処理\n * - 柔軟なバインディングやAPI経由での利用が可能\n */\n\nimport { getPathInfo } from \"../../address/PathInfo\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { setByAddress } from \"../methods/setByAddress\";\nimport { IStateHandler } from \"../types\";\n\ntype ResolveFunction = (path: string, indexes: number[], value?: any) => any;\n\nexport function resolve(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): ResolveFunction {\n return (path: string, indexes: number[], value?: any): any => {\n const pathInfo = getPathInfo(path);\n if (handler.addressStackLength > 0) {\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\n // gettersに含まれる場合は依存関係を登録\n if (stateElement.getterPaths.has(lastInfo.path)) {\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\n }\n }\n }\n\n if (pathInfo.wildcardParentPathInfos.length > indexes.length) {\n raiseError(`indexes length is insufficient: ${path}`);\n }\n // ワイルドカード階層ごとにListIndexを解決していく\n let listIndex: IListIndex | null = null;\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\n const wildcardParentPathInfo = pathInfo.wildcardParentPathInfos[i];\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\n const tmpValue = getByAddress(target, wildcardAddress, receiver, handler);\n const listIndexes = getListIndexesByList(tmpValue);\n if (listIndexes == null) {\n raiseError(`ListIndexes not found: ${wildcardParentPathInfo.path}`);\n }\n const index = indexes[i];\n listIndex = listIndexes[index] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n }\n\n // ToDo:WritableかReadonlyかを判定して適切なメソッドを呼び出す\n const address = createStateAddress(pathInfo, listIndex);\n const hasSetValue = typeof value !== \"undefined\";\n if (!hasSetValue) {\n return getByAddress(target, address, receiver, handler);\n } else {\n setByAddress(target, address, value, receiver, handler);\n }\n };\n} ","/**\n * getAllReadonly\n *\n * ワイルドカードを含む State パスから、対象となる全要素を配列で取得する。\n * Throws: LIST-201(インデックス未解決)、BIND-201(ワイルドカード情報不整合)\n */\n\nimport { getPathInfo } from \"../../address/PathInfo\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IPathInfo, IStateAddress } from \"../../address/types\";\nimport { createListDiff } from \"../../list/createListDiff\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { getContextListIndex } from \"../methods/getContextListIndex\";\nimport { IStateHandler } from \"../types\";\nimport { resolve } from \"./resolve\";\n\n// ToDo: IAbsoluteStateAddressに変更する\nconst lastValueByListAddress = new WeakMap<IStateAddress, unknown[]>();\n\ntype GetAllFunction = (path: string, indexes?: number[]) => any[];\n\nexport function getAll(\n target: object, \n prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): GetAllFunction {\n const resolveFn = resolve(target, prop, receiver, handler);\n return (path: string, indexes?: number[]): any[] => {\n const newValueByAddress: Map<IStateAddress, any> = new Map();\n const pathInfo = getPathInfo(path);\n if (handler.addressStackLength > 0) {\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\n // gettersに含まれる場合は依存関係を登録\n if (stateElement.getterPaths.has(lastInfo.path)) {\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\n }\n }\n }\n \n if (typeof indexes === \"undefined\") {\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\n const wildcardPattern = pathInfo.wildcardParentPathInfos[i];\n const listIndex = getContextListIndex(handler, wildcardPattern.path);\n if (listIndex) {\n indexes = listIndex.indexes;\n break;\n }\n }\n if (typeof indexes === \"undefined\") {\n indexes = [];\n }\n }\n const walkWildcardPattern = (\n wildcardParentPathInfos: IPathInfo[],\n wildcardIndexPos: number,\n listIndex: IListIndex | null,\n indexes: number[],\n indexPos: number,\n parentIndexes: number[],\n results: number[][]\n ) => {\n const wildcardParentPathInfo = wildcardParentPathInfos[wildcardIndexPos] ?? null;\n if (wildcardParentPathInfo === null) {\n results.push(parentIndexes);\n return;\n }\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\n const oldValue = lastValueByListAddress.get(wildcardAddress);\n const newValue = getByAddress(target, wildcardAddress, receiver, handler);\n const listDiff = createListDiff(listIndex, oldValue, newValue);\n const listIndexes = listDiff.newIndexes;\n const index = indexes[indexPos] ?? null;\n newValueByAddress.set(wildcardAddress, newValue);\n if (index === null) {\n for(let i = 0; i < listIndexes.length; i++) {\n const listIndex = listIndexes[i];\n walkWildcardPattern(\n wildcardParentPathInfos, \n wildcardIndexPos + 1, \n listIndex, \n indexes, \n indexPos + 1, \n parentIndexes.concat(listIndex.index),\n results);\n }\n } else {\n const listIndex = listIndexes[index] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n if ((wildcardIndexPos + 1) < wildcardParentPathInfos.length) {\n walkWildcardPattern(\n wildcardParentPathInfos, \n wildcardIndexPos + 1, \n listIndex, \n indexes, \n indexPos + 1, \n parentIndexes.concat(listIndex.index),\n results\n );\n } else {\n // 最終ワイルドカード層まで到達しているので、結果を確定\n results.push(parentIndexes.concat(listIndex.index));\n }\n }\n }\n const resultIndexes: number[][] = [];\n walkWildcardPattern(\n pathInfo.wildcardParentPathInfos, \n 0, \n null, \n indexes, \n 0, \n [], \n resultIndexes\n );\n const resultValues: any[] = [];\n for(let i = 0; i < resultIndexes.length; i++) {\n resultValues.push(resolveFn(\n pathInfo.path,\n resultIndexes[i]\n ));\n }\n for(const [address, newValue] of newValueByAddress.entries()) {\n lastValueByListAddress.set(address, newValue);\n }\n return resultValues;\n }\n }\n","/**\n * getListIndex.ts\n *\n * StateClassの内部APIとして、パス情報(IResolvedAddress)から\n * 対応するリストインデックス(IListIndex)を取得する関数です。\n *\n * 主な役割:\n * - パスのワイルドカード種別(context/all/partial/none)に応じてリストインデックスを解決\n * - context型は現在のループコンテキストからリストインデックスを取得\n * - all型は各階層のリストインデックス集合からインデックスを辿って取得\n * - partial型やnone型は未実装またはnullを返す\n *\n * 設計ポイント:\n * - ワイルドカードや多重ループ、ネストした配列バインディングに柔軟に対応\n * - getListIndexesByListで各階層のリストインデックス集合を取得\n * - エラー時はraiseErrorで例外を投げる\n */\n\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IResolvedAddress } from \"../../address/types\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\nimport { getContextListIndex } from \"./getContextListIndex\";\n\nexport function getListIndex(\n target : object, \n resolvedAddress: IResolvedAddress, \n receiver: any,\n handler: IStateHandler\n): IListIndex | null {\n const pathInfo = resolvedAddress.pathInfo;\n switch (resolvedAddress.wildcardType) {\n case \"none\":\n return null;\n case \"context\": {\n const lastWildcardPath = pathInfo.wildcardPaths.at(-1) ?? \n raiseError(`lastWildcardPath is null: ${resolvedAddress.pathInfo.path}`);\n return getContextListIndex(handler, lastWildcardPath) ?? \n raiseError(`ListIndex not found: ${resolvedAddress.pathInfo.path}`);\n }\n case \"all\": {\n let parentListIndex: IListIndex | null = null;\n for(let i = 0; i < resolvedAddress.pathInfo.wildcardCount; i++) {\n const wildcardParentPathInfo = resolvedAddress.pathInfo.wildcardParentPathInfos[i] ?? \n raiseError(`wildcardParentPathInfo is null: ${resolvedAddress.pathInfo.path}`);\n const wildcardParentAddress = createStateAddress(wildcardParentPathInfo, parentListIndex);\n const wildcardParentValue = getByAddress(target, wildcardParentAddress, receiver, handler);\n const wildcardParentListIndexes: IListIndex[] = getListIndexesByList(wildcardParentValue) ?? \n raiseError( `ListIndex not found: ${wildcardParentPathInfo.path}`);\n const wildcardIndex = resolvedAddress.wildcardIndexes[i] ?? \n raiseError(`wildcardIndex is null: ${resolvedAddress.pathInfo.path}`);\n parentListIndex = wildcardParentListIndexes[wildcardIndex] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n }\n return parentListIndex;\n }\n case \"partial\": {\n raiseError(`Partial wildcard type is not supported yet: ${resolvedAddress.pathInfo.path}`);\n }\n }\n}\n","/**\n * setLoopContext.ts\n *\n * StateClassの内部APIとして、ループコンテキスト(ILoopContext)を一時的に設定し、\n * 指定した同期/非同期コールバックをそのスコープ内で実行するための関数です。\n *\n * 主な役割:\n * - handler.loopContextにループコンテキストを一時的に設定\n * - 既にループコンテキストが設定されている場合はエラーを投げる\n * - 常にスコープを設定しコールバックを実行\n * - finallyで必ずloopContextをnullに戻し、スコープ外への影響を防止\n *\n * 設計ポイント:\n * - ループバインディングや多重ループ時のスコープ管理を安全に行う\n * - finallyで状態復元を保証し、例外発生時も安全\n * - 非同期処理にも対応\n */\n\nimport { ILoopContext } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\n\nfunction _setLoopContext<T>(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => T\n): T {\n if (typeof handler.loopContext !== \"undefined\") {\n raiseError('already in loop context');\n }\n handler.setLoopContext(loopContext);\n try {\n handler.pushAddress(loopContext);\n try {\n return callback();\n } finally {\n handler.popAddress();\n }\n } finally {\n handler.clearLoopContext();\n }\n}\n\nexport function setLoopContext(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => any\n): any {\n return _setLoopContext(handler, loopContext, callback);\n}\n\nexport async function setLoopContextAsync(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => Promise<any>\n): Promise<any> {\n return await _setLoopContext(handler, loopContext, callback);\n}\n","/**\n * get.ts\n *\n * StateClassのProxyトラップとして、プロパティアクセス時の値取得処理を担う関数(get)の実装です。\n *\n * 主な役割:\n * - 文字列プロパティの場合、特殊プロパティ($1〜、$stateElement, $getAll, $postUpdate,\n * $resolve, $trackDependency, $command, $streamStatus, $streamError)に応じた値やAPIを返却\n * - 通常のプロパティはgetResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\n * - getByRefで構造化パス・リストインデックスに対応した値を取得\n * - シンボルプロパティの場合はhandler.callableApi経由でAPIを呼び出し\n * - それ以外はReflect.getで通常のプロパティアクセスを実行\n *\n * 設計ポイント:\n * - $1〜$128(MAX_WILDCARD_DEPTH)は直近のStatePropertyRefのリストインデックス値を返す特殊プロパティ\n * - $getAll, $resolve 等はAPI関数を、$command / $streamStatus / $streamError は名前空間を返す\n * - 通常のプロパティアクセスもバインディングや多重ループに対応\n * - シンボルAPIやReflect.getで拡張性・互換性も確保\n */\n\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\nimport { getCommandNamespace } from \"../../command/commandNamespace\";\nimport { DELIMITER, INDEX_BY_INDEX_NAME, STATE_COMMAND_NAMESPACE_NAME, STATE_STREAM_ERROR_NAMESPACE_NAME, STATE_STREAM_STATUS_NAMESPACE_NAME } from \"../../define\";\nimport { raiseError } from \"../../raiseError\";\nimport { getStreamErrorNamespace, getStreamStatusNamespace } from \"../../stream/streamNamespace\";\nimport { connectedCallback } from \"../apis/connectedCallback\";\nimport { disconnectedCallback } from \"../apis/disconnectedCallback\";\nimport { getAll } from \"../apis/getAll\";\nimport { postUpdate } from \"../apis/postUpdate\";\nimport { resolve } from \"../apis/resolve\";\nimport { trackDependency } from \"../apis/trackDependency\";\nimport { untrackDependency } from \"../apis/untrackDependency\";\nimport { updatedCallback } from \"../apis/updatedCallback\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { hasByAddress } from \"../methods/hasByAddress\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { setByAddress } from \"../methods/setByAddress\";\nimport { setLoopContext, setLoopContextAsync } from \"../methods/setLoopContext\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol, getByAddressSymbol, hasByAddressSymbol, setByAddressSymbol, setLoopContextAsyncSymbol, setLoopContextSymbol, updatedCallbackSymbol } from \"../symbols\";\nimport { IStateHandler } from \"../types\";\n\n// `$streamStatus.<name>` / `$streamError.<name>` の dotted パス判定用プレフィックス\nconst STREAM_STATUS_PATH_PREFIX = `${STATE_STREAM_STATUS_NAMESPACE_NAME}${DELIMITER}`;\nconst STREAM_ERROR_PATH_PREFIX = `${STATE_STREAM_ERROR_NAMESPACE_NAME}${DELIMITER}`;\n\n// symbol API のクロージャは handler(= proxy と 1:1、target/receiver 不変)ごとに\n// 使い回す。drain の getValue が binding ごとに getByAddressSymbol を引くため、\n// 毎回の新規クロージャ生成が GC 圧・固定費になっていた。\nconst symbolApiCacheByHandler = new WeakMap<IStateHandler, Map<symbol, unknown>>();\n\nfunction getSymbolApiCache(handler: IStateHandler): Map<symbol, unknown> {\n let cache = symbolApiCacheByHandler.get(handler);\n if (typeof cache === \"undefined\") {\n cache = new Map<symbol, unknown>();\n symbolApiCacheByHandler.set(handler, cache);\n }\n return cache;\n}\n\nexport function get(\n target : object, \n prop : PropertyKey, \n receiver: any,\n handler : IStateHandler\n): any {\n const index = INDEX_BY_INDEX_NAME[prop];\n if (typeof index !== \"undefined\") {\n if (handler.addressStackLength === 0) {\n raiseError(`No active state reference to get list index for \"${prop.toString()}\".`);\n }\n const lastAddress = handler.lastAddressStack;\n // getter 評価中のインデックス読み取りを記録する。位置だけが変わった行\n // (listDiff.changeIndexSet)は index 以外の入力が不変なので、walkDependency の\n // 静的子展開を「インデックスを読んだ getter の subtree」に限定できる。\n // $untrackDependency スコープ中/setter 実行中は記録しない。\n const lastInfo = lastAddress?.pathInfo;\n if (lastInfo && !handler.untracking && handler.stateElement?.getterPaths.has(lastInfo.path)) {\n handler.stateElement.addIndexDependentGetterPath?.(lastInfo.path);\n }\n const listIndex = lastAddress?.listIndex;\n return listIndex?.indexes[index] ?? raiseError(`ListIndex not found: ${prop.toString()}`);\n }\n if (typeof prop === \"string\") {\n if (prop[0] === '$') {\n switch (prop) {\n case \"$stateElement\": {\n return handler.stateElement;\n }\n case \"$getAll\": {\n return (path: string, indexes?: number[]): any[] => {\n return getAll(\n target, \n prop, \n receiver,\n handler\n )(path, indexes);\n }\n }\n case \"$postUpdate\": {\n return (path: string): void => {\n return postUpdate(\n target, \n prop, \n receiver,\n handler\n )(path);\n }\n }\n case \"$resolve\": {\n return (path: string, indexes: number[], value?: any): any => {\n return resolve(\n target, \n prop, \n receiver,\n handler\n )(path, indexes, value);\n }\n }\n case \"$trackDependency\": {\n return (path: string): void => {\n return trackDependency(\n target,\n prop,\n receiver,\n handler\n )(path);\n }\n }\n case \"$untrackDependency\": {\n return <T>(fn: () => T): T => {\n return untrackDependency(\n target,\n prop,\n receiver,\n handler\n )(fn);\n }\n }\n case STATE_COMMAND_NAMESPACE_NAME: {\n return getCommandNamespace(handler.stateElement);\n }\n case STATE_STREAM_STATUS_NAMESPACE_NAME: {\n return getStreamStatusNamespace(handler.stateElement);\n }\n case STATE_STREAM_ERROR_NAMESPACE_NAME: {\n return getStreamErrorNamespace(handler.stateElement);\n }\n }\n // switch 不一致の $ プロパティのうち、`$streamStatus.<name>` / `$streamError.<name>`\n // の dotted パスだけは通常のパス解決(getByAddress)へフォールスルーさせる。\n // これが computed(getter)内での依存追跡付き読み取りの正規形\n // (checkDependency が getter スコープで動的依存を登録し、$postUpdate の\n // walkDependency で computed が無効化される、docs/state-streams-design.md §4-3)。\n // それ以外の未知 $ プロパティは従来どおり undefined を返す。\n if (!prop.startsWith(STREAM_STATUS_PATH_PREFIX) && !prop.startsWith(STREAM_ERROR_PATH_PREFIX)) {\n return undefined;\n }\n }\n const resolvedAddress = getResolvedAddress(prop);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\n return getByAddress(\n target,\n stateAddress,\n receiver,\n handler\n );\n } else if (typeof prop === \"symbol\") {\n const cache = getSymbolApiCache(handler);\n const cached = cache.get(prop);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n let api: unknown;\n switch (prop) {\n case setLoopContextAsyncSymbol: {\n api = (loopContext: any, callback = async (): Promise<any> => {}): Promise<any> => {\n return setLoopContextAsync(handler, loopContext, callback);\n };\n break;\n }\n case setLoopContextSymbol: {\n api = (loopContext: any, callback = (): any => {}): any => {\n return setLoopContext(handler, loopContext, callback);\n };\n break;\n }\n case getByAddressSymbol: {\n api = (address: IStateAddress): any => {\n return getByAddress(\n target,\n address,\n receiver,\n handler\n );\n }\n break;\n }\n case hasByAddressSymbol: {\n api = (address: IStateAddress): boolean => {\n return hasByAddress(\n target,\n address,\n receiver,\n handler\n );\n }\n break;\n }\n case setByAddressSymbol: {\n api = (address: IStateAddress, value: any): void => {\n return setByAddress(\n target,\n address,\n value,\n receiver,\n handler\n );\n }\n break;\n }\n case connectedCallbackSymbol: {\n api = (): Promise<void> => {\n return connectedCallback(\n target,\n connectedCallbackSymbol,\n receiver,\n handler\n );\n }\n break;\n }\n case disconnectedCallbackSymbol: {\n api = (): void => {\n return disconnectedCallback(\n target,\n disconnectedCallbackSymbol,\n receiver,\n handler\n );\n }\n break;\n }\n case updatedCallbackSymbol: {\n api = (\n refs: IAbsoluteStateAddress[]\n ): unknown => {\n return updatedCallback(\n target,\n refs,\n receiver,\n handler\n );\n }\n break;\n }\n default: {\n return Reflect.get(\n target,\n prop,\n receiver\n );\n }\n }\n cache.set(prop, api);\n return api;\n }\n}\n","import { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IStateAddress } from \"../../address/types\";\nimport { dirtyCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { walkDependency } from \"../../dependency/walkDependency\";\nimport { getUpdater } from \"../../updater/updater\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { IStateHandler, IStateProxy } from \"../types\";\n\n\ntype PostFunction = (path: string) => void;\n\nexport function postUpdate(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): PostFunction {\n const stateElement = handler.stateElement;\n return (path: string): void => {\n const resolvedAddress = getResolvedAddress(path);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const address = createStateAddress(resolvedAddress.pathInfo, listIndex);\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const updater = getUpdater();\n updater.enqueueAbsoluteAddress(absAddress);\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\n walkDependency(\n handler.stateName,\n handler.stateElement,\n address,\n handler.stateElement.staticDependency,\n handler.stateElement.dynamicDependency,\n handler.stateElement.listPaths,\n receiver as IStateProxy,\n \"new\",\n (depAddress: IStateAddress) => {\n // キャッシュを無効化(ダーティ)\n const absDepPathInfo = getAbsolutePathInfo(stateElement, depAddress.pathInfo);\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\n // 更新対象として登録\n updater.enqueueAbsoluteAddress(absDepAddress);\n }\n );\n }\n}","/**\n * trackDependency.ts\n *\n * StateClassのAPIとして、getterチェーン中に参照されたパス間の\n * 依存関係を動的に登録するための関数(trackDependency)の実装です。\n *\n * 主な役割:\n * - 現在解決中のStatePropertyRef(lastRefStack)を取得\n * - pathManager.gettersに登録されているgetterの場合のみ依存を追跡\n * - 自身と同一パターンでない参照に対してaddDynamicDependencyを呼び出す\n *\n * 設計ポイント:\n * - lastRefStackが存在しない場合はSTATE-202エラーを発生させる\n * - getter同士の再帰(自己依存)は登録しない\n * - 動的依存はpathManagerに集約し、キャッシュの無効化に利用する\n */\n\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\n\n/**\n * 現在解決中のgetterから、指定されたパスへの動的依存を登録する関数を返します。\n *\n * - pathManager.gettersに登録されているgetterのみ依存追跡を行う\n * - 自己参照は除外し、異なるパターン間の依存だけを記録\n * - 動的依存はpathManager.addDynamicDependencyで集中管理される\n *\n * @param target プロキシ対象オブジェクト\n * @param prop アクセスされたプロパティキー\n * @param receiver プロキシレシーバ\n * @param handler StateClassハンドラ\n * @returns 引数pathで指定されたパターンへの依存を登録する無名関数\n */\n\ntype TrackDependencyFunction = (path: string) => void;\n\nexport function trackDependency(\n _target: object, \n _prop: PropertyKey, \n _receiver: any,\n handler: IStateHandler\n): TrackDependencyFunction {\n return (path: string): void => {\n if (handler.addressStackLength === 0) {\n raiseError(`No active state reference to track dependency for path \"${path}\".`);\n }\n const lastInfo = handler.lastAddressStack?.pathInfo ?? \n raiseError('Internal error: lastAddressStack is null');\n const stateElement = handler.stateElement;\n if (handler.stateElement.getterPaths.has(lastInfo.path) &&\n lastInfo.path !== path) {\n stateElement.addDynamicDependency(path, lastInfo.path);\n }\n };\n}\n","/**\n * untrackDependency.ts\n *\n * StateClass の API として、コールバック実行中の依存追跡を抑止する関数\n * ($untrackDependency)の実装です。$trackDependency(明示的な依存登録)と\n * 対称の「明示的な依存抑止」API。\n *\n * 主な役割:\n * - fn 実行中、checkDependency の動的依存登録と $1 インデックス依存の記録を抑止\n * - fn の戻り値をそのまま返す(値の読み取り自体は通常どおり行われる)\n *\n * 設計ポイント:\n * - スコープはハンドラ単位のカウンタ(ネスト可)で管理し、finally で必ず復元する\n * - 典型例: リスト行 getter が「行の外の単一値」を読みたいが、その値の変更で\n * 全行を再評価させたくない場合(選択インデックス等)。書き手側が該当行へ\n * 直接書き込むことで、必要な行だけが更新される\n */\n\nimport { IStateHandler } from \"../types\";\n\ntype UntrackDependencyFunction = <T>(fn: () => T) => T;\n\nexport function untrackDependency(\n _target: object,\n _prop: PropertyKey,\n _receiver: any,\n handler: IStateHandler\n): UntrackDependencyFunction {\n return <T>(fn: () => T): T => {\n handler.beginUntrack();\n try {\n return fn();\n } finally {\n handler.endUntrack();\n }\n };\n}\n","/**\n * connectedCallback.ts\n *\n * StateClassのライフサイクルフック「$connectedCallback」を呼び出すユーティリティ関数です。\n *\n * 主な役割:\n * - オブジェクト(target)に$connectedCallbackメソッドが定義されていれば呼び出す\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\n * - 非同期関数として実行可能(await対応)\n *\n * 設計ポイント:\n * - Reflect.getで$connectedCallbackプロパティを安全に取得\n * - 存在しない場合は何もしない\n * - ライフサイクル管理やカスタム初期化処理に利用\n */\n\nimport { STATE_CONNECTED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\nexport async function connectedCallback(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n _handler: IStateHandler\n):Promise<void> {\n const callback = Reflect.get(target, STATE_CONNECTED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n await callback.call(receiver);\n }\n}","/**\n * disconnectedCallback.ts\n *\n * StateClassのライフサイクルフック「$disconnectedCallback」を呼び出すユーティリティ関数です。\n *\n * 主な役割:\n * - オブジェクト(target)に$disconnectedCallbackメソッドが定義されていれば呼び出す\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\n *\n * 設計ポイント:\n * - Reflect.getで$disconnectedCallbackプロパティを安全に取得\n * - 存在しない場合は何もしない\n * - ライフサイクル管理やクリーンアップ処理に利用\n */\n\nimport { STATE_DISCONNECTED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\nexport function disconnectedCallback(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n _handler: IStateHandler\n): void {\n const callback = Reflect.get(target, STATE_DISCONNECTED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n callback.call(receiver);\n }\n}\n","/**\n * updatedCallback.ts\n *\n * Utility function to invoke the StateClass lifecycle hook \"$updatedCallback\".\n *\n * Main responsibilities:\n * - Invokes $updatedCallback method if defined on the object (target)\n * - Callback is invoked with target's this context, passing IReadonlyStateProxy (receiver) as argument\n * - Executable as async function (await compatible)\n *\n * Design points:\n * - Safely retrieves $updatedCallback property using Reflect.get\n * - Does nothing if the callback doesn't exist\n * - Used for lifecycle management and update handling logic\n */\n\nimport { IAbsoluteStateAddress } from \"../../address/types\";\nimport { STATE_UPDATED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\n/**\n * Invokes the $updatedCallback lifecycle hook if defined on the target.\n * Aggregates updated paths and their indexes before passing to the callback.\n * @param target - Target object to check for callback\n * @param refs - Array of state property references that were updated\n * @param receiver - State proxy to pass as this context\n * @param handler - State handler (unused but part of signature)\n * @returns Promise or void depending on callback implementation\n */\nexport function updatedCallback(\n target: object, \n refs: IAbsoluteStateAddress[], \n receiver: any,\n handler: IStateHandler\n): unknown {\n const callback: unknown = Reflect.get(target, STATE_UPDATED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n const paths: Set<string> = new Set();\n // ToDo:現状では1階層のみのワイルドカードに対応。多階層対応は後回し\n const indexesListByPath: Record<string, Array<number[]>> = {};\n for (const ref of refs) {\n const pathInfo = ref.absolutePathInfo.pathInfo;\n let pathName;\n if (ref.absolutePathInfo.stateName === handler.stateName) {\n pathName = pathInfo.path;\n } else {\n pathName = pathInfo.path + \"@\" + ref.absolutePathInfo.stateName;\n }\n paths.add(pathName);\n if (pathInfo.wildcardCount > 0) {\n const indexes = ref.listIndex!.indexes ?? [];\n const indexesList = indexesListByPath[pathName];\n if (typeof indexesList === \"undefined\") {\n indexesListByPath[pathName] = [indexes];\n } else {\n indexesList.push(indexes);\n }\n }\n }\n return callback.call(receiver, Array.from(paths), indexesListByPath);\n }\n}","import { IStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IStateHandler, IStateProxy, Mutability } from \"./types\";\nimport { get as trapGet } from \"./traps/get\";\nimport { set as trapSet } from \"./traps/set\";\nimport { ILoopContext } from \"../list/types\";\nimport { IState } from \"../types\";\nimport { MAX_LOOP_DEPTH } from \"../define\";\n\nclass StateHandler implements IStateHandler {\n private _stateElement: IStateElement;\n private _stateName: string;\n private _addressStack: (IStateAddress | null | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\n private _addressStackIndex: number = -1;\n private _loopContext: ILoopContext | null | undefined;\n private _mutability: Mutability;\n private _untrackDepth: number = 0;\n \n constructor(\n rootNode: Node,\n stateName: string,\n mutability: Mutability\n ) {\n this._stateName = stateName;\n const stateElement = getStateElementByName(rootNode, this._stateName);\n if (stateElement === null) {\n raiseError(`StateHandler: State element with name \"${this._stateName}\" not found.`);\n }\n this._stateElement = stateElement;\n this._mutability = mutability;\n }\n\n get stateName(): string {\n return this._stateName;\n }\n\n get stateElement(): IStateElement {\n return this._stateElement;\n }\n\n get lastAddressStack(): IStateAddress | null {\n let address: IStateAddress | null | undefined = undefined;\n if (this._addressStackIndex >= 0) {\n address = this._addressStack[this._addressStackIndex];\n }\n if (typeof address === \"undefined\") {\n raiseError(`Last address stack is undefined.`);\n }\n return address;\n }\n\n get addressStackLength(): number {\n return this._addressStackIndex + 1;\n }\n\n get loopContext(): ILoopContext | null | undefined {\n return this._loopContext;\n }\n\n pushAddress(address: IStateAddress | null): void {\n this._addressStackIndex++;\n if (this._addressStackIndex >= MAX_LOOP_DEPTH) {\n raiseError(`Exceeded maximum address stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\n }\n this._addressStack[this._addressStackIndex] = address;\n }\n\n popAddress(): IStateAddress | null {\n if (this._addressStackIndex < 0) {\n return null;\n }\n const address = this._addressStack[this._addressStackIndex];\n if (typeof address === \"undefined\") {\n raiseError(`Address stack at index ${this._addressStackIndex} is undefined.`);\n }\n this._addressStack[this._addressStackIndex] = undefined;\n this._addressStackIndex--;\n return address;\n }\n\n setLoopContext(loopContext: ILoopContext | null): void {\n this._loopContext = loopContext;\n }\n\n clearLoopContext(): void {\n this._loopContext = undefined;\n }\n\n get untracking(): boolean {\n return this._untrackDepth > 0;\n }\n\n beginUntrack(): void {\n this._untrackDepth++;\n }\n\n endUntrack(): void {\n this._untrackDepth--;\n }\n\n get(\n target : object, \n prop : PropertyKey, \n receiver: any\n ): any {\n return trapGet(target, prop, receiver, this);\n }\n\n set(\n target : object, \n prop : PropertyKey, \n value : any, \n receiver: any\n ): boolean {\n if (this._mutability === \"readonly\") {\n raiseError(`State \"${this._stateName}\" is readonly.`);\n }\n return trapSet(target, prop, value, receiver, this);\n }\n\n has(\n target: object, \n prop : PropertyKey\n ): boolean {\n return Reflect.has(target, prop);\n// return Reflect.has(target, prop) || this.symbols.has(prop) || this.apis.has(prop);\n }\n\n}\n\nexport function createStateProxy(\n rootNode: Node,\n state: IState,\n stateName: string,\n mutability: Mutability\n): IStateProxy {\n const handler = new StateHandler(rootNode, stateName, mutability);\n const stateProxy = new Proxy<IStateProxy>(state as IStateProxy, handler);\n return stateProxy;\n}\n\nexport const __private__ = {\n StateHandler,\n};","/**\n * set.ts\n *\n * StateClassのProxyトラップとして、プロパティ設定時の値セット処理を担う関数(set)の実装です。\n *\n * 主な役割:\n * - 文字列プロパティの場合、getResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\n * - setByRefで構造化パス・リストインデックスに対応した値設定を実行\n * - それ以外(シンボル等)の場合はReflect.setで通常のプロパティ設定を実行\n *\n * 設計ポイント:\n * - バインディングや多重ループ、ワイルドカードを含むパスにも柔軟に対応\n * - setByRefを利用することで、依存解決や再描画などの副作用も一元管理\n * - Reflect.setで標準的なプロパティ設定の互換性も確保\n */\n\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { IStateHandler } from \"../types\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { setByAddress } from \"../methods/setByAddress\";\n\nexport function set(\n target : object, \n prop : PropertyKey, \n value : any, \n receiver: any,\n handler : IStateHandler\n): boolean {\n if (typeof prop === \"string\") {\n const resolvedAddress = getResolvedAddress(prop);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\n return setByAddress(\n target, \n stateAddress,\n value, \n receiver,\n handler\n );\n } else {\n return Reflect.set(\n target, \n prop, \n value, \n receiver\n );\n }\n}\n","\n// WebComponent専用のキャッシュ\n// outerState.tsからのアクセスで、これを返す\n\nimport { IAbsoluteStateAddress } from \"../address/types\";\n\nconst lastValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, any> = new WeakMap();\n\nexport function setLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, value: any): void {\n lastValueByAbsoluteStateAddress.set(absoluteStateAddress, value);\n}\n\nexport function getLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): any {\n return lastValueByAbsoluteStateAddress.get(absoluteStateAddress);\n}\n","import { IStateElement } from \"../components/types\";\n\nconst stateElementByWebComponent: WeakMap<Element, Map<string, IStateElement>> = new WeakMap();\n\nexport function setStateElementByWebComponent(webComponent: Element, stateName: string, stateElement: IStateElement): void {\n let stateMap = stateElementByWebComponent.get(webComponent);\n if (!stateMap) {\n stateMap = new Map();\n stateElementByWebComponent.set(webComponent, stateMap);\n }\n stateMap.set(stateName, stateElement);\n}\n\nexport function getStateElementByWebComponent(webComponent: Element, stateName: string): IStateElement | null {\n const stateMap = stateElementByWebComponent.get(webComponent);\n if (!stateMap) {\n return null;\n }\n return stateMap.get(stateName) ?? null;\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IAbsolutePathInfo } from \"../address/types\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { addBindingByNode } from \"../bindings/getBindingsByNode\";\nimport { IStateElement } from \"../components/types\";\nimport { DELIMITER } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\n\nexport interface IMappingRule {\n innerAbsPathInfo: IAbsolutePathInfo;\n outerAbsPathInfo: IAbsolutePathInfo;\n}\n\nconst innerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\nconst outerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\nconst primaryMappingRuleSetByElement: WeakMap<Element, Set<IMappingRule>> = new WeakMap();\nconst primaryBindingByMappingRule: WeakMap<IMappingRule, IBindingInfo> = new WeakMap();\n\nfunction createMappingRuleByBinding(innerState: IStateElement, binding: IBindingInfo): IMappingRule {\n const innerPathInfo = getPathInfo(binding.propSegments.slice(1).join(DELIMITER));\n const innerAbsPathInfo = getAbsolutePathInfo(innerState, innerPathInfo);\n const outerAbsStateAddress = getAbsoluteStateAddressByBinding(binding);\n const outerAbsPathInfo = outerAbsStateAddress.absolutePathInfo;\n return { innerAbsPathInfo, outerAbsPathInfo };\n}\n\nexport function buildPrimaryMappingRule(webComponent: Element, stateName: string, bindings: IBindingInfo[]): void {\n if (bindings.length === 0) {\n return;\n }\n const innerState = getStateElementByWebComponent(webComponent, stateName);\n if (innerState === null) {\n raiseError('State element not found for web component.');\n }\n const innerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n const outerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n for (const binding of bindings) {\n const mappingRule = createMappingRuleByBinding(innerState, binding);\n let primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\n if (typeof primaryMappingRuleSet === 'undefined') {\n primaryMappingRuleSetByElement.set(webComponent, new Set([mappingRule]));\n } else {\n primaryMappingRuleSet.add(mappingRule);\n }\n const innerAbsPathInfo = mappingRule.innerAbsPathInfo;\n const outerAbsPathInfo = mappingRule.outerAbsPathInfo;\n primaryBindingByMappingRule.set(mappingRule, binding);\n innerMappingRule.set(innerAbsPathInfo, outerAbsPathInfo);\n outerMappingRule.set(outerAbsPathInfo, innerAbsPathInfo);\n }\n innerMappingByElement.set(webComponent, innerMappingRule);\n outerMappingByElement.set(webComponent, outerMappingRule);\n}\n\nexport function getInnerAbsolutePathInfo(webComponent: Element, outerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\n const mapping = outerMappingByElement.get(webComponent);\n if (typeof mapping === 'undefined') {\n return null;\n }\n return mapping.get(outerAbsPathInfo) ?? null;\n}\n\nexport function getOuterAbsolutePathInfo(webComponent: Element, innerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\n let innerMapping = innerMappingByElement.get(webComponent);\n if (typeof innerMapping === 'undefined') {\n innerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n innerMappingByElement.set(webComponent, innerMapping);\n }\n if (innerMapping.has(innerAbsPathInfo)) {\n return innerMapping.get(innerAbsPathInfo)!\n }\n let outerMapping = outerMappingByElement.get(webComponent);\n if (typeof outerMapping === 'undefined') {\n outerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n outerMappingByElement.set(webComponent, outerMapping);\n }\n // 内側からのアクセスの場合、ルールがなければプライマリルールから新たにルールとバインディングを生成する\n const primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\n if (typeof primaryMappingRuleSet === 'undefined') {\n // マッピングルールが存在しない場合はnullを返し、ローカル状態へのフォールバックを許可する\n return null;\n }\n let primaryMappingRule: IMappingRule | null = null;\n for(const currentPrimaryMappingRule of primaryMappingRuleSet) {\n // innerPathInfoがprimaryMappingRuleのinnerPathInfoを包含しているか\n if (!innerAbsPathInfo.pathInfo.cumulativePathInfoSet.has(currentPrimaryMappingRule.innerAbsPathInfo.pathInfo)) {\n continue;\n }\n if (currentPrimaryMappingRule.innerAbsPathInfo.pathInfo.segments.length === innerAbsPathInfo.pathInfo.segments.length) {\n raiseError('Duplicate mapping rule for web component.');\n }\n primaryMappingRule = currentPrimaryMappingRule;\n break;\n }\n if (primaryMappingRule === null) {\n // マッピングルールに一致しない場合はnullを返し、ローカル状態へのフォールバックを許可する\n return null;\n }\n // マッチした残りのパスをouterPathInfoに付与して新たなルールを生成\n const primaryBinding = primaryBindingByMappingRule.get(primaryMappingRule);\n /* c8 ignore start */\n if (typeof primaryBinding === 'undefined') {\n raiseError('Binding not found for primary mapping rule on web component.');\n }\n /* c8 ignore stop */\n const outerRemainingSegments = innerAbsPathInfo.pathInfo.segments.slice(primaryMappingRule.innerAbsPathInfo.pathInfo.segments.length);\n const outerSegments = primaryMappingRule.outerAbsPathInfo.pathInfo.segments.concat(outerRemainingSegments);\n const outerPathInfo = getPathInfo(outerSegments.join(DELIMITER));\n const rootNode = webComponent.getRootNode() as Node;\n const outerStateElement = getStateElementByName(rootNode, primaryBinding.stateName);\n if (outerStateElement === null) {\n raiseError(`State element with name \"${primaryBinding.stateName}\" not found for web component.`);\n }\n const outerAbsPathInfo = getAbsolutePathInfo(outerStateElement, outerPathInfo);\n innerMapping.set(innerAbsPathInfo, outerAbsPathInfo);\n outerMapping.set(outerAbsPathInfo, innerAbsPathInfo);\n\n // ルールに対応するバインディングを生成\n const newBinding: IBindingInfo = {\n ...primaryBinding,\n propName: innerAbsPathInfo.pathInfo.path,\n propSegments: innerAbsPathInfo.pathInfo.segments,\n statePathName: outerAbsPathInfo.pathInfo.path,\n statePathInfo: outerAbsPathInfo.pathInfo,\n }\n addBindingByNode(webComponent, newBinding);\n\n return outerAbsPathInfo;\n}","\nfunction cloneWithDescriptors(obj: object) {\n const proto = Object.getPrototypeOf(obj);\n const clone = Object.create(proto);\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n for(const key in descriptors) {\n const descriptor = descriptors[key];\n if (descriptor.writable === false) {\n descriptor.writable = true;\n }\n }\n Object.defineProperties(clone, descriptors);\n return clone;\n}\n\nexport function meltFrozenObject(frozenObj: object) {\n return cloneWithDescriptors(frozenObj);\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateElement } from \"../components/types\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { IListIndex } from \"../list/types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { setLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\nimport { getOuterAbsolutePathInfo } from \"./MappingRule\";\nimport { meltFrozenObject } from \"./meltFrozenObject\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IInnerState } from \"./types\";\n\nclass InnerStateProxyHandler implements ProxyHandler<IInnerState> {\n private _webComponent: Element;\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._webComponent = webComponent;\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IInnerState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n if (prop === \"then\") {\n // Promiseのthenと誤認識されるのを防ぐため、Promiseに存在するプロパティはProxyのgetで処理しない\n return undefined;\n }\n if (prop[0] === '$') {\n return undefined;\n }\n // 1. getter完全一致 → ローカル計算(this = receiverで依存自動追跡)\n if (this._innerStateElement.getterPaths.has(prop) && prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n // 2 & 3. マッピング完全一致 / サブパス → 親の状態\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n const loopContext = getLoopContextByNode(this._webComponent);\n let value = undefined;\n outerAbsPathInfo.stateElement.createState(\"readonly\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n value = state[outerAbsPathInfo.pathInfo.path];\n let listIndex: IListIndex | null = null;\n if (loopContext !== null && loopContext.listIndex !== null) {\n if (outerAbsPathInfo.pathInfo.wildcardCount > 0) {\n // wildcardPathSetとloopContextのpathInfoSetのintersectionのうち、segment数が最も多いものをouterAbsPathInfoにする\n // 例: outerPathInfoが \"todos.*.name\"で、loopContextのpathInfoSetに \"todos.0.name\", \"todos.1.name\"がある場合、\"todos.0.name\"や\"todos.1.name\"をouterAbsPathInfoにする\n listIndex = loopContext.listIndex.at(outerAbsPathInfo.pathInfo.wildcardCount - 1);\n }\n }\n const absStateAddress = createAbsoluteStateAddress(outerAbsPathInfo, listIndex);\n setLastValueByAbsoluteStateAddress(absStateAddress, value);\n });\n });\n return value;\n }\n // 4. ローカルデータプロパティ → ローカル値\n if (prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n // 5. エラー\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IInnerState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n // 1. setter完全一致 → ローカル処理(this = receiverで親への書き込み可能)\n if (this._innerStateElement.setterPaths.has(prop) && prop in target) {\n return Reflect.set(target, prop, value, receiver);\n }\n // 2 & 3. マッピング完全一致 / サブパス → 親に書く\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n const loopContext = getLoopContextByNode(this._webComponent);\n outerAbsPathInfo.stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[outerAbsPathInfo.pathInfo.path] = value;\n });\n });\n return true;\n }\n // 4. ローカルデータプロパティ → ローカルに書く\n if (prop in target) {\n return Reflect.set(target, prop, value, receiver);\n }\n // 5. エラー\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n\n has(target: IInnerState, prop: string | symbol): boolean {\n if (typeof prop === 'string') {\n if (prop[0] === '$') {\n return false;\n }\n // 1. getter/setter完全一致\n if ((this._innerStateElement.getterPaths.has(prop) || this._innerStateElement.setterPaths.has(prop)) && prop in target) {\n return true;\n }\n // 2 & 3. マッピング\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n return true;\n }\n // 4. ローカルデータ\n if (prop in target) {\n return true;\n }\n // 5. 存在しない\n return false;\n } else {\n return Reflect.has(target, prop);\n }\n }\n\n}\n\nexport function createInnerState(webComponent: Element, stateName: string): IInnerState {\n const handler = new InnerStateProxyHandler(webComponent, stateName);\n const innerState = getStateElementByWebComponent(webComponent, stateName);\n /* c8 ignore start */\n if (innerState === null) {\n raiseError('State element not found for web component.');\n }\n /* c8 ignore stop */\n if (innerState.boundComponentStateProp === null) {\n raiseError('State element is not bound to any component state prop.');\n }\n if (!(innerState.boundComponentStateProp in webComponent)) {\n raiseError(`State element is not bound to a valid component state prop: ${innerState.boundComponentStateProp}`);\n }\n const state = (webComponent as any)[innerState.boundComponentStateProp];\n if (typeof state !== 'object' || state === null) {\n raiseError(`Invalid state object for component state prop: ${innerState.boundComponentStateProp}`);\n }\n return new Proxy(meltFrozenObject(state), handler);\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nclass OuterStateProxyHandler implements ProxyHandler<IOuterState> {\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const absStateAddress = createAbsoluteStateAddress(innerAbsPathInfo, null);\n return getLastValueByAbsoluteStateAddress(absStateAddress);\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n this._innerStateElement.createState(\"readonly\", (state) => {\n state.$postUpdate(innerAbsPathInfo.pathInfo.path);\n });\n return true;\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n}\n\nexport function createOuterState(webComponent: Element, stateName: string): IOuterState {\n const handler = new OuterStateProxyHandler(webComponent, stateName);\n return new Proxy({}, handler);\n}\n","import { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nclass PlainOuterStateProxyHandler implements ProxyHandler<IOuterState> {\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n let value;\n this._innerStateElement.createState(\"readonly\", (state) => {\n value = state[prop];\n });\n return value;\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n this._innerStateElement.createState(\"writable\", (state) => {\n state[prop] = value;\n });\n return true;\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n}\n\nexport function createPlainOuterState(webComponent: Element, stateName: string): IOuterState {\n const handler = new PlainOuterStateProxyHandler(webComponent, stateName);\n return new Proxy({}, handler);\n}\n","import { getBindingsByNode } from \"../bindings/getBindingsByNode\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { WEBCOMPONENT_STATE_READY_CALLBACK_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { markWebComponentAsComplete } from \"./completeWebComponent\";\nimport { createInnerState } from \"./innerState\";\nimport { buildPrimaryMappingRule } from \"./MappingRule\";\nimport { meltFrozenObject } from \"./meltFrozenObject\";\nimport { createOuterState } from \"./outerState\";\nimport { createPlainOuterState } from \"./plainOuterState\";\nimport { setStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nconst getOuter = (outerState: IOuterState) => (): IOuterState => outerState;\n\nexport function bindWebComponent(\n innerStateElement: IStateElement,\n component: Element,\n stateProp: string,\n state: Record<string, any>\n): void {\n setStateElementByWebComponent(component, stateProp, innerStateElement);\n if (component.hasAttribute(config.bindAttributeName)) {\n const bindings = (getBindingsByNode(component) ?? []).filter(\n binding => binding.propSegments[0] === stateProp\n );\n buildPrimaryMappingRule(component, stateProp, bindings);\n const outerState = createOuterState(component, stateProp);\n const innerState = createInnerState(component, stateProp);\n innerStateElement.setInitialState(innerState);\n Object.defineProperty(component, stateProp, {\n get: getOuter(outerState),\n enumerable: true,\n configurable: true,\n });\n } else {\n innerStateElement.setInitialState(meltFrozenObject(state));\n const outerState = createPlainOuterState(component, stateProp);\n Object.defineProperty(component, stateProp, {\n get: getOuter(outerState),\n enumerable: true,\n configurable: true,\n });\n }\n markWebComponentAsComplete(component, innerStateElement);\n if (WEBCOMPONENT_STATE_READY_CALLBACK_NAME in component) {\n const func = (component as any)[WEBCOMPONENT_STATE_READY_CALLBACK_NAME];\n if (typeof func === 'function') {\n func.call(component, stateProp).catch((error: any) => {\n raiseError(`Error in ${WEBCOMPONENT_STATE_READY_CALLBACK_NAME}: ${error instanceof Error ? error.message : String(error)}`);\n });\n } else {\n raiseError(`${WEBCOMPONENT_STATE_READY_CALLBACK_NAME} is not a function.`);\n }\n }\n}\n","import { config, inSsr } from \"../config\";\nimport { loadFromInnerScript } from \"../stateLoader/loadFromInnerScript\";\nimport { loadFromJsonFile } from \"../stateLoader/loadFromJsonFile\";\nimport { loadFromScriptFile } from \"../stateLoader/loadFromScriptFile\";\nimport { loadFromScriptJson } from \"../stateLoader/loadFromScriptJson\";\nimport { raiseError } from \"../raiseError\";\nimport { BindingType, IState } from \"../types\";\nimport { IStateElement } from \"./types\";\nimport { setStateElementByName, getStateElementByName, getBindingsReady } from \"../stateElementByName\";\nimport { ILoopContextStack } from \"../list/types\";\nimport { createLoopContextStack } from \"../list/loopContext\";\nimport { DCC_DEFINITION_ATTRIBUTE, NO_SET_TIMEOUT, STATE_CONNECTED_CALLBACK_NAME, STATE_DISCONNECTED_CALLBACK_NAME, STATE_UPDATED_CALLBACK_NAME, WILDCARD } from \"../define\";\nimport { processCommandTokensDeclaration } from \"../command/processCommandTokensDeclaration\";\nimport { clearCommandTokenRegistry } from \"../command/commandTokenRegistry\";\nimport { clearCommandNamespace } from \"../command/commandNamespace\";\nimport { processEventTokensDeclaration } from \"../event/processEventTokensDeclaration\";\nimport { clearEventTokenRegistry } from \"../event/eventTokenRegistry\";\nimport { processOnDeclaration } from \"../event/processOnDeclaration\";\nimport { processStreamsDeclaration } from \"../stream/processStreamsDeclaration\";\nimport { clearStreamNamespace } from \"../stream/streamNamespace\";\nimport { abortAllStreams, clearStreamRegistry } from \"../stream/streamRegistry\";\nimport { startStreams } from \"../stream/streamRuntime\";\nimport { defineDCC } from \"../dcc/defineDCC\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateProxy, Mutability } from \"../proxy/types\";\nimport { createStateProxy } from \"../proxy/StateHandler\";\nimport { bindWebComponent } from \"../webComponent/bindWebComponent\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol } from \"../proxy/symbols\";\nimport { waitInitializeBinding } from \"../bindings/initializeBindingPromiseByNode\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { Ssr } from \"./Ssr\";\nimport { VERSION } from \"../version\";\nimport { HTMLElementBase } from \"../platform/HTMLElementBase\";\n\ntype Descriptors = Record<string, PropertyDescriptor>;\n\nfunction getAllPropertyDescriptors(obj: object): Descriptors {\n let descriptors: Descriptors = {};\n let proto = obj;\n while (proto && proto !== Object.prototype) {\n Object.assign(descriptors, Object.getOwnPropertyDescriptors(proto));\n proto = Object.getPrototypeOf(proto);\n }\n return descriptors;\n}\n\nfunction getStateInfo(\n state: IState\n): {\n getterPaths: Set<string>,\n setterPaths: Set<string>,\n} {\n const getterPaths: Set<string> = new Set<string>();\n const setterPaths: Set<string> = new Set<string>();\n const descriptors = getAllPropertyDescriptors(state);\n for(const [ key, descriptor ] of Object.entries(descriptors)) {\n if (typeof descriptor.get === \"function\") {\n getterPaths.add(key);\n }\n if (typeof descriptor.set === \"function\") {\n setterPaths.add(key);\n }\n }\n return {\n getterPaths, setterPaths\n };\n}\n\nexport class State extends HTMLElementBase implements IStateElement {\n static hasConnectedCallbackPromise = true;\n\n static getBindingsReady(rootNode: Node): Promise<void> {\n return getBindingsReady(rootNode);\n }\n\n private __state: IState | undefined;\n private _hasUpdatedCallback: boolean = false;\n // 他行を読む getter が検出されたリストパス(diff-filter 展開の全行フォールバック対象)。\n // 依存マップ(static/dynamic)と同様に追加のみ・クリアしない(安全側に固定される)。\n private _crossRowListPaths: Set<string> = new Set<string>();\n // $1 等のインデックスを読んだ getter パス(実行時検出)。位置のみ変わった行の\n // 静的子展開はこの集合の subtree に限定される。追加のみ・クリアしない(安全側)。\n private _indexDependentGetterPaths: Set<string> = new Set<string>();\n private _name: string = 'default';\n private _initialized: boolean = false;\n private _initializePromise: Promise<void>;\n private _resolveInitialize: (() => void) | null = null;\n private _connectedCallbackPromise: Promise<void>;\n private _resolveConnectedCallback: (() => void) | null = null;\n private _loadingPromise: Promise<void>;\n private _resolveLoading: (() => void) | null = null;\n private _setStatePromise: Promise<Record<string, any>> | null = null;\n private _resolveSetState: ((value: Record<string, any>) => void) | null = null;\n private _listPaths: Set<string> = new Set<string>();\n private _elementPaths: Set<string> = new Set<string>();\n private _getterPaths: Set<string> = new Set<string>();\n private _setterPaths: Set<string> = new Set<string>();\n private _loopContextStack: ILoopContextStack = createLoopContextStack();\n private _dynamicDependency: Map<string, string[]> = new Map<string, string[]>();\n private _staticDependency: Map<string, string[]> = new Map<string, string[]>();\n private _pathSet: Set<string> = new Set<string>();\n private _version = 0;\n private _rootNode: Node | null = null;\n private _boundComponent: Element | null = null;\n private _boundComponentStateProp: string | null = null;\n private _bindableEventMap: Record<string, string> = {};\n private _commandTokenNames: Set<string> = new Set<string>();\n private _eventTokenNames: Set<string> = new Set<string>();\n private _dcc: boolean = false;\n // connect サイクルの世代カウンタ(connectedCallback 冒頭でインクリメント)。\n // $connectedCallback の await 中の「切断 → 即再接続」では、新 connect が\n // _rootNode を再設定済みのため陳腐化した旧 connect の再開が _rootNode ガードを\n // 素通りして startStreams に到達し、同一の再接続に対して source が二重起動する。\n // 末尾で冒頭に捕捉した世代と照合し、陳腐 connect からの起動を skip する(設計書 §2-3)。\n private _connectGeneration: number = 0;\n // _state セッター側の startStreams が走った connect 世代\n // (connectedCallback 末尾の startStreams との二重起動防止、設計書 §2-3。\n // 世代が進めば不一致となり自然に無効化される — サイクル単位のフラグリセット相当)\n private _streamsStartedGeneration: number = 0;\n\n constructor() {\n super();\n this._initializePromise = new Promise<void>((resolve) => {\n this._resolveInitialize = resolve;\n });\n this._connectedCallbackPromise = new Promise<void>((resolve) => {\n this._resolveConnectedCallback = resolve;\n });\n this._loadingPromise = new Promise<void>((resolve) => {\n this._resolveLoading = resolve;\n });\n this._setStatePromise = new Promise<Record<string, any>>((resolve) => {\n this._resolveSetState = resolve;\n });\n }\n\n private get _state(): IState {\n if (typeof this.__state === \"undefined\") {\n raiseError(`${config.tagNames.state} _state is not initialized yet.`);\n }\n return this.__state;\n }\n\n private set _state(value: IState) {\n this._commandTokenNames = processCommandTokensDeclaration(value);\n this._eventTokenNames = processEventTokensDeclaration(value);\n this.__state = value;\n // $updatedCallback の有無を state セット時に確定しておく(in はプロトタイプ\n // チェーンも見る・getter を評価しない)。drain 側はこのフラグで更新アドレスの\n // 集計と writable createState をスキップできる。\n // 注: state セット後に生オブジェクトへ直接 $updatedCallback を後付けする\n // パターンは検知できない(bindProperty / _state 再セットは検知する)。\n // ライフサイクルフックは宣言時に定義するのが規約。\n this._hasUpdatedCallback = STATE_UPDATED_CALLBACK_NAME in value;\n // 再 set 時に二重 subscribe しないよう registry をクリアしてから $on を配線し直す。\n clearEventTokenRegistry(this);\n processOnDeclaration(this, value, this._eventTokenNames);\n this._listPaths.clear();\n this._elementPaths.clear();\n this._getterPaths.clear();\n // 再 set 時の残骸が $streams の衝突検査(processStreamsDeclaration)に\n // 偽陽性で命中しないよう getterPaths と対称にクリアする。\n this._setterPaths.clear();\n this._pathSet.clear();\n const stateInfo = getStateInfo(value);\n for(const path of stateInfo.getterPaths) {\n this._getterPaths.add(path);\n }\n for(const path of stateInfo.setterPaths) {\n this._setterPaths.add(path);\n }\n // $streams: 再 set 時の二重起動防止のため旧 stream を abort + registry 全削除してから\n // 新宣言をパースする(clearEventTokenRegistry → processOnDeclaration と同じ再配線パターン)。\n // getterPaths / setterPaths の収集後であること(宣言バリデーションが衝突検査で参照する)。\n // namespace proxy の memo も破棄して古い proxy を捨てる(clearCommandNamespace と対称)。\n clearStreamNamespace(this);\n clearStreamRegistry(this);\n processStreamsDeclaration(this, value);\n // 接続中の再 set(S13)は新宣言で即再起動する。\n // 初回(_initialize 中)は _initialized が false なのでここでは起動されず、\n // connectedCallback 側の startStreams($connectedCallback 完了後)が担う。\n if (this._initialized && this._rootNode !== null && !inSsr()) {\n startStreams(this);\n // $connectedCallback 実行中の再 set(setInitialState)では、ここで新宣言が\n // 起動済みのため connectedCallback 末尾の startStreams を skip させる。\n // skip しないと同一 connect サイクルで新宣言の source が 2 回起動する\n // (1 回目は即 abort — switchMap 意味論で状態は壊れないが、副作用を持つ\n // source が 2 回発火してしまう)。\n this._streamsStartedGeneration = this._connectGeneration;\n }\n this._resolveLoading?.();\n }\n\n get name(): string {\n return this._name;\n }\n\n private _loadFromSsrElement(): IState | null {\n if (!this.hasAttribute('enable-ssr')) return null;\n const name = this.getAttribute('name') || 'default';\n const root = this.parentNode;\n if (!root) return null;\n const ssrEl = Ssr.findByName(root, name);\n if (!ssrEl) return null;\n const data = ssrEl.stateData;\n return Object.keys(data).length > 0 ? data : null;\n }\n\n private async _initialize() {\n // enable-ssr (クライアント側のみ): <wcs-ssr> から初期データを取得\n const ssrState = !inSsr() ? this._loadFromSsrElement() : null;\n try {\n if (this.hasAttribute('state')) {\n const state = this.getAttribute('state');\n this._state = loadFromScriptJson(state!);\n } else if (this.hasAttribute('src')) {\n const src = this.getAttribute('src');\n if (src && src.endsWith('.json')) {\n this._state = await loadFromJsonFile(src);\n } else if (src && src.endsWith('.js')) {\n this._state = await loadFromScriptFile(src);\n } else {\n raiseError(`Unsupported src file type: ${src}`);\n }\n } else if (this.hasAttribute('json')) {\n const json = this.getAttribute('json');\n this._state = JSON.parse(json!);\n } else {\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\n if (script) {\n this._state = await loadFromInnerScript(script, `${this._name}`);\n } else {\n const timerId = setTimeout(() => {\n console.warn(`[@wcstack/state] Warning: No state source found for <${config.tagNames.state}> element with name=\"${this._name}\".`);\n }, NO_SET_TIMEOUT);\n // 要注意!!!APIでセットする場合はここで待機する必要がある --(1)\n this._state = await this._setStatePromise!;\n clearTimeout(timerId);\n }\n }\n } catch(e) {\n raiseError(`Failed to initialize state: ${e}`);\n }\n // SSR データがある場合、state 定義(メソッド/getter)を維持しつつデータ値を上書き\n if (ssrState !== null && this.__state) {\n for (const [key, value] of Object.entries(ssrState)) {\n if (key in this.__state) {\n const desc = Object.getOwnPropertyDescriptor(this.__state, key);\n // getter/setter はスキップ(定義側を優先)\n if (desc && (desc.get || desc.set)) continue;\n // 関数はスキップ\n if (typeof this.__state[key] === 'function') continue;\n }\n this.__state[key] = value;\n }\n }\n await this._loadingPromise;\n this._name = this.getAttribute('name') || 'default';\n setStateElementByName(this.rootNode!, this._name, this);\n }\n\n private async _initializeBindWebComponent() {\n if (this.hasAttribute(\"bind-component\")) {\n // wcs-stateはコンポーネントのトップレベル要素であること\n // ShadowDOM直下: parentNodeがShadowRoot → hostが親コンポーネント\n // LightDOM/ShadowDOM内のLightDOM: parentNodeがElement → それが親コンポーネント\n const parentNode = this.parentNode;\n const boundComponent = parentNode instanceof ShadowRoot\n ? parentNode.host\n : parentNode instanceof Element\n ? parentNode\n : null;\n const customTagName = boundComponent ? getCustomElement(boundComponent) : null;\n if (boundComponent === null || customTagName === null) {\n raiseError(`\"bind-component\" requires <${config.tagNames.state}> to be a direct child of a custom element.`);\n }\n // LightDOMの場合、名前空間が上位スコープと共有されるためnameが必須\n if (!(parentNode instanceof ShadowRoot) && !this.hasAttribute(\"name\")) {\n raiseError(`\"bind-component\" in Light DOM requires a \"name\" attribute to avoid namespace conflicts with the parent scope.`);\n }\n const boundComponentStateProp = this.getAttribute(\"bind-component\")!;\n await customElements.whenDefined(customTagName.toLowerCase());\n // data-wcs属性がある場合は、上位の状態によりbinding情報の設定が完了するまで待機する\n if (boundComponent.hasAttribute(config.bindAttributeName)) {\n await waitInitializeBinding(boundComponent);\n }\n if (!(boundComponentStateProp in boundComponent)) {\n raiseError(`Component does not have property \"${boundComponentStateProp}\" for state binding.`);\n }\n const state = (boundComponent as any)[boundComponentStateProp] as Record<string, any>;\n if (typeof state !== 'object' || state === null) {\n raiseError(`Component property \"${boundComponentStateProp}\" is not an object for state binding.`);\n }\n this._boundComponent = boundComponent;\n this._boundComponentStateProp = boundComponentStateProp;\n bindWebComponent(this, this._boundComponent, this._boundComponentStateProp, state);\n }\n }\n\n private async _callStateConnectedCallback(): Promise<void> {\n await this.createStateAsync(\"writable\", async (state) => {\n // stateに\"$connectedCallback\"があるか確認し、connectedCallbackAPIを呼び出す\n if (STATE_CONNECTED_CALLBACK_NAME in state) {\n await state[connectedCallbackSymbol]();\n }\n });\n }\n\n private async _initializeDCC(hostElement: Element, shadowRoot: ShadowRoot): Promise<void> {\n let state: IState;\n try {\n if (this.hasAttribute('src')) {\n const src = this.getAttribute('src')!;\n if (src.endsWith('.js')) {\n state = await loadFromScriptFile(src);\n } else {\n raiseError(`DCC: Unsupported src type: ${src}`);\n }\n } else {\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\n if (script) {\n state = await loadFromInnerScript(script, hostElement.tagName.toLowerCase());\n } else {\n raiseError(`DCC: No state source found for \"${hostElement.tagName.toLowerCase()}\".`);\n }\n }\n } catch (e) {\n raiseError(`DCC: Failed to load state: ${e}`);\n }\n defineDCC(hostElement, shadowRoot, state!);\n this._dcc = true;\n this._initialized = true;\n this._rootNode = null; // disconnectedCallbackでのstate参照を防止\n this._resolveInitialize?.();\n this._resolveConnectedCallback?.();\n }\n\n private _callStateDisconnectedCallback(): void {\n this.createState(\"writable\", (state) => {\n // stateに\"$disconnectedCallback\"があるか確認し、disconnectedCallbackAPIを呼び出す\n if (STATE_DISCONNECTED_CALLBACK_NAME in state) {\n state[disconnectedCallbackSymbol]();\n }\n });\n }\n\n async connectedCallback() {\n this._rootNode = this.getRootNode() as Node;\n // connect 世代を進めて冒頭で捕捉する(末尾の startStreams 前に照合し、\n // $connectedCallback の await 中に「切断 → 即再接続」された陳腐 connect の\n // 再開からの起動を防ぐ)。前回接続中の再 set(S13)で立った\n // _streamsStartedGeneration も世代不一致となり自然に無効化される。\n const connectGeneration = ++this._connectGeneration;\n if (!this._initialized) {\n // DCC 検出: ShadowRoot 内かつホストに data-wc-definition がある場合\n const parentNode = this.parentNode;\n if (parentNode instanceof ShadowRoot &&\n parentNode.host.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) {\n await this._initializeDCC(parentNode.host, parentNode);\n return;\n }\n await this._initializeBindWebComponent();\n await this._initialize();\n this._initialized = true;\n this._resolveInitialize?.();\n } else if (!this._dcc && getStateElementByName(this._rootNode, this._name) !== this) {\n // 再接続(disconnect で名前登録が解除された後の再 connect): 登録を復元する。\n // createState が rootNode 経由でこの要素を解決できるようにするために必要\n // ($connectedCallback の再実行と $streams の initial からの再起動が依存する、設計書 §2-3)。\n setStateElementByName(this._rootNode, this._name, this);\n }\n // enable-ssr (クライアント側): SSR で $connectedCallback 済みなのでスキップ\n // inSsr() (サーバー側): レンダリング中なので実行する\n if (!this.hasAttribute('enable-ssr') || inSsr()) {\n await this._callStateConnectedCallback();\n }\n\n // サーバーモード + enable-ssr: バインディング完了後に <wcs-ssr> を生成\n if (inSsr() && this.hasAttribute('enable-ssr')) {\n await getBindingsReady(this.rootNode);\n\n const name = this.getAttribute('name') || 'default';\n const stateData = Ssr.extractStateData(this);\n const ssrEl = document.createElement(config.tagNames.ssr);\n ssrEl.setAttribute('name', name);\n ssrEl.setAttribute('version', VERSION);\n Ssr.buildContent(ssrEl, stateData);\n this.parentNode?.insertBefore(ssrEl, this);\n }\n\n // $streams の eager 起動($connectedCallback 完了後、設計書 §2-3)。\n // inSsr() 時は起動しない(SSR 出力には initial が乗る、§7-1)。\n // enable-ssr のクライアント側は $connectedCallback をスキップしても起動する\n // (stream はシリアライズ不能なランタイム副作用のため)。\n // _rootNode ガード: $connectedCallback の await 中に切断された場合は起動しない。\n // ガードなしだと startStream 内の createState が rootNode 解決(disconnectedCallback\n // で null 化済み)の raiseError で throw し、connectedCallbackPromise が永遠に\n // 未解決になる。「未接続の entry は restart しない」設計書 §3-2 とも整合し、\n // _state セッター側の startStreams 前ガード(_rootNode !== null)と対称。\n // 世代ガード(connectGeneration 照合): await 中に「切断 → 即再接続」された場合、\n // 新 connect が _rootNode を再設定済みで上のガードを素通りするため、世代不一致で\n // 陳腐化した connect の再開を検出して skip する。起動点が新 connect の末尾に\n // 一本化され、「$connectedCallback 完了後に起動」(S1)の順序保証も保たれる。\n // _streamsStartedGeneration ガード: $connectedCallback 内の setInitialState\n // (接続中の再 set)で _state セッター側が新宣言を起動済みの場合は skip する\n // (skip しないと同一 connect サイクルで source が 2 回起動する、設計書 §2-3)。\n if (\n !inSsr() &&\n this._rootNode !== null &&\n connectGeneration === this._connectGeneration &&\n this._streamsStartedGeneration !== connectGeneration\n ) {\n startStreams(this);\n }\n\n this._resolveConnectedCallback?.();\n }\n\n disconnectedCallback() {\n if (this._rootNode !== null) {\n // try/finally: ユーザーの $disconnectedCallback が throw しても後続の後始末を\n // 必ず実行する。特に abortAllStreams が飛ぶと stream が消費を続け(ゾンビ I/O)、\n // activeStateElements の強参照残留で GC が妨げられ、切断済み要素が依存駆動\n // restart の対象にも残る(設計書 §3-2 / §5-1 違反)。throw 自体は従来どおり\n // 呼び出し元へ伝播させる(変わるのは後始末の保証のみ)。\n try {\n this._callStateDisconnectedCallback();\n } finally {\n setStateElementByName(this.rootNode, this._name, null);\n clearCommandTokenRegistry(this);\n clearCommandNamespace(this);\n clearEventTokenRegistry(this);\n // stream は abort のみで registry は保持する(再接続時に同じ宣言から\n // initial で再起動できる、設計書 §5-1 / §5-2)。\n // namespace proxy の memo は破棄する(clearCommandNamespace と対称。\n // registry は残るため再接続後の初回アクセスで同内容の proxy が再生成される)。\n abortAllStreams(this);\n clearStreamNamespace(this);\n this._rootNode = null;\n }\n }\n }\n\n get initializePromise(): Promise<void> {\n return this._initializePromise;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get listPaths(): Set<string> {\n return this._listPaths;\n }\n\n get elementPaths(): Set<string> {\n return this._elementPaths;\n }\n\n get getterPaths(): Set<string> {\n return this._getterPaths;\n }\n\n get setterPaths(): Set<string> {\n return this._setterPaths;\n }\n\n get loopContextStack(): ILoopContextStack {\n return this._loopContextStack;\n }\n\n get dynamicDependency(): Map<string, string[]> {\n return this._dynamicDependency;\n }\n\n get staticDependency(): Map<string, string[]> {\n return this._staticDependency;\n }\n\n get version(): number {\n return this._version;\n }\n\n get rootNode(): Node {\n if (this._rootNode === null) {\n raiseError('State rootNode is not available.');\n }\n return this._rootNode;\n }\n\n get boundComponentStateProp(): string | null {\n return this._boundComponentStateProp;\n }\n\n get bindableEventMap(): Record<string, string> {\n return this._bindableEventMap;\n }\n\n get commandTokenNames(): ReadonlySet<string> {\n return this._commandTokenNames;\n }\n\n get eventTokenNames(): ReadonlySet<string> {\n return this._eventTokenNames;\n }\n\n setBindableEventMap(map: Record<string, string>): void {\n this._bindableEventMap = map;\n }\n\n private _addDependency(\n map: Map<string, string[]>,\n sourcePath: string,\n targetPath: string\n ): boolean {\n const deps = map.get(sourcePath);\n if (deps === undefined) {\n map.set(sourcePath, [targetPath]);\n return true;\n } else if (!deps.includes(targetPath)) {\n deps.push(targetPath);\n return true;\n }\n return false;\n }\n\n /**\n * source, target\n *\n * products.*.price => products.*.tax\n * get \"products.*.tax\"() { return this[\"products.*.price\"] * 0.1; }\n *\n * products.*.price => products.summary\n * get \"products.summary\"() { return this.$getAll(\"products.*.price\", []).reduce(sum); }\n *\n * categories.*.name => categories.*.products.*.categoryName\n * get \"categories.*.products.*.categoryName\"() { return this[\"categories.*.name\"]; }\n *\n * @param sourcePath\n * @param targetPath\n */\n addDynamicDependency(sourcePath: string, targetPath: string): boolean {\n return this._addDependency(this._dynamicDependency, sourcePath, targetPath);\n }\n\n /**\n * source, target\n * products => products.*\n * products.* => products.*.price\n * products.* => products.*.name\n *\n * @param sourcePath\n * @param targetPath\n */\n addStaticDependency(sourcePath: string, targetPath: string): boolean {\n return this._addDependency(this._staticDependency, sourcePath, targetPath);\n }\n\n setPathInfo(path: string, bindingType: BindingType): void {\n if (bindingType === \"for\") {\n this._listPaths.add(path);\n this._elementPaths.add(path + '.' + WILDCARD);\n }\n if (!this._pathSet.has(path)) {\n const pathInfo = getPathInfo(path);\n this._pathSet.add(path);\n if (pathInfo.parentPath !== null) {\n let currentPathInfo = pathInfo;\n while(currentPathInfo.parentPath !== null) {\n if (!this.addStaticDependency(currentPathInfo.parentPath, currentPathInfo.path)) {\n break;\n }\n currentPathInfo = getPathInfo(currentPathInfo.parentPath);\n }\n }\n }\n }\n\n private _createState<T>(rootNode: Node, mutability: Mutability, callback: (state: IStateProxy) => T): T {\n try {\n const stateProxy = createStateProxy(rootNode, this._state, this._name, mutability);\n return callback(stateProxy);\n } finally {\n // cleanup if needed\n }\n }\n\n async createStateAsync(mutability: Mutability, callback: (state: IStateProxy) => Promise<void>): Promise<void> {\n return await this._createState(this.rootNode, mutability, callback);\n }\n\n createState(mutability: Mutability, callback: (state: IStateProxy) => void): void {\n this._createState(this.rootNode, mutability, callback);\n }\n\n nextVersion(): number {\n this._version++;\n return this._version;\n }\n\n get hasUpdatedCallback(): boolean {\n return this._hasUpdatedCallback;\n }\n\n get crossRowListPaths(): ReadonlySet<string> {\n return this._crossRowListPaths;\n }\n\n addCrossRowListPath(path: string): void {\n this._crossRowListPaths.add(path);\n }\n\n get indexDependentGetterPaths(): ReadonlySet<string> {\n return this._indexDependentGetterPaths;\n }\n\n addIndexDependentGetterPath(path: string): void {\n this._indexDependentGetterPaths.add(path);\n }\n\n bindProperty(prop: string, desc: PropertyDescriptor): void {\n Object.defineProperty(this._state, prop, desc);\n if (prop === STATE_UPDATED_CALLBACK_NAME) {\n this._hasUpdatedCallback = true;\n }\n }\n\n setInitialState(state: Record<string, any>): void {\n if (!this._initialized) {\n this._resolveSetState?.(state);\n } else {\n this._state = state;\n }\n }\n}\n","/**\n * `$commandTokens: [\"a\", \"b\", ...]` 配列宣言を解析し、宣言された名前群を Set で返す。\n *\n * 注入は行わず、proxy 側で `state.$command.<name>` として token を解決する設計。\n * (以前の実装は state 直下に各名前の getter を注入していたが、リアクティブ値との\n * 名前空間衝突を避け識別性を上げるため `$command` ネームスペース集約に切り替え。)\n *\n * 対応している宣言形式は **オブジェクトリテラル** のみ。\n * クラス本体に `static $commandTokens = [...]` を書く形式や、\n * クラスのプロトタイプ上の同名コマンドの検出は現状サポートしない。\n */\n\nimport { STATE_COMMAND_NAMESPACE_NAME, STATE_COMMAND_TOKENS_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport function processCommandTokensDeclaration(state: IState): Set<string> {\n const names = new Set<string>();\n const declared = (state as Record<string, unknown>)[STATE_COMMAND_TOKENS_NAME];\n if (typeof declared === \"undefined\") {\n return names;\n }\n if (!Array.isArray(declared)) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} must be an array of strings.`);\n }\n for (const name of declared) {\n if (typeof name !== \"string\" || name.length === 0) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entries must be non-empty strings.`);\n }\n if (name === STATE_COMMAND_NAMESPACE_NAME) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entry \"${name}\" conflicts with the reserved namespace name \"${STATE_COMMAND_NAMESPACE_NAME}\".`);\n }\n if (names.has(name)) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entry \"${name}\" is duplicated.`);\n }\n names.add(name);\n }\n return names;\n}\n","/**\n * `$eventTokens: [\"a\", \"b\", ...]` 配列宣言を解析し、宣言された名前群を Set で返す。\n *\n * event-token は command-token の双対(element→state 方向)。要素が dispatch する\n * イベントを `eventToken.<prop>: <name>` で token に流し、state 側は `$on` マップで受ける。\n * ここで宣言された名前のみが `eventToken.X` / `$on` の有効なチャネル名になる(typo 耐性)。\n *\n * 対応している宣言形式は **オブジェクトリテラル** のみ。\n */\n\nimport { STATE_EVENT_TOKENS_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport function processEventTokensDeclaration(state: IState): Set<string> {\n const names = new Set<string>();\n const declared = (state as Record<string, unknown>)[STATE_EVENT_TOKENS_NAME];\n if (typeof declared === \"undefined\") {\n return names;\n }\n if (!Array.isArray(declared)) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} must be an array of strings.`);\n }\n for (const name of declared) {\n if (typeof name !== \"string\" || name.length === 0) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} entries must be non-empty strings.`);\n }\n if (names.has(name)) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} entry \"${name}\" is duplicated.`);\n }\n names.add(name);\n }\n return names;\n}\n","/**\n * `$on: { <name>: (state, event, ...listIndexes) => {...} }` マップを解析し、\n * 各ハンドラを対応する event-token に subscribe する(state 側の受信配線)。\n *\n * - `$on` のキーは `$eventTokens` で宣言済みでなければならない(typo 耐性)。\n * - 各値は関数でなければならない。\n * - 引数規約は `(state, event, ...listIndexes)`。`this` 束縛は行わず引数で state を渡すため\n * アロー関数で書ける(command-token の emit 規約と対称)。\n *\n * `$eventTokens` で宣言されたが `$on` に対応が無い token は subscriber ゼロ(emit は no-op)。\n */\n\nimport { IStateElement } from \"../components/types\";\nimport { STATE_ON_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\nimport { TokenSubscriber } from \"../token/Token\";\nimport { getOrCreateEventToken } from \"./eventTokenRegistry\";\n\nexport function processOnDeclaration(\n stateElement: IStateElement,\n state: IState,\n eventTokenNames: ReadonlySet<string>,\n): void {\n const declared = (state as Record<string, unknown>)[STATE_ON_NAME];\n if (typeof declared === \"undefined\") {\n return;\n }\n if (typeof declared !== \"object\" || declared === null) {\n raiseError(`${STATE_ON_NAME} must be an object mapping event-token names to handler functions.`);\n }\n for (const [name, handler] of Object.entries(declared as Record<string, unknown>)) {\n if (!eventTokenNames.has(name)) {\n raiseError(`${STATE_ON_NAME} entry \"${name}\" is not declared in $eventTokens.`);\n }\n if (typeof handler !== \"function\") {\n raiseError(`${STATE_ON_NAME} entry \"${name}\" must be a function.`);\n }\n const token = getOrCreateEventToken(stateElement, name);\n token.subscribe(handler as TokenSubscriber);\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\n\nexport function loadFromScriptJson(id: string): IState {\n const script = document.getElementById(id) as HTMLScriptElement;\n if (script && script.type === 'application/json') {\n try {\n const data = JSON.parse(script.textContent || '{}');\n return data;\n } catch (e) {\n raiseError('Failed to parse JSON from script element:' + e);\n }\n }\n return {};\n}","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport async function loadFromJsonFile(url: string): Promise<IState> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n raiseError(`Failed to fetch JSON file: ${response.statusText}`);\n }\n const data = await response.json();\n return data;\n } catch (e) {\n console.error('Failed to load JSON file:', e);\n return {};\n }\n}","import { IState } from \"../types\";\nimport { DCC_DEFINITION_ATTRIBUTE, STATE_BINDABLES_NAME } from \"../define\";\nimport { config } from \"../config\";\nimport { raiseError } from \"../raiseError\";\nimport { getterFn, setterFn, callFn, isInternalProperty } from \"./dccPropertyFactories\";\nimport { createWcBindable, createBindableEventMap, IWcBindable } from \"./wcBindable\";\nimport { State } from \"../components/State\";\n\nexport function defineDCC(hostElement: Element, shadowRoot: ShadowRoot, state: IState): void {\n const tagName = hostElement.tagName.toLowerCase();\n\n // バリデーション\n if (!tagName.includes(\"-\")) {\n raiseError(`DCC: \"${tagName}\" is not a valid custom element name (must contain a hyphen).`);\n }\n if (customElements.get(tagName)) {\n // 既に登録済みならスキップ(重複定義の検知のため警告は出す)\n console.warn(`[@wcstack/state] DCC: \"${tagName}\" is already registered. Skipping redefinition.`);\n return;\n }\n\n // ShadowRoot は cloneNode 不可のため、template 経由で内容をクローン\n const template = document.createElement(\"template\");\n template.innerHTML = shadowRoot.innerHTML;\n const shadowRootMode = shadowRoot.mode as ShadowRootMode;\n\n // $bindables から wcBindable + bindableEventMap を生成\n const bindables: string[] = Array.isArray(state[STATE_BINDABLES_NAME])\n ? state[STATE_BINDABLES_NAME]\n : [];\n const wcBindable: IWcBindable | null = bindables.length > 0\n ? createWcBindable(tagName, bindables)\n : null;\n const bindableEventMap: Record<string, string> = bindables.length > 0\n ? createBindableEventMap(tagName, bindables)\n : {};\n\n // DCC クラス生成\n const stateTagSelector = `${config.tagNames.state}:not([name])` as const;\n\n const DCCElement = class extends HTMLElement {\n static template = template;\n static shadowRootMode = shadowRootMode;\n static wcBindable = wcBindable;\n static bindableEventMap = bindableEventMap;\n\n private _shadow: ShadowRoot | null = null;\n\n connectedCallback() {\n if (this.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) return;\n this._shadow = this.attachShadow({ mode: DCCElement.shadowRootMode });\n this._shadow.appendChild(DCCElement.template.content.cloneNode(true));\n\n // bindableEventMap の設定\n if (Object.keys(DCCElement.bindableEventMap).length > 0) {\n const stateEl = this._shadow.querySelector(stateTagSelector) as State | null;\n if (stateEl) {\n stateEl.initializePromise.then(() => {\n stateEl.setBindableEventMap(DCCElement.bindableEventMap);\n });\n }\n }\n }\n\n get stateElement() {\n return this._shadow?.querySelector(stateTagSelector) as State | null;\n }\n };\n\n // state プロパティを走査して DCC クラスのプロトタイプにgetter/setter/methodを定義\n const descriptors = Object.getOwnPropertyDescriptors(state);\n for (const [name, desc] of Object.entries(descriptors)) {\n if (isInternalProperty(name)) continue;\n\n const newDesc: PropertyDescriptor = { configurable: true, enumerable: true };\n if (typeof desc.value === \"function\") {\n const isAsync = desc.value.constructor?.name === \"AsyncFunction\";\n newDesc.value = callFn(name, isAsync);\n } else {\n newDesc.get = getterFn(name);\n newDesc.set = setterFn(name);\n }\n Object.defineProperty(DCCElement.prototype, name, newDesc);\n }\n\n // カスタム要素登録\n customElements.define(tagName, DCCElement);\n}\n","// wc-bindable protocol manifest types — single source of truth in /protocol/wc-bindable.ts.\nexport type {\n IWcBindable, IWcBindableProperty, IWcBindableInput, IWcBindableCommand,\n} from \"../protocol/wcBindable.js\";\n// This module also uses the types in its runtime helpers below, so import them into scope.\nimport type { IWcBindable, IWcBindableInput, IWcBindableProperty } from \"../protocol/wcBindable.js\";\n\nexport function createWcBindable(tagName: string, bindables: string[]): IWcBindable {\n const properties: IWcBindableProperty[] = bindables.map((propName) => ({\n name: propName,\n event: `${tagName}:${propName}-changed`,\n }));\n // Every $bindables member gets both a getter and a setter on the DCC prototype,\n // so declare it in inputs as well — a property declared only in `properties` is\n // output-only under directional initial sync, which would permanently block\n // parent-state → DCC writes.\n const inputs: IWcBindableInput[] = bindables.map((propName) => ({\n name: propName,\n }));\n return {\n protocol: \"wc-bindable\",\n version: 1,\n properties,\n inputs,\n };\n}\n\nexport function createBindableEventMap(tagName: string, bindables: string[]): Record<string, string> {\n const map: Record<string, string> = {};\n for (const propName of bindables) {\n map[propName] = `${tagName}:${propName}-changed`;\n }\n return map;\n}\n","import { Ssr } from \"./components/Ssr\";\nimport { State } from \"./components/State\";\nimport { config } from \"./config\";\n\nexport function registerComponents() {\n if (!customElements.get(config.tagNames.ssr)) {\n customElements.define(config.tagNames.ssr, Ssr);\n }\n if (!customElements.get(config.tagNames.state)) {\n customElements.define(config.tagNames.state, State);\n }\n}\n","import { setConfig } from \"./config\";\nimport { registerDevtoolsSource } from \"./devtools/bridge\";\nimport { registerComponents } from \"./registerComponents\";\nimport { IWritableConfig } from \"./types\";\n\nexport function bootstrapState(config?: IWritableConfig): void {\n if (config) {\n setConfig(config);\n }\n registerComponents();\n // DevTools Hook Protocol への source 登録(SSR では no-op・冪等)\n registerDevtoolsSource();\n}","/**\n * defineState.ts\n *\n * 状態オブジェクトに型付けを提供するためのユーティリティ。\n * defineState() はアイデンティティ関数で、ThisType<> を付与することで\n * メソッド・computed getter 内の this に型補完を提供する。\n *\n * テンプレートリテラル型によるドットパスの型解決:\n * - WcsPaths<T> : T から生成される全ドットパスの union\n * - WcsPathValue<T,P>: パス P に対応する値の型\n * - WcsPathAccessor<T>: ブラケットアクセス用マップ型\n */\n\n// ============================================================\n// Internal helper types\n// ============================================================\n\n/**\n * `any` 型を検出する。\n * `0 extends (1 & T)` は T が `any` の場合のみ true になる。\n */\ntype IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/**\n * T がドットパス再帰の対象となる「プレーンなデータオブジェクト」かどうかを判定する。\n * プリミティブ、組み込みオブジェクト (Date, Map 等)、関数、配列、any は除外。\n */\ntype IsPlainObject<T> =\n IsAny<T> extends true ? false :\n T extends\n | string | number | boolean | null | undefined | symbol | bigint\n | ((...args: any[]) => any) | Date | RegExp | Error\n | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any>\n | Promise<any> | readonly any[]\n ? false\n : T extends Record<string, any>\n ? true\n : false;\n\n/**\n * T のキーのうち、関数でないもの(データプロパティ・computed getter)を抽出する。\n * メソッド(イベントハンドラ等)はドットパスの対象外。\n * `$` プレフィックスキー($streams / $commandTokens / $on 等の予約宣言)もドットパスにならない。\n * any 型のプロパティは除外せず保持する。\n */\ntype DataKeys<T> = {\n [K in keyof T & string]:\n K extends `$${string}` ? never :\n IsAny<T[K]> extends true ? K : T[K] extends (...args: any[]) => any ? never : K;\n}[keyof T & string];\n\n// ============================================================\n// WcsPaths — ドットパスの union 生成\n// ============================================================\n\n/**\n * 型 T から生成される全てのドットパスの union。\n * 配列プロパティはワイルドカード `*` を使用: `items.*.name`\n *\n * 再帰の深さは最大4レベルに制限(コンパイル性能の確保)。\n *\n * @example\n * ```ts\n * type S = {\n * count: number;\n * users: { name: string; age: number }[];\n * cart: { items: { price: number }[] };\n * };\n * type P = WcsPaths<S>;\n * // = \"count\" | \"users\" | \"users.*\" | \"users.*.name\" | \"users.*.age\"\n * // | \"cart\" | \"cart.items\" | \"cart.items.*\" | \"cart.items.*.price\"\n * ```\n */\nexport type WcsPaths<T, Depth extends readonly any[] = []> =\n Depth[\"length\"] extends 4 ? never :\n {\n [K in DataKeys<T>]:\n | K\n | (T[K] extends readonly (infer E)[]\n ? IsPlainObject<E> extends true\n ? `${K}.*` | WcsSubPaths<E, `${K}.*.`, [...Depth, 0]>\n : `${K}.*`\n : IsPlainObject<T[K]> extends true\n ? WcsSubPaths<T[K], `${K}.`, [...Depth, 0]>\n : never)\n }[DataKeys<T>];\n\n/** @internal プレフィックス付きサブパスの生成ヘルパー */\ntype WcsSubPaths<T, Prefix extends string, Depth extends readonly any[]> =\n WcsPaths<T, Depth> extends infer P extends string\n ? `${Prefix}${P}`\n : never;\n\n// ============================================================\n// WcsPathValue — パスから値の型を解決\n// ============================================================\n\n/**\n * ドットパス P に対応する値の型を T から解決する。\n *\n * 解決順序:\n * 1. T の直接キー(computed getter 含む)\n * 2. `K.*` → 配列要素型\n * 3. `K.rest` → オブジェクト/配列のネストを再帰的に辿る\n *\n * @example\n * ```ts\n * type S = { cart: { items: { price: number; qty: number }[] } };\n * type V1 = WcsPathValue<S, \"cart.items.*.price\">; // number\n * type V2 = WcsPathValue<S, \"cart.items.*\">; // { price: number; qty: number }\n * type V3 = WcsPathValue<S, \"cart\">; // { items: ... }\n * ```\n */\nexport type WcsPathValue<T, P extends string> =\n // 1. Direct key (includes computed getters like \"users.*.ageCategory\")\n P extends keyof T\n ? T[P]\n // 2. K.* → array element type\n : P extends `${infer K}.*`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[] ? E : never\n : never\n // 3. K.rest → recurse into nested structure\n : P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[]\n // Array: expect *.subpath or *\n ? Rest extends `*.${infer SubRest}`\n ? WcsPathValue<E, SubRest>\n : Rest extends \"*\"\n ? E\n : never\n // Object: recurse\n : T[K] extends Record<string, any>\n ? WcsPathValue<T[K], Rest>\n : never\n : never\n : never;\n\n// ============================================================\n// WcsPathAccessor — ブラケットアクセス用マップ型\n// ============================================================\n\n/**\n * 全ドットパスに対する型付きブラケットアクセスを提供するマップ型。\n *\n * `this[\"users.*.name\"]` のようなアクセスに対して、\n * WcsPaths で生成されたパスに対応する値の型を返す。\n */\ntype WcsPathAccessor<T> = {\n [P in WcsPaths<T>]: WcsPathValue<T, P>;\n};\n\n// ============================================================\n// State Proxy API — this 経由でアクセスできるAPI\n// ============================================================\n\n/**\n * `<wcs-state>` の Proxy 経由で提供されるAPIメソッド。\n * state定義オブジェクト内のメソッド・getter で `this.` 経由で利用可能。\n */\nexport interface WcsStateApi {\n /**\n * ワイルドカードを含むパスにマッチする全要素を配列で取得する。\n *\n * @param path - ワイルドカードを含むパス\n * @param indexes - 各ワイルドカード階層のインデックス(省略時はループコンテキストから解決)\n *\n * @example\n * ```ts\n * get \"cart.totalPrice\"() {\n * return this.$getAll(\"cart.items.*.price\").reduce((sum, v) => sum + v, 0);\n * }\n * ```\n */\n $getAll<V = any>(path: string, indexes?: number[]): V[];\n\n /**\n * 指定パスの更新を手動でトリガーする。\n * Proxy の set トラップを経由せずに内部状態を変更した場合に使用。\n */\n $postUpdate(path: string): void;\n\n /**\n * パスとインデックス配列を指定して、ワイルドカードを解決した値を取得・設定する。\n *\n * @param path - ワイルドカードを含むパス\n * @param indexes - 各ワイルドカード階層のインデックス\n * @param value - 設定する値(省略時は取得)\n */\n $resolve(path: string, indexes: number[], value?: any): any;\n\n /**\n * 指定パスへの依存関係を明示的に登録する。\n * computed getter 内で動的にパスを組み立てる場合に使用。\n */\n $trackDependency(path: string): void;\n\n /**\n * コールバック実行中の依存追跡(動的依存・`$1` インデックス依存の登録)を\n * 抑止して fn を実行し、その戻り値を返す(`$trackDependency` と対称)。\n * リスト行 getter が「行外の単一値」を読みたいが、その値の変更で全行を\n * 再評価させたくない場合に使う(該当行へ直接書き込む設計と組で用いる)。\n */\n $untrackDependency<T>(fn: () => T): T;\n\n /** `<wcs-state>` 要素への参照 */\n readonly $stateElement: HTMLElement;\n\n /**\n * `$commandTokens` で宣言した command token の名前空間。\n * `this.$command.<name>` で token を解決できる(バインディングでは\n * `onclick: $command.<name>` / `command.<method>: $command.<name>`)。\n */\n readonly $command: Record<string, { emit(...args: any[]): any }>;\n\n /** `$streams` 各エントリの状態(\"idle\" | \"active\" | \"done\" | \"error\")を返す読み取り専用名前空間 */\n readonly $streamStatus: Record<string, \"idle\" | \"active\" | \"done\" | \"error\">;\n\n /** `$streams` 各エントリの直近エラーを返す読み取り専用名前空間 */\n readonly $streamError: Record<string, unknown>;\n\n // computed getter 内での依存追跡付き読み取りの正規形は dotted パス\n // (`this[\"$streamStatus.<name>\"]` — docs/state-streams-design.md §4-3)\n readonly [key: `$streamStatus.${string}`]: \"idle\" | \"active\" | \"done\" | \"error\";\n readonly [key: `$streamError.${string}`]: unknown;\n\n // ループインデックス変数 ($1〜$9)\n // for テンプレート内のイベントハンドラで、ネストされたループの\n // 各階層のインデックスにアクセスするために使用。\n // (ランタイムは $1〜$128 まで解決するが、型宣言は実用域の $9 までとする)\n readonly $1: number;\n readonly $2: number;\n readonly $3: number;\n readonly $4: number;\n readonly $5: number;\n readonly $6: number;\n readonly $7: number;\n readonly $8: number;\n readonly $9: number;\n}\n\n// ============================================================\n// WcsThis — state メソッド/getter 内の this の型\n// ============================================================\n\n/**\n * state定義オブジェクト内の `this` の型。\n *\n * - `T` のプロパティに型付きでアクセス可能(直接キー)\n * - `WcsPathAccessor<T>` によるネストされたドットパスの型付きアクセス\n * - `WcsStateApi` のメソッド ($getAll, $postUpdate 等) にアクセス可能\n * - 動的パス (`this[\\`items.${i}.name\\`]`) は型チェック対象外(キャストが必要)\n *\n * @example\n * ```ts\n * defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n * increment() {\n * this.count++; // number\n * this[\"users.*.name\"]; // string (パス型解決)\n * this.$getAll(\"users.*.age\"); // API\n * }\n * });\n * ```\n */\nexport type WcsThis<T> = T & WcsStateApi & WcsPathAccessor<T>;\n\n// ============================================================\n// defineState — 型付き状態定義関数\n// ============================================================\n\n/**\n * `<wcs-state>` 用の型付き状態オブジェクトを定義する。\n *\n * ランタイムではアイデンティティ関数(引数をそのまま返す)として動作し、\n * コストはゼロ。TypeScript の `ThisType<>` を利用して、メソッド・getter 内の\n * `this` に型補完を提供する。\n *\n * ### 基本的な使い方 (TypeScript)\n * ```ts\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n *\n * increment() {\n * this.count++; // ✅ number\n * this[\"users.*.name\"]; // ✅ string (ドットパス型解決)\n * },\n *\n * get \"users.*.ageCategory\"() {\n * return this[\"users.*.age\"] < 25 ? \"Young\" : \"Adult\";\n * }\n * });\n * ```\n *\n * ### JavaScript (JSDoc)\n * ```js\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * increment() {\n * this.count++; // ✅ JSDoc + tsconfig checkJs で型補完\n * }\n * });\n * ```\n *\n * ### HTML インラインスクリプト\n * ```html\n * <wcs-state>\n * <script type=\"module\">\n * import { defineState } from '@wcstack/state';\n * export default defineState({\n * count: 0,\n * increment() { this.count++; }\n * });\n * </script>\n * </wcs-state>\n * ```\n *\n * ### ライフサイクルコールバック\n * ```ts\n * export default defineState({\n * data: null,\n * async $connectedCallback() {\n * this.data = await fetch('/api/data').then(r => r.json());\n * },\n * $disconnectedCallback() {\n * // cleanup\n * },\n * $updatedCallback() {\n * // called after DOM update\n * }\n * });\n * ```\n */\nexport function defineState<T extends Record<string, any>>(\n definition: T & ThisType<WcsThis<T>>\n): T {\n return definition;\n}\n","/**\n * filterMeta.ts — 組み込みフィルタの構造化メタデータ(単一正本・route-a A2-1)。\n *\n * これまで vscode-wcs(completionData.ts BUILTIN_FILTERS)が手で持っていたフィルタの\n * 引数仕様・型・説明を、実装側(@wcstack/state)に**正本として移設**したもの。\n * manifest.ts がこれを公開し、vscode-wcs はそれを消費して手リストを撤去できる。\n *\n * 完全性は __tests__/manifest.test.ts のドリフト検出が保証する\n * (filterMeta のキー集合 == builtinFilters のキー集合)。フィルタを追加して meta を\n * 書き忘れると CI が落ちる。\n */\n\nexport type FilterResultType = \"boolean\" | \"number\" | \"string\" | \"passthrough\";\nexport type FilterArgType = \"number\" | \"string\" | \"any\";\n\nexport interface IFilterMeta {\n /** 説明(補完・ホバー用) */\n description: string;\n /** 引数を取るか */\n hasArgs: boolean;\n /** 適用後の結果型(passthrough は入力型をそのまま返す) */\n resultType: FilterResultType;\n /** 受け入れ可能な入力型('any' は任意) */\n acceptTypes: \"any\" | readonly string[];\n /** 引数の最小数 */\n minArgs: number;\n /** 引数の最大数 */\n maxArgs: number;\n /** 各引数の期待型(省略時はチェックしない) */\n argTypes?: readonly FilterArgType[];\n}\n\n/** 組み込みフィルタ名 → 構造化メタデータ。キー集合は builtinFilters と一致しなければならない。 */\nexport const builtinFilterMeta: Record<string, IFilterMeta> = {\n // 比較・論理\n eq: { description: \"等しいか比較\", hasArgs: true, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 1, maxArgs: 1, argTypes: [\"any\"] },\n ne: { description: \"異なるか比較\", hasArgs: true, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 1, maxArgs: 1, argTypes: [\"any\"] },\n not: { description: \"ブール値を反転\", hasArgs: false, resultType: \"boolean\", acceptTypes: [\"boolean\"], minArgs: 0, maxArgs: 0 },\n lt: { description: \"より小さいか\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n le: { description: \"以下か\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n gt: { description: \"より大きいか\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n ge: { description: \"以上か\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n // 算術\n inc: { description: \"加算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n dec: { description: \"減算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n mul: { description: \"乗算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n div: { description: \"除算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n mod: { description: \"剰余\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n // 数値フォーマット\n fix: { description: \"固定小数点表記\", hasArgs: true, resultType: \"string\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n locale: { description: \"ロケール形式で数値フォーマット\", hasArgs: true, resultType: \"string\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"string\"] },\n // 文字列\n uc: { description: \"大文字に変換\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n lc: { description: \"小文字に変換\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n cap: { description: \"先頭文字を大文字に\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n trim: { description: \"前後の空白を削除\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n slice: { description: \"部分文字列 (start[,end])\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 2, argTypes: [\"number\", \"number\"] },\n substr: { description: \"部分文字列 (pos,len)\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 2, argTypes: [\"number\", \"number\"] },\n pad: { description: \"パディング (length[,char])\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 2, argTypes: [\"number\", \"string\"] },\n rep: { description: \"繰り返し (count)\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n rev: { description: \"文字順を反転\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n // 数値パース・丸め\n int: { description: \"整数にパース\", hasArgs: false, resultType: \"number\", acceptTypes: [\"string\", \"number\"], minArgs: 0, maxArgs: 0 },\n float: { description: \"浮動小数点数にパース\", hasArgs: false, resultType: \"number\", acceptTypes: [\"string\", \"number\"], minArgs: 0, maxArgs: 0 },\n round: { description: \"四捨五入\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n floor: { description: \"切り下げ\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n ceil: { description: \"切り上げ\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n percent: { description: \"パーセンテージ形式\", hasArgs: true, resultType: \"string\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n // 日付・時刻\n date: { description: \"ロケール形式の日付\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n time: { description: \"ロケール形式の時刻\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n datetime: { description: \"ロケール形式の日時\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n ymd: { description: \"YYYY-MM-DD 形式\", hasArgs: true, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 1, argTypes: [\"string\"] },\n // 真偽値・変換\n falsy: { description: \"偽値か判定\", hasArgs: false, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n truthy: { description: \"真値か判定\", hasArgs: false, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n defaults: { description: \"偽値の場合デフォルト値\", hasArgs: true, resultType: \"passthrough\", acceptTypes: \"any\", minArgs: 1, maxArgs: 1, argTypes: [\"any\"] },\n boolean: { description: \"ブール値に変換\", hasArgs: false, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n number: { description: \"数値に変換\", hasArgs: false, resultType: \"number\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n string: { description: \"文字列に変換\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n null: { description: \"空文字列をnullに変換\", hasArgs: false, resultType: \"passthrough\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n};\n","/**\n * manifest.ts — `<wcs-state>` の構文・フィルタ・予約名を機械可読な単一正本として公開する。\n *\n * 目的(route-a A2-1): vscode-wcs(wcstack-intellisense)が現在ハードコードで二重実装している\n * 「フィルタ一覧・構文区切り・予約名」を、state 側の実装から導出した manifest に一本化し、\n * 手作業同期によるドリフトを構造的に断つための土台。\n *\n * 設計:\n * - `filters` は実装(builtinFilters の Record キー)から **自動導出**=実装が唯一の正本。\n * - 構文・予約名は config / define.ts の定数から導出。\n * - 将来 `dist/wcs-manifest.json` としてビルド時に書き出し、vscode-wcs がそれを読む形に発展させる。\n * - ドリフト検出テスト(__tests__/manifest.test.ts)が、フィルタ集合の golden と実装の一致を CI で保証する。\n */\nimport { config } from \"./config.js\";\nimport { outputBuiltinFilters } from \"./filters/builtinFilters.js\";\nimport { builtinFilterMeta, IFilterMeta } from \"./filters/filterMeta.js\";\nimport { STRUCTURAL_BINDING_TYPE_SET } from \"./structural/define.js\";\nimport {\n DELIMITER,\n WILDCARD,\n BINDING_SEPARATOR,\n PROP_VALUE_SEPARATOR,\n MODIFIER_SEPARATOR,\n STATE_NAME_SEPARATOR,\n FILTER_SEPARATOR,\n STATE_CONNECTED_CALLBACK_NAME,\n STATE_DISCONNECTED_CALLBACK_NAME,\n STATE_UPDATED_CALLBACK_NAME,\n WEBCOMPONENT_STATE_READY_CALLBACK_NAME,\n STATE_BINDABLES_NAME,\n STATE_COMMAND_TOKENS_NAME,\n STATE_COMMAND_NAMESPACE_NAME,\n STATE_EVENT_TOKENS_NAME,\n STATE_ON_NAME,\n STATE_STREAMS_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n} from \"./define.js\";\n\n// 消費側(vscode-wcs 等)が `@wcstack/state/manifest` から正本を直接引けるよう再エクスポート。\nexport { builtinFilterMeta } from \"./filters/filterMeta.js\";\nexport type { IFilterMeta, FilterResultType, FilterArgType } from \"./filters/filterMeta.js\";\nexport { STRUCTURAL_BINDING_TYPE_SET } from \"./structural/define.js\";\n\n/** マニフェストのバージョン(構造を変えたら上げる)。 */\nexport const WCS_MANIFEST_VERSION = 1;\n\nexport interface IWcsManifest {\n version: number;\n syntax: {\n /** バインド属性名(既定 data-wcs) */\n bindAttribute: string;\n /** タグ名(既定 wcs-state) */\n tagName: string;\n /** パス区切り(`.`) */\n pathDelimiter: string;\n /** ワイルドカード(`*`) */\n wildcard: string;\n /** バインディング構文 `[prop][#mod]: [path][@state][|filter...]` の区切り文字 */\n delimiters: {\n binding: string; // ; 複数バインディングの区切り\n propValue: string; // : prop と path の区切り\n modifier: string; // # prop と修飾子の区切り\n stateName: string; // @ path と stateName の区切り\n filter: string; // | フィルタパイプの区切り\n };\n /** 構造ディレクティブ(`<template data-wcs=\"for: ...\">` 等) */\n structuralDirectives: readonly string[];\n };\n /** 組み込みフィルタ名(builtinFilters から自動導出=実装が正本) */\n filters: string[];\n /** 組み込みフィルタの構造化メタデータ(説明・引数仕様・型)。vscode-wcs の手リスト撤去用。 */\n filterMeta: Record<string, IFilterMeta>;\n /** 予約ライフサイクルフック名 */\n reservedLifecycle: readonly string[];\n /** 予約 state API(プロトコル系の `$` 名前空間) */\n reservedStateApi: readonly string[];\n}\n\n/** 機械可読な単一正本を返す。vscode-wcs はこれを消費する想定。 */\nexport function getWcsManifest(): IWcsManifest {\n return {\n version: WCS_MANIFEST_VERSION,\n syntax: {\n bindAttribute: config.bindAttributeName,\n tagName: config.tagNames.state,\n pathDelimiter: DELIMITER,\n wildcard: WILDCARD,\n delimiters: {\n binding: BINDING_SEPARATOR,\n propValue: PROP_VALUE_SEPARATOR,\n modifier: MODIFIER_SEPARATOR,\n stateName: STATE_NAME_SEPARATOR,\n filter: FILTER_SEPARATOR,\n },\n // 正本 STRUCTURAL_BINDING_TYPE_SET から導出(手書きの二重定義を排除)。\n structuralDirectives: Array.from(STRUCTURAL_BINDING_TYPE_SET),\n },\n // 実装(Record のキー)から自動導出。手リストを持たない=ドリフトの構造的排除。\n filters: Object.keys(outputBuiltinFilters),\n filterMeta: builtinFilterMeta,\n reservedLifecycle: [\n STATE_CONNECTED_CALLBACK_NAME,\n STATE_DISCONNECTED_CALLBACK_NAME,\n STATE_UPDATED_CALLBACK_NAME,\n WEBCOMPONENT_STATE_READY_CALLBACK_NAME,\n ],\n reservedStateApi: [\n STATE_BINDABLES_NAME,\n STATE_COMMAND_TOKENS_NAME,\n STATE_COMMAND_NAMESPACE_NAME,\n STATE_EVENT_TOKENS_NAME,\n STATE_ON_NAME,\n STATE_STREAMS_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n ],\n };\n}\n","/**\n * contract/contractAnalyzer.ts\n *\n * Phase 5b(09-remediation-design.md §5b / §7.1 dev runtime / §6 contract trace)の\n * opt-in dev-time analyzer。実際に登録済みの custom element の `static wcBindable`\n * 宣言(= 実行時の正本)を、利用者が渡した sidecar manifest と突き合わせ、drift を\n * DevTools trace(`contract:*`)へ流す。\n *\n * 完了条件「無効時の runtime 挙動・cost が不変」: `analyzeContract` は\n * `config.enableContractAnalyzer` が false のとき即 return し、manifest を一切走査\n * しない(hot path には一切フックしない — 純粋な on-demand API)。\n *\n * pure な core(`analyzeManifestContract`)は宣言解決と emit を注入で受けるためテスト可能。\n */\n\nimport { config } from \"../config.js\";\nimport { devtoolsSink } from \"../devtools/sink.js\";\nimport { ContractEvent } from \"../devtools/types.js\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry.js\";\nimport { IContractComponent, IContractManifest, ILiveDeclaration } from \"./types.js\";\n\n/** runtime analyzer が解釈する manifest namespace。これ以外は unsupported-extension。 */\nconst KNOWN_NAMESPACES: ReadonlySet<string> = new Set([\n \"wcstack.types\",\n \"wcstack.async\",\n \"wcstack.platformCapabilities\",\n \"wcstack.application\",\n]);\n\nconst EMPTY: readonly ContractEvent[] = Object.freeze([]);\n\n/**\n * opt-in dev-time contract analysis。無効時はゼロコスト(即 return・manifest 非走査)。\n * 有効時は live 宣言と manifest を突き合わせ、`contract:*` trace を返しつつ、DevTools\n * sink が接続されていれば同時に流す。\n */\nexport function analyzeContract(manifest: IContractManifest): readonly ContractEvent[] {\n if (!config.enableContractAnalyzer) return EMPTY;\n const events: ContractEvent[] = [];\n const emit = (event: ContractEvent): void => {\n events.push(event);\n if (devtoolsSink !== null) devtoolsSink(event);\n };\n analyzeManifestContract(manifest, resolveLiveDeclaration, emit);\n return events;\n}\n\n/**\n * pure core。`resolveDeclaration(tag)` は該当タグの live 宣言(未登録なら null)を返す。\n * emit は生成した trace を受ける。config フラグは見ない(呼び出し側が guard 済み)。\n */\nexport function analyzeManifestContract(\n manifest: IContractManifest,\n resolveDeclaration: (tag: string) => ILiveDeclaration | null,\n emit: (event: ContractEvent) => void,\n): void {\n const extensions = manifest.manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return;\n\n // 未知 namespace は runtime が解釈しない → unsupported-extension。\n for (const namespace of Object.keys(extensions)) {\n if (!KNOWN_NAMESPACES.has(namespace)) {\n emit({ type: \"contract:unsupported-extension\", namespace });\n }\n }\n\n const components = extensions[\"wcstack.types\"]?.components;\n if (components === undefined || components === null) return;\n\n for (const [tag, component] of Object.entries(components)) {\n const live = resolveDeclaration(tag);\n emit({ type: \"contract:manifest-read\", tag, loaded: live !== null });\n if (live === null) {\n // manifest が宣言するタグが実行時に登録されていない = component-not-loaded drift。\n emit({ type: \"contract:drift\", reason: \"component-not-loaded\", tag });\n continue;\n }\n checkComponentDrift(tag, component, live, emit);\n }\n}\n\nfunction checkComponentDrift(\n tag: string,\n rawComponent: unknown,\n live: ILiveDeclaration,\n emit: (event: ContractEvent) => void,\n): void {\n // 壊れた manifest(component が null / primitive)でも analyzer 全体を落とさない。\n const component: IContractComponent =\n rawComponent !== null && typeof rawComponent === \"object\" ? (rawComponent as IContractComponent) : {};\n for (const [member, observable] of Object.entries(component.observables ?? {})) {\n if (!live.propertyEvents.has(member)) {\n emit({ type: \"contract:drift\", reason: \"missing-member\", tag, member });\n continue;\n }\n const liveEvent = live.propertyEvents.get(member)!;\n const sidecarEvent = observable?.event;\n if (typeof sidecarEvent === \"string\" && sidecarEvent !== liveEvent) {\n emit({ type: \"contract:drift\", reason: \"event-mismatch\", tag, member, sidecarEvent, liveEvent });\n }\n }\n for (const member of Object.keys(component.inputs ?? {})) {\n if (!live.inputs.has(member)) {\n emit({ type: \"contract:drift\", reason: \"missing-member\", tag, member });\n }\n }\n for (const member of Object.keys(component.commands ?? {})) {\n if (!live.commands.has(member)) {\n emit({ type: \"contract:drift\", reason: \"missing-member\", tag, member });\n }\n }\n}\n\n/**\n * 登録済み custom element の `static wcBindable` を drift 照合用に索引化する。\n * 未登録・非 wc-bindable は null(= component-not-loaded)。\n */\nfunction resolveLiveDeclaration(tag: string): ILiveDeclaration | null {\n const registry = getCustomElementRegistry();\n const ctor = registry?.get(tag);\n if (ctor === undefined) return null;\n const declaration = (ctor as { readonly wcBindable?: unknown }).wcBindable;\n if (\n declaration === null\n || typeof declaration !== \"object\"\n || (declaration as { protocol?: unknown }).protocol !== \"wc-bindable\"\n ) {\n return null;\n }\n const decl = declaration as {\n readonly properties?: readonly { readonly name?: unknown; readonly event?: unknown }[];\n readonly inputs?: readonly { readonly name?: unknown }[];\n readonly commands?: readonly { readonly name?: unknown }[];\n };\n // 各配列は非配列(object 等)でも落ちないよう Array.isArray で container を守る。\n const propertyEvents = new Map<string, string>();\n for (const property of Array.isArray(decl.properties) ? decl.properties : []) {\n if (typeof property?.name === \"string\" && typeof property.event === \"string\") {\n propertyEvents.set(property.name, property.event);\n }\n }\n const inputs = new Set<string>();\n for (const input of Array.isArray(decl.inputs) ? decl.inputs : []) {\n if (typeof input?.name === \"string\") inputs.add(input.name);\n }\n const commands = new Set<string>();\n for (const command of Array.isArray(decl.commands) ? decl.commands : []) {\n if (typeof command?.name === \"string\") commands.add(command.name);\n }\n return { propertyEvents, inputs, commands };\n}\n"],"names":["inSsr","html","document","documentElement","hasAttribute","_config","bindAttributeName","commentTextPrefix","commentForPrefix","commentIfPrefix","commentElseIfPrefix","commentElsePrefix","tagNames","state","ssr","locale","debug","enableMustache","enableDirectionalInitialSync","enablePropagationContext","enableContractAnalyzer","sameValueGuard","config","getConfig","bindingPromiseByNode","WeakMap","resolvedNodes","WeakSet","id","async","waitInitializeBinding","node","bindingPromise","resolveFn","get","promise","Promise","resolve","set","has","getInitializeBindingPromiseByNode","resolveInitializedBinding","existing","add","DELIMITER","WILDCARD","MAX_LOOP_DEPTH","FILTER_SEPARATOR","tmpIndexByIndexName","i","INDEX_BY_INDEX_NAME","Object","freeze","STATE_CONNECTED_CALLBACK_NAME","STATE_DISCONNECTED_CALLBACK_NAME","STATE_UPDATED_CALLBACK_NAME","WEBCOMPONENT_STATE_READY_CALLBACK_NAME","STATE_BINDABLES_NAME","STATE_COMMAND_TOKENS_NAME","STATE_COMMAND_NAMESPACE_NAME","STATE_EVENT_TOKENS_NAME","STATE_ON_NAME","STATE_STREAMS_NAME","STATE_STREAM_STATUS_NAMESPACE_NAME","STATE_STREAM_ERROR_NAMESPACE_NAME","DCC_DEFINITION_ATTRIBUTE","_cache","Map","getPathInfo","path","pathInfo","PathInfo","segments","lastSegment","cumulativePaths","cumulativePathSet","cumulativePathInfos","cumulativePathInfoSet","parentPath","wildcardPaths","wildcardPathSet","indexByWildcardPath","wildcardPathInfos","wildcardPathInfoSet","wildcardParentPaths","wildcardParentPathSet","wildcardParentPathInfos","wildcardParentPathInfoSet","wildcardPositions","lastWildcardPath","lastWildcardInfo","wildcardCount","parentPathInfo","constructor","getPattern","_path","this","split","currentPatternPath","prevPatternPath","length","push","Set","cache","getCustomElement","cached","undefined","value","nodeType","Node","ELEMENT_NODE","element","tagName","toLowerCase","includes","is","getAttribute","getCustomElementRegistry","owner","globalRegistry","globalThis","customElements","registry","candidate","whenDefined","upgradeCustomElement","root","upgrade","readBindableDeclaration","target","addEventListener","removeEventListener","declaration","wcBindable","protocol","Number","isInteger","version","knownProperties","readNamedList","properties","isValidPropertyDescriptor","declaredInputs","inputs","isValidInputDescriptor","declaredCommands","commands","isValidCommandDescriptor","liveDeclaration","descriptor","name","event","getter","attribute","isValidEntry","Array","isArray","entries","entry","raiseError","message","Error","makeExpandedEntry","base","stateName","expandedPath","propName","propSegments","propModifiers","statePathName","statePathInfo","inFilters","outFilters","bindingType","dedupKey","r","resolveNodePath","currentNode","childNodes","bindingsByNode","getBindingsByNode","setBindingsByNode","bindings","STRUCTURAL_BINDING_TYPE_SET","optionsRequired","fnName","optionMustBeNumber","valueMustBeNumber","valueMustBeDate","validateNumberString","isNaN","builtinFilters","eq","options","opt","ne","not","_options","lt","le","gt","ge","inc","dec","mul","div","mod","fix","toFixed","toLocaleString","uc","String","toUpperCase","lc","cap","v","charAt","slice","trim","numberedOpts","opt1","opt2","substr","pad","padStart","rep","repeat","rev","reverse","join","int","parseInt","float","parseFloat","round","optValue","Math","pow","floor","ceil","percent","date","Date","toLocaleDateString","time","toLocaleTimeString","datetime","ymd","year","getFullYear","toString","month","getMonth","day","getDate","falsy","truthy","defaults","boolean","Boolean","number","string","null","outputBuiltinFilters","builtinFiltersByFilterIOType","input","output","builtinFilterFn","filters","filter","filterFnByKey","parseFilters","filterTextList","filterIOType","map","filterText","openParenIndex","indexOf","closeParenIndex","lastIndexOf","filterName","filterKey","filterFn","args","argsText","substring","current","inQuote","hasQuote","char","last","parseFilterArgs","trimFn","s","cacheFilterInfos","parseStatePart","statePart","pos","stateAndPath","filterTexts","filtersText","parseBindTextsForElement","bindText","bindTexts","results","separatorIndex","propPart","stateResult","propResult","propText","propModifiersText","parsePropPart","startsWith","some","bindTextByNode","bindingTypeKeywordSet","EMBEDDED_REGEX","RegExp","parseCommentNode","savedText","COMMENT_NODE","text","data","match","exec","keyword","fragmentInfoByUUID","setFragmentInfoByUUID","uuid","rootNode","fragmentInfo","delete","bindingPartial","parseBindTextResult","stateElement","getStateElementByName","setPathInfo","nodeInfo","nodeInfos","nodeBindingPartial","parseBindTextResults","nodeStateElement","getFragmentInfoByUUID","getParseBindTextResults","bindTextOrUUID","parseBindingTextResult","getSubscriberNodes","subscriberNodes","walker","createTreeWalker","NodeFilter","SHOW_ELEMENT","SHOW_COMMENT","acceptNode","FILTER_ACCEPT","FILTER_SKIP","nextNode","registeredNodeSet","processParseResultsForNode","parseResults","expanded","allowDeferred","spreadOrigin","result","bindable","targetBase","seen","keys","lastIndexByKey","key","final","overrider","tagText","console","expandSpread","deferred","parseBindingTextResults","bindingInfos","replaceNode","TEXT_NODE","createTextNode","getBindingInfos","collectNodesAndBindingInfos","allBindings","deferredSpreads","markNodeRegistered","processDeferredNode","unregisterNode","loopContextByNode","getLoopContextByNode","paramNode","loopContext","parentNode","setLoopContextByNode","lastListValueByAbsoluteStateAddress","getLastListValueByAbsoluteStateAddress","address","setLastListValueByAbsoluteStateAddress","setLoopContextAsyncSymbol","Symbol","setLoopContextSymbol","getByAddressSymbol","hasByAddressSymbol","setByAddressSymbol","connectedCallbackSymbol","disconnectedCallbackSymbol","updatedCallbackSymbol","getAbsolutePathInfo","pathMap","absolutePathInfo","AbsolutePathInfo","parentAbsolutePathInfo","_cacheNullListIndex","AbsoluteStateAddress","listIndex","_parentAbsoluteAddress","parentAbsoluteAddress","parentListIndex","createAbsoluteStateAddress","cacheByAbsolutePathInfo","rootNodeByFragment","setRootNodeByFragment","fragment","getRootNodeByFragment","cacheCalcWildcardLen","calcWildcardLen","targetPathInfo","path1","path2","len","intersection","size","listIndexByBindingInfoByLoopContext","getListIndexByBindingInfo","bindingInfo","listIndexByBindingInfo","wildcardLen","at","absoluteStateAddressByBinding","resolveBindingRootNode","binding","knownRootNode","getRootNode","isConnected","nodeName","getAbsoluteStateAddressByBinding","absoluteStateAddress","clearAbsoluteStateAddressByBinding","devtoolsSink","bindingsByAbsoluteStateAddress","addBindingByAbsoluteStateAddress","type","absoluteAddress","removeBindingByAbsoluteStateAddress","patternLedger","peekBindingsForAddress","StateAddress","_parentAddress","parentAddress","createStateAddress","cacheByPathInfo","stateAddressByBindingInfo","getStateAddressByBindingInfo","stateAddress","clearStateAddressByBindingInfo","createHandlerBindingRegistry","attachedByKey","countByKey","attached","remove","next","countOf","keyCount","clear","handlerByHandlerKey","bindingRegistry","getHandlerKey","eventName","f","getEventName","modifier","attachCheckboxEventHandler","checkboxEventHandler","warn","checked","filteredNewValue","createState","currentValue","concat","index","toSpliced","Token","_name","_subscribers","subscribe","fn","unsubscribe","emit","EventToken","_ownerStateName","ownerStateName","super","kind","tokenName","subscriberCount","registryByStateElement","getOrCreateEventToken","token","clearEventTokenRegistry","listenerByBinding","attachEventTokenHandler","customTagName","propertyName","getWcBindable","propDesc","modifiers","handler","preventDefault","stopPropagation","eventTokenNames","createStateAsync","indexes","CommandToken","isCommandToken","modifierKey","m","sort","stateEventHandlerFunction","handlerName","isCommand","Reflect","apply","attachEventHandler","stateEventHandler","attachRadioEventHandler","radioEventHandler","CHECK_TYPES","DEFAULT_VALUE_PROP_NAMES","isPossibleTwoWay","inputType","customClass","nextWireId","nextTransactionId","nextSynchronousScopeId","wireIdsByNode","getWireId","member","byKey","wireKey","wireId","getEdgeId","direction","EMPTY_EDGES","beginPropagationTransaction","originBindingId","transactionId","visitedEdges","hop","extendPropagationContext","context","edgeId","currentContext","getCurrentPropagationContext","runWithPropagationContext","callback","previous","receiptStack","producerValueObserversByNode","DEFAULT_GETTER","e","detail","hasGetter","getValueGetter","twowayEventHandlerFunction","valueGetter","newValue","producerObservers","observer","propagationContext","receipt","active","matchWriteReceipt","writtenValue","coveredBySameValueGuard","reason","toStateEdgeId","baseContext","commitToState","observerSkipNodes","markObserverSkipOnRemove","consumeObserverSkipOnRemove","observerSkipAddedNodes","markObserverSkipOnAdd","consumeObserverSkipOnAdd","pendingObservationCount","decrementPendingObservation","hasPendingObservation","DefinitionCoordinator","wait","reject","normalizedTagName","waiters","then","settle","error","waiter","pendingCount","from","coordinatorByRegistry","getDefinitionCoordinator","coordinator","readOption","separator","hasInitialSyncModifier","STATE_CALL_POLICY","authority","syncOn","observable","outputOnly","NONE_CALL_POLICY","statePolicy","resolveInitialSyncPolicy","explicitAuthority","parseSyncOn","hasOutput","hasInput","resolveInitialAuthority","initialized","isBindingStateInitialized","nextRecordId","nextGeneration","recordByBinding","sessionByRoot","bindingKeyByBinding","interestedSessionsByNode","addInterestedSession","session","forEachInterestedSession","forEachInclusive","firstChild","child","isObservableRoot","BindingOwner","Observer","MutationObserver","mutations","handleMutations","observe","childList","subtree","removed","added","mutation","removedNodes","addedNodes","reconnected","contains","handleRemovedNode","handleAddedNode","applyChangeFromBindings","ownerByRoot","getBindingOwner","bindingKey","addRecordTeardown","record","teardown","teardowns","BindingSession","records","rowPlan","knownBindingsByNode","optionsByBinding","deferredByNode","initialize","knownRoot","registerAddress","resolvedOptions","registerPathInfo","applyOnReconnect","remember","phase","start","anchor","patternListIndex","settleInitialRecord","settleConnectedSnapshot","shouldApplyState","activate","activatePlanRows","initialApplyDone","resolvedAuthority","outputOnlyMember","observationPending","getRecord","addTeardown","isAlive","generation","deferUntilDefined","task","cancel","tasks","finish","disposeBinding","disposeRecord","dispose","canWholesaleDestroy","pendingDefinitions","destroyRecords","info","observableRootFor","known","values","knownMapFor","remembered","rememberedOptions","initializeRow","plan","rowOptions","slots","slot","addKnownRowBinding","patternPathInfo","initialPolicy","policy","initialSettled","eventSequence","hasProducerValue","producerValue","eventAttached","twowayAttached","isEvent","runTeardowns","slotIndex","replaceChild","replaceToReplaceNode","recordOptions","attachListeners","detachRadioEventHandler","detachCheckboxEventHandler","attachAfterDefinition","removeObserver","byProperty","observers","addTwowayValueObserver","twowayEventHandler","attachTwowayEventHandler","listener","detachEventTokenHandler","attach","HTMLElement","readProducerSnapshot","eventWins","sequence","filteredValue","commitProducerValue","rowMap","addBindingByPattern","removeBindingByPattern","detachTwowayEventHandler","detachEventHandler","getOrCreateBindingSession","getBindingSession","completeByStateElementByWebComponent","isWebComponentComplete","webComponent","completeByStateElement","getFilteredValue","EMPTY_ARRAY","subscribedBindings","indexBindingsByContent","getIndexBindingsByContent","content","setIndexBindingsByContent","prototype","difference","other","elem","count","getUUID","ListIndex","position","_index","_version","_indexes","_listIndexes","dirty","listIndexes","WeakRef","varName","deref","createListIndex","listIndexesByList","getListIndexesByList","list","setListIndexesByList","listDiffByOldListByNewList","EMPTY_LIST","EMPTY_SET","createListDiff","rawOldList","rawNewList","diff","oldList","newList","cachedDiff","diffByNewList","getListDiff","oldIndexes","retValue","newIndexes","changeIndexSet","deleteIndexSet","addIndexSet","newListIndex","isSameList","newIndexSet","oldIndexSet","oldPosByIndex","calcDiffIndexes","indexByValue","val","existingIndexes","oldIndex","shift","existingListIndex","setListDiff","computeListDiff","syncListIndexes","computeStableIndexSet","reused","seq","prevPos","sorted","lis","n","tails","prev","fill","lo","hi","mid","k","longestIncreasingSubsequence","stable","seqIndex","bindingsByContent","getBindingsByContent","setBindingsByContent","bindingSessionByContent","getBindingSessionByContent","setBindingSessionByContent","nodesByContent","getNodesByContent","setNodesByContent","nodes","bindLoopContextToContent","activateContent","applyChange","deactivateContent","mounted","unbindLoopContextToContent","contentSetByNode","setContentByNode","contents","getContentSetByNode","deleteContentByNode","recursiveBindingTypes","Content","_content","_childNodeArray","_firstNode","_lastNode","_mounted","firstNode","lastNode","appendTo","targetNode","appendChild","mountAfter","nextSibling","insertBefore","tryDestroy","removeChild","unmount","createContentFromNodes","createDocumentFragment","createPlanContent","cloneFragment","importNode","nodePath","indexBindings","nodeIndex","template","isIndexBinding","initializeRowBindings","createContent","directional","namespace","compileRowPlan","initialInfo","collectNodesAndBindingInfosByFragment","bindingSession","initializeBindingsByFragment","lastNodeByNode","contentByListIndexByNode","pooledContentsByNode","isOnlyNodeInParentContentByNode","hydrateSetContent","contentByListIndex","setContent","hydrateSetLastNode","setPooledContent","isPhysicallyAfter","compareDocumentPosition","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_DISCONNECTED","bindingInfoText","applyChangeToIf","rawNewValue","ssrMode","log","startComment","createComment","endComment","afterNode","store","getSsrProperties","trackedNodes","SSR_ATTR_PROPS","textContent","setAttribute","removeAttribute","selected","disabled","selectedIndex","querySelectorAll","idx","applyChangeToProperty","_context","firstSegment","performWrite","propertyWriteSucceeded","mirrorAttr","getInputAttributeMirror","attributeName","formatted","JSON","stringify","applyMirrorAttribute","propagationContextByBinding","extendedContext","bindingId","bindingGeneration","synchronousScopeId","pop","runWithWriteReceipt","attrHandler","find","addSsrProperty","subObject","segment","oldValue","isFrozen","ssrWrappedNodes","applyChangeToWebComponent","restSegments","getValue","indexName","indexPos","getIndexValueByLoopContext","scheduledBindings","reportFailure","applyChangeByFirstSegment","class","className","classList","toggle","attr","attrName","style","styleName","command","methodName","elementRef","el","method","applyChangeByBindingType","nodeValue","for","listPathInfo","absAddress","lastValue","newListValueByAbsAddress","fullDelete","isOnlyNode","prevCheckNode","previousSibling","nextCheckNode","onlyNode","isOnlyNodeInParentContent","contentMap","poolBudget","getPooledContents","POSITIVE_INFINITY","deleteIndex","elementPathInfo","loopContextStack","stableIndexSet","pooledContents","createLoopContext","indexBinding","if","else","elseif","radio","elementFilteredValue","checkbox","normalizedNewValue","fnByBinding","deferredSelectBindingByBinding","definedApplyVerifiedByBinding","_applyChange","deferredSelectBindings","appliedBindingSet","hasUpdatedCallback","updatedAbsAddressSetByStateElement","customTag","applyLatest","currentSession","scheduleDeferredApply","sameRootVerified","DocumentFragment","ShadowRoot","targetState","newContext","bindingIndex","nextBindingInfo","nextRootNode","newListValue","absAddressSet","initializeBindings","parentLoopContext","scheduleDeferredSpreads","MUSTACHE_REGEX","SKIP_TAGS","convertMustacheToComments","SHOW_TEXT","textNodes","textNode","parentElement","replaceTextNode","convertTextNodes","templates","namespaceURI","newTemplate","createElement","childNode","attributes","replaceWith","lastIndex","test","_notFilterInfo","createNotFilter","COMMENT_REGEX","expandShorthandInStatePart","forPath","prefix","pipeIndex","atIndex","pathPart","suffix","expandCommentData","commentPrefix","commentSuffix","expandBindAttribute","attrValue","parts","changed","part","trimmed","colonIndex","expandShorthandInBindAttribute","expandShorthandPaths","bindAttr","comment","HTMLTemplateElement","getNodePath","unshift","getFragmentNodeInfos","fragmnentNodeInfos","subscriberNode","optimizeFragment","keywordByBindingType","notFilter","cloneNotParseBindTextResult","_getFragmentInfo","collectStructuralFragments","walkRoot","elseKeyword","lastIfFragmentInfo","elseFragmentInfos","childForPath","lastElseFragmentInfo","placeHolder","elseUUID","elseFragmentInfo","elsePlaceHolder","waitForStateInitialize","elements","promises","initializePromise","all","buildBindings","body","shadowRoot","host","VERSION","HTMLElementBase","SSR_PLACEHOLDER_COMMENT","SSR_BLOCK_START","SSR_BLOCK_END","SSR_TEXT_START","escapeJsonForScript","json","replace","Ssr","_stateData","_templates","_hydrateProps","stateData","_loadStateData","_loadTemplates","hydrateProps","_loadHydrateProps","getTemplate","verifyVersion","serverVersion","serverParts","clientParts","setStateData","setHydrateProps","props","script","querySelector","parse","tpl","findByName","parentEl","Element","Document","extractStateData","stateEl","raw","__state","buildContent","ssrEl","jsonScript","uuids","bindResult","cloneNode","ssrNodes","propsData","propsScript","removeBlockBoundaryComments","toRemove","removeStructuralComments","restoreTextBindings","startComments","bindComment","sibling","endPattern","cleanupDom","ssrElements","templateByUuid","ssrNode","walker1","walker2","placeholders","restored","imported","ssrIdElements","STRUCTURAL_TYPES","collectBindingsFromLiveNodes","parent","wrapper","findPlaceholderComment","pattern","restoreFragments","lastIfParseResult","hydrateBindings","blocks","startMatch","collectSsrBlocks","listIndexesByUuid","block","placeholderComment","hydrateBlocks","ssrParents","normalBindings","structuralBindings","initializedBindings","absAddr","restoredSsrElements","propMap","completedEls","stateElementByNameByNode","bindingsReadyByNode","liveStateElements","stateElementByName","getBindingsReady","setStateElementByName","enableSsr","ready","queueMicrotask","updateBatchListeners","registerUpdateBatchListener","updater","_queueUpdateRecords","enqueueAbsoluteAddress","requireStartProcess","updateRecords","testApplyChange","absoluteAddresses","contexts","contextByAbsoluteAddress","droppedTransactionId","winnerTransactionId","processBindings","maxHops","batch","notifyUpdateBatchListeners","getUpdater","DEVTOOLS_HOOK_GLOBAL","getOrCreateHookRegistry","globals","sources","listeners","applySink","source","_setSink","sourceId","onEvent","register","onSourceRegistered","unregister","onSourceUnregistered","addListener","createMinimalRegistry","onUpdateBatch","addresses","setSink","sink","wasActive","setDevtoolsSink","isActive","createStateElementSummary","paths","listPaths","elementPaths","getterPaths","setter","setterPaths","commandTokenNames","staticDependency","dynamicDependency","requireStateElement","registeredSource","registerDevtoolsSource","random","packageVersion","getStateElements","summaries","read","write","loadFromInnerScript","scriptModule","uniq_comment","URL","createObjectURL","blob","Blob","url","import","revokeObjectURL","b64","btoa","fromCodePoint","TextEncoder","encode","default","loadFromScriptFile","LoopContextStack","_loopContextStack","_length","elementStateAddress","lastLoopContext","prevWildcardPathInfo","finally","getOrCreateCommandToken","namespaceProxyByStateElement","getCommandNamespace","proxy","Proxy","create","_target","prop","ownKeys","getOwnPropertyDescriptor","configurable","enumerable","deleteProperty","UNCERTAIN","lastNotifiedByStateElement","pruneLastNotified","liveNames","lastMap","invalidateLastNotified","status","activeStateElements","deleteActiveStateElement","getActiveStateElements","getStreamEntries","abortAllStreams","controller","abort","latestFold","_acc","chunk","NO_STREAM_NAMES","processStreamsDeclaration","declared","def","definition","hasFold","fold","initial","depAddresses","setStreamEntries","statusNamespaceByStateElement","errorNamespaceByStateElement","createStreamNamespaceProxy","namespaceName","pick","getStreamStatusNamespace","getStreamErrorNamespace","clearStreamNamespace","collector","consumeSource","signal","iterator","returned","onAbort","return","once","produced","getReader","stream","reader","catch","done","releaseLock","readableToAsyncIterable","asyncIterator","TypeError","iterate","aborted","fail","startStreams","addActiveStateElement","startStream","AbortController","argsValue","argsFn","previousCollector","captured","selfStatusPath","selfErrorPath","dep","traceArgs","updateStreamStatus","getLastNotified","statusChanged","errorChanged","setLastNotified","$postUpdate","getterFn","setterFn","callFn","isAsync","isInternalProperty","hits","ResolvedAddress","wildcardType","wildcardIndexes","tmpPatternSegments","incompleteCount","completeCount","getResolvedAddress","nameInfo","cacheEntryByAbsoluteStateAddress","setCacheEntryByAbsoluteStateAddress","cacheEntry","dirtyCacheEntryByAbsoluteStateAddress","walkNamespace","_getByAddress","receiver","parentValue","getByAddress","pushAddress","popAddress","_getByAddressWithCache","getCacheEntryByAbsoluteStateAddress","untracking","addressStackLength","lastAddress","lastAddressStack","lastInfo","addDynamicDependency","sharedLen","crossRow","level","addCrossRowListPath","checkDependency","collectStreamDependency","getContextListIndex","structuredPath","hasByAddress","swapInfoByStateAddress","setSwapInfoByAddress","swapInfo","_walkExpandWildcard","currentWildcardIndex","parentAbsPathInfo","stateProxy","loopIndexes","listDiff","searchType","getIndexes","targetListIndexes","EMPTY_INDEXES","selectExpansionIndexes","sourcePath","_lastValue","_newValue","listExpansion","crossRowListPaths","fullRows","movedRows","EMPTY_PATH_INFOS","getMovedRowExpansionPaths","wildcardPath","depPathInfo","indexGetters","indexDependentGetterPaths","queue","children","staticMap","walkDependency","startAddress","listPathSet","startPath","dynamicMap","visited","stack","depth","nextDepth","nextEntries","staticDeps","selection","depAddress","movedPathInfos","dynamicDeps","expandContext","_walkDependency","notifyWrite","absDepAddress","_setByAddress","beginUntrack","endUntrack","_setByAddressWithSwap","getSwapInfoByAddress","currentParentValue","currentListIndexes","curIndex","setByAddress","devOldValue","devHasOldValue","cacheable","hasOldValue","bindableEventMap","dispatchEvent","CustomEvent","bubbles","isSwappable","_prop","wildcardParentPathInfo","wildcardAddress","lastValueByListAddress","getListIndex","resolvedAddress","_setLoopContext","setLoopContext","clearLoopContext","STREAM_STATUS_PATH_PREFIX","STREAM_ERROR_PATH_PREFIX","symbolApiCacheByHandler","addIndexDependentGetterPath","newValueByAddress","wildcardPattern","walkWildcardPattern","wildcardIndexPos","parentIndexes","resultIndexes","resultValues","getAll","postUpdate","_receiver","trackDependency","untrackDependency","getSymbolApiCache","api","setLoopContextAsync","call","connectedCallback","disconnectedCallback","refs","indexesListByPath","ref","pathName","indexesList","updatedCallback","StateHandler","_stateElement","_stateName","_addressStack","_addressStackIndex","_loopContext","_mutability","_untrackDepth","mutability","trapGet","trapSet","lastValueByAbsoluteStateAddress","stateElementByWebComponent","getStateElementByWebComponent","stateMap","innerMappingByElement","outerMappingByElement","primaryMappingRuleSetByElement","primaryBindingByMappingRule","createMappingRuleByBinding","innerState","innerAbsPathInfo","outerAbsPathInfo","getOuterAbsolutePathInfo","innerMapping","outerMapping","primaryMappingRuleSet","primaryMappingRule","currentPrimaryMappingRule","primaryBinding","outerRemainingSegments","outerPathInfo","outerStateElement","addBindingByNode","meltFrozenObject","frozenObj","obj","proto","getPrototypeOf","clone","descriptors","getOwnPropertyDescriptors","writable","defineProperties","cloneWithDescriptors","InnerStateProxyHandler","_webComponent","_innerStateElement","innerPathInfo","setLastValueByAbsoluteStateAddress","OuterStateProxyHandler","absStateAddress","PlainOuterStateProxyHandler","getOuter","outerState","bindWebComponent","innerStateElement","component","stateProp","setStateElementByWebComponent","innerMappingRule","outerMappingRule","mappingRule","buildPrimaryMappingRule","createOuterState","boundComponentStateProp","createInnerState","setInitialState","defineProperty","createPlainOuterState","markWebComponentAsComplete","func","getStateInfo","assign","getAllPropertyDescriptors","State","static","_hasUpdatedCallback","_crossRowListPaths","_indexDependentGetterPaths","_initialized","_initializePromise","_resolveInitialize","_connectedCallbackPromise","_resolveConnectedCallback","_loadingPromise","_resolveLoading","_setStatePromise","_resolveSetState","_listPaths","_elementPaths","_getterPaths","_setterPaths","createLoopContextStack","_dynamicDependency","_staticDependency","_pathSet","_rootNode","_boundComponent","_boundComponentStateProp","_bindableEventMap","_commandTokenNames","_eventTokenNames","_dcc","_connectGeneration","_streamsStartedGeneration","_state","names","processCommandTokensDeclaration","processEventTokensDeclaration","processOnDeclaration","stateInfo","_loadFromSsrElement","_initialize","ssrState","getElementById","loadFromScriptJson","src","endsWith","response","fetch","ok","statusText","loadFromJsonFile","timerId","setTimeout","clearTimeout","desc","_initializeBindWebComponent","boundComponent","_callStateConnectedCallback","_initializeDCC","hostElement","innerHTML","shadowRootMode","mode","bindables","createWcBindable","createBindableEventMap","stateTagSelector","DCCElement","_shadow","attachShadow","setBindableEventMap","newDesc","define","defineDCC","_callStateDisconnectedCallback","connectGeneration","clearCommandNamespace","connectedCallbackPromise","_addDependency","targetPath","deps","addStaticDependency","currentPathInfo","_createState","createStateProxy","nextVersion","bindProperty","registerComponents","bootstrapState","partialConfig","defineState","builtinFilterMeta","description","hasArgs","resultType","acceptTypes","minArgs","maxArgs","argTypes","WCS_MANIFEST_VERSION","getWcsManifest","syntax","bindAttribute","pathDelimiter","wildcard","delimiters","propValue","structuralDirectives","filterMeta","reservedLifecycle","reservedStateApi","KNOWN_NAMESPACES","EMPTY","analyzeContract","manifest","events","resolveDeclaration","extensions","manifestExtensions","components","tag","live","loaded","checkComponentDrift","analyzeManifestContract","resolveLiveDeclaration","rawComponent","observables","propertyEvents","liveEvent","sidecarEvent","ctor","decl","property"],"mappings":"SAEgBA,IAOd,MAAMC,EAAOC,SAASC,gBACtB,QAAOF,GAAOA,EAAKG,aAAa,kBAClC,CAsBA,MAAMC,EAA2B,CAC/BC,kBAAmB,WACnBC,kBAAmB,WACnBC,iBAAkB,UAClBC,gBAAiB,SACjBC,oBAAqB,aACrBC,kBAAmB,WACnBC,SAAU,CACRC,MAAO,YACPC,IAAK,WAEPC,OAAQ,KACRC,OAAO,EACPC,gBAAgB,EAChBC,8BAA8B,EAC9BC,0BAA0B,EAM1BC,wBAAwB,EACxBC,gBAAgB,GAILC,EAAkBjB,WAEfkB,IACd,OAAOD,CACT,CC7DA,MAAME,EAAuB,IAAIC,QAG3BC,EAAgB,IAAIC,QAE1B,IAAIC,EAAK,EAuBFC,eAAeC,EAAsBC,GAC1C,MAAMC,EAtBF,SAA4CD,GAChD,IAIIE,EAJAD,EAAiBR,EAAqBU,IAAIH,IAAS,KACvD,GAAuB,OAAnBC,EACF,OAAOA,EAGT,MAAMG,EAAU,IAAIC,QAAeC,IACjCJ,EAAYI,IAWd,OATAL,EAAiB,CACfJ,KAAMA,EACNO,UACAE,QAASJ,GAEXT,EAAqBc,IAAIP,EAAMC,GAC3BN,EAAca,IAAIR,IACpBC,EAAeK,UAEVL,CACT,CAGyBQ,CAAkCT,SACnDC,EAAeG,OACvB,CAEM,SAAUM,EAA0BV,GAIxC,MAAMW,EAAWlB,EAAqBU,IAAIH,QAClB,IAAbW,EAIXhB,EAAciB,IAAIZ,GAHhBW,EAASL,SAIb,CC7CO,MAAMO,EAAY,IACZC,EAAW,IAEXC,EAAiB,IAWjBC,EAAmB,IAW1BC,EAAsD,CAAA,EAC5D,IAAK,IAAIC,EAAI,EAAGA,EAxBkB,IAwBMA,IACtCD,EAAoB,IAAIC,EAAE,KAAOA,EAE5B,MAAMC,EAAsDC,OAAOC,OAAOJ,GAMpEK,EAAgC,qBAChCC,EAAmC,wBACnCC,EAA8B,mBAE9BC,EAAyC,sBAEzCC,EAAuB,aACvBC,EAA4B,iBAC5BC,EAA+B,WAC/BC,EAA0B,eAC1BC,EAAgB,MAChBC,EAAqB,WACrBC,EAAqC,gBACrCC,EAAoC,eACpCC,EAA2B,qBC9ClCC,EAAiC,IAAIC,IAE3C,IAAIvC,EAAa,EACX,SAAUwC,EAAYC,GAC1B,IAAIC,EAAWJ,EAAOhC,IAAImC,GAC1B,YAAwB,IAAbC,IAGXA,EAAWnB,OAAOC,OAAO,IAAImB,EAASF,IACtCH,EAAO5B,IAAI+B,EAAMC,IAHRA,CAKX,CAEA,MAAMC,EACK3C,KAAeA,EACfyC,KACAG,SACAC,YACAC,gBACAC,kBACAC,oBACAC,sBACAC,WACAC,cACAC,gBACAC,oBACAC,kBACAC,oBACAC,oBACAC,sBACAC,wBACAC,0BACAC,kBACAC,iBACAC,iBACAC,cACAC,eACT,WAAAC,CAAYxB,GAEV,MAAMyB,EAAcC,GACV1B,IAAS0B,EAASC,KAAO5B,EAAY2B,GAIzCvB,EAAWH,EAAK4B,MAAM,KAGtBvB,EAAkB,GAClBE,EAAmC,GAGnCG,EAAgB,GAChBE,EAA8C,CAAA,EAC9CC,EAAoB,GACpBE,EAAsB,GACtBE,EAA0B,GAC1BE,EAAoB,GAE1B,IAAIU,EAAqB,GAAIC,EAAkB,GAC3CR,EAAgB,EAGpB,IAAI,IAAI1C,EAAI,EAAGA,EAAIuB,EAAS4B,OAAQnD,IAClCiD,GAAsB1B,EAASvB,GAG3BuB,EAASvB,KAAOJ,IAClBkC,EAAcsB,KAAKH,GACnBjB,EAAoBiB,GAAsBP,EAC1CT,EAAkBmB,KAAKP,EAAWI,IAClCd,EAAoBiB,KAAKF,GACzBb,EAAwBe,KAAKP,EAAWK,IACxCX,EAAkBa,KAAKpD,GACvB0C,KAIFjB,EAAgB2B,KAAKH,GACrBtB,EAAoByB,KAAKP,EAAWI,IAGpCC,EAAkBD,EAClBA,GAAsB,IAIxB,MAAMT,EAAmBV,EAAcqB,OAAS,EAAIrB,EAAcA,EAAcqB,OAAS,GAAK,KACxFtB,EAAaJ,EAAgB0B,OAAS,EAAI1B,EAAgBA,EAAgB0B,OAAS,GAAK,KAG9FJ,KAAK3B,KAAOA,EACZ2B,KAAKxB,SAAWA,EAChBwB,KAAKvB,YAAcD,EAASA,EAAS4B,OAAS,GAC9CJ,KAAKtB,gBAAkBA,EACvBsB,KAAKrB,kBAAoB,IAAI2B,IAAI5B,GACjCsB,KAAKpB,oBAAsBA,EAC3BoB,KAAKnB,sBAAwB,IAAIyB,IAAI1B,GACrCoB,KAAKjB,cAAgBA,EACrBiB,KAAKhB,gBAAkB,IAAIsB,IAAIvB,GAC/BiB,KAAKf,oBAAsBA,EAC3Be,KAAKd,kBAAoBA,EACzBc,KAAKb,oBAAsB,IAAImB,IAAIpB,GACnCc,KAAKZ,oBAAsBA,EAC3BY,KAAKX,sBAAwB,IAAIiB,IAAIlB,GACrCY,KAAKV,wBAA0BA,EAC/BU,KAAKT,0BAA4B,IAAIe,IAAIhB,GACzCU,KAAKR,kBAAoBA,EACzBQ,KAAKP,iBAAmBA,EACxBO,KAAKN,iBAAmBD,EAAmBK,EAAWL,GAAoB,KAC1EO,KAAKlB,WAAaA,EAClBkB,KAAKJ,eAAiBd,EAAagB,EAAWhB,GAAc,KAC5DkB,KAAKL,cAAgBA,CACvB,EClHF,MAAMY,EAAQ,IAAI9E,QAEZ,SAAU+E,EAAiBzE,GAC/B,MAAM0E,EAASF,EAAMrE,IAAIH,GACzB,QAAe2E,IAAXD,EACF,OAAOA,EAET,IAAIE,EAAuB,KAC3B,IACE,GAAI5E,EAAK6E,WAAaC,KAAKC,aACzB,OAAOH,EAET,MAAMI,EAAUhF,EACViF,EAAUD,EAAQC,QAAQC,cAChC,GAAID,EAAQE,SAAS,KACnB,OAAOP,EAAQK,EAEjB,GAAID,EAAQ3G,aAAa,MAAO,CAC9B,MAAM+G,EAAKJ,EAAQK,aAAa,MAChC,GAAID,EAAGD,SAAS,KACd,OAAOP,EAAQQ,CAEnB,CACA,OAAOR,CACT,SACEJ,EAAMjE,IAAIP,EAAM4E,EAClB,CACF,CCbM,SAAUU,EACdC,EAA4C,MAE5C,MAAMC,EAAkBC,WAAqDC,eACvEC,EAAWJ,GAAOG,gBAAkBF,EAC1C,GAAwB,iBAAbG,GAAsC,OAAbA,EAAmB,OAAO,KAE9D,MAAMC,EAAYD,EAClB,MAA6B,mBAAlBC,EAAUzF,KAAuD,mBAA1ByF,EAAUC,YACnD,KAEFD,CACT,CAEM,SAAUE,EACdH,EACAI,GAEAJ,EAASK,UAAUD,EACrB,CCaM,SAAUE,EAAwBC,GACtC,IACE,GAAe,OAAXA,GAAsC,iBAAXA,GAAyC,mBAAXA,EAC3D,OAAO,KAGT,MAAMN,EAAYM,EAKZC,EAAmBP,EAAUO,iBAC7BC,EAAsBR,EAAUQ,oBAChCC,EAAcT,EAAU9B,aAAawC,WAE3C,GAAgC,mBAArBH,GAAkE,mBAAxBC,EACnD,OAAO,KAET,GAA8B,gBAA1BC,GAAaE,SAA4B,OAAO,KACpD,IAAKC,OAAOC,UAAUJ,EAAYK,UAAYL,EAAYK,QArDvB,EAsDjC,OAAO,KAGT,MAAMC,EAAkBC,EAAcP,EAAYQ,WAAYC,GAC9D,GAAwB,OAApBH,EAA0B,OAAO,KAErC,MAAMI,OAAwCpC,IAAvB0B,EAAYW,OAC/B,IAAI5E,IACJwE,EAAcP,EAAYW,OAAQC,GACtC,GAAuB,OAAnBF,EAAyB,OAAO,KAEpC,MAAMG,OAA4CvC,IAAzB0B,EAAYc,SACjC,IAAI/E,IACJwE,EAAcP,EAAYc,SAAUC,GACxC,OAAyB,OAArBF,EAAkC,KAE/B,CACLhB,OAAQA,EACRmB,gBAAiBhB,EACjBM,kBACAI,iBACAG,mBAEJ,CAAE,MACA,OAAO,IACT,CACF,CAEA,SAASJ,EAA0BlC,GACjC,GAAqB,iBAAVA,GAAgC,OAAVA,EAAgB,OAAO,EACxD,MAAM0C,EAAa1C,EACnB,MAA+B,iBAApB0C,EAAWC,MAAgD,IAA3BD,EAAWC,KAAKlD,SAC3B,iBAArBiD,EAAWE,OAAkD,IAA5BF,EAAWE,MAAMnD,cAChCM,IAAtB2C,EAAWG,QAAqD,mBAAtBH,EAAWG,QAC9D,CAEA,SAASR,EAAuBrC,GAC9B,GAAqB,iBAAVA,GAAgC,OAAVA,EAAgB,OAAO,EACxD,MAAM0C,EAAa1C,EACnB,MAA+B,iBAApB0C,EAAWC,MAAgD,IAA3BD,EAAWC,KAAKlD,cAC3BM,IAAzB2C,EAAWI,WAA2D,iBAAzBJ,EAAWI,UACjE,CAEA,SAASN,EAAyBxC,GAChC,GAAqB,iBAAVA,GAAgC,OAAVA,EAAgB,OAAO,EACxD,MAAM0C,EAAa1C,EACnB,MAA+B,iBAApB0C,EAAWC,MAAgD,IAA3BD,EAAWC,KAAKlD,cAC/BM,IAArB2C,EAAWxH,OAAmD,kBAArBwH,EAAWxH,MAC7D,CAEA,SAAS8G,EACPhC,EACA+C,GAEA,IAAKC,MAAMC,QAAQjD,GAAQ,OAAO,KAClC,MAAMkD,EAAU,IAAI1F,IACpB,IAAK,MAAM2F,KAASnD,EAAO,CACzB,IAAK+C,EAAaI,IAAUD,EAAQtH,IAAIuH,EAAMR,MAAO,OAAO,KAC5DO,EAAQvH,IAAIwH,EAAMR,KAAMQ,EAC1B,CACA,OAAOD,CACT,CC/HM,SAAUE,EAAWC,GACzB,MAAM,IAAIC,MAAM,oBAAoBD,IACtC,CCKA,SAASE,EACPZ,EACAa,EACAC,GAGA,MAAMC,EAAwB,MAATF,EAAe,IAAIb,IAAS,GAAGa,KAAQb,IAC5D,MAAO,CACLgB,SAAUhB,EACViB,aAAc,CAACjB,GACfkB,cAAe,GACfC,cAAeJ,EACfK,cAAetG,EAAYiG,GAC3BD,YACAO,UAAW,GACXC,WAAY,GACZC,YAAa,OAEjB,CAEA,SAASC,EAASC,GAChB,OAAQA,EAAEF,aACR,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,WACH,MAAO,GAAGE,EAAEF,gBAAgBE,EAAET,WAGhC,QACE,OAAO,KAEb,CCvCM,SAAUU,EAAgBlD,EAAYzD,GAC1C,IAAI4G,EAAcnD,EAClB,GAAoB,IAAhBzD,EAAK+B,OAAc,OAAO6E,EAE9B,IAAI,IAAIhI,EAAI,EAAGA,EAAIoB,EAAK+B,SACtB6E,EAAcA,GAAaC,WAAW7G,EAAKpB,KAAO,KAC9B,OAAhBgI,GAF0BhI,KAIhC,OAAOgI,CACT,CCRA,MAAME,EAAiB,IAAI1J,QAErB,SAAU2J,EAAkBrJ,GAChC,OAAOoJ,EAAejJ,IAAIH,IAAS,IACrC,CAEM,SAAUsJ,EAAkBtJ,EAAYuJ,GAC5CH,EAAe7I,IAAIP,EAAMuJ,EAC3B,CCRO,MAAMC,EAAgD,IAAIjF,IAAI,CACnE,KACA,SACA,OACA,QCkBI,SAAUkF,EAAgBC,GAC9B1B,EAAW,UAAU0B,iCACvB,CAQM,SAAUC,EAAmBD,GACjC1B,EAAW,UAAU0B,gCACvB,CAQM,SAAUE,EAAkBF,GAChC1B,EAAW,UAAU0B,4BACvB,CA4BM,SAAUG,EAAgBH,GAC9B1B,EAAW,UAAU0B,0BACvB,CCvDA,SAASI,EAAqBlF,GAC5B,SAAKA,GAASmF,MAAMvD,OAAO5B,IAI7B,CAQA,MA4jBMoF,GAAoC,CACxCC,GA7jBUC,IACV,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,MAC5C,OAAQ7E,GAEe,iBAAVA,GACJkF,EAAqBK,IAAOR,EAAmB,MAC7C/E,IAAU4B,OAAO2D,IAGjBvF,IAAUuF,GAqjBrBC,GAxiBUF,IACV,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,MAC5C,OAAQ7E,GAEe,iBAAVA,GACJkF,EAAqBK,IAAOR,EAAmB,MAC7C/E,IAAU4B,OAAO2D,IAGjBvF,IAAUuF,GAgiBrBE,IAnhBWC,GACH1F,IACe,kBAAVA,GDfboD,EAAW,UCe2C,mCAC5CpD,GAkhBV2F,GAxgBUL,IACV,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,MAE5C,OADKK,EAAqBK,IAAOR,EAAmB,MAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,MAC3ChF,EAAQ4B,OAAO2D,KAogBxBK,GA1fUN,IACV,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,MAE5C,OADKK,EAAqBK,IAAOR,EAAmB,MAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,MAC3ChF,GAAS4B,OAAO2D,KAsfzBM,GA5eUP,IACV,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,MAE5C,OADKK,EAAqBK,IAAOR,EAAmB,MAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,MAC3ChF,EAAQ4B,OAAO2D,KAwexBO,GA9dUR,IACV,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,MAE5C,OADKK,EAAqBK,IAAOR,EAAmB,MAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,MAC3ChF,GAAS4B,OAAO2D,KA2dzBQ,IAjdWT,IACX,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,OAE5C,OADKK,EAAqBK,IAAOR,EAAmB,OAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,OAC3ChF,EAAQ4B,OAAO2D,KA6cxBS,IAncWV,IACX,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,OAE5C,OADKK,EAAqBK,IAAOR,EAAmB,OAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,OAC3ChF,EAAQ4B,OAAO2D,KA+bxBU,IArbWX,IACX,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,OAE5C,OADKK,EAAqBK,IAAOR,EAAmB,OAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,OAC3ChF,EAAQ4B,OAAO2D,KAibxBW,IAvaWZ,IACX,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,OAE5C,OADKK,EAAqBK,IAAOR,EAAmB,OAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,OAC3ChF,EAAQ4B,OAAO2D,KAmaxBY,IAzZWb,IACX,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,OAE5C,OADKK,EAAqBK,IAAOR,EAAmB,OAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,OAC3ChF,EAAQ4B,OAAO2D,KAsZxBa,IA5YWd,IACX,MAAMC,EAAMD,IAAU,IAAM,IAE5B,OADKJ,EAAqBK,IAAOR,EAAmB,OAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,OAC3ChF,EAAMqG,QAAQzE,OAAO2D,MAwY9BnL,OA9XckL,IACd,MAAMC,EAAMD,IAAU,IAAM3K,EAAOP,OACnC,OAAQ4F,IACe,iBAAVA,GAAqBgF,EAAkB,UAC3ChF,EAAMsG,eAAef,KA2X9BgB,GAjXUb,GACF1F,GACCwG,OAAOxG,GAAOyG,cAgXvBC,GAtWUhB,GACF1F,GACCwG,OAAOxG,GAAOM,cAqWvBqG,IA3VWjB,GACH1F,IACN,MAAM4G,EAAIJ,OAAOxG,GACjB,OAAiB,IAAb4G,EAAEnH,OAAsBmH,EACX,IAAbA,EAAEnH,OAAsBmH,EAAEH,cACvBG,EAAEC,OAAO,GAAGJ,cAAgBG,EAAEE,MAAM,IAuV7CC,KA7UYrB,GACJ1F,GACCwG,OAAOxG,GAAO+G,OA4UvBD,MAlUaxB,IACb,MAAM0B,EAAyB,GACzBC,EAAO3B,IAAU,IAAMT,EAAgB,SACxCK,EAAqB+B,IAAQlC,EAAmB,SACrDiC,EAAatH,KAAKkC,OAAOqF,IACzB,MAAMC,EAAO5B,IAAU,GAKvB,YAJoB,IAAT4B,IACJhC,EAAqBgC,IAAQnC,EAAmB,SACrDiC,EAAatH,KAAKkC,OAAOsF,KAEnBlH,GACCwG,OAAOxG,GAAO8G,SAASE,IAwThCG,OA9Sc7B,IACd,MAAM2B,EAAO3B,IAAU,IAAMT,EAAgB,UACxCK,EAAqB+B,IAAQlC,EAAmB,UACrD,MAAMmC,EAAO5B,IAAU,IAAMT,EAAgB,UAE7C,OADKK,EAAqBgC,IAAQnC,EAAmB,UAC7C/E,GACCwG,OAAOxG,GAAOmH,OAAOvF,OAAOqF,GAAOrF,OAAOsF,KAySnDE,IA/RW9B,IACX,MAAM2B,EAAO3B,IAAU,IAAMT,EAAgB,OACxCK,EAAqB+B,IAAQlC,EAAmB,OACrD,MAAMmC,EAAO5B,IAAU,IAAM,IAC7B,OAAQtF,GACCwG,OAAOxG,GAAOqH,SAASzF,OAAOqF,GAAOC,IA2R9CI,IAjRWhC,IACX,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,OAE5C,OADKK,EAAqBK,IAAOR,EAAmB,OAC5C/E,GACCwG,OAAOxG,GAAOuH,OAAO3F,OAAO2D,KA8QrCiC,IApQW9B,GACH1F,GACCwG,OAAOxG,GAAOV,MAAM,IAAImI,UAAUC,KAAK,IAoQhDC,IA1PWjC,GACH1F,GACC4H,SAASpB,OAAOxG,GAAQ,IAyPjC6H,MA/OanC,GACL1F,GACC8H,WAAWtB,OAAOxG,IA8O3B+H,MApOazC,IACb,MAAMC,EAAMD,IAAU,IAAM,IAE5B,OADKJ,EAAqBK,IAAOR,EAAmB,SAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,SAClD,MAAMgD,EAAWC,KAAKC,IAAI,GAAItG,OAAO2D,IACrC,OAAO0C,KAAKF,MAAM/H,EAAQgI,GAAYA,IA+NxCG,MArNa7C,IACb,MAAMC,EAAMD,IAAU,IAAM,IAE5B,OADKJ,EAAqBK,IAAOR,EAAmB,SAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,SAClD,MAAMgD,EAAWC,KAAKC,IAAI,GAAItG,OAAO2D,IACrC,OAAO0C,KAAKE,MAAMnI,EAAQgI,GAAYA,IAgNxCI,KAtMY9C,IACZ,MAAMC,EAAMD,IAAU,IAAM,IAE5B,OADKJ,EAAqBK,IAAOR,EAAmB,QAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,QAClD,MAAMgD,EAAWC,KAAKC,IAAI,GAAItG,OAAO2D,IACrC,OAAO0C,KAAKG,KAAKpI,EAAQgI,GAAYA,IAiMvCK,QAvLe/C,IACf,MAAMC,EAAMD,IAAU,IAAM,IAE5B,OADKJ,EAAqBK,IAAOR,EAAmB,WAC5C/E,IACe,iBAAVA,GAAqBgF,EAAkB,WAC3C,IAAY,IAARhF,GAAaqG,QAAQzE,OAAO2D,SAoLzC+C,KA1KYhD,IACZ,MAAMC,EAAMD,IAAU,IAAM3K,EAAOP,OACnC,OAAQ4F,IACAA,aAAiBuI,MAAStD,EAAgB,QACzCjF,EAAMwI,mBAAmBjD,KAuKlCkD,KA7JYnD,IACZ,MAAMC,EAAMD,IAAU,IAAM3K,EAAOP,OACnC,OAAQ4F,IACAA,aAAiBuI,MAAQtD,EAAgB,QACxCjF,EAAM0I,mBAAmBnD,KA0JlCoD,SAhJgBrD,IAChB,MAAMC,EAAMD,IAAU,IAAM3K,EAAOP,OACnC,OAAQ4F,IACAA,aAAiBuI,MAAQtD,EAAgB,YACxCjF,EAAMsG,eAAef,KA6I9BqD,IAnIWtD,IACX,MAAMC,EAAMD,IAAU,IAAM,IAC5B,OAAQtF,IACAA,aAAiBuI,MAAQtD,EAAgB,OAC/C,MAAM4D,EAAO7I,EAAM8I,cAAcC,WAC3BC,GAAShJ,EAAMiJ,WAAa,GAAGF,WAAW1B,SAAS,EAAG,KACtD6B,EAAMlJ,EAAMmJ,UAAUJ,WAAW1B,SAAS,EAAG,KACnD,MAAO,GAAGwB,IAAOtD,IAAMyD,IAAQzD,IAAM2D,MA8HvCE,MApHa1D,GACL1F,IAAsC,IAAVA,SAAmBA,GAAmD,IAAVA,GAAyB,KAAVA,GAAgB4B,OAAOuD,MAAMnF,GAoH5IqJ,OA3Gc3D,GACN1F,IAAqC,IAAVA,SAAmBA,GAAmD,IAAVA,GAAyB,KAAVA,IAAiB4B,OAAOuD,MAAMnF,GA2G5IsJ,SAlGgBhE,IAChB,MAAMC,EAAMD,IAAU,IAAMT,EAAgB,YAC5C,OAAQ7E,IACQ,IAAVA,SAAmBA,GAAmD,IAAVA,GAAyB,KAAVA,GAAgB4B,OAAOuD,MAAMnF,GAAgBuF,EACrHvF,GAgGTuJ,QAtFe7D,GACP1F,GACCwJ,QAAQxJ,GAqFjByJ,OA3Ec/D,GACN1F,GACC4B,OAAO5B,GA0EhB0J,OAhEchE,GACN1F,GACCwG,OAAOxG,GA+DhB2J,KArDajE,GACL1F,GACY,KAAVA,EAAgB,KAAOA,GAsDtB4J,GAAuBxE,GAGvByE,GAA+B,CAC1CC,MAHiC1E,GAIjC2E,OAAUH,IAUCI,GAAkB,CAACrH,EAAa2C,IAAuB2E,IAClE,MAAMC,EAASD,EAAQtH,GAIvB,OAHKuH,GACH9G,EAAW,qBAAqBT,KAE3BuH,EAAO5E,IC9pBhB,MAAM6E,GAAgD,IAAI3M,IAIpD,SAAU4M,GAAaC,EAA0BC,GACrD,MAAMlF,EAAiByE,GAA6BS,GA0CpD,OAzC+BD,EAAeE,IAAKC,IACjD,MAAMC,EAAiBD,EAAWE,QAAQ,KACpCC,EAAkBH,EAAWI,YAAY,KAQ/C,IANuB,IAAnBH,QAAyBE,GAC3BvH,EAAW,0DAA0DoH,OAE/C,IAApBG,QAA0BF,GAC5BrH,EAAW,0DAA0DoH,OAEhD,IAAnBC,EAAuB,CAEzB,MAAMI,EAAaL,EAAWzD,OACxB+D,EAAY,GAAGD,OAAgBP,IACrC,IAAIS,EAAWZ,GAAc5O,IAAIuP,GAKjC,YAJwB,IAAbC,IACTA,EAAWf,GAAgBa,EAAY,GAA5Bb,CAAgC5E,GAC3C+E,GAAcxO,IAAImP,EAAWC,IAExB,CACLF,WAAYA,EACZG,KAAM,GACND,SAAUA,EAEd,CAAO,CACL,MAAME,EAAWT,EAAWU,UAAUT,EAAiB,EAAGE,GACpDE,EAAaL,EAAWU,UAAU,EAAGT,GAAgB1D,OACrDiE,ECvCN,SAA0BC,GAC9B,MAAMD,EAAiB,GACvB,IAAIG,EAAU,GACVC,EAAyB,KACzBC,GAAW,EAEf,IAAK,IAAI/O,EAAI,EAAGA,EAAI2O,EAASxL,OAAQnD,IAAK,CACxC,MAAMgP,EAAOL,EAAS3O,GAElB8O,EACEE,IAASF,EACXA,EAAU,KAEVD,GAAWG,EAEK,MAATA,GAAyB,MAATA,GACzBF,EAAUE,EACVD,GAAW,GACO,MAATC,GACTN,EAAKtL,KAAKyL,EAAQpE,QAClBoE,EAAU,GACVE,GAAW,GAEXF,GAAWG,CAEf,CAEA,MAAMC,EAAOJ,EAAQpE,OAKrB,OAJIwE,GAAQF,IACVL,EAAKtL,KAAK6L,GAGLP,CACT,CDMmBQ,CAAgBP,GACvBH,EAAY,GAAGD,KAAcG,EAAKtD,KAAK,SAAS4C,IACtD,IAAIS,EAAWZ,GAAc5O,IAAIuP,GAKjC,YAJwB,IAAbC,IACTA,EAAWf,GAAgBa,EAAYG,EAA5BhB,CAAkC5E,GAC7C+E,GAAcxO,IAAImP,EAAWC,IAExB,CACLF,aACAG,OACAD,WAEJ,GAGJ,CErDO,MAAMU,GAAUC,GAAsBA,EAAE3E,OCMzC4E,GAAmB,IAAInO,ICE7B,MAAMmO,GAAmB,IAAInO,IAMvB,SAAUoO,GAAeC,GAC7B,MAAMC,EAAMD,EAAUnB,QAAQtO,GAC9B,IAAI2P,EAAuB,GACvBC,EAAwB,GACxBC,EAAc,GACdhC,EAAyB,IACjB,IAAR6B,GACFC,EAAeF,EAAU/E,MAAM,EAAGgF,GAAK/E,OACvCkF,EAAcJ,EAAU/E,MAAMgF,EAAM,GAAG/E,OACnC4E,GAAiB/P,IAAIqQ,GACvBhC,EAAU0B,GAAiBpQ,IAAI0Q,IAE/BD,EAAcC,EAAY3M,MAAMlD,GAAkBmO,IAAIkB,IACtDxB,EAAUG,GAAa4B,EAAa,UACpCL,GAAiBhQ,IAAIsQ,EAAahC,KAGpC8B,EAAeF,EAAU9E,OAE3B,MAAOjD,EAAeL,EAAY,WAAasI,EAAazM,MhBrB1B,KgBqBsDiL,IAAIkB,IAE5F,MAAO,CACLhI,YACAK,gBACAC,cAJetG,EAAYqG,GAK3BG,WAAYgG,EAEhB,CCxBM,SAAUiC,GAAyBC,GACvC,SAAWC,GAAcD,EAAS7M,MjBTH,KiBS4BiL,IAAIkB,IAAQvB,OAAOwB,GAAKA,EAAEjM,OAAS,GACxF4M,EAAUD,EAAU7B,IAAK4B,IAC7B,MAAMG,EAAiBH,EAASzB,QjBVA,MiBWT,IAAnB4B,GACFlJ,EAAW,sBAAsB+I,6DAEnC,MAAMI,EAAWJ,EAASrF,MAAM,EAAGwF,GAAgBvF,OAC7C8E,EAAYM,EAASrF,MAAMwF,EAAiB,GAAGvF,OACrD,GAAiB,SAAbwF,EAAqB,CAEvB,MAAO,CACL5I,SAAU,OACVC,aAAc,CAAC,QACfC,cAAe,GACfC,cAAe,QACfC,cANetG,EAAY,SAO3BgG,UAAW,GACXO,UAAW,GACXC,WAAY,GACZC,YAAa,OAEjB,CAAO,GAAiB,QAAbqI,EAAoB,CAC7B,MAAMC,EAAcZ,GAAeC,GAOnC,OANIW,EAAYvI,WAAWxE,OAAS,GAClC2D,EAAW,2BAA2B+I,kDAEC,IAArCK,EAAY1I,cAAcrE,QAC5B2D,EAAW,2BAA2B+I,uCAEjC,CACLxI,SAAU,MACVC,aAAc,CAAC,OACfC,cAAe,GACfG,UAAW,MACRwI,EACHtI,YAAa,SAEjB,CAAO,GAAiB,OAAbqI,GACO,WAAbA,GACa,QAAbA,GACa,UAAbA,GACa,aAAbA,EACH,CAEA,MAAO,CACL5I,SAAU4I,EACV3I,aAAc,CAAC2I,GACf1I,cAAe,GACfG,UAAW,MALO4H,GAAeC,GAOjC3H,YAAaqI,EAEjB,CAAO,CACL,MAAMC,EAAcZ,GAAeC,GAC7BY,EFxDN,SAAwBF,GAC5B,MAAMT,EAAMS,EAAS7B,QAAQtO,GAC7B,IAAIsQ,EAAmB,GACnBV,EAAwB,GACxBC,EAAc,GACdhC,EAAyB,IACjB,IAAR6B,GACFY,EAAWH,EAASzF,MAAM,EAAGgF,GAAK/E,OAClCkF,EAAcM,EAASzF,MAAMgF,EAAM,GAAG/E,OAClC4E,GAAiB/P,IAAIqQ,GACvBhC,EAAU0B,GAAiBpQ,IAAI0Q,IAE/BD,EAAcC,EAAY3M,MAAMlD,GAAkBmO,IAAIkB,IACtDxB,EAAUG,GAAa4B,EAAa,SACpCL,GAAiBhQ,IAAIsQ,EAAahC,KAGpCyC,EAAWH,EAASxF,OAGtB,MAAOpD,EAAUgJ,GAAqBD,EAASpN,MfzBf,KeyByCiL,IAAIkB,IACvE7H,EAAeD,EAASrE,MAAMrD,GAAWsO,IAAIkB,IAInD,MAAO,CACL9H,WACAC,eACAC,cANoB8I,EAClBA,EAAkBrN,MAAM,KAAKiL,IAAIkB,IACjC,GAKFzH,UAAWiG,EAEf,CEyByB2C,CAAcL,GAGjC,MAAmC,eAA/BE,EAAW7I,aAAa,IAOxB6I,EAAW7I,aAAa,GAAGiJ,WAAW,MANjC,IACFJ,KACAD,EACHtI,YAAa,SAUR,IACFuI,KACAD,EACHtI,YAAa,OAGnB,IAGF,GAAImI,EAAQ5M,OAAS,EAAG,CACS4M,EAAQS,KAAK1I,GAAKQ,EAA4BhJ,IAAIwI,EAAEF,eAEjFd,EAAW,sBAAsB+I,yEAErC,CACA,OAAOE,CACT,CCxGA,MAAMU,GAAiB,IAAIjS,QAYrBkS,GAAqC,IAAIrN,IAAY,CACzDhF,EAAOf,kBACPe,EAAOd,iBACPc,EAAOb,gBACPa,EAAOZ,oBACPY,EAAOX,oBAIHiT,GAAiB,IAAIC,OAAO,uCAE5B,SAAUC,GAAiB/R,GAC/B,MAAMgS,EAAYL,GAAexR,IAAIH,GACrC,GAAyB,iBAAdgS,EACT,OAAOA,EAET,GAAIhS,EAAK6E,WAAaC,KAAKmN,aACzB,OAAO,KAET,MACMC,EADclS,EACKmS,KAAKxG,OACxByG,EAAQP,GAAeQ,KAAKH,GAClC,GAAc,OAAVE,EACF,OAAO,KAGT,MAAME,EAAUF,EAAM,IAAM7S,EAAOf,kBACnC,OAAKoT,GAAsBpR,IAAI8R,IAG/BX,GAAepR,IAAIP,EAAMoS,EAAM,IACxBA,EAAM,IAHJ,IAIX,CC1CA,MAAMG,GAAqB,IAAInQ,aAEfoQ,GAAsBC,EAAcC,EAAgBC,GAClE,GAAqB,OAAjBA,EACFJ,GAAmBK,OAAOH,OACrB,CACLF,GAAmBhS,IAAIkS,EAAME,GAC7B,MAAME,EAAiBF,EAAaG,oBAC9BC,EAAeC,GAAsBN,EAAUG,EAAexK,WAC/C,OAAjB0K,GACF/K,EAAW,4BAA4B6K,EAAexK,2CAExD0K,EAAaE,YAAYJ,EAAenK,cAAemK,EAAe/J,aACtE,IAAI,MAAMoK,KAAYP,EAAaQ,UACjC,IAAI,MAAMC,KAAsBF,EAASG,qBAAsB,CAC7D,MAAMC,EAAmBN,GAAsBN,EAAUU,EAAmB/K,WACnD,OAArBiL,GACFtL,EAAW,4BAA4BoL,EAAmB/K,gDAE5DiL,EAAiBL,YAAYG,EAAmB1K,cAAe0K,EAAmBtK,YACpF,CAEJ,CACF,CAEM,SAAUyK,GAAsBd,GACpC,OAAOF,GAAmBpS,IAAIsS,IAAS,IACzC,CCvBM,SAAUe,GAAwBxT,GACtC,GAAIA,EAAK6E,WAAaC,KAAKC,aAAc,CAGvC,OAAO+L,GAFS9Q,EACSqF,aAAa9F,EAAOhB,oBAAsB,GAErE,CAAO,GAAIyB,EAAK6E,WAAaC,KAAKmN,aAAc,CAC9C,MAAMwB,EAAiB1B,GAAiB/R,GACjB,OAAnByT,GACFzL,EAAW,wCAEb,MAAM2K,EAAeY,GAAsBE,GAC3C,IAAIC,EAAyBf,GAAcG,qBAAuB,KAC9DL,EAAsB,KAQ1B,OAP+B,OAA3BiB,GAEFA,EClBG,CACLnL,SAAU,cACVC,aAAc,CAAC,eACfC,cAAe,GACfG,UAAW,MALO4H,GDmBsCiD,GCZxD3K,YAAa,QDaX2J,EAAO,MAEPA,EAAOgB,EAEF,CAAC,IACHC,EACHjB,KAAMA,GAEV,CACA,MAAO,EACT,CEzBM,SAAUkB,GAAmB5N,GACjC,MAAM6N,EAA0B,GAC1BC,EAAS1V,SAAS2V,iBACtB/N,EACAgO,WAAWC,aAAeD,WAAWE,aACrC,CACE,UAAAC,CAAWlU,GACT,GAAIA,EAAK6E,WAAaC,KAAKC,aAAc,CAGvC,OAFgB/E,EACW3B,aAAakB,EAAOhB,mBAE3CwV,WAAWI,cACXJ,WAAWK,WACjB,CAEE,OAAkC,OAA3BrC,GAAiB/R,GACpB+T,WAAWI,cACXJ,WAAWK,WAEnB,IAIJ,KAAOP,EAAOQ,YACZT,EAAgBtP,KAAKuP,EAAO3K,aAE9B,OAAO0K,CACT,CCvBA,MAAMU,GAAoB,IAAI1U,QAQ9B,SAAS2U,GACPvU,EACAwU,EACAtK,GAEA,MAAMuK,EjBoDF,SACJzU,EACAiR,EACA/G,EAAgC,CAAA,GAEhC,MAAMwK,EAAgBxK,EAAQwK,gBAAiB,EAC/C,IAAKzD,EAAQS,KAAK1I,GAAuB,WAAlBA,EAAEF,aACvB,OAAOmI,EAET,MAAMwD,EAAkC,GAClCE,EAAe,IAAI/U,QACzB,IAAK,MAAMgV,KAAU3D,EAAS,CAC5B,GAA2B,WAAvB2D,EAAO9L,YAA0B,CACnC2L,EAASnQ,KAAKsQ,GACd,QACF,CACI5U,EAAK6E,WAAaC,KAAKC,cACzBiD,EAAW,4CAEb,MAAMhD,EAAUhF,EACViF,EAAUR,EAAiBO,GACjB,OAAZC,GACF+C,EAAW,mBAAmB4M,EAAOlM,kEAAkE1D,EAAQC,QAAQC,2CAEzH,MAAMS,EAAWL,IAKjB,GAJiB,OAAbK,GACFqC,EAAW,6CAA6C/C,YAG/B,IADPU,EAASxF,IAAI8E,GACO,CACjCyP,GACH1M,EAAW,mBAAmB4M,EAAOlM,4BAA4BzD,oFAGnEwP,EAASnQ,KAAKsQ,GACd,QACF,CACA9O,EAAqBH,EAAUX,GAC/B,MAAM6P,EAAW5O,EAAwBjB,GACxB,OAAb6P,GACF7M,EAAW,mBAAmB4M,EAAOlM,4BAA4BzD,gDAEnE,MAAM6P,EAAaF,EAAOlM,cACpBL,EAAYuM,EAAOvM,UACnB0M,EAAO,IAAIxQ,IACjB,IAAK,MAAMgD,KAAQsN,EAASlO,gBAAgBqO,OAAQ,CAClD,GAAID,EAAKvU,IAAI+G,GAAO,SACpBwN,EAAKnU,IAAI2G,GACT,MAAMQ,EAAQI,EAAkBZ,EAAMuN,EAAYzM,GAClDsM,EAAa/T,IAAImH,GACjB0M,EAASnQ,KAAKyD,EAChB,CAGA,IAAK,MAAMR,KAAQsN,EAAS9N,eAAeiO,OAAQ,CACjD,GAAID,EAAKvU,IAAI+G,GAAO,SACpBwN,EAAKnU,IAAI2G,GACT,MAAMQ,EAAQI,EAAkBZ,EAAMuN,EAAYzM,GAClDsM,EAAa/T,IAAImH,GACjB0M,EAASnQ,KAAKyD,EAChB,CACF,CAEA,MAAMkN,EAAiB,IAAI7S,IAC3B,IAAK,IAAIlB,EAAI,EAAGA,EAAIuT,EAASpQ,OAAQnD,IAAK,CACxC,MAAMgU,EAAMnM,EAAS0L,EAASvT,IAClB,OAARgU,GACFD,EAAe1U,IAAI2U,EAAKhU,EAE5B,CACA,MAAMiU,EAA+B,GACrC,IAAK,IAAIjU,EAAI,EAAGA,EAAIuT,EAASpQ,OAAQnD,IAAK,CACxC,MAAMgU,EAAMnM,EAAS0L,EAASvT,IAC9B,GAAY,OAARgU,GAIJ,GAAID,EAAe9U,IAAI+U,KAAShU,EAC9BiU,EAAM7Q,KAAKmQ,EAASvT,SACf,GAAI3B,EAAON,OAAS0V,EAAanU,IAAIiU,EAASvT,IAAK,CACxD,MAAMkU,EAAYX,EAASQ,EAAe9U,IAAI+U,IACxCG,EAAUrV,EAAK6E,WAAaC,KAAKC,aACnC,IAAK/E,EAAiBiF,QAAQC,iBAC9B,OACJoQ,QAAQrW,MAAM,kCAAkCwV,EAASvT,GAAGqH,gBAAgB8M,iDAAuDD,EAAU1M,mBAC/I,OAXEyM,EAAM7Q,KAAKmQ,EAASvT,GAYxB,CACA,OAAOiU,CACT,CiB5ImBI,CAAavV,EAAMwU,EAAc,CAAEE,cAAexK,EAAQwK,gBAC3E,GAAwBD,EjB8IT/C,KAAK1I,GAAuB,WAAlBA,EAAEF,aiB9IQ,CACjC,MAAM7D,EAAUjF,EAAK6E,WAAaC,KAAKC,aACnCN,EAAiBzE,GACjB,KAIJ,OAHgB,OAAZiF,GACF+C,EAAW,gEAEN,CAAEuB,SAAU,GAAIiM,SAAU,CAAExV,OAAMiF,UAASuP,gBACpD,CACAF,GAAkB1T,IAAIZ,GACtB,MAAMuJ,EClCF,SAA0BvJ,EAAYyV,GAC1C,MAAMC,EAA+B,GACrC,IAAK,MAAMhC,KAA0B+B,EACnC,GAA2C,SAAvC/B,EAAuB5K,YACzB4M,EAAapR,KAAK,IACboP,EACH1T,KAAMA,EACN2V,YAAa3V,QAEV,CAKL,MAAM2V,EAAc3V,EAAK6E,WAAaC,KAAK8Q,UACvC5V,EACA7B,SAAS0X,eAAe,IAC5BH,EAAapR,KAAK,IACboP,EACH1T,KAAMA,EACN2V,YAAaA,GAEjB,CAEF,OAAOD,CACT,CDSmBI,CAAgB9V,EAAMyU,GAGvC,OAFAnL,EAAkBtJ,EAAMuJ,GACxB7I,EAA0BV,GACnB,CAAEuJ,WAAUiM,SAAU,KAC/B,CAEM,SAAUO,GACdhQ,GAEA,MAAM6N,EAAkBD,GAAmB5N,GACrCiQ,EAA8B,GAC9BC,EAA0C,GAChD,IAAI,MAAMjW,KAAQ4T,EAAiB,CACjC,GAAIU,GAAkB9T,IAAIR,GAAO,SACjC,MACM4U,EAASL,GAA2BvU,EADrBwT,GAAwBxT,GACiB,CAAE0U,eAAe,IACvD,OAApBE,EAAOY,SAIXQ,EAAY1R,QAAQsQ,EAAOrL,UAHzB0M,EAAgB3R,KAAKsQ,EAAOY,SAIhC,CACA,MAAO,CAAC5B,EAAiBoC,EAAaC,EACxC,CA+BM,SAAUC,GAAmBlW,GACjCsU,GAAkB1T,IAAIZ,EACxB,CAOM,SAAUmW,GAAoBpO,GAClC,MAAM/H,KAAEA,EAAIwU,aAAEA,GAAiBzM,GAnB3B,SAAyB/H,GAC7BsU,GAAkB1B,OAAO5S,EAC3B,CAkBEoW,CAAepW,GAEf,OADeuU,GAA2BvU,EAAMwU,EAAc,CAAEE,eAAe,IACjEnL,QAChB,CEvGA,MAAM8M,GAAoB,IAAI3W,QAExB,SAAU4W,GAAqBtW,GACnC,IAAIuW,EAAyBvW,EAC7B,KAAOuW,GAAW,CAChB,MAAMC,EAAcH,GAAkBlW,IAAIoW,GAC1C,GAAIC,EACF,OAAOA,EAETD,EAAYA,EAAUE,UACxB,CACA,OAAO,IACT,CAEM,SAAUC,GAAqB1W,EAAYwW,GAC3B,OAAhBA,EAIJH,GAAkB9V,IAAIP,EAAMwW,GAH1BH,GAAkBzD,OAAO5S,EAI7B,CCpBA,MAAM2W,GAA0F,IAAIjX,QAE9F,SAAUkX,GAAuCC,GACrD,OAAOF,GAAoCxW,IAAI0W,IAAY,EAC7D,CAEM,SAAUC,GAAuCD,EAAgCjS,GACrF+R,GAAoCpW,IAAIsW,EAASjS,EACnD,CCTO,MAAMmS,GAA2CC,OAAO,yBAClDC,GAAsCD,OAAO,oBAC7CE,GAAoCF,OAAO,kBAC3CG,GAAoCH,OAAO,kBAC3CI,GAAoCJ,OAAO,kBAC3CK,GAAyCL,OAAO,uBAChDM,GAA4CN,OAAO,0BACnDO,GAAuCP,OAAO,qBCLrD7U,GAAwE,IAAIzC,QAE5E,SAAU8X,GAAoBzE,EAA6BxQ,GAC/D,GAAIJ,GAAO3B,IAAIuS,GAAe,CAC5B,MAAM0E,EAAUtV,GAAOhC,IAAI4S,GAC3B,GAAI0E,EAAQjX,IAAI+B,GACd,OAAOkV,EAAQtX,IAAIoC,EAEvB,MACEJ,GAAO5B,IAAIwS,EAAc,IAAIrT,SAE/B,MAAMgY,EAAmBtW,OAAOC,OAAO,IAAIsW,GAAiB5E,EAAcxQ,IAE1E,OADAJ,GAAOhC,IAAI4S,GAAexS,IAAIgC,EAAUmV,GACjCA,CACT,CAEA,MAAMC,GACKpV,SACA8F,UACA0K,aACA6E,uBACT,WAAA9T,CAAYiP,EAA6BxQ,GACvC0B,KAAK1B,SAAWA,EAChB0B,KAAKoE,UAAY0K,EAAaxL,KAC9BtD,KAAK8O,aAAeA,EACY,OAA5BxQ,EAASsB,eACXI,KAAK2T,uBAAyB,KAE9B3T,KAAK2T,uBAAyBJ,GAAoBzE,EAAcxQ,EAASsB,eAE7E,EC7BF,MAAM1B,GAAiF,IAAIzC,QACrFmY,GAAyE,IAAInY,QAEnF,MAAMoY,GACKJ,iBACAK,UACDC,uBAER,WAAAlU,CAAY4T,EAAqCK,GAC/C9T,KAAKyT,iBAAmBA,EACxBzT,KAAK8T,UAAYA,CACnB,CAEA,yBAAIE,GACF,QAA2C,IAAhChU,KAAK+T,uBACd,OAAO/T,KAAK+T,uBAEd,MAAMJ,EAAyB3T,KAAKyT,iBAAiBE,uBACrD,GAA+B,OAA3BA,EACF,OAAO,KAGT,IAAIM,EAAqC,KAMzC,OAJEA,EAHkBjU,KAAKyT,iBAAiBnV,SAASE,SAASwB,KAAKyT,iBAAiBnV,SAASE,SAAS4B,OAAS,KAEzFvD,EACAmD,KAAK8T,WAAWG,iBAAmB,KAEnCjU,KAAK8T,UAElB9T,KAAK+T,uBAAyBG,GACnCP,EACAM,EAEJ,EAGI,SAAUC,GAA2BT,EAAqCK,GAC9E,GAAkB,OAAdA,EAAoB,CACtB,IAAIrT,EAASmT,GAAoB1X,IAAIuX,GACrC,YAAsB,IAAXhT,IAGXA,EAAS,IAAIoT,GAAqBJ,EAAkB,MACpDG,GAAoBtX,IAAImX,EAAkBhT,IAHjCA,CAKX,CAAO,CACL,IAAI0T,EAA0BjW,GAAOhC,IAAI4X,QACF,IAA5BK,IACTA,EAA0B,IAAI1Y,QAC9ByC,GAAO5B,IAAIwX,EAAWK,IAExB,IAAI1T,EAAS0T,EAAwBjY,IAAIuX,GACzC,YAAsB,IAAXhT,IAGXA,EAAS,IAAIoT,GAAqBJ,EAAkBK,GACpDK,EAAwB7X,IAAImX,EAAkBhT,IAHrCA,CAKX,CACF,CC7DA,MAAM2T,GAAsD,IAAI3Y,QAE1D,SAAU4Y,GAAsBC,EAA4B7F,GAC/C,OAAbA,EACF2F,GAAmBzF,OAAO2F,GAE1BF,GAAmB9X,IAAIgY,EAAU7F,EAErC,CAEM,SAAU8F,GAAsBD,GACpC,OAAOF,GAAmBlY,IAAIoY,IAAa,IAC7C,CCXA,MAAME,GAA4C,IAAIrW,IAEhD,SAAUsW,GAAgBnW,EAAqBoW,GACnD,IAAIC,EACAC,EACJ,GAA+B,IAA3BtW,EAASqB,eAAwD,IAAjC+U,EAAe/U,cACjD,OAAO,EAET,GAA+B,IAA3BrB,EAASqB,eACR+U,EAAe/U,cAAgB,GAC/B+U,EAAe1V,gBAAgBzC,IAAI+B,EAASD,MAC/C,OAAO,EAELC,EAAS1C,GAAK8Y,EAAe9Y,IAC/B+Y,EAAQrW,EACRsW,EAAQF,IAERC,EAAQD,EACRE,EAAQtW,GAEV,MAAM2S,EAAM,GAAG0D,EAAMtW,SAASuW,EAAMvW,OACpC,IAAIwW,EAAML,GAAqBtY,IAAI+U,GACnC,QAAmB,IAAR4D,EACT,OAAOA,EAKT,OAFAA,EADkBF,EAAM3V,gBAAgB8V,aAAaF,EAAM5V,iBAC3C+V,KAChBP,GAAqBlY,IAAI2U,EAAK4D,GACvBA,CACT,CC1BA,MAAMG,GAAuG,IAAIvZ,QAE3G,SAAUwZ,GAA0BC,GACxC,MAAM3C,EAAcF,GAAqB6C,EAAYnZ,MACrD,GAAoB,OAAhBwW,EACF,OAAO,KAET,IAAI4C,EAAyBH,GAAoC9Y,IAAIqW,GACrE,QAAsC,IAA3B4C,EACTA,EAAyB,IAAI1Z,QAC7BuZ,GAAoC1Y,IAAIiW,EAAa4C,OAChD,CACL,MAAMrB,EAAYqB,EAAuBjZ,IAAIgZ,GAC7C,QAAyB,IAAdpB,EACT,OAAOA,CAEX,CAEA,IAAIA,EAA+B,KACnC,IACE,MAAMsB,EAAcX,GAAgBlC,EAAYjU,SAAU4W,EAAYxQ,eAItE,OAHI0Q,EAAc,IAChBtB,EAAYvB,EAAYuB,UAAUuB,GAAGD,EAAc,IAE9CtB,CACT,SACEqB,EAAuB7Y,IAAI4Y,EAAapB,EAC1C,CAEF,CCzBA,MAAMwB,GAA8E,IAAI7Z,QAMlF,SAAU8Z,GAAuBC,EAAuBC,GAC5D,GAAqB,MAAjBA,EACF,OAAOA,EAET,IAAIhH,EAAiB+G,EAAQ9D,YAAYgE,cAEzC,IAAwC,IAApCF,EAAQ9D,YAAYiE,YAAuB,CAE7C,MAAMvB,EAAqBG,GAAsB9F,GACtB,OAAvB2F,EACFrQ,EAAW,+DAA+DyR,EAAQ3Q,eAAe2Q,EAAQ/Q,oBAAoB+Q,EAAQzZ,KAAK6Z,YAE1InH,EAAW2F,CAEf,CACA,OAAO3F,CACT,CAEM,SAAUoH,GAAiCL,EAAuBC,GAEtE,IAAIK,EAAqD,KAEzD,GADAA,EAAuBR,GAA8BpZ,IAAIsZ,IAAY,KACxC,OAAzBM,EACF,OAAOA,EAGT,MAAMrH,EAAiB8G,GAAuBC,EAASC,GAEjD3B,EAAYmB,GAA0BO,GACtC1G,EAAeC,GAAsBN,EAAU+G,EAAQpR,WACxC,OAAjB0K,GACF/K,EAAW,4BAA4ByR,EAAQpR,qCAMjD,OAHA0R,EACE5B,GAFuBX,GAAoBzE,EAAc0G,EAAQ9Q,eAEpBoP,GAC/CwB,GAA8BhZ,IAAIkZ,EAASM,GACpCA,CACT,CAEM,SAAUC,GAAmCP,GACjDF,GAA8B3G,OAAO6G,EACvC,CC1CO,IAAIQ,GAAoC,KCD/C,MAAMC,GAAmG,IAAIxa,QAgBvG,SAAUya,GAAiCJ,EAA6CN,GAC5F,MAAM1J,EAAUmK,GAA+B/Z,IAAI4Z,QAC5B,IAAZhK,EACTmK,GAA+B3Z,IAAIwZ,EAAsBN,GAChD1J,aAAmBxL,IAC5BwL,EAAQnP,IAAI6Y,GACH1J,IAAY0J,GACrBS,GAA+B3Z,IAAIwZ,EAAsB,IAAIxV,IAAI,CAACwL,EAAS0J,KAExD,OAAjBQ,IACFA,GAAa,CAAEG,KAAM,sBAAuBC,gBAAiBN,EAAsBN,WAEvF,CASM,SAAUa,GAAoCP,EAA6CN,GAC/F,MAAM1J,EAAUmK,GAA+B/Z,IAAI4Z,QAC5B,IAAZhK,IAGPA,aAAmBxL,IACrBwL,EAAQ6C,OAAO6G,GACN1J,IAAY0J,GACrBS,GAA+BtH,OAAOmH,GAEnB,OAAjBE,IACFA,GAAa,CAAEG,KAAM,wBAAyBC,gBAAiBN,EAAsBN,YAEzF,CAgBA,MAAMc,GAAmG,IAAI7a,QA6CvG,SAAU8a,GACdT,GAEA,MAAMhS,EAAQmS,GAA+B/Z,IAAI4Z,GACjD,YAAqB,IAAVhS,EACFA,EAE8B,OAAnCgS,EAAqBhC,UAGlBwC,GAAcpa,IAAI4Z,EAAqBrC,mBAAmBvX,IAAI4Z,EAAqBhC,gBAH1F,CAIF,CCpIA,MAAM5V,GAAiE,IAAIzC,QACrEmY,GAAyD,IAAInY,QAEnE,MAAM+a,GACKlY,SACAwV,UACD2C,eAER,WAAA5W,CAAYvB,EAAqBwV,GAC/B9T,KAAK1B,SAAWA,EAChB0B,KAAK8T,UAAYA,CACnB,CAEA,iBAAI4C,GACF,QAAmC,IAAxB1W,KAAKyW,eACd,OAAOzW,KAAKyW,eAEd,MAAM7W,EAAiBI,KAAK1B,SAASsB,eACrC,GAAuB,OAAnBA,EACF,OAAO,KAGT,IAAIqU,EAAqC,KAMzC,OAJEA,EAHkBjU,KAAK1B,SAASE,SAASwB,KAAK1B,SAASE,SAAS4B,OAAS,KAEvDvD,EACAmD,KAAK8T,WAAWG,iBAAmB,KAEnCjU,KAAK8T,UAElB9T,KAAKyW,eAAiBE,GAAmB/W,EAAgBqU,EAClE,EAGI,SAAU0C,GAAmBrY,EAAqBwV,GACtD,GAAkB,OAAdA,EAAoB,CACtB,IAAIrT,EAASmT,GAAoB1X,IAAIoC,GACrC,YAAsB,IAAXmC,IAGXA,EAAS,IAAI+V,GAAalY,EAAU,MACpCsV,GAAoBtX,IAAIgC,EAAUmC,IAHzBA,CAKX,CAAO,CACL,IAAImW,EAAkB1Y,GAAOhC,IAAI4X,QACF,IAApB8C,IACTA,EAAkB,IAAInb,QACtByC,GAAO5B,IAAIwX,EAAW8C,IAExB,IAAInW,EAASmW,EAAgB1a,IAAIoC,GACjC,YAAsB,IAAXmC,IAGXA,EAAS,IAAI+V,GAAalY,EAAUwV,GACpC8C,EAAgBta,IAAIgC,EAAUmC,IAHrBA,CAKX,CACF,CCrDA,MAAMoW,GAAkE,IAAIpb,QAEtE,SAAUqb,GAA6B5B,GAC3C,IAAI6B,EAAqC,KAEzC,GADAA,EAAeF,GAA0B3a,IAAIgZ,IAAgB,KACxC,OAAjB6B,EACF,OAAOA,EAET,GAAI7B,EAAYxQ,cAAc/E,cAAgB,EAAG,CAC/C,MAAMmU,EAAYmB,GAA0BC,GAC1B,OAAdpB,GACF/P,EAAW,yEAAyEmR,EAAYzQ,8CAElGsS,EAAeJ,GAAmBzB,EAAYxQ,cAAeoP,EAC/D,MACEiD,EAAeJ,GAAmBzB,EAAYxQ,cAAe,MAG/D,OADAmS,GAA0Bva,IAAI4Y,EAAa6B,GACpCA,CACT,CAGM,SAAUC,GAA+B9B,GAC7C2B,GAA0BlI,OAAOuG,EACnC,UCLgB+B,KACd,MAAMC,EAAgB,IAAI/Y,IACpBgZ,EAAa,IAAIhZ,IACvB,MAAO,CACL,GAAAxB,CAAIsU,EAAauE,GACf,IAAI4B,EAAWF,EAAchb,IAAI+U,GAKjC,YAJwB,IAAbmG,IACTA,EAAW,IAAIzb,QACfub,EAAc5a,IAAI2U,EAAKmG,KAErBA,EAAS7a,IAAIiZ,KAGjB4B,EAASza,IAAI6Y,GACb2B,EAAW7a,IAAI2U,GAAMkG,EAAWjb,IAAI+U,IAAQ,GAAK,IAC1C,EACT,EACA,MAAAoG,CAAOpG,EAAauE,GAClB,MAAM4B,EAAWF,EAAchb,IAAI+U,GACnC,QAAwB,IAAbmG,IAA6BA,EAAS7a,IAAIiZ,GACnD,OAAO,EAET4B,EAASzI,OAAO6G,GAChB,MAAM8B,GAAQH,EAAWjb,IAAI+U,IAAQ,GAAK,EAC1C,OAAIqG,GAAQ,GACVJ,EAAcvI,OAAOsC,GACrBkG,EAAWxI,OAAOsC,IACX,IAETkG,EAAW7a,IAAI2U,EAAKqG,IACb,EACT,EACA/a,IAAG,CAAC0U,EAAauE,IACR0B,EAAchb,IAAI+U,IAAM1U,IAAIiZ,KAAY,EAEjD+B,QAAQtG,GACCkG,EAAWjb,IAAI+U,IAAQ,EAEhC,YAAIuG,GACF,OAAOL,EAAWpC,IACpB,EACA,KAAA0C,GACEP,EAAcO,QACdN,EAAWM,OACb,EAEJ,CChEA,MAAMC,GAA0D,IAAIvZ,IAE9DwZ,GAAkBV,KAExB,SAASW,GAAcpC,EAAuBqC,GAC5C,MAAMpM,EAAY+J,EAAQ7Q,UAAUuG,IAAI4M,GAAKA,EAAEtM,WAAa,IAAMsM,EAAEnM,KAAKtD,KAAK,KAAO,KAAKA,KAAK,KAC/F,MAAO,GAAGmN,EAAQpR,cAAcoR,EAAQ/Q,kBAAkBoT,MAAcpM,GAC1E,CAEA,SAASsM,GAAavC,GACpB,IAAIqC,EAAY,QAChB,IAAI,MAAMG,KAAYxC,EAAQhR,cACxBwT,EAASxK,WAAW,QACtBqK,EAAYG,EAASvQ,MAAM,IAG/B,OAAOoQ,CACT,CAuDM,SAAUI,GAA2BzC,GACzC,GAA4B,aAAxBA,EAAQ3Q,kBAA8B2Q,EAAQhR,cAAc6G,QAAQ,MAAc,CACpF,MAAMwM,EAAYE,GAAavC,GACzBvE,EAAM2G,GAAcpC,EAASqC,GACnC,IAAIK,EAAuBR,GAAoBxb,IAAI+U,GAWnD,YAVoC,IAAzBiH,IAzDb9T,EA2DMoR,EAAQpR,UA1DdK,EA2DM+Q,EAAQ/Q,cA1DdE,EA2DM6Q,EAAQ7Q,UAHVuT,EAvDA3U,IACJ,MAAMxH,EAAOwH,EAAMtB,OACnB,GAAa,OAATlG,EAEF,YADAsV,QAAQ8G,KAAK,0CAGf,GAAkB,aAAdpc,EAAKoa,KAEP,YADA9E,QAAQ8G,KAAK,kEAGf,MAAMC,EAAUrc,EAAKqc,QAErB,IAAIC,EADatc,EAAK4E,MAEtB,IAAI,MAAMkK,KAAUlG,EAClB0T,EAAmBxN,EAAOa,SAAS2M,GAGrC,MACMvJ,EAAeC,GADJhT,EAAK2Z,cAC+BtR,GAChC,OAAjB0K,GACF/K,EAAW,4BAA4BK,qCAGzC,MAAMmO,EAAcF,GAAqBtW,GACzC+S,EAAawJ,YAAY,WAAazd,IACpCA,EAAMmY,IAAsBT,EAAa,KACvC,IAAIgG,EAAe1d,EAAM4J,GACzB,GAAId,MAAMC,QAAQ2U,GAChB,GAAIH,GAC6C,IAA3CG,EAAalN,QAAQgN,KACvBxd,EAAM4J,GAAiB8T,EAAaC,OAAOH,QAExC,CACL,MAAMI,EAAQF,EAAalN,QAAQgN,IACrB,IAAVI,IACF5d,EAAM4J,GAAiB8T,EAAaG,UAAUD,EAAO,GAEzD,MAGE5d,EAAM4J,GADJ2T,EACqB,CAACC,GAED,QAkB3BX,GAAoBpb,IAAI2U,EAAKiH,IAE9B1C,EAAQzZ,KAAiBmG,iBAAiB2V,EAAWK,GACtDP,GAAgBhb,IAAIsU,EAAKuE,IAClB,CACT,CArEmC,IACnCpR,EACAK,EACAE,EAmEA,OAAO,CACT,OC/EagU,GACHC,MACAC,aAAqC,IAAIvY,IAEjD,WAAAT,CAAYyD,GACVtD,KAAK4Y,MAAQtV,CACf,CAEA,QAAIA,GACF,OAAOtD,KAAK4Y,KACd,CAEA,QAAI7D,GACF,OAAO/U,KAAK6Y,aAAa9D,IAC3B,CAEA,SAAA+D,CAAUC,GAER,OADA/Y,KAAK6Y,aAAalc,IAAIoc,GACf,KACL/Y,KAAK6Y,aAAalK,OAAOoK,GAE7B,CAEA,WAAAC,CAAYD,GACV,OAAO/Y,KAAK6Y,aAAalK,OAAOoK,EAClC,CAEA,IAAAE,IAAQtN,GACN,MAAMqB,EAAqB,GAC3B,IAAK,MAAM+L,KAAM/Y,KAAK6Y,aACpB7L,EAAQ3M,KAAK0Y,KAAMpN,IAErB,OAAOqB,CACT,EC3CI,MAAOkM,WAAmBP,GACtBQ,gBAER,WAAAtZ,CAAYyD,EAAc8V,GACxBC,MAAM/V,GACNtD,KAAKmZ,gBAAkBC,GAAkB,IAC3C,CAEA,IAAAH,IAAQtN,GAWN,OAVqB,OAAjBqK,IACFA,GAAa,CACXG,KAAM,mBACNmD,KAAM,QACNlV,UAAWpE,KAAKmZ,gBAChBI,UAAWvZ,KAAKsD,KAChBqI,OACA6N,gBAAiBxZ,KAAK+U,OAGnBsE,MAAMJ,QAAQtN,EACvB,ECzBF,MAAM8N,GAA0E,IAAIhe,QAE9E,SAAUie,GAAsB5K,EAA6BxL,GACjE,IAAI5B,EAAW+X,GAAuBvd,IAAI4S,QAClB,IAAbpN,IACTA,EAAW,IAAIvD,IACfsb,GAAuBnd,IAAIwS,EAAcpN,IAE3C,IAAIiY,EAAQjY,EAASxF,IAAIoH,GAKzB,YAJqB,IAAVqW,IACTA,EAAQ,IAAIT,GAAW5V,EAAMwL,EAAaxL,MAC1C5B,EAASpF,IAAIgH,EAAMqW,IAEdA,CACT,CAEM,SAAUC,GAAwB9K,GACtC2K,GAAuB9K,OAAOG,EAChC,CCoBA,MAAM+K,GAAgE,IAAIpe,QAWpE,SAAUqe,GAAwBtE,GACtC,GAAgC,eAA5BA,EAAQjR,aAAa,GACvB,OAAO,EAET,MAAMxD,EAAUyU,EAAQzZ,KAGlBge,EAAgBvZ,EAAiBO,GACjCW,EAAWL,IACjB,GAAsB,OAAlB0Y,QAA2DrZ,IAAjCgB,GAAUxF,IAAI6d,GAI1C,OAHiB,OAAbrY,GACFqC,EAAW,6CAA6CgW,QAEnD,EAIT,GAAIF,GAAkBtd,IAAIiZ,GACxB,OAAO,EAGT,MAAMwE,EAAexE,EAAQjR,aAAa,GACd,iBAAjByV,GAAqD,IAAxBA,EAAa5Z,QACnD2D,EAAW,2EAGb,MAAM6M,EAnCR,SAAuB7P,GAErB,OAAsB,OADAP,EAAiBO,GAE9B,KAGFiB,EAAwBjB,EACjC,CA4BmBkZ,CAAclZ,GACd,OAAb6P,GACF7M,EAAW,8DAA8DhD,EAAQC,QAAQC,sCAE3F,MAAMiZ,EAAWtJ,EAASlO,gBAAgBxG,IAAI8d,QACtB,IAAbE,GACTnW,EAAW,aAAaiW,mDAA8DjZ,EAAQC,QAAQC,mBAExG,MAAM4W,EAAYqC,EAAS3W,MAErBgW,EAAY/D,EAAQ/Q,cACpBL,EAAYoR,EAAQpR,UACpB+V,EAAY3E,EAAQhR,cACpB4V,EAAW7W,IACX4W,EAAUjZ,SAAS,YAAYqC,EAAM8W,iBACrCF,EAAUjZ,SAAS,SAASqC,EAAM+W,kBAGtC,MACMxL,EAAeC,GADJhO,EAAQ2U,cAC4BtR,GAChC,OAAjB0K,GACF/K,EAAW,4BAA4BK,wCAEpC0K,EAAayL,gBAAgBhe,IAAIgd,IACpCxV,EAAW,eAAewV,gDAAwDnV,OAEpF,MAAMmO,EAAcF,GAAqBtR,GACzC+N,EAAa0L,iBAAiB,WAAY3e,MAAOhB,IAC/CA,EAAMmY,IAAsBT,EAAa,KACvC,MAAMkI,EAAUlI,GAAauB,UAAU2G,SAAW,GAElD,OADcf,GAAsB5K,EAAcyK,GACrCN,KAAKpe,EAAO0I,KAAUkX,QAOzC,OAFA1Z,EAAQmB,iBAAiB2V,EAAWuC,GACpCP,GAAkBvd,IAAIkZ,EAAS,CAAEqC,YAAWuC,aACrC,CACT,CC3GM,MAAOM,WAAqB/B,GACxBQ,gBAER,WAAAtZ,CAAYyD,EAAc8V,GACxBC,MAAM/V,GACNtD,KAAKmZ,gBAAkBC,GAAkB,IAC3C,CAEA,IAAAH,IAAQtN,GAaN,OAZqB,OAAjBqK,IAGFA,GAAa,CACXG,KAAM,mBACNmD,KAAM,UACNlV,UAAWpE,KAAKmZ,gBAChBI,UAAWvZ,KAAKsD,KAChBqI,OACA6N,gBAAiBxZ,KAAK+U,OAGnBsE,MAAMJ,QAAQtN,EACvB,EAGI,SAAUgP,GAAeha,GAC7B,OAAOA,aAAiB+Z,EAC1B,CCnBA,MAAMhD,GAA0D,IAAIvZ,IAE9DwZ,GAAkBV,KAExB,SAASW,GAAcpC,GACrB,MAAMoF,EAAcpF,EAAQhR,cAAcqG,OAAOgQ,GAAW,YAANA,GAAyB,SAANA,GAAcC,OAAOzS,KAAK,KACnG,MAAO,GAAGmN,EAAQpR,cAAcoR,EAAQ/Q,kBAAkBmW,GAC5D,CAEA,MAAMG,GAA4B,CAChC3W,EACA4W,EACAb,EACAzV,IACInB,IACA4W,EAAUjZ,SAAS,YAAYqC,EAAM8W,iBACrCF,EAAUjZ,SAAS,SAASqC,EAAM+W,kBAEtC,MAAMve,EAAOwH,EAAMtB,OAEb6M,EAAeC,GADJhT,EAAK2Z,cAC+BtR,GAChC,OAAjB0K,GACF/K,EAAW,4BAA4BK,mCAGzC,MAAMmO,EAAcF,GAAqBtW,GACnCkf,EAA+BD,EA7BhBxN,WAAW7P,EAA+B,KA8B/DmR,EAAa0L,iBAAiB,WAAY3e,MAAOhB,IAC/CA,EAAMmY,IAAsBT,EAAa,KACvC,MAAMkI,EAAUlI,GAAauB,UAAU2G,SAAW,GAClD,GAAIQ,EAAW,CAEb,MAAMtB,EAAQ9e,EAAMoY,IAAoB0D,GAAmBjS,EAAe,OAI1E,OAHKiW,GAAehB,IAClB5V,EAAW,kBAAkBiX,iHAEvBrB,EAAwBV,KAAK1V,KAAUkX,EACjD,CACA,MAAML,EAAUvf,EAAMmgB,GAItB,MAHuB,mBAAZZ,GACTrW,EAAW,YAAYiX,kCAA4C5W,OAE9D8W,QAAQC,MAAMf,EAASvf,EAAO,CAAC0I,KAAUkX,SAKhD,SAAUW,GAAmB5F,GACjC,IAAKA,EAAQlR,SAASkJ,WAAW,MAC/B,OAAO,EAET,MAAMyD,EAAM2G,GAAcpC,GAC1B,IAAI6F,EAAoB3D,GAAoBxb,IAAI+U,QACf,IAAtBoK,IACTA,EAAoBN,GAA0BvF,EAAQpR,UAAWoR,EAAQ/Q,cAAe+Q,EAAQhR,cAAegR,EAAQ9Q,eACvHgT,GAAoBpb,IAAI2U,EAAKoK,IAG/B,MAAMxD,EAAYrC,EAAQlR,SAASmD,MAAM,GAIzC,OAHC+N,EAAQzZ,KAAiBmG,iBAAiB2V,EAAWwD,GAEtD1D,GAAgBhb,IAAIsU,EAAKuE,IAClB,CACT,CC1EA,MAAMkC,GAA0D,IAAIvZ,IAE9DwZ,GAAkBV,KAExB,SAASW,GAAcpC,EAAuBqC,GAC5C,MAAMpM,EAAY+J,EAAQ7Q,UAAUuG,IAAI4M,GAAKA,EAAEtM,WAAa,IAAMsM,EAAEnM,KAAKtD,KAAK,KAAO,KAAKA,KAAK,KAC/F,MAAO,GAAGmN,EAAQpR,cAAcoR,EAAQ/Q,kBAAkBoT,MAAcpM,GAC1E,CAEA,SAASsM,GAAavC,GACpB,IAAIqC,EAAY,QAChB,IAAI,MAAMG,KAAYxC,EAAQhR,cACxBwT,EAASxK,WAAW,QACtBqK,EAAYG,EAASvQ,MAAM,IAG/B,OAAOoQ,CACT,CAuCM,SAAUyD,GAAwB9F,GACtC,GAA4B,UAAxBA,EAAQ3Q,kBAA2B2Q,EAAQhR,cAAc6G,QAAQ,MAAc,CACjF,MAAMwM,EAAYE,GAAavC,GACzBvE,EAAM2G,GAAcpC,EAASqC,GACnC,IAAI0D,EAAoB7D,GAAoBxb,IAAI+U,GAWhD,YAViC,IAAtBsK,IAzCbnX,EA2CMoR,EAAQpR,UA1CdK,EA2CM+Q,EAAQ/Q,cA1CdE,EA2CM6Q,EAAQ7Q,UAHV4W,EAvCAhY,IACJ,MAAMxH,EAAOwH,EAAMtB,OACnB,GAAa,OAATlG,EAEF,YADAsV,QAAQ8G,KAAK,0CAGf,GAAkB,UAAdpc,EAAKoa,KAEP,YADA9E,QAAQ8G,KAAK,+DAGf,IAAqB,IAAjBpc,EAAKqc,QACP,OAGF,IAAIC,EADatc,EAAK4E,MAEtB,IAAI,MAAMkK,KAAUlG,EAClB0T,EAAmBxN,EAAOa,SAAS2M,GAGrC,MACMvJ,EAAeC,GADJhT,EAAK2Z,cAC+BtR,GAChC,OAAjB0K,GACF/K,EAAW,4BAA4BK,qCAGzC,MAAMmO,EAAcF,GAAqBtW,GACzC+S,EAAawJ,YAAY,WAAazd,IACpCA,EAAMmY,IAAsBT,EAAa,KACvC1X,EAAM4J,GAAiB4T,OAgBvBX,GAAoBpb,IAAI2U,EAAKsK,IAE9B/F,EAAQzZ,KAAiBmG,iBAAiB2V,EAAW0D,GACtD5D,GAAgBhb,IAAIsU,EAAKuE,IAClB,CACT,CArDgC,IAChCpR,EACAK,EACAE,EAmDA,OAAO,CACT,CC5EA,MAAM6W,GAAc,IAAIlb,IAAI,CAAE,QAAS,aACjCmb,GAA2B,IAAInb,IAAI,CAAE,QAAS,gBAAiB,gBAE/D,SAAUob,GAAiB3f,EAAYuI,GAC3C,GAAIvI,EAAK6E,WAAaC,KAAKC,aACzB,OAAO,EAET,MAAMC,EAAUhF,EACViF,EAAUD,EAAQC,QAAQC,cAChC,GAAgB,UAAZD,EAAqB,CACvB,MAAM2a,GAAa5a,EAAQK,aAAa,SAAW,QAAQH,cAC3D,GAAkB,WAAd0a,EACF,OAAO,EAET,GAAIH,GAAYjf,IAAIof,IAA2B,YAAbrX,EAChC,OAAO,EAET,GAAImX,GAAyBlf,IAAI+H,GAC/B,OAAO,CAEX,CACA,GAAgB,WAAZtD,GAAqC,UAAbsD,EAC1B,OAAO,EAET,GAAgB,aAAZtD,GAAuC,UAAbsD,EAC5B,OAAO,EAET,MAAMyV,EAAgBvZ,EAAiBO,GACvC,GAAsB,OAAlBgZ,EAAwB,CAC1B,MAAM6B,EAAcva,KAA4BnF,IAAI6d,QACzB,IAAhB6B,GACT7X,EAAW,mBAAmBgW,oDAAgEzV,uCAEhG,MAAMsM,EAAW5O,EAAwBjB,GACzC,GAAI6P,GAAUlO,gBAAgBnG,IAAI+H,GAChC,OAAO,CAEX,CACA,OAAO,CACT,CCzBA,IAAIuX,GAAa,EACbC,GAAoB,EACpBC,GAAyB,EAG7B,MAAMC,GAAgB,IAAIvgB,QASpB,SAAUwgB,GACdlgB,EACAmgB,EACA9X,EACAK,GAEA,IAAI0X,EAAQH,GAAc9f,IAAIH,QACT,IAAVogB,IACTA,EAAQ,IAAIhe,IACZ6d,GAAc1f,IAAIP,EAAMogB,IAE1B,MAAMlL,EAlBR,SAAiBiL,EAAgB9X,EAAmBK,GAClD,MAAO,GAAGL,MAAcK,MAAkByX,GAC5C,CAgBcE,CAAQF,EAAQ9X,EAAWK,GACvC,IAAI4X,EAASF,EAAMjgB,IAAI+U,GAKvB,YAJsB,IAAXoL,IACTA,EAASR,KACTM,EAAM7f,IAAI2U,EAAKoL,IAEVA,CACT,CAGM,SAAUC,GAAUD,EAAgBE,GACxC,MAAqB,eAAdA,EAAsC,EAATF,EAAsB,EAATA,EAAa,CAChE,CAEA,MAAMG,GAAmC,IAAIlc,IAGvC,SAAUmc,GAA4BC,GAC1C,MAAO,CACLC,cAAeb,KACfY,kBACAE,aAAcJ,GACdK,IAAK,EAET,CAGM,SAAUC,GACdC,EACAC,GAEA,MAAMJ,EAAe,IAAItc,IAAIyc,EAAQH,cAErC,OADAA,EAAajgB,IAAIqgB,GACV,CACLL,cAAeI,EAAQJ,cACvBD,gBAAiBK,EAAQL,gBACzBE,eACAC,IAAKE,EAAQF,IAAM,EAEvB,CAGA,IAAII,GAA6C,cAEjCC,KACd,OAAOD,EACT,CAEM,SAAUE,GACdJ,EACAK,GAEA,MAAMC,EAAWJ,GACjBA,GAAiBF,EACjB,IACE,OAAOK,GACT,SACEH,GAAiBI,CACnB,CACF,CAQA,MAAMC,GAAsC,GCjG5C,MAAM5F,GAA0D,IAAIvZ,IAE9DwZ,GAAkBV,KAClBsG,GAA+B,IAAI9hB,QAEnC+hB,GAAkBC,GAAcA,EAAkBC,OAExD,SAAS9F,GAAcpC,EAAuBqC,EAAmB8F,GAC/D,MAAMlS,EAAY+J,EAAQ7Q,UAAUuG,IAAI4M,GAAKA,EAAEtM,WAAa,IAAMsM,EAAEnM,KAAKtD,KAAK,KAAO,KAAKA,KAAK,KAC/F,MAAO,GAAGmN,EAAQpR,cAAcoR,EAAQlR,aAAakR,EAAQ/Q,kBAAkBoT,MAAcpM,MAAckS,EAAY,IAAM,KAC/H,CAEA,SAAS5F,GAAavC,GAGpB,IAAIqC,EAAyB,WAFZrC,EAAQzZ,KAAiBiF,QAAQC,cAET,SAAW,QAEpD,MAAM8Y,EAAgBvZ,EAAiBgV,EAAQzZ,MAC/C,GAAsB,OAAlBge,EAAwB,CAC1B,MAAM6B,EAAcva,KAA4BnF,IAAI6d,QACzB,IAAhB6B,GACT7X,EAAW,mBAAmBgW,uEAEhC,MAAMG,EAAWlY,EAAwBwT,EAAQzZ,OAAO2G,gBAAgBxG,IAAIsZ,EAAQlR,UAChF4V,IACFrC,EAAYqC,EAAS3W,MAEzB,CAEA,IAAI,MAAMyU,KAAYxC,EAAQhR,cACxBwT,EAASxK,WAAW,QACtBqK,EAAYG,EAASvQ,MAAM,IAG/B,OAAOoQ,CACT,CAEA,SAAS+F,GAAepI,GAEtB,GAAsB,OADAhV,EAAiBgV,EAAQzZ,MACnB,CAC1B,MAAMme,EAAWlY,EAAwBwT,EAAQzZ,OAAO2G,gBAAgBxG,IAAIsZ,EAAQlR,UACpF,GAAI4V,EACF,OAAOA,EAAS1W,QAAUga,EAE9B,CACA,OAAO,IACT,CAEA,MAAMK,GAA6B,CACjCzZ,EACAE,EACAG,EACAE,EACAmZ,IACIva,IACJ,MAAMxH,EAAOwH,EAAMtB,OACnB,GAAa,OAATlG,EAEF,YADAsV,QAAQ8G,KAAK,0CAGf,IAAI4F,EACJ,GAAoB,OAAhBD,EACFC,EAAWD,EAAYva,OAClB,CACL,KAAMe,KAAYvI,GAEhB,YADAsV,QAAQ8G,KAAK,8BAA8B7T,wCAG7CyZ,EAAYhiB,EAAauI,EAC3B,CACA,IAAI+T,EAAmB0F,EACvB,IAAI,MAAMlT,KAAUlG,EAClB0T,EAAmBxN,EAAOa,SAAS2M,GAErC,MAAM2F,EAAoBT,GAA6BrhB,IAAIH,IAAOG,IAAIoI,GACtE,QAAiC,IAAtB0Z,EACT,IAAK,MAAMC,KAAYD,EAAmBC,EAAS5F,GAGrD,IAAI6F,EAAsE,KAC1E,GAAI5iB,EAAOH,yBAA0B,CAEnC,MAAMkhB,EAASJ,GAAUlgB,EAAMuI,EAAUF,EAAWK,GAC9C0Z,EDiDJ,SAA4BpiB,EAAYmgB,GAC5C,IAAK,IAAIjf,EAAIqgB,GAAald,OAAS,EAAGnD,GAAK,EAAGA,IAAK,CACjD,MAAMmhB,EAASd,GAAargB,GAC5B,GAAImhB,EAAOriB,OAASA,GAAQqiB,EAAOD,QAAQjC,SAAWA,EACpD,OAAOkC,EAAOD,OAElB,CACA,OAAO,IACT,CCzDoBE,CAAkBtiB,EAAMuI,GACxC,GAAgB,OAAZ6Z,GAAoBhhB,OAAOgE,GAAGgd,EAAQG,aAAcP,GAyBtD,OApBIziB,EAAON,OACTqW,QAAQrW,MAAM,oEAAqE,CACjFe,OACAuI,WACAG,gBACAkY,cAAewB,EAAQxB,cACvB4B,wBAAyBjjB,EAAOD,iBACL,OAArBgd,GAAyD,iBAArBA,UAGzB,OAAjBrC,IACFA,GAAa,CACXG,KAAM,yBACNqI,OAAQ,eACR7B,cAAewB,EAAQxB,cACvBK,OAAQV,GAAUD,EAAQ,YAC1BtgB,OACAmgB,OAAQ5X,KAOd,MAAMma,EAAgBnC,GAAUD,EAAQ,YAClCqC,EAAcxB,KACpB,GAAoB,OAAhBwB,GAAwBA,EAAY9B,aAAargB,IAAIkiB,GAYvD,YAVqB,OAAjBzI,IACFA,GAAa,CACXG,KAAM,yBACNqI,OAAQ,eACR7B,cAAe+B,EAAY/B,cAC3BK,OAAQyB,EACR1iB,OACAmgB,OAAQ5X,KAMd4Z,EAAqBpB,GACnB4B,GAAejC,GAA4BJ,GAC3CoC,EAEJ,CAEA,MACM3P,EAAeC,GADJhT,EAAK2Z,cAC+BtR,GAChC,OAAjB0K,GACF/K,EAAW,4BAA4BK,qCAGzC,MAAMmO,EAAcF,GAAqBtW,GACnC4iB,EAAgB,KACpB7P,EAAawJ,YAAY,WAAazd,IACpCA,EAAMmY,IAAsBT,EAAa,KACvC1X,EAAM4J,GAAiB4T,OAIF,OAAvB6F,EACFf,GAA0Be,EAAoBS,GAE9CA,KC3JJ,MAAMC,GAAoB,IAAIjjB,QAExB,SAAUkjB,GAAyB9iB,GACvC6iB,GAAkBjiB,IAAIZ,EACxB,CAGM,SAAU+iB,GAA4B/iB,GAC1C,QAAK6iB,GAAkBriB,IAAIR,KAG3B6iB,GAAkBjQ,OAAO5S,IAClB,EACT,CAQA,MAAMgjB,GAAyB,IAAIpjB,QAE7B,SAAUqjB,GAAsBjjB,GACpCgjB,GAAuBpiB,IAAIZ,EAC7B,CAGM,SAAUkjB,GAAyBljB,GACvC,QAAKgjB,GAAuBxiB,IAAIR,KAGhCgjB,GAAuBpQ,OAAO5S,IACvB,EACT,CAMA,IAAImjB,GAA0B,WAMdC,KACdD,IACF,UAEgBE,KACd,OAAOF,GAA0B,CACnC,OC/CaG,GAGkB3d,SAFZmC,QAAU,IAAI1F,IAE/B,WAAA0B,CAA6B6B,GAAA1B,KAAA0B,SAAAA,CAA0C,CAEvE,IAAA4d,CACEte,EACA3E,EACAkjB,EAAmC,QAEnC,MAAMC,EAAoBxe,EAAQC,cAClC,IAAI6C,EAAQ9D,KAAK6D,QAAQ3H,IAAIsjB,QACR,IAAV1b,IACTA,EAAQ,CAAE2b,QAAS,IAAInf,KACvBN,KAAK6D,QAAQvH,IAAIkjB,EAAmB1b,GACpC9D,KAAK0B,SAASE,YAAY4d,GAAmBE,KAC3C,IAAM1f,KAAK2f,OAAOH,EAAmB,MACpCI,GAAmB5f,KAAK2f,OAAOH,EAAmBI,KAIvD,MAAMC,EAA4B,CAAEzB,QAAQ,EAAM/hB,UAASkjB,UAE3D,OADAzb,EAAM2b,QAAQ9iB,IAAIkjB,GACX,KACAA,EAAOzB,SACZyB,EAAOzB,QAAS,EAChBta,GAAO2b,QAAQ9Q,OAAOkR,IAE1B,CAEA,YAAAC,CAAa9e,GACX,OAAOhB,KAAK6D,QAAQ3H,IAAI8E,EAAQC,gBAAgBwe,QAAQ1K,MAAQ,CAClE,CAEQ,MAAA4K,CAAO3e,EAAiB4e,GAC9B,MAAM9b,EAAQ9D,KAAK6D,QAAQ3H,IAAI8E,GAC/B,QAAqB,IAAV8C,EAAuB,OAClC9D,KAAK6D,QAAQ8K,OAAO3N,GACpB,MAAMye,EAAU9b,MAAMoc,KAAKjc,EAAM2b,SACjC3b,EAAM2b,QAAQhI,QACd,IAAK,MAAMoI,KAAUJ,EACdI,EAAOzB,SACZyB,EAAOzB,QAAS,EACF,OAAVwB,EAAgBC,EAAOxjB,UACtBwjB,EAAON,OAAOK,GAEvB,EAGF,MAAMI,GAAwB,IAAIvkB,QAE5B,SAAUwkB,GACdve,GAEA,IAAIwe,EAAcF,GAAsB9jB,IAAIwF,GAK5C,YAJ2B,IAAhBwe,IACTA,EAAc,IAAIb,GAAsB3d,GACxCse,GAAsB1jB,IAAIoF,EAAUwe,IAE/BA,CACT,CCnDA,SAASC,GACP3K,EACAvE,GAEA,IAAIN,EAAwB,KAC5B,IAAK,MAAMqH,KAAYxC,EAAQhR,cAAe,CAC5C,MAAM4b,EAAYpI,EAAS3M,QAAQ,KACnC,GAAI+U,EAAY,EAAG,SACnB,MAAMxF,EAAc5C,EAASvQ,MAAM,EAAG2Y,GAAW1Y,OAC3C/G,EAAQqX,EAASvQ,MAAM2Y,EAAY,GAAG1Y,OACxB,SAAhBkT,GAA0C,SAAhBA,GAC5B7W,EAAW,6BAA6B6W,UAAoB5C,OAE1D4C,IAAgB3J,IACL,OAAXN,GACF5M,EAAW,qBAAqBkN,kCAElCN,EAAShQ,EACX,CACA,OAAOgQ,CACT,CAgBM,SAAU0P,GAAuB7K,GACrC,OAAOA,EAAQhR,cAAciJ,KAAMuK,GAAaA,EAAS9W,SAAS,KACpE,CAKA,MAAMof,GAAwCnjB,OAAOC,OAAO,CAAEmjB,UAAW,QAASC,OAAQ,OAAQC,YAAY,EAAOC,YAAY,IAC3HC,GAAuCxjB,OAAOC,OAAO,CAAEmjB,UAAW,OAAQC,OAAQ,OAAQC,YAAY,EAAOC,YAAY,IAE/H,SAASE,GAAYL,EAA6BC,GAChD,MAAkB,UAAdD,GAAoC,SAAXC,EAA0BF,GAChD,CAAEC,YAAWC,SAAQC,YAAY,EAAOC,YAAY,EAC7D,CAEM,SAAUG,GAAyBrL,GACvC,IAAKla,EAAOJ,6BAIV,OAHImlB,GAAuB7K,IACzBzR,EAAW,+DAENuc,GAGT,MAAMQ,EApCQ,QADQngB,EAqCmBwf,GAAW3K,EAAS,SApClC,KACb,UAAV7U,GAA+B,YAAVA,GAAiC,SAAVA,GAA8B,SAAVA,EAC3DA,EAEFoD,EAAW,gCAAgCpD,OALpD,IAAwBA,EAsCtB,MAAM6f,EA9BR,SAAqB7f,GACnB,OAAc,OAAVA,GAA4B,SAAVA,EAAyB,OACjC,YAAVA,EAA4B,UACzBoD,EAAW,gCAAgCpD,MACpD,CA0BiBogB,CAAYZ,GAAW3K,EAAS,SAC/C,GAA4B,UAAxBA,EAAQ3Q,YAIV,OAH0B,OAAtBic,GAAoD,SAAtBA,GAChC/c,EAAW,wCAEK,SAAXyc,EAAoBG,GAAmB,CAAEJ,UAAW,OAAQC,SAAQC,YAAY,EAAOC,YAAY,GAO5G,GAAgC,YAA5BlL,EAAQjR,aAAa,GACvB,OAAOqc,GAAY,QAASJ,GAE9B,GAA4B,SAAxBhL,EAAQ3Q,YAIV,OAH0B,OAAtBic,GAAoD,UAAtBA,GAAuD,SAAtBA,GACjE/c,EAAW,iBAAiByR,EAAQ3Q,sCAAsCic,MAErEF,GAAYE,GAAqB,QAASN,GAGnD,MAAMpe,EAAcJ,EAAwBwT,EAAQzZ,MACpD,GAAoB,OAAhBqG,EACF,OAAOwe,GAAYE,GAAqB,QAASN,GAEnD,MAAMQ,EAAY5e,EAAYM,gBAAgBnG,IAAIiZ,EAAQlR,UACpD2c,EAAW7e,EAAYU,eAAevG,IAAIiZ,EAAQlR,UACnD0c,GAAcC,GACjBld,EAAW,aAAayR,EAAQlR,4CAGlC,MAMMic,EAAYO,IADyBE,IAAcC,EAAW,UAAY,SAQhF,OAbgBD,GAAaC,EACzB,IAAI3gB,IAAsB,CAAC,QAAS,UAAW,OAAQ,SACvD0gB,EACE,IAAI1gB,IAAsB,CAAC,UAAW,SACtC,IAAIA,IAAsB,CAAC,QAAS,UAG7B/D,IAAIgkB,IACfxc,EAAW,QAAQwc,6CAAqD/K,EAAQlR,cAEnE,YAAXkc,GAAyBQ,GAC3Bjd,EAAW,8CAA8CyR,EAAQlR,cAE5D,CAAEic,YAAWC,SAAQC,WAAYO,EAAWN,WAAYM,IAAcC,EAC/E,CAgBM,SAAUC,GACd1L,EACA+K,GAEA,MAAkB,SAAdA,EAA6BA,EAlB7B,SAAoC/K,GACxC,MACM1G,EAAeC,GADJyG,EAAQ9D,YAAYgE,cACgBF,EAAQpR,WACxC,OAAjB0K,GACF/K,EAAW,4BAA4ByR,EAAQpR,qCAEjD,MAAMwO,EAAUkE,GAA6BtB,GAC7C,IAAI2L,GAAc,EAIlB,OAHArS,EAAawJ,YAAY,WAAazd,IACpCsmB,EAActmB,EAAMqY,IAAoBN,KAEnCuO,CACT,CAOSC,CAA0B5L,GAAW,QAAU,SACxD,CChDA,IAAI6L,GAAe,EACfC,GAAiB,EAErB,MAAMC,GAAkB,IAAI9lB,QACtB+lB,GAAgB,IAAI/lB,QAMpBgmB,GAAsB,IAAIhmB,QAQ1BimB,GAA2B,IAAIjmB,QAErC,SAASkmB,GAAqB5lB,EAAY6lB,GACxC,MAAM9V,EAAU4V,GAAyBxlB,IAAIH,QACtB,IAAZ+P,EAIPA,IAAY8V,IACZ9V,aAAmBxL,IACrBwL,EAAQnP,IAAIilB,GAGdF,GAAyBplB,IAAIP,EAAM,IAAIuE,IAAI,CAACwL,EAAS8V,MARnDF,GAAyBplB,IAAIP,EAAM6lB,EASvC,CAEA,SAASC,GAAyB9lB,EAAYqhB,GAC5C,MAAMtR,EAAU4V,GAAyBxlB,IAAIH,GAC7C,QAAuB,IAAZ+P,EACX,GAAIA,aAAmBxL,IACrB,IAAK,MAAMshB,KAAWje,MAAMoc,KAAKjU,GAAUsR,EAASwE,QAGtDxE,EAAStR,EACX,CAEA,SAASgW,GAAiBhgB,EAAYsb,GAKpC,GAJAA,EAAStb,GAIe,OAApBA,EAAKigB,WACT,IAAK,MAAMC,KAASre,MAAMoc,KAAKje,EAAKoD,YAClC4c,GAAiBE,EAAO5E,EAE5B,CAEA,SAAS6E,GAAiBthB,GACxB,GAAqB,iBAAVA,GAAgC,OAAVA,EAAgB,OAAO,EACxD,MAAM5E,EAAO4E,EACb,OAAyB,IAAlB5E,EAAK6E,UAAqC,KAAlB7E,EAAK6E,UAAmB,SAAW7E,CACpE,CAOA,MAAMmmB,GAGiBpgB,KAFJmc,SAEjB,WAAApe,CAAqBiC,GAAA9B,KAAA8B,KAAAA,EACnB,MAAMqgB,EAAY3gB,WAA8D4gB,iBAChFpiB,KAAKie,SAA+B,mBAAbkE,EACnB,IAAIA,EAAUE,GAAcriB,KAAKsiB,gBAAgBD,IACjD,KACJriB,KAAKie,UAAUsE,QAAQzgB,EAAM,CAAE0gB,WAAW,EAAMC,SAAS,GAC3D,CAEQ,eAAAH,CAAgBD,GACtB,MAAMK,EAAkB,GAClBC,EAAgB,GACtB,IAAK,MAAMC,KAAYP,EACrBK,EAAQriB,QAAQsD,MAAMoc,KAAK6C,EAASC,eACpCF,EAAMtiB,QAAQsD,MAAMoc,KAAK6C,EAASE,aAIpC,MAAMC,EAA8B,GACpC,IAAK,MAAMN,KAAWC,EAIhB5D,GAA4B2D,IAChCX,GAAiBW,EAAU1mB,IACzB8lB,GAAyB9lB,EAAO6lB,IAC1B5hB,KAAK8B,KAAKkhB,SAASjnB,IACvB6lB,EAAQqB,kBAAkBlnB,OAIhC,IAAK,MAAM0mB,KAAWE,EAIhB1D,GAAyBwD,KAAarD,MAC1C0C,GAAiBW,EAAU1mB,IACzB8lB,GAAyB9lB,EAAO6lB,IACzB5hB,KAAK8B,KAAKkhB,SAASjnB,IACxB6lB,EAAQsB,gBAAgBnnB,EAAMgnB,OAIhCA,EAAY3iB,OAAS,GAAG+iB,GAAwBJ,EACtD,EAGF,MAAMK,GAAc,IAAI3nB,QAExB,SAAS4nB,GAAgBvhB,GACvB,IAAIR,EAAQ8hB,GAAYlnB,IAAI4F,GAK5B,YAJqB,IAAVR,IACTA,EAAQ,IAAI4gB,GAAapgB,GACzBshB,GAAY9mB,IAAIwF,EAAMR,IAEjBA,CACT,CAEA,SAASgiB,GAAW9N,GAClB,MAAM7Q,EAAY6Q,EAAQ7Q,UAAUuG,IAAKL,GAAW,GAAGA,EAAOW,cAAcX,EAAOc,KAAKtD,KAAK,SAASA,KAAK,KACrGzD,EAAa4Q,EAAQ5Q,WAAWsG,IAAKL,GAAW,GAAGA,EAAOW,cAAcX,EAAOc,KAAKtD,KAAK,SAASA,KAAK,KAC7G,MAAO,CACLmN,EAAQ3Q,YACR2Q,EAAQlR,SACRkR,EAAQhR,cAAc6D,KAAK,KAC3BmN,EAAQpR,UACRoR,EAAQ/Q,cACRE,EACAC,EACA4Q,EAAQhH,MAAQ,IAChBnG,KAAK,KACT,CAEA,SAASkb,GAAkBC,EAAgCC,GAChC,OAArBD,EAAOE,YACTF,EAAOE,UAAY,IAAIpjB,KAEzBkjB,EAAOE,UAAU/mB,IAAI8mB,EACvB,OAEaE,GACMC,QAAU,IAAItjB,IAKvBujB,QAA2B,KAGlBC,oBAAsB,IAAIroB,QAC1BsoB,iBAAmB,IAAItoB,QACvBuoB,eAAiB,IAAIvoB,QACrB8V,SAAW,IAAIjR,IAEhC,WAAAT,CAAYiC,EAAoB,MACjB,OAATA,GAAe9B,KAAKuiB,QAAQzgB,EAClC,CASA,UAAAmiB,CACE3e,EACAW,EAAoC,CAAA,EACpCie,GAEA,MAAMC,EAAkBle,EAAQke,kBAAmB,EAC7CC,EAAmC,CACvCD,kBACAE,iBAAkBpe,EAAQoe,kBAAoBF,EAC9CG,iBAAkBre,EAAQqe,mBAAoB,GAE1CnD,EAA8B,GACpC,IAAK,MAAMxf,KAAa2D,EAAU,CAChC,MAAMkQ,EAAUxV,KAAKukB,SAAS5iB,EAAWyiB,GACnC1nB,EAAW6kB,GAAgBrlB,IAAIsZ,QACb,IAAb9Y,GAA+C,aAAnBA,EAAS8nB,OAA2C,WAAnB9nB,EAAS8nB,OAUjFxkB,KAAKykB,MAAMjP,EAAS4O,EAAiBF,GACrC/C,EAAY9gB,KAAKmV,KAVfxV,KAAKuiB,QAAQ7lB,EAASgoB,QAClBN,EAAgBD,iBAAwC,OAArBznB,EAASkW,SAAkD,OAA9BlW,EAASioB,mBAC3EjoB,EAASuJ,QAAQke,iBAAkB,EACnCnkB,KAAKmkB,gBAAgBznB,IAEA,WAAnBA,EAAS8nB,OAAoBxkB,KAAK4kB,oBAAoBloB,GAC1DsD,KAAK6kB,wBAAwBnoB,GAKjC,CACA,OAAOykB,EAAYtW,OAAQ2K,GAAYxV,KAAK8kB,iBAAiBtP,GAC/D,CAcA,QAAAuP,CAASzf,EAAmC4e,GAE1C,GADIjC,GAAiBiC,IAAYb,GAAgBa,GAC5B,OAAjBlkB,KAAK6jB,QAIT,IAAK,MAAMrO,KAAWlQ,EAAU,CAC9B,MAAMke,EAASjC,GAAgBrlB,IAAIsZ,GACnC,QAAsB,IAAXgO,GAA0BA,EAAO5B,UAAY5hB,MAClC,aAAjBwjB,EAAOgB,OAAyC,WAAjBhB,EAAOgB,MAAoB,CACtC,OAAnBhB,EAAO5Q,SAAgD,OAA5B4Q,EAAOmB,mBAEpCnB,EAAOvd,QAAQke,iBAAkB,EACjCnkB,KAAKmkB,gBAAgBX,EAAQU,IAEV,WAAjBV,EAAOgB,OAAoBxkB,KAAK4kB,oBAAoBpB,GACxDxjB,KAAK6kB,wBAAwBrB,GAC7B,QACF,CACA,MAAMvd,EAAUjG,KAAK+jB,iBAAiB7nB,IAAIsZ,QACnB,IAAZvP,GAMXA,EAAQke,iBAAkB,EAC1BnkB,KAAKykB,MAAMjP,EAASvP,EAASie,IAL3BlkB,KAAKikB,WAAW,CAACzO,GAAU,CAAE2O,iBAAiB,EAAME,kBAAkB,EAAOC,kBAAkB,GAMnG,MAzBEtkB,KAAKglB,iBAAiBhlB,KAAK6jB,QAASve,EAAU4e,EA0BlD,CAEA,gBAAAY,CAAiBtP,GACf,IAAKla,EAAOJ,6BAEV,OADImlB,GAAuB7K,IAAUqL,GAAyBrL,IACvD,EAET,MAAMgO,EAASjC,GAAgBrlB,IAAIsZ,GACnC,YAAsB,IAAXgO,GAA0BA,EAAO5B,UAAY5hB,QACnDwjB,EAAOvd,QAAQke,iBAAoC,uBAAjBX,EAAOgB,OACzB,WAAjBhB,EAAOgB,QACU,WAAjBhB,EAAOgB,OAAoBxkB,KAAK4kB,oBAAoBpB,GAKnDA,EAAOyB,iBAIqB,UAA7BzB,EAAO0B,oBAKH1B,EAAO2B,mBAAqB3B,EAAO4B,oBARzC5B,EAAOyB,kBAAmB,EACU,UAA7BzB,EAAO0B,oBAQlB,CAEA,SAAAG,CAAU7P,GACR,MAAMgO,EAASjC,GAAgBrlB,IAAIsZ,GACnC,OAAOgO,GAAQ5B,UAAY5hB,KAAOwjB,EAAS,IAC7C,CAEA,WAAA8B,CAAY9P,EAAuBiO,GACjC,MAAMD,EAASjC,GAAgBrlB,IAAIsZ,GACnC,aAAsB,IAAXgO,IAA2BxjB,KAAKulB,QAAQ/B,EAAQA,EAAOgC,eAGlEjC,GAAkBC,EAAQC,IACnB,EACT,CAEA,iBAAAgC,CACE1pB,EACAiF,EACAoc,EACAmC,EAAmC,QAEnC,MAAM7d,EAAWL,IACA,OAAbK,GACFqC,EAAW,6CAA6C/C,OAE1DhB,KAAKuiB,QAAQxmB,GACb4lB,GAAqB5lB,EAAMiE,MAC3B,MAAM0lB,EAA4B,CAAE3pB,OAAMqiB,QAAQ,EAAMuH,OAAQ,MAChE,IAAIC,EAAQ5lB,KAAKgkB,eAAe9nB,IAAIH,QACf,IAAV6pB,IACTA,EAAQ,IAAItlB,IACZN,KAAKgkB,eAAe1nB,IAAIP,EAAM6pB,IAEhCA,EAAMjpB,IAAI+oB,GACV1lB,KAAKuR,SAAS5U,IAAI+oB,GAClB,MAAMG,EAAS,MACRH,EAAKtH,SACVsH,EAAKtH,QAAS,EACdwH,GAAOjX,OAAO+W,GACd1lB,KAAKuR,SAAS5C,OAAO+W,IACd,GAkBT,OAhBAA,EAAKC,OAAS1F,GAAyBve,GAAU4d,KAC/Cte,EACA,KACE,GAAK6kB,IACL,IACEhkB,EAAqBH,EAAU3F,GAC/BqhB,GACF,CAAE,MAAOwC,GACPL,EAAOK,EACT,GAEDA,IACMiG,KACLtG,EAAOK,KAGJ,KACAiG,KACLH,EAAKC,WAET,CAEA,cAAAG,CAAetQ,GACb,MAAMgO,EAASjC,GAAgBrlB,IAAIsZ,QACb,IAAXgO,GAA0BA,EAAO5B,UAAY5hB,MACxDA,KAAK+lB,cAAcvC,EACrB,CAEA,OAAAwC,GACE,IAAK,MAAMxC,KAAU7f,MAAMoc,KAAK/f,KAAK4jB,SAAU5jB,KAAK+lB,cAAcvC,GAClE,IAAK,MAAMkC,KAAQ/hB,MAAMoc,KAAK/f,KAAKuR,UACjCmU,EAAKtH,QAAS,EACdsH,EAAKC,WACL3lB,KAAKuR,SAAS5C,OAAO+W,GACrB1lB,KAAKgkB,eAAe9nB,IAAIwpB,EAAK3pB,OAAO4S,OAAO+W,EAE/C,CAQA,mBAAAO,GACE,GAAIjmB,KAAKuR,SAASwD,KAAO,EAAG,OAAO,EACnC,IAAK,MAAMyO,KAAUxjB,KAAK4jB,QACxB,GAAIJ,EAAO0C,mBAAqB,GAAK1C,EAAO4B,mBAAoB,OAAO,EAEzE,OAAO,CACT,CAcA,cAAAe,GACE,IAAK,MAAM3C,KAAUxjB,KAAK4jB,QACD,OAAnBJ,EAAO5Q,UACTyD,GAAoCmN,EAAO5Q,QAAS4Q,EAAO4C,MAC3D5C,EAAO5Q,QAAU,MAEnB4Q,EAAOgB,MAAQ,WACfhB,EAAOE,UAAY,KAErB1jB,KAAK4jB,QAAQnM,OACf,CAEA,OAAA8K,CAAQxmB,GACN,MAAM+F,EA1UV,SAA2B/F,GACzB,MAAM+F,EAAO/F,EAAK2Z,cAClB,OAAOuM,GAAiBngB,GAAQA,EAAO,IACzC,CAuUiBukB,CAAkBtqB,GAClB,OAAT+F,GAIJuhB,GAAgBvhB,EAClB,CAEA,eAAAwgB,CAAgBxgB,EAAuB4gB,EAA0BC,GAC/D,IAAK,MAAMF,KAAWC,EACpBZ,GAAiBW,EAAU1mB,IACrB+F,EAAKkhB,SAASjnB,IAClBiE,KAAKijB,kBAAkBlnB,KAG3B,MAAMgnB,EAA8B,GACpC,IAAK,MAAMN,KAAWE,EACpBb,GAAiBW,EAAU1mB,IACpB+F,EAAKkhB,SAASjnB,IACnBiE,KAAKkjB,gBAAgBnnB,EAAMgnB,KAG3BA,EAAY3iB,OAAS,GAAG+iB,GAAwBJ,EACtD,CAEA,iBAAAE,CAAkBlnB,GAChB,MAAMuqB,EAAQtmB,KAAK8jB,oBAAoB5nB,IAAIH,GAC3C,QAAqB,IAAVuqB,EACT,GAAIA,aAAiBnoB,IACnB,IAAK,MAAMqX,KAAW8Q,EAAMC,SAAUvmB,KAAK8lB,eAAetQ,QAE1DxV,KAAK8lB,eAAeQ,GAGxB,MAAMV,EAAQ5lB,KAAKgkB,eAAe9nB,IAAIH,GACtC,QAAqB,IAAV6pB,EACT,IAAK,MAAMF,KAAQ/hB,MAAMoc,KAAK6F,GAC5BF,EAAKtH,QAAS,EACdsH,EAAKC,WACLC,EAAMjX,OAAO+W,GACb1lB,KAAKuR,SAAS5C,OAAO+W,EAG3B,CAEA,eAAAxC,CAAgBnnB,EAAYgnB,GAC1B,MAAMuD,EAAQtmB,KAAK8jB,oBAAoB5nB,IAAIH,GAC3C,QAAqB,IAAVuqB,EAAuB,OAClC,MAAMhhB,EAAWghB,aAAiBnoB,IAAMmoB,EAAMC,SAAW,CAACD,GAC1D,IAAK,MAAM9Q,KAAWlQ,EAAU,CAC9B,MAAMke,EAASjC,GAAgBrlB,IAAIsZ,GACnC,GAAsB,WAAlBgO,GAAQgB,MAAoB,CAC9BxkB,KAAK6kB,wBAAwBrB,GAC7B,QACF,CACA,GAAsB,aAAlBA,GAAQgB,MAAsB,SAClC,MAAMve,EAAUjG,KAAK+jB,iBAAiB7nB,IAAIsZ,GAC1C,QAAuB,IAAZvP,EACX,IACEjG,KAAKykB,MAAMjP,EAASvP,GAChBA,EAAQqe,kBAAoBtkB,KAAK8kB,iBAAiBtP,IAAUuN,EAAY1iB,KAAKmV,EACnF,CAAE,MAEF,CACF,CACF,CAMQ,WAAAgR,CAAY9B,GAClB,MAAM5Y,EAAU9L,KAAK8jB,oBAAoB5nB,IAAIwoB,GAC7C,GAAI5Y,aAAmB3N,IACrB,OAAO2N,EAET,MAAMZ,EAAM,IAAI/M,IAChB,QAAuB,IAAZ2N,EAAyB,CAClC,IAAImF,EAAMwQ,GAAoBvlB,IAAI4P,QACf,IAARmF,IACTA,EAAMqS,GAAWxX,GACjB2V,GAAoBnlB,IAAIwP,EAASmF,IAEnC/F,EAAI5O,IAAI2U,EAAKnF,EACf,CAEA,OADA9L,KAAK8jB,oBAAoBxnB,IAAIooB,EAAQxZ,GAC9BA,CACT,CAEQ,QAAAqZ,CAAS/O,EAAuBvP,GACtC,MAAMye,EAASlP,EAAQ9D,YAGvBiQ,GAAqB+C,EAAQ1kB,MAC7B,MAAMsmB,EAAQtmB,KAAKwmB,YAAY9B,GAC/B,IAAIzT,EAAMwQ,GAAoBvlB,IAAIsZ,QACf,IAARvE,IACTA,EAAMqS,GAAW9N,GACjBiM,GAAoBnlB,IAAIkZ,EAASvE,IAEnC,MAAMwV,EAAaH,EAAMpqB,IAAI+U,GAC7B,QAA0B,IAAfwV,EAA4B,CACrC,MAAMC,EAAoB1mB,KAAK+jB,iBAAiB7nB,IAAIuqB,GAMpD,YALiC,IAAtBC,IACTA,EAAkBvC,kBAAoBle,EAAQke,gBAC9CuC,EAAkBrC,mBAAqBpe,EAAQoe,iBAC/CqC,EAAkBpC,mBAAqBre,EAAQqe,kBAE1CmC,CACT,CAGA,OAFAH,EAAMhqB,IAAI2U,EAAKuE,GACfxV,KAAK+jB,iBAAiBznB,IAAIkZ,EAAS,IAAKvP,IACjCuP,CACT,CAUA,aAAAmR,CAAcC,EAAgBthB,GAC5BtF,KAAK6jB,QAAU+C,EACf,MAAMC,EAA8B,CAAE1C,iBAAiB,EAAOE,kBAAkB,EAAOC,kBAAkB,GACnGwC,EAAQF,EAAKE,MACnB,IAAK,IAAI7pB,EAAI,EAAGA,EAAIqI,EAASlF,OAAQnD,IAAK,CACxC,MAAMuY,EAAUlQ,EAASrI,GACnB8pB,EAAOD,EAAM7pB,GACbynB,EAASlP,EAAQ9D,YACvBiQ,GAAqB+C,EAAQ1kB,MAC7BA,KAAKgnB,mBAAmBtC,EAAQlP,EAASvY,GACzC+C,KAAK+jB,iBAAiBznB,IAAIkZ,EAASqR,GACnC,MAAMrD,EAAiC,CACrC5nB,KAAMylB,GACN+E,KAAM5Q,EACNgQ,aAAclE,GACdkD,MAAO,SACPd,UAAW,KACX9B,QAAS5hB,KACT0kB,SACAze,QAAS4gB,EACTjU,QAAS,KACTqU,gBAAiB,KACjBtC,iBAAkB,KAClBuB,mBAAoB,EACpBgB,cAAeH,EAAKI,OACpBjC,kBAAmB6B,EAAKxG,UACxB6G,gBAAgB,EAChBnC,kBAAkB,EAClBE,iBAAkB4B,EAAKI,OAAOzG,WAC9B0E,oBAAoB,EACpBiC,cAAe,EACfC,kBAAkB,EAClBC,mBAAe7mB,EACf8mB,eAAe,EACfC,gBAAgB,GAIlB,GAFAlG,GAAgBjlB,IAAIkZ,EAASgO,GAC7BxjB,KAAK4jB,QAAQjnB,IAAI6mB,GACbuD,EAAKW,QAAS,CAChB,IACEtM,GAAmB5F,EACrB,CAAE,MAAOoK,GAIP,MAHA4D,EAAOgB,MAAQ,SACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,GACd5D,CACR,CACA4D,EAAOgE,eAAgB,CACzB,CAGF,CACF,CAWQ,gBAAAxC,CAAiB4B,EAAgBthB,EAAmC4e,GAC1E,MAAM4C,EAAQF,EAAKE,MACnB,IAAK,IAAI7pB,EAAI,EAAGA,EAAIqI,EAASlF,OAAQnD,IAAK,CACxC,MAAMuY,EAAUlQ,EAASrI,GACnBumB,EAASjC,GAAgBrlB,IAAIsZ,GACnC,QAAsB,IAAXgO,GAA0BA,EAAO5B,UAAY5hB,KAAxD,CAMA,GADAwjB,EAAOvd,QAAQke,iBAAkB,EACZ,aAAjBX,EAAOgB,OAAyC,WAAjBhB,EAAOgB,MAAoB,CAE5D,MAAMuC,EAAOD,EAAM7pB,GASnB,GARAumB,EAAOgC,aAAelE,GACtBkC,EAAOgB,MAAQ,SACfhB,EAAO0D,cAAgBH,EAAKI,OAC5B3D,EAAO0B,kBAAoB6B,EAAKxG,UAChCiD,EAAO4D,gBAAiB,EACxB5D,EAAOyB,kBAAmB,EAC1BzB,EAAO2B,iBAAmB4B,EAAKI,OAAOzG,WACtC1gB,KAAK4jB,QAAQjnB,IAAI6mB,GACbuD,EAAKW,QAAS,CAChB,IACEtM,GAAmB5F,EACrB,CAAE,MAAOoK,GAIP,MAHA4D,EAAOgB,MAAQ,SACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,GACd5D,CACR,CACA4D,EAAOgE,eAAgB,CACzB,CACAxnB,KAAKmkB,gBAAgBX,EAAQU,GAC7B,QACF,CACuB,OAAnBV,EAAO5Q,SAAgD,OAA5B4Q,EAAOmB,kBAEpC3kB,KAAKmkB,gBAAgBX,EAAQU,EA7B/B,MAFElkB,KAAKikB,WAAW,CAACzO,GAAU,CAAE2O,iBAAiB,EAAME,kBAAkB,EAAOC,kBAAkB,GAiCnG,CACF,CAEQ,kBAAA0C,CAAmBtC,EAAclP,EAAuBoS,GAC9D,MAAM9b,EAAU9L,KAAK8jB,oBAAoB5nB,IAAIwoB,GAC7C,QAAuB,IAAZ5Y,EAET,YADA9L,KAAK8jB,oBAAoBxnB,IAAIooB,EAAQlP,GAKvC,GAAI1J,aAAmB3N,IAErB,YADA2N,EAAQxP,IAAI,SAAWsrB,EAAWpS,GAGpC,MAAMtK,EAAM,IAAI/M,IAChB+M,EAAI5O,IAAI,cAAewP,GACvBZ,EAAI5O,IAAI,SAAWsrB,EAAWpS,GAC9BxV,KAAK8jB,oBAAoBxnB,IAAIooB,EAAQxZ,EACvC,CAEQ,KAAAuZ,CAAMjP,EAAuBvP,EAA0Bie,ICtuB3D,SAA+BhP,GACnC,MAAMnZ,EAAOmZ,EAAYnZ,KACnB2V,EAAcwD,EAAYxD,YAC5B3V,IAAS2V,GAGW,OAApB3V,EAAKyW,YAITzW,EAAKyW,WAAWqV,aAAanW,EAAa3V,EAC5C,CD4tBI+rB,CAAqBtS,GACrB,MAAMuS,EAAgB/nB,KAAK+jB,iBAAiB7nB,IAAIsZ,IAAY,IAAKvP,GAC3Dud,EAAiC,CACrC5nB,KAAMylB,GACN+E,KAAM5Q,EACNgQ,aAAclE,GACdkD,MAAO,aACPd,UAAW,KACX9B,QAAS5hB,KACT0kB,OAAQlP,EAAQ9D,YAChBzL,QAAS8hB,EACTnV,QAAS,KACTqU,gBAAiB,KACjBtC,iBAAkB,KAClBuB,mBAAoB,EACpBgB,cAAe,KACfhC,kBAAmB,KACnBkC,gBAAgB,EAChBnC,kBAAkB,EAClBE,kBAAkB,EAClBC,oBAAoB,EACpBiC,cAAe,EACfC,kBAAkB,EAClBC,mBAAe7mB,EACf8mB,eAAe,EACfC,gBAAgB,GAElBlG,GAAgBjlB,IAAIkZ,EAASgO,GAC7BxjB,KAAK4jB,QAAQjnB,IAAI6mB,QAGQ,IAAdU,GAA2BlkB,KAAKuiB,QAAQiB,EAAOkB,QAE1D,IACElB,EAAOgB,MAAQ,YACfxkB,KAAKgoB,gBAAgBxE,GACjBA,EAAOvd,QAAQke,iBAAiBnkB,KAAKmkB,gBAAgBX,EAAQU,GAC/B,IAA9BV,EAAO0C,qBAA0B1C,EAAOgB,MAAQ,SACtD,CAAE,MAAO5E,GAIP,MAHA4D,EAAOgB,MAAQ,SACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,GACd5D,CACR,CACF,CAEQ,eAAAoI,CAAgBxE,GACtB,MAAMhO,EAAUgO,EAAO4C,KACnBhL,GAAmB5F,GACrBgO,EAAOgE,eAAgB,EAIO,eAA5BhS,EAAQjR,aAAa,IASrB+W,GAAwB9F,IAC1B+N,GAAkBC,EAAQ,IPrtB1B,SAAkChO,GACtC,GAA4B,UAAxBA,EAAQ3Q,kBAA2B2Q,EAAQhR,cAAc6G,QAAQ,MAAc,CACjF,MAAMwM,EAAYE,GAAavC,GACzBvE,EAAM2G,GAAcpC,EAASqC,GAC7B0D,EAAoB7D,GAAoBxb,IAAI+U,GAClD,YAAiC,IAAtBsK,IAGV/F,EAAQzZ,KAAiBoG,oBAAoB0V,EAAW0D,GAEpB,IAAjC5D,GAAgBJ,QAAQtG,KAGxB0G,GAAgBN,OAAOpG,EAAKuE,IAC9BkC,GAAoB/I,OAAOsC,IAEtB,GACT,CACA,OAAO,CACT,COksBsCgX,CAAwBzS,IAEtDyC,GAA2BzC,IAC7B+N,GAAkBC,EAAQ,IdxsB1B,SAAqChO,GACzC,GAA4B,aAAxBA,EAAQ3Q,kBAA8B2Q,EAAQhR,cAAc6G,QAAQ,MAAc,CACpF,MAAMwM,EAAYE,GAAavC,GACzBvE,EAAM2G,GAAcpC,EAASqC,GAC7BK,EAAuBR,GAAoBxb,IAAI+U,GACrD,YAAoC,IAAzBiH,IAGV1C,EAAQzZ,KAAiBoG,oBAAoB0V,EAAWK,GAEpB,IAAjCP,GAAgBJ,QAAQtG,KAGxB0G,GAAgBN,OAAOpG,EAAKuE,IAC9BkC,GAAoB/I,OAAOsC,IAEtB,GACT,CACA,OAAO,CACT,CcqrBsCiX,CAA2B1S,IAE7DxV,KAAKmoB,sBAAsB3E,EAAQ,KAUjC,GACEloB,EAAOJ,8BACJwgB,GAAiBlG,EAAQzZ,KAAMyZ,EAAQlR,YACC,IAAxCkR,EAAQhR,cAAc6G,QAAQ,MACjC,CACA,MAAM+c,WJhpBZrsB,EACAuI,EACA2Z,GAEA,IAAIoK,EAAa9K,GAA6BrhB,IAAIH,QACxB,IAAfssB,IACTA,EAAa,IAAIlqB,IACjBof,GAA6BjhB,IAAIP,EAAMssB,IAEzC,IAAIC,EAAYD,EAAWnsB,IAAIoI,GAM/B,YALyB,IAAdgkB,IACTA,EAAY,IAAIhoB,IAChB+nB,EAAW/rB,IAAIgI,EAAUgkB,IAE3BA,EAAU3rB,IAAIshB,GACP,KACLqK,GAAW3Z,OAAOsP,GACM,IAApBqK,GAAWvT,MAAYsT,GAAY1Z,OAAOrK,GACrB,IAArB+jB,GAAYtT,MAAYwI,GAA6B5O,OAAO5S,GAEpE,CI4nB+BwsB,CAAuB/S,EAAQzZ,KAAMyZ,EAAQlR,SAAW3D,IACxEX,KAAKulB,QAAQ/B,EAAQA,EAAOgC,cACjChC,EAAO6D,eAAiB,EACxB7D,EAAO8D,kBAAmB,EAC1B9D,EAAO+D,cAAgB5mB,KAEzB4iB,GAAkBC,EAAQ4E,EAC5B,EJjoBA,SAAmC5S,GACvC,MAAMuE,EAAgBvZ,EAAiBgV,EAAQzZ,MAC/C,GAAsB,OAAlBge,EAAwB,CAC1B,MAAMrY,EAAWL,IACXua,EAAcla,GAAUxF,IAAI6d,GAClC,QAA2B,IAAhB6B,EAIT,YAHiB,OAAbla,GACFqC,EAAW,6CAA6CgW,OAI9D,CAEA,GAAI2B,GAAiBlG,EAAQzZ,KAAMyZ,EAAQlR,YAAqD,IAAxCkR,EAAQhR,cAAc6G,QAAQ,MAAc,CAClG,MAAMwM,EAAYE,GAAavC,GACzBsI,EAAcF,GAAepI,GAC7BvE,EAAM2G,GAAcpC,EAASqC,EAA2B,OAAhBiG,GAC9C,IAAI0K,EAAqB9Q,GAAoBxb,IAAI+U,QACf,IAAvBuX,IACTA,EAAqB3K,GACnBrI,EAAQpR,UACRoR,EAAQlR,SACRkR,EAAQ/Q,cACR+Q,EAAQ7Q,UACRmZ,GAEFpG,GAAoBpb,IAAI2U,EAAKuX,IAE9BhT,EAAQzZ,KAAiBmG,iBAAiB2V,EAAW2Q,GACtD7Q,GAAgBhb,IAAIsU,EAAKuE,EAC3B,CACF,CImmBMiT,CAAyBjT,GACzBgO,EAAOiE,gBAAiB,KAtCxBznB,KAAKmoB,sBAAsB3E,EAAQ,KAC7B1J,GAAwBtE,IAC1B+N,GAAkBC,EAAQ,IV1qB9B,SAAkChO,GACtC,GAAgC,eAA5BA,EAAQjR,aAAa,GACvB,OAAO,EAET,MAAMmkB,EAAW7O,GAAkB3d,IAAIsZ,GACvC,YAAwB,IAAbkT,IAGVlT,EAAQzZ,KAAiBoG,oBAAoBumB,EAAS7Q,UAAW6Q,EAAStO,SAC3EP,GAAkBlL,OAAO6G,IAClB,EACT,CU+pB0CmT,CAAwBnT,KAsChE,CAEQ,qBAAA2S,CAAsB3E,EAAgCoF,GAC5D,MAAM5nB,EAAUR,EAAiBgjB,EAAO4C,KAAKrqB,MAC7C,GAAgB,OAAZiF,EAEF,YADA4nB,IAGF,MAAMlnB,EAAWL,IAIjB,GAHiB,OAAbK,GACFqC,EAAW,6CAA6C/C,YAErB,IAA1BU,EAASxF,IAAI8E,GAEtB,YADA4nB,IAIFpF,EAAOgB,MAAQ,qBACfhB,EAAO0C,oBAAsB,EAC7B,MAAMV,EAAahC,EAAOgC,WAEpBG,EADqC1F,GAAyBve,GACzC4d,KAAKte,EAAS,KACvC,GAAKhB,KAAKulB,QAAQ/B,EAAQgC,GAC1B,IACE3jB,EAAqBH,EAAU8hB,EAAO4C,KAAKrqB,MAC3C6sB,IACApF,EAAO0C,oBAAsB,EACK,IAA9B1C,EAAO0C,qBACT1C,EAAOgB,MAAQ,SACfxkB,KAAK4kB,oBAAoBpB,GAE7B,CAAE,MACAA,EAAOgB,MAAQ,SACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,EACtB,GACC,KACIxjB,KAAKulB,QAAQ/B,EAAQgC,KAC1BhC,EAAOgB,MAAQ,SACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,MAEtBD,GAAkBC,EAAQmC,EAC5B,CAEQ,mBAAAf,CAAoBpB,GAC1B,GAAKloB,EAAOJ,+BAAgCsoB,EAAO4D,gBAAmB5D,EAAOvd,QAAQke,gBAArF,CACAX,EAAOgB,MAAQ,gBACf,IACE,MAAM2C,EAAStG,GAAyB2C,EAAO4C,MACzC7F,EAAYW,GAAwBsC,EAAO4C,KAAMe,EAAO5G,WAM9D,GALAiD,EAAO0D,cAAgBC,EACvB3D,EAAO0B,kBAAoB3E,EAC3BiD,EAAO4D,gBAAiB,EACxB5D,EAAO2B,iBAAmBgC,EAAOzG,WACjC8C,EAAOgB,MAAQ,UACV2C,EAAO1G,WAAY,OACxB,GACoB,YAAlB0G,EAAO3G,QACJgD,EAAO4C,KAAKrqB,gBAAgB8sB,cAC3BrF,EAAO4C,KAAKrqB,KAAK4Z,YAKrB,OAHA6N,EAAO4B,oBAAqB,OH90BlClG,KGm1BIlf,KAAK8oB,qBAAqBtF,EAA0B,SAAlB2D,EAAO3G,OAC3C,CAAE,MAAOZ,GAIP,MAHA4D,EAAOgB,MAAQ,SACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,GACd5D,CACR,CA3BsG,CA4BxG,CAEQ,oBAAAkJ,CAAqBtF,EAAgCuF,GAC3D,IAAK/oB,KAAKulB,QAAQ/B,EAAQA,EAAOgC,YAAa,OAC9C,MAAMvjB,EAASuhB,EAAO4C,KAAKrqB,KACrBuH,EAAOkgB,EAAO4C,KAAK9hB,SACzB,KAAMhB,KAAQrB,GAAS,OACvB,MAAM+mB,EAAWxF,EAAO6D,cAClB1mB,EAAQsB,EAAOqB,GACjBkgB,EAAO4B,qBACT5B,EAAO4B,oBAAqB,EAC5BjG,MAEE4J,GAAavF,EAAO6D,gBAAkB2B,IAC1CxF,EAAO8D,kBAAmB,EAC1B9D,EAAO+D,cAAgB5mB,EACU,YAA7B6iB,EAAO0B,mBDrwBT,SAA8B1P,EAAuB7U,GACzD,IAAIsoB,EAAgBtoB,EACpB,IAAK,MAAMkK,KAAU2K,EAAQ7Q,UAC3BskB,EAAgBpe,EAAOa,SAASud,GAElC,MACMna,EAAeC,GADJyG,EAAQzZ,KAAK2Z,cACuBF,EAAQpR,WACxC,OAAjB0K,GACF/K,EAAW,4BAA4ByR,EAAQpR,kDAEjD,MAAMmO,EAAcF,GAAqBmD,EAAQzZ,MACjD+S,EAAawJ,YAAY,WAAazd,IACpCA,EAAMmY,IAAsBT,EAAa,KACvC1X,EAAM2a,EAAQ/Q,eAAiBwkB,KAGrC,CCsvBMC,CAAoB1F,EAAO4C,KAAMzlB,GAErC,CAEQ,uBAAAkkB,CAAwBrB,GAC9B,GACGloB,EAAOJ,8BACJsoB,EAAO4B,oBACN5B,EAAO4C,KAAKrqB,gBAAgB8sB,aAC7BrF,EAAO4C,KAAKrqB,KAAK4Z,YAEvB,IACE3V,KAAK8oB,qBAAqBtF,GAAQ,EACpC,CAAE,MACAA,EAAOgB,MAAQ,SACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,EACtB,CACF,CAEQ,eAAAW,CAAgBX,EAAgCU,GACtD,GAAuB,OAAnBV,EAAO5Q,SAAgD,OAA5B4Q,EAAOmB,iBAA2B,OACjE,MAAMnP,EAAUgO,EAAO4C,KACjBtS,EAAYmB,GAA0BO,GAC5C,GAAkB,OAAd1B,EAAoB,CAGtB,MACMhF,EAAeC,GADJwG,GAAuBC,EAAS0O,GACI1O,EAAQpR,WACxC,OAAjB0K,GACF/K,EAAW,4BAA4ByR,EAAQpR,qCAEjD,MAAMqP,EAAmBF,GAAoBzE,EAAc0G,EAAQ9Q,yBlBh3BrC+O,EAAqCK,EAAuB0B,GAC9F,IAAI2T,EAAS7S,GAAcpa,IAAIuX,QACT,IAAX0V,IACTA,EAAS,IAAI1tB,QACb6a,GAAcha,IAAImX,EAAkB0V,IAEtC,MAAMrd,EAAUqd,EAAOjtB,IAAI4X,QACJ,IAAZhI,EACTqd,EAAO7sB,IAAIwX,EAAW0B,GACb1J,aAAmBxL,IAC5BwL,EAAQnP,IAAI6Y,GACH1J,IAAY0J,GACrB2T,EAAO7sB,IAAIwX,EAAW,IAAIxT,IAAI,CAACwL,EAAS0J,KAErB,OAAjBQ,IACFA,GAAa,CAAEG,KAAM,sBAAuBC,gBAAiBlC,GAA2BT,EAAkBK,GAAY0B,WAE1H,CkBg2BM4T,CAAoB3V,EAAkBK,EAAW0B,GACjDgO,EAAOyD,gBAAkBxT,EACzB+P,EAAOmB,iBAAmB7Q,CAC5B,KAAO,CACL,MAAMlB,EAAUiD,GAAiCL,EAAS0O,GAC1DhO,GAAiCtD,EAAS4C,GAC1CgO,EAAO5Q,QAAUA,CACnB,CAGA,IAAK4Q,EAAOvd,QAAQoe,iBAAkB,OACtC,MACMvV,EAAeC,GADJyG,EAAQ9D,YAAYgE,cACgBF,EAAQpR,WACxC,OAAjB0K,GACF/K,EAAW,4BAA4ByR,EAAQpR,qCAErB,UAAxBoR,EAAQ3Q,aACViK,EAAaE,YAAYwG,EAAQ/Q,cAAe+Q,EAAQ3Q,YAE5D,CAEQ,OAAA0gB,CAAQ/B,EAAgCgC,GAC9C,OAAOhC,EAAOgC,aAAeA,GACxBjE,GAAgBrlB,IAAIsnB,EAAO4C,QAAU5C,GACpB,aAAjBA,EAAOgB,OACU,WAAjBhB,EAAOgB,KACd,CAEQ,aAAAuB,CAAcvC,GACC,aAAjBA,EAAOgB,QACXhB,EAAOgB,MAAQ,WACfxkB,KAAK2nB,aAAanE,GAClBxjB,KAAK4jB,QAAQjV,OAAO6U,GACtB,CAEQ,YAAAmE,CAAanE,GAGfA,EAAO4B,qBACT5B,EAAO4B,oBAAqB,EAC5BjG,MAEF,MAAM3J,EAAUgO,EAAO4C,KAKvB,GAAuB,OAAnB5C,EAAO5Q,QACT,IACEyD,GAAoCmN,EAAO5Q,QAAS4C,GACpDgO,EAAO5Q,QAAU,KACjBoE,GAA+BxB,GAC/BO,GAAmCP,EACrC,CAAE,MAEF,MACK,GAAgC,OAA5BgO,EAAOmB,iBAChB,clBv5BiClR,EAAqCK,EAAuB0B,GACjG,MAAM2T,EAAS7S,GAAcpa,IAAIuX,GACjC,QAAsB,IAAX0V,EACT,OAEF,MAAMrd,EAAUqd,EAAOjtB,IAAI4X,QACJ,IAAZhI,IAGPA,aAAmBxL,IACrBwL,EAAQ6C,OAAO6G,GACN1J,IAAY0J,GACrB2T,EAAOxa,OAAOmF,GAEK,OAAjBkC,IACFA,GAAa,CAAEG,KAAM,wBAAyBC,gBAAiBlC,GAA2BT,EAAkBK,GAAY0B,YAE5H,CkBu4BQ6T,CAAuB7F,EAAOyD,gBAAkBzD,EAAOmB,iBAAkBnP,GACzEgO,EAAOyD,gBAAkB,KACzBzD,EAAOmB,iBAAmB,KAG1B3N,GAA+BxB,GAC/BO,GAAmCP,EACrC,CAAE,MAEF,CAEF,GAAIgO,EAAOiE,eAAgB,CACzBjE,EAAOiE,gBAAiB,EACxB,KJvyBA,SAAmCjS,GACvC,MAAMuE,EAAgBvZ,EAAiBgV,EAAQzZ,MAC/C,GAAsB,OAAlBge,EAAwB,CAC1B,MAAMrY,EAAWL,IACXua,EAAcla,GAAUxF,IAAI6d,GAClC,QAA2B,IAAhB6B,EAIT,MAEJ,CAEA,GAAIF,GAAiBlG,EAAQzZ,KAAMyZ,EAAQlR,YAAqD,IAAxCkR,EAAQhR,cAAc6G,QAAQ,MAAc,CAClG,MAAMwM,EAAYE,GAAavC,GAEzBvE,EAAM2G,GAAcpC,EAASqC,EAA2B,OAD1C+F,GAAepI,IAE7BgT,EAAqB9Q,GAAoBxb,IAAI+U,GACnD,QAAkC,IAAvBuX,EACT,OAEDhT,EAAQzZ,KAAiBoG,oBAAoB0V,EAAW2Q,GAErD7Q,GAAgBN,OAAOpG,EAAKuE,IAC9BkC,GAAoB/I,OAAOsC,EAE/B,CACF,CI6wBQqY,CAAyB9T,EAC3B,CAAE,MAEF,CACF,CACA,GAAyB,OAArBgO,EAAOE,UAAoB,CAC7B,MAAMA,EAAY/f,MAAMoc,KAAKyD,EAAOE,WAAWtb,UAC/Cob,EAAOE,UAAY,KACnB,IAAK,MAAMD,KAAYC,EACrB,IACED,GACF,CAAE,MAEF,CAEJ,CACA,GAAID,EAAOgE,cAAe,CACxBhE,EAAOgE,eAAgB,EACvB,KR18BA,SAA6BhS,GACjC,IAAKA,EAAQlR,SAASkJ,WAAW,MAC/B,OAAO,EAET,MAAMyD,EAAM2G,GAAcpC,GACpB6F,EAAoB3D,GAAoBxb,IAAI+U,GAClD,QAAiC,IAAtBoK,EACT,OAAO,EAET,MAAMxD,EAAYrC,EAAQlR,SAASmD,MAAM,GACxC+N,EAAQzZ,KAAiBoG,oBAAoB0V,EAAWwD,GAEpB,IAAjC1D,GAAgBJ,QAAQtG,KAGxB0G,GAAgBN,OAAOpG,EAAKuE,IAC9BkC,GAAoB/I,OAAOsC,GAG/B,CQw7BQsY,CAAmB/T,EACrB,CAAE,MAEF,CACF,CACF,EAGI,SAAUgU,GAA0B1nB,GACxC,IAAI8f,EAAUJ,GAActlB,IAAI4F,GAKhC,YAJuB,IAAZ8f,IACTA,EAAU,IAAI+B,GAAe7hB,GAC7B0f,GAAcllB,IAAIwF,EAAM8f,IAEnBA,CACT,CAEM,SAAU6H,GAAkBjU,GAChC,OAAO+L,GAAgBrlB,IAAIsZ,IAAUoM,SAAW,IAClD,CE/iCA,MAAM8H,GAAuC,IAAIjuB,QAW3C,SAAUkuB,GAAuBC,EAAuB9a,GAC5D,MAAM+a,EAAyBH,GAAqCxtB,IAAI0tB,GACxE,QAAKC,IAG+C,IAA7CA,EAAuB3tB,IAAI4S,EACpC,CCjBM,SAAUgb,GAAiBnpB,EAAYiK,GAC3C,IAAIqe,EAAgBtoB,EACpB,IAAI,MAAMkK,KAAUD,EAClBqe,EAAgBpe,EAAOa,SAASud,GAElC,OAAOA,CACT,CCHA,MAAMc,GCHG5sB,OAAOC,OAAiB,ICkCjC,MAAM4sB,GAAkE,IAAIvuB,QCjC5E,MAAMwuB,GAA4D,IAAIxuB,QAEhE,SAAUyuB,GAA0BC,GACxC,OAAOF,GAAuB/tB,IAAIiuB,IAAY,EAChD,CAEM,SAAUC,GAA0BD,EAAmB7kB,GAC3D2kB,GAAuB3tB,IAAI6tB,EAAS7kB,EACtC,CCDKhF,IAAI+pB,UAAUC,aACjBhqB,IAAI+pB,UAAUC,WAAa,SAA2BC,GACpD,MAAM5Z,EAAS,IAAIrQ,IAAIN,MACvB,IAAK,MAAMwqB,KAAQD,EACjB5Z,EAAOhC,OAAO6b,GAEhB,OAAO7Z,CACT,GAGGrQ,IAAI+pB,UAAUvV,eACjBxU,IAAI+pB,UAAUvV,aAAe,SAA2ByV,GACtD,MAAM5Z,EAAS,IAAIrQ,IACnB,IAAK,MAAMkqB,KAAQD,EACbvqB,KAAKzD,IAAIiuB,IACX7Z,EAAOhU,IAAI6tB,GAGf,OAAO7Z,CACT,GC5BF,IAAI8Z,GAAQ,WACIC,KACd,MAAO,KAAKD,MAAS/gB,SAAS,KAChC,CCDA,IAAIjH,GAAU,EAEd,MAAMkoB,GACKnc,KAAOkc,KACPzW,gBACA2W,SACAxqB,OAEDyqB,OACAC,SACAC,SACAC,aAQR,WAAAnrB,CAAYoU,EAAoCwE,GAC9CzY,KAAKiU,gBAAkBA,EACvBjU,KAAK4qB,SAAW3W,EAAkBA,EAAgB2W,SAAW,EAAI,EACjE5qB,KAAKI,OAASJ,KAAK4qB,SAAW,EAC9B5qB,KAAK6qB,OAASpS,EACdzY,KAAK8qB,SAAWroB,EAClB,CAOA,SAAIgW,GACF,OAAOzY,KAAK6qB,MACd,CAOA,SAAIpS,CAAM9X,GACRX,KAAK6qB,OAASlqB,EACdX,KAAK8qB,WAAaroB,GAClBzC,KAAKya,QAAQza,KAAK4qB,UAAYjqB,CAChC,CAOA,WAAI8B,GACF,OAAOzC,KAAK8qB,QACd,CAOA,SAAIG,GACF,OAA6B,OAAzBjrB,KAAKiU,kBAGAjU,KAAKiU,gBAAgBgX,OAASjrB,KAAKiU,gBAAgBxR,QAAUzC,KAAK8qB,SAE7E,CAQA,WAAIrQ,GAWF,OAV6B,OAAzBza,KAAKiU,qBACsB,IAAlBjU,KAAK+qB,WACd/qB,KAAK+qB,SAAW,CAAC/qB,KAAK6qB,eAGK,IAAlB7qB,KAAK+qB,UAA4B/qB,KAAKirB,SAC/CjrB,KAAK+qB,SAAW,IAAI/qB,KAAKiU,gBAAgBwG,QAASza,KAAK6qB,QACvD7qB,KAAK8qB,SAAWroB,IAGbzC,KAAK+qB,QACd,CAOA,eAAIG,GAUF,OAT6B,OAAzBlrB,KAAKiU,qBAC0B,IAAtBjU,KAAKgrB,eACdhrB,KAAKgrB,aAAe,CAAC,IAAIG,QAAQnrB,aAGF,IAAtBA,KAAKgrB,eACdhrB,KAAKgrB,aAAe,IAAIhrB,KAAKiU,gBAAgBiX,YAAa,IAAIC,QAAQnrB,QAGnEA,KAAKgrB,YACd,CAOA,WAAII,GACF,MAAO,IAAIprB,KAAK4qB,SAAW,GAC7B,CASA,EAAAvV,CAAG5I,GACD,OAAIA,GAAO,EACFzM,KAAKkrB,YAAYze,IAAM4e,SAAW,KAElCrrB,KAAKkrB,YAAYlrB,KAAKkrB,YAAY9qB,OAASqM,IAAM4e,SAAW,IAEvE,EAUI,SAAUC,GAAgBrX,EAAoCwE,GAClE,OAAO,IAAIkS,GAAU1W,EAAiBwE,EACxC,CC9IA,MAAM8S,GAAoB,IAAI9vB,QAExB,SAAU+vB,GAAqBC,GACnC,OAAOF,GAAkBrvB,IAAIuvB,IAAS,IACxC,CAEM,SAAUC,GAAqBD,EAA0BP,GACzC,OAAhBA,EAIJK,GAAkBjvB,IAAImvB,EAAMP,GAH1BK,GAAkB5c,OAAO8c,EAI7B,CCTA,MAAME,GAA6B,IAAIlwB,QAEjCmwB,GAAazuB,OAAOC,OAAO,IAC3ByuB,GAAY,IAAIvrB,aAgENwrB,GACd7X,EACA8X,EACAC,GAEA,MAAMC,EAKR,SACEhY,EACA8X,EACAC,GAGA,MAAME,EAA+BvoB,MAAMC,QAAQmoB,IAAeA,EAAW3rB,OAAS,EAAK2rB,EAAaH,GAClGO,EAA+BxoB,MAAMC,QAAQooB,IAAeA,EAAW5rB,OAAS,EAAK4rB,EAAaJ,GAClGQ,EAhFR,SAAqBL,EAAgCC,GACnD,MAAME,EAAWvoB,MAAMC,QAAQmoB,IAAeA,EAAW3rB,OAAS,EAAK2rB,EAAaH,GAC9EO,EAAWxoB,MAAMC,QAAQooB,IAAeA,EAAW5rB,OAAS,EAAK4rB,EAAaJ,GACpF,IAAIS,EAAgBV,GAA2BzvB,IAAIgwB,GACnD,OAAKG,GAGEA,EAAcnwB,IAAIiwB,IAFhB,IAGX,CAwEqBG,CAAYJ,EAASC,GACxC,GAAIC,EACF,OAAOA,EAET,MAAMG,EAAaf,GAAqBU,IAAY,GACpD,IAAIM,EACJ,IAEE,GAAuB,IAAnBL,EAAQ/rB,OACV,OAAOosB,EAAW,CAChBD,WAAYA,EACZE,WAAY,GACZC,eAAgBb,GAChBc,eAAgB,IAAIrsB,IAAgBisB,GACpCK,YAAaf,IAIjB,IAAIY,EAAkCjB,GAAqBW,GAC3D,GAAuB,IAAnBD,EAAQ9rB,OAAc,CACxB,GAAmB,OAAfqsB,EAAqB,CACvBA,EAAa,GACb,IAAI,IAAIxvB,EAAI,EAAGA,EAAIkvB,EAAQ/rB,OAAQnD,IAAK,CACtC,MAAM4vB,EAAevB,GAAgBrX,EAAiBhX,GACtDwvB,EAAWpsB,KAAKwsB,EAClB,CACF,CACA,OAAOL,EAAW,CAChBD,WAAYA,EACZE,WAAYA,EACZC,eAAgBb,GAChBc,eAAgBd,GAChBe,YAAa,IAAItsB,IAAgBmsB,GAErC,CAEA,GA5FJ,SAAoBP,EAA6BC,GAC/C,GAAID,EAAQ9rB,SAAW+rB,EAAQ/rB,OAC7B,OAAO,EAGT,IAAK,IAAInD,EAAI,EAAGA,EAAIivB,EAAQ9rB,OAAQnD,IAClC,GAAIivB,EAAQjvB,KAAOkvB,EAAQlvB,GACzB,OAAO,EAIX,OAAO,CACT,CAgFQ6vB,CAAWZ,EAASC,GACtB,OAAOK,EAAW,CAChBD,WAAYA,EACZE,WAAYF,EACZG,eAAgBb,GAChBc,eAAgBd,GAChBe,YAAaf,IAGjB,GAAmB,OAAfY,EACF,OAqEN,SACEF,EACAE,GAEA,MAAMM,EAA+B,IAAIzsB,IAAImsB,GACvCO,EAA+B,IAAI1sB,IAAIisB,GACvCG,EAAkC,IAAIpsB,IACtCssB,EAA+BG,EAAYzC,WAAW0C,GACtDL,EAAkCK,EAAY1C,WAAWyC,GAGzDE,EAAgB,IAAI9uB,IAC1B,IAAK,IAAIlB,EAAI,EAAGA,EAAIsvB,EAAWnsB,OAAQnD,IACrCgwB,EAAc3wB,IAAIiwB,EAAWtvB,GAAIA,GAEnC,IAAK,IAAIA,EAAI,EAAGA,EAAIwvB,EAAWrsB,OAAQnD,IAAK,CAC1C,MAAMwb,EAAQgU,EAAWxvB,GACrB2vB,EAAYrwB,IAAIkc,IAGhBwU,EAAc/wB,IAAIuc,KAAWxb,GAE/ByvB,EAAe/vB,IAAI8b,EAEvB,CACA,MAAO,CACL8T,WAAYA,EACZE,WAAYA,EACZC,eAAgBA,EAChBC,eAAgBA,EAChBC,YAAaA,EAEjB,CArGaM,CAAgBX,EAAYE,GAErCA,EAAa,GAIb,MAAMU,EAAe,IAAIhvB,IACzB,IAAI,IAAIlB,EAAI,EAAGA,EAAIivB,EAAQ9rB,OAAQnD,IAAK,CACtC,MAAMmwB,EAAMlB,EAAQjvB,GACpB,IAAIwd,EAAU0S,EAAajxB,IAAIkxB,GAC1B3S,IACHA,EAAU,GACV0S,EAAa7wB,IAAI8wB,EAAK3S,IAExBA,EAAQpa,KAAKpD,EACf,CAGA,MAAMyvB,EAAkC,IAAIpsB,IACtCssB,EAA+B,IAAItsB,IACzC,IAAI,IAAIrD,EAAI,EAAGA,EAAIkvB,EAAQ/rB,OAAQnD,IAAK,CACtC,MAAM8gB,EAAWoO,EAAQlvB,GACnBowB,EAAkBF,EAAajxB,IAAI6hB,GACnCuP,EAAWD,GAAmBA,EAAgBjtB,OAAS,EAAIitB,EAAgBE,aAAU7sB,EAE3F,QAAwB,IAAb4sB,EAA0B,CAEnC,MAAMT,EAAevB,GAAgBrX,EAAiBhX,GACtDwvB,EAAWpsB,KAAKwsB,GAChBD,EAAYjwB,IAAIkwB,EAClB,KAAO,CAEL,MAAMW,EAAoBjB,EAAWe,GAKjCA,IAAarwB,GACfyvB,EAAe/vB,IAAI6wB,GAErBf,EAAWpsB,KAAKmtB,EAClB,CACF,CAGA,OAAOhB,EAAW,CAChBD,WAAYA,EACZE,WAAYA,EACZC,eAAgBA,EAChBC,eALsC,IAAKrsB,IAAIisB,GAAajC,WAAW,IAAIhqB,IAAImsB,IAM/EG,YAAaA,EAEjB,cAC0B,IAAbJ,KAzKf,SAAqBN,EAA6BC,EAA6BF,GAC7E,IAAII,EAAgBV,GAA2BzvB,IAAIgwB,GAC9CG,IACHA,EAAgB,IAAI5wB,QACpBkwB,GAA2BrvB,IAAI4vB,EAASG,IAE1CA,EAAc/vB,IAAI6vB,EAASF,EAC7B,CAmKMwB,CAAYvB,EAASC,EAASK,GAC9Bd,GAAqBS,EAASK,EAASC,YAE3C,CACF,CArHeiB,CAAgBzZ,EAAiB8X,EAAYC,GAE1D,OAxBF,SAAyBS,GACvB,IAAK,IAAIxvB,EAAI,EAAGA,EAAIwvB,EAAWrsB,OAAQnD,IACjCwvB,EAAWxvB,GAAGwb,QAAUxb,IAC1BwvB,EAAWxvB,GAAGwb,MAAQxb,EAG5B,CAiBE0wB,CAAgB1B,EAAKQ,YACdR,CACT,CCvBM,SAAU2B,GAAsB3B,GAGpC,GAAiC,IAA7BA,EAAKS,eAAe3X,MAAckX,EAAKW,YAAY7X,OAASkX,EAAKQ,WAAWrsB,OAC9E,OAAO,KAET,MAAM6sB,EAAgB,IAAI9uB,IAC1B,IAAK,IAAIlB,EAAI,EAAGA,EAAIgvB,EAAKM,WAAWnsB,OAAQnD,IAC1CgwB,EAAc3wB,IAAI2vB,EAAKM,WAAWtvB,GAAIA,GAExC,MAAM4wB,EAAuB,GACvBC,EAAgB,GACtB,IAAIC,GAAU,EACVC,GAAS,EACb,IAAK,MAAMvV,KAASwT,EAAKQ,WAAY,CACnC,GAAIR,EAAKW,YAAYrwB,IAAIkc,GACvB,SAEF,MAAMhM,EAAMwgB,EAAc/wB,IAAIuc,GAC9B,QAAY/X,IAAR+L,EAGF,OAAO,KAELA,EAAMshB,IACRC,GAAS,GAEXD,EAAUthB,EACVohB,EAAOxtB,KAAKoY,GACZqV,EAAIztB,KAAKoM,EACX,CACA,GAAIuhB,EACF,OAAO,KAET,MAAMC,EAnFF,SAAuCH,GAC3C,MAAMI,EAAIJ,EAAI1tB,OAGR+tB,EAAkB,GAClBC,EAAiB,IAAIzqB,MAAMuqB,GAAGG,MAAK,GACzC,IAAK,IAAIpxB,EAAI,EAAGA,EAAIixB,EAAGjxB,IAAK,CAC1B,MAAM0D,EAAQmtB,EAAI7wB,GAClB,IAAIqxB,EAAK,EACLC,EAAKJ,EAAM/tB,OACf,KAAOkuB,EAAKC,GAAI,CACd,MAAMC,EAAOF,EAAKC,GAAO,EACrBT,EAAIK,EAAMK,IAAQ7tB,EACpB2tB,EAAKE,EAAM,EAEXD,EAAKC,CAET,CACIF,EAAK,IACPF,EAAKnxB,GAAKkxB,EAAMG,EAAK,IAEvBH,EAAMG,GAAMrxB,CACd,CACA,MAAM0T,EAAmB,GACzB,IAAI8d,EAAIN,EAAM/tB,OAAS,EAAI+tB,EAAMA,EAAM/tB,OAAS,IAAK,EACrD,KAAOquB,GAAK,GACV9d,EAAOtQ,KAAKouB,GACZA,EAAIL,EAAKK,GAGX,OADA9d,EAAOvI,UACAuI,CACT,CAoDc+d,CAA6BZ,GACnCa,EAAS,IAAIruB,IACnB,IAAK,MAAMsuB,KAAYX,EACrBU,EAAOhyB,IAAIkxB,EAAOe,IAEpB,OAAOD,CACT,CC9FA,MAAME,GAAuD,IAAIpzB,QAE3D,SAAUqzB,GAAqB3E,GACnC,OAAO0E,GAAkB3yB,IAAIiuB,IAAY,EAC3C,CAEM,SAAU4E,GAAqB5E,EAAmB7kB,GACtDupB,GAAkBvyB,IAAI6tB,EAAS7kB,EACjC,CCRA,MAAM0pB,GAA0B,IAAIvzB,QAE9B,SAAUwzB,GAA2B9E,GACzC,OAAO6E,GAAwB9yB,IAAIiuB,IAAY,IACjD,CAEM,SAAU+E,GAA2B/E,EAAmBvI,GAC5DoN,GAAwB1yB,IAAI6tB,EAASvI,EACvC,CCTA,MAAMuN,GAA4C,IAAI1zB,QAEhD,SAAU2zB,GAAkBjF,GAChC,OAAOgF,GAAejzB,IAAIiuB,IAAY,EACxC,CAEM,SAAUkF,GAAkBlF,EAAmBmF,GACnDH,GAAe7yB,IAAI6tB,EAASmF,EAC9B,CCLM,SAAUC,GAAyBpF,EAAmB5X,GAC1D,MAAM+c,EAAQF,GAAkBjF,GAChC,IAAI,MAAMpuB,KAAQuzB,EAChB7c,GAAqB1W,EAAMwW,EAE/B,UCAgBid,GACdrF,EACA5X,EACAwK,GAEAwS,GAAyBpF,EAAS5X,GAClC,MAAMjN,EAAWwpB,GAAqB3E,GAChCvI,EAAUqN,GAA2B9E,GAC3B,OAAZvI,GAMFA,EAAQmD,SAASzf,EAAUyX,EAAQtO,UAErC,IAAK,MAAM+G,KAAWlQ,EAAU,CAC9B,GAAgB,OAAZsc,EAAkB,CAEpB1L,GAD6BL,GAAiCL,GACPA,EACzD,EACgB,OAAZoM,GAAqBA,EAAQkD,iBAAiBtP,KAGlDia,GAAYja,EAASuH,EACvB,CACF,CAEM,SAAU2S,GACdvF,GAEA,IAAKA,EAAQwF,QACX,OAEF,MAAMrqB,EAAWwpB,GAAqB3E,GAChCvI,EAAUqN,GAA2B9E,GAC3C,IAAK,MAAM3U,KAAWlQ,EACpB,GAAgB,OAAZsc,EACFA,EAAQkE,eAAetQ,OAClB,CAELa,GAD6BR,GAAiCL,GACJA,EAC5D,EDxCE,SAAqC2U,GACzC,MAAMmF,EAAQF,GAAkBjF,GAChC,IAAI,MAAMpuB,KAAQuzB,EAChB7c,GAAqB1W,EAAM,KAE/B,CCqCE6zB,CAA2BzF,EAC7B,CCpDA,MAAM0F,GAAmB,IAAIp0B,QAEvBowB,GCHG1uB,OAAOC,OAAO,IAAIkD,KDKrB,SAAUwvB,GAAiB/zB,EAAYouB,GAC3C,MAAM4F,EAAWF,GAAiB3zB,IAAIH,GAClCg0B,EACFA,EAASpzB,IAAIwtB,GAEb0F,GAAiBvzB,IAAIP,EAAM,IAAIuE,IAAI,CAAC6pB,IAExC,CAEM,SAAU6F,GAAoBj0B,GAClC,MAAMg0B,EAAWF,GAAiB3zB,IAAIH,GACtC,YAAwB,IAAbg0B,EACFA,EAEFlE,EACT,CAEM,SAAUoE,GAAoBl0B,EAAYouB,GAC9C,MAAM4F,EAAWF,GAAiB3zB,IAAIH,GAClCg0B,IACFA,EAASphB,OAAOwb,GACM,IAAlB4F,EAAShb,MACX8a,GAAiBlhB,OAAO5S,GAG9B,CEZA,MAAMm0B,GAAwB,IAAI5vB,IAAI,CAAC,KAAM,SAAU,OAAQ,QAE/D,MAAM6vB,GACIC,SACAC,gBAA0B,GAC1BC,WAA0B,KAC1BC,UAAyB,KACzBC,UAAoB,EAC5B,WAAA3wB,CAAYsqB,GACVnqB,KAAKowB,SAAWjG,EAChBnqB,KAAKqwB,gBAAkB1sB,MAAMoc,KAAK/f,KAAKowB,SAASlrB,YAChDlF,KAAKswB,WAAatwB,KAAKqwB,gBAAgBjwB,OAAS,EAAIJ,KAAKqwB,gBAAgB,GAAK,KAC9ErwB,KAAKuwB,UAAYvwB,KAAKqwB,gBAAgBjwB,OAAS,EAAIJ,KAAKqwB,gBAAgBrwB,KAAKqwB,gBAAgBjwB,OAAS,GAAK,IAC7G,CAEA,aAAIqwB,GACF,OAAOzwB,KAAKswB,UACd,CAEA,YAAII,GACF,OAAO1wB,KAAKuwB,SACd,CAEA,WAAIZ,GACF,OAAO3vB,KAAKwwB,QACd,CAEA,QAAAG,CAASC,GACP,IAAI,MAAM70B,KAAQiE,KAAKqwB,gBAIrBrR,GAAsBjjB,GACtB60B,EAAWC,YAAY90B,GAEzBiE,KAAKwwB,UAAW,CAClB,CAEA,UAAAM,CAAWF,GACT,MAAMpe,EAAaoe,EAAWpe,WAC9B,GAAIA,EAAY,CAMd,IAAIkS,EAAekM,EACnB,IAAI,MAAM70B,KAAQiE,KAAKqwB,gBACjB3L,EAAOqM,cAAgBh1B,IACzBijB,GAAsBjjB,GACtByW,EAAWwe,aAAaj1B,EAAM2oB,EAAOqM,cAEvCrM,EAAS3oB,CAEb,CACAiE,KAAKwwB,UAAW,CAClB,CAEA,UAAAS,GACE,MAAMrP,EAAUqN,GAA2BjvB,MAG3C,GAAgB,OAAZ4hB,IAAqBA,EAAQqE,sBAC/B,OAAO,EAETrE,EAAQuE,iBACR,IAAK,MAAMpqB,KAAQiE,KAAKqwB,gBAGtBxR,GAAyB9iB,GACD,OAApBA,EAAKyW,YACPzW,EAAKyW,WAAW0e,YAAYn1B,GAGhC,MAAMuJ,EAAWwpB,GAAqB9uB,MACtC,IAAK,MAAMwV,KAAWlQ,EACpB,GAAI4qB,GAAsB3zB,IAAIiZ,EAAQ3Q,aAAc,CAClD,MAAMkrB,EAAWC,GAAoBxa,EAAQzZ,MAC7C,IAAK,MAAMouB,KAAW4F,EACf5F,EAAQ8G,cACX9G,EAAQgH,SAGd,CAGF,OADAnxB,KAAKwwB,UAAW,GACT,CACT,CAEA,OAAAW,GACElC,GAA2BjvB,OAAOgmB,UAClC,IAAI,MAAMjqB,KAAQiE,KAAKqwB,gBAMrBxR,GAAyB9iB,GACD,OAApBA,EAAKyW,YACPzW,EAAKyW,WAAW0e,YAAYn1B,GAGhC,MAAMuJ,EAAWwpB,GAAqB9uB,MACtC,IAAI,MAAMwV,KAAWlQ,EAAU,CAC7B,GAAI4qB,GAAsB3zB,IAAIiZ,EAAQ3Q,aAAc,CAClD,MAAMkrB,EAAWC,GAAoBxa,EAAQzZ,MAC7C,IAAK,MAAMouB,KAAW4F,EACpB5F,EAAQgH,SAEZ,CACAna,GAA+BxB,GAC/BO,GAAmCP,EACrC,CACAxV,KAAKwwB,UAAW,CAClB,EAOI,SAAUY,GACd9B,GAEA,MAAMhb,EAAWpa,SAASm3B,yBAEpBlH,EAAU,IAAIgG,GAAQ7b,GAM5B,OAJC6V,EAAgBkG,gBAAkBf,EAClCnF,EAAgBmG,WAAahB,EAAMlvB,OAAS,EAAIkvB,EAAM,GAAK,KAC3DnF,EAAgBoG,UAAYjB,EAAMlvB,OAAS,EAAIkvB,EAAMA,EAAMlvB,OAAS,GAAK,KACzE+pB,EAAgBqG,UAAW,EACrBrG,CACT,CAQA,SAASmH,GACPpc,EACAxG,EACAkY,GAEA,MAAM2K,EAAgBr3B,SAASs3B,WAAW9iB,EAAa4F,UAAU,GAC3DpF,EAAYR,EAAaQ,UACzBogB,EAAgB,IAAI3rB,MAAMuL,EAAU9O,QAC1C,IAAK,IAAInD,EAAI,EAAGA,EAAIiS,EAAU9O,OAAQnD,IAAK,CACzC,MAAMlB,EAAOiJ,EAAgBusB,EAAeriB,EAAUjS,GAAGw0B,UAC5C,OAAT11B,GACFgI,EAAW,2BAA2BmL,EAAUjS,GAAGw0B,SAASppB,KAAK,uBAGnE4J,GAAmBlW,GACnBU,EAA0BV,GAC1BuzB,EAAMryB,GAAKlB,CACb,CACA,MAAM+qB,EAAQF,EAAKE,MACbxhB,EAA2B,IAAI3B,MAAMmjB,EAAM1mB,QAC3CsxB,EAAgC,GACtC,IAAK,IAAIjD,EAAI,EAAGA,EAAI3H,EAAM1mB,OAAQquB,IAAK,CACrC,MAAM1H,EAAOD,EAAM2H,GACb1yB,EAAOuzB,EAAMvI,EAAK4K,WAGlBnc,EAAwB,IAAKuR,EAAK6K,SAAU71B,OAAM2V,YAAa3V,GACrEuJ,EAASmpB,GAAKjZ,EACVuR,EAAK8K,gBACPH,EAAcrxB,KAAKmV,EAEvB,CACA,MAAMoM,EC1HF,SAAgCgF,EAAgBthB,GACpD,MAAMsc,EAAU,IAAI+B,GAEpB,OADA/B,EAAQ+E,cAAcC,EAAMthB,GACrBsc,CACT,CDsHkBkQ,CAAsBlL,EAAMthB,GACtC6kB,EAAU,IAAIgG,GAAQoB,GAM5B,OALArC,GAA2B/E,EAASvI,GACpCmN,GAAqB5E,EAAS7kB,GAC9B8kB,GAA0BD,EAASuH,GACnCrC,GAAkBlF,EAASmF,GAC3BQ,GAAiB5a,EAAYnZ,KAAMouB,GAC5BA,CACT,CAEM,SAAU4H,GACd7c,QAEgC,IAArBA,EAAY1G,MAA6C,OAArB0G,EAAY1G,MACzDzK,EAAW,6BAEb,MAAM2K,EAAeY,GAAsB4F,EAAY1G,MAClDE,GACH3K,EAAW,uBAAuBmR,EAAY1G,oBAEhD,IAAIoY,EAAOlY,EAAamV,QAMxB,SALoB,IAAT+C,GAAkC,OAATA,GAAiBA,EAAKoL,cAAgB12B,EAAOJ,gCAG/E0rB,EAAOlY,EAAamV,QEhMlB,SAAyBnV,GAC7B,MAAMsjB,EAAc12B,EAAOJ,6BACrB4rB,EAAwB,GACxB5X,EAAYR,EAAaQ,UAC/B,IAAK,IAAIyiB,EAAY,EAAGA,EAAYziB,EAAU9O,OAAQuxB,IAAa,CACjE,MAAM1iB,EAAWC,EAAUyiB,GACrB51B,EAAOiJ,EAAgB0J,EAAa4F,SAAUrF,EAASwiB,UAC7D,GAAa,OAAT11B,EACF,OAAO,KAET,IAAK,MAAM61B,KAAY3iB,EAASG,qBAAsB,CACpD,MAAMvK,EAAc+sB,EAAS/sB,YAC7B,GAAoB,SAAhBA,GAA0C,SAAhBA,GAA0C,UAAhBA,EACtD,OAAO,KAIT,MAAMotB,EAAYL,EAASrtB,aAAa,GACxC,GAAkB,YAAd0tB,GAAyC,eAAdA,EAC7B,OAAO,KAET,GAAoB,SAAhBptB,GACF,GAAI9I,EAAK6E,WAAaC,KAAK8Q,UACzB,OAAO,UAEJ,GAA+B,OAA3BnR,EAAiBzE,GAC1B,OAAO,KAET,GAAoB,SAAhB8I,GAA0B6W,GAAiB3f,EAAM61B,EAASttB,UAC5D,OAAO,KAET,IAAI6iB,EACJ,IAKEA,EAAStG,GADmB,IAAK+Q,EAAU71B,OAAM2V,YAAa3V,GAEhE,CAAE,MACA,OAAO,IACT,CACA,GAAIorB,EAAO1G,YAAmC,SAArB0G,EAAO5G,UAC9B,OAAO,KAETuG,EAAMzmB,KAAK,CACTsxB,YACAC,WACAlK,QAAyB,UAAhB7iB,EACTgtB,eAAgBD,EAASntB,iBAAiBvH,EAC1CiqB,SACA5G,UAAW4G,EAAO5G,WAEtB,CACF,CACA,MAAO,CAAEyR,cAAalL,QACxB,CFyIkCoL,CAAexjB,IAElC,OAATkY,EACF,OAAO0K,GAAkBpc,EAAaxG,EAAckY,GAEtD,MAAM2K,EAAgBr3B,SAASs3B,WAAW9iB,EAAa4F,UAAU,GAC3D6d,ECjLF,SACJrwB,EACAoN,GAEA,MAAOS,EAAiBoC,GpDYpB,SACJjQ,EACAoN,GAEA,MAAMogB,EAAgB,GAChBvd,EAA8B,GACpC,IAAI,MAAM9C,KAAYC,EAAW,CAC/B,MAAMnT,EAAOiJ,EAAgBlD,EAAMmN,EAASwiB,UAI5C,GAHa,OAAT11B,GACFgI,EAAW,2BAA2BkL,EAASwiB,SAASppB,KAAK,uBAE3DgI,GAAkB9T,IAAIR,GAAO,SACjC,MAAM4U,EAASL,GAA2BvU,EAAMkT,EAASG,qBAAsB,CAAEqB,eAAe,IAEhGsB,EAAY1R,QAAQsQ,EAAOrL,UAC3BgqB,EAAMjvB,KAAKtE,EACb,CACA,MAAO,CAACuzB,EAAOvd,EACjB,CoD9ByCqgB,CAAsCtwB,EAAMoN,GAC7E0S,EAAU,IAAI+B,GAGdxC,EAAcS,EAAQqC,WAAWlS,EAAa,CAClDoS,iBAAiB,EACjBG,kBAAkB,GACjB,MACH,MAAO,CACLgL,MAAO3f,EACP8B,aAAc0P,EACdkR,eAAgBzQ,EAEpB,CDgKsB0Q,CAA6Bf,EAAe7iB,EAAaQ,WACvEib,EAAU,IAAIgG,GAAQoB,GAC5BrC,GAA2B/E,EAASgI,EAAYE,gBAChDtD,GAAqB5E,EAASgI,EAAY1gB,cAC1C,MAAMigB,EAAgC,GACtC,IAAI,MAAMlc,KAAW2c,EAAY1gB,aAC3B+D,EAAQ/Q,iBAAiBvH,GAC3Bw0B,EAAcrxB,KAAKmV,GAMvB,OAHA4U,GAA0BD,EAASuH,GACnCrC,GAAkBlF,EAASgI,EAAY7C,OACvCQ,GAAiB5a,EAAYnZ,KAAMouB,GAC5BA,CACT,CGxNA,MAAMoI,GAAsC,IAAI92B,QAC1C+2B,GAAyE,IAAI/2B,QAC7Eg3B,GAAkD,IAAIh3B,QACtDi3B,GAA0D,IAAIj3B,iBAYpDk3B,GAAkB52B,EAAY0c,EAAmB0R,IA2FjE,SAAoBpuB,EAAY+X,EAAuBqW,GACrD,IAAIyI,EAAqBJ,GAAyBt2B,IAAIH,GACtD,QAAkC,IAAvB62B,EAAoC,CAC7C,GAAgB,OAAZzI,EACF,OAEFyI,EAAqB,IAAIn3B,QACzB+2B,GAAyBl2B,IAAIP,EAAM62B,EACrC,CACgB,OAAZzI,EACFyI,EAAmBjkB,OAAOmF,GAE1B8e,EAAmBt2B,IAAIwX,EAAWqW,EAEtC,CAxGE0I,CAAW92B,EAAM0c,EAAO0R,EAC1B,CAEM,SAAU2I,GAAmB/2B,EAAY20B,GAC7C6B,GAAej2B,IAAIP,EAAM20B,EAC3B,CA6BA,SAASqC,GAAiB7d,EAA2BiV,GACnD,IAAI4F,EAAW0C,GAAqBv2B,IAAIgZ,EAAYnZ,WAC5B,IAAbg0B,IACTA,EAAW,GACX0C,GAAqBn2B,IAAI4Y,EAAYnZ,KAAMg0B,IAEzCA,EAAS3vB,OApBa,IAqBxB2vB,EAAS1vB,KAAK8pB,GAId8F,GAAoB/a,EAAYnZ,KAAMouB,EAE1C,CA+BA,SAAS6I,GAAkBtC,EAAgBD,GACzC,GAAkB,OAAdA,EACF,OAAO,EAET,GAAIC,EAASK,cAAgBN,EAC3B,OAAO,EAET,MAAM7F,EAAW8F,EAASuC,wBAAwBxC,GAClD,OAAyD,KAAjD7F,EAAW/pB,KAAKqyB,8BACkC,KAApDtI,EAAW/pB,KAAKsyB,+BACxB,CCpHA,SAASC,GAAgBle,GACvB,MAAO,GAAGA,EAAYrQ,eAAeqQ,EAAYzQ,iBAAiByQ,EAAYtQ,WAAWsG,IAAI4M,GAAKA,EAAEtM,YAAYnD,KAAK,QAAQ6M,EAAYnZ,KAAK4Z,YAAc,cAAgB,kBAC9K,UAEgB0d,GACdne,EACA6H,EACAuW,GAEA,MAAMvV,EAAW5T,QAAQmpB,GACzB,IAAInJ,EACJ,MAAM4F,EAAWC,GAAoB9a,EAAYnZ,MAE/CouB,EADoB,IAAlB4F,EAAShb,KACDgd,GAAc7c,GAEd6a,EAASxJ,SAASjP,OAAO3W,MAErC,MAAM4yB,EAAUv5B,IACVwU,EAAO0G,EAAY1G,MAAQ,GAC3BH,EAAU6G,EAAYrQ,YAQ5B,GAPKkZ,IACCziB,EAAON,OACTqW,QAAQmiB,IAAI,wBAAwBJ,GAAgBle,MAEtDwa,GAAkBvF,GAClBA,EAAQgH,WAENpT,EAAU,CAIZ,GAHIziB,EAAON,OACTqW,QAAQmiB,IAAI,sBAAsBJ,GAAgBle,MAEhDqe,EAAS,CACX,MAAME,EAAev5B,SAASw5B,cAAc,SAASrlB,WAAiBG,KAAQ0G,EAAYzQ,iBAC1FyQ,EAAYnZ,KAAKyW,WAAYwe,aAAayC,EAAcve,EAAYnZ,KAAKg1B,aACzE5G,EAAQ2G,WAAW2C,GACnB,MAAME,EAAaz5B,SAASw5B,cAAc,SAASrlB,SAAeG,KAAQ0G,EAAYzQ,iBAChFmvB,EAAYzJ,EAAQuG,UAAY+C,EACtCG,EAAUphB,WAAYwe,aAAa2C,EAAYC,EAAU7C,YAC3D,MACE5G,EAAQ2G,WAAW5b,EAAYnZ,MAGjCyzB,GAAgBrF,EADI9X,GAAqB6C,EAAYnZ,MACfghB,EACxC,CACF,CC1CA,MAAM8W,GAA4C,IAAIp4B,QAiBhD,SAAUq4B,GAAiB/3B,GAC/B,OAAO83B,GAAM33B,IAAIH,IAAS,EAC5B,CAOA,MAAMg4B,GAA0B,IAAIzzB,IC1BpC,MAAM0zB,GAA6E,CACjF,KAAArzB,CAAMI,EAASJ,GACW,aAApBI,EAAQC,QACVD,EAAQkzB,YAAc9sB,OAAOxG,GAAS,IAEtCI,EAAQmzB,aAAa,QAAS/sB,OAAOxG,GAAS,IAElD,EACA,OAAAyX,CAAQrX,EAASJ,GACXA,EAAOI,EAAQmzB,aAAa,UAAW,IACtCnzB,EAAQozB,gBAAgB,UAC/B,EACA,QAAAC,CAASrzB,EAASJ,GACZA,EAAOI,EAAQmzB,aAAa,WAAY,IACvCnzB,EAAQozB,gBAAgB,WAC/B,EACA,QAAAE,CAAStzB,EAASJ,GACZA,EAAOI,EAAQmzB,aAAa,WAAY,IACvCnzB,EAAQozB,gBAAgB,WAC/B,EACA,aAAAG,CAAcvzB,EAASJ,GACrB,MAAMsF,EAAUlF,EAAQwzB,iBAAiB,UACnCC,EAAMjyB,OAAO5B,GACnB,IAAK,IAAI1D,EAAI,EAAGA,EAAIgJ,EAAQ7F,OAAQnD,IAC9BA,IAAMu3B,EAAKvuB,EAAQhJ,GAAGi3B,aAAa,WAAY,IAC9CjuB,EAAQhJ,GAAGk3B,gBAAgB,WAEpC,YAGcM,GAAsBjf,EAAuBkf,EAAyB3W,GAMpF,QAAwB,IAAbA,EAQT,YAPIziB,EAAON,OACTqW,QAAQrW,MAAM,oDAAqD,CACjE+F,QAASyU,EAAQzZ,KACjBwI,aAAciR,EAAQjR,aACtBE,cAAe+Q,EAAQ/Q,iBAK7B,MAAM1D,EAAUyU,EAAQzZ,KAClBwI,EAAeiR,EAAQjR,aAC7B,GAA4B,IAAxBA,EAAanE,OAAc,CAC7B,MAAMu0B,EAAepwB,EAAa,GAClC,GAAKxD,EAAgB4zB,KAAkB5W,EAAU,CAC/C,MAAM6W,EAAe,KACnB,IAAIC,GAAyB,EAC7B,IACG9zB,EAAgB4zB,GAAgB5W,EACjC8W,GAAyB,CAC3B,CAAE,MAAOjV,GACHtkB,EAAON,OACTqW,QAAQ8G,KAAK,2BAA2Bwc,iBAA6B,CACnE5zB,UACAgd,WACA6B,SAGN,CAKA,GAAIiV,EAAwB,CAC1B,MAAMC,ECpEV,SAAkC/zB,EAAkBuD,GACxD,MAAMyV,EAAgBvZ,EAAiBO,GACvC,GAAsB,OAAlBgZ,EACF,OAAO,KAET,MAAM6B,EAAcva,KAA4BnF,IAAI6d,GACpD,QAA2B,IAAhB6B,EACT,OAAO,KAET,MAAMnR,EAAQzI,EAAwBjB,IAAU+B,eAAe5G,IAAIoI,GACnE,MAAgC,iBAArBmG,GAAOhH,WAA0BgH,EAAMhH,UAAUrD,OAAS,EAC5DqK,EAAMhH,UAER,IACT,CDsD6BsxB,CAAwBh0B,EAAS4zB,GACpD,GAAmB,OAAfG,EACF,cChDyB/zB,EAAkBi0B,EAAuBr0B,GAC5E,GAAIA,QAEF,YADAI,EAAQozB,gBAAgBa,GAG1B,IAAIC,EACJ,GAAqB,iBAAVt0B,EACT,IACEs0B,EAAYC,KAAKC,UAAUx0B,EAC7B,CAAE,MACAs0B,EAAY9tB,OAAOxG,EACrB,MAEAs0B,EAAY9tB,OAAOxG,GAErBI,EAAQmzB,aAAac,EAAeC,EACtC,CDiCcG,CAAqBr0B,EAAS+zB,EAAY/W,EAC5C,CAAE,MAAO6B,GACHtkB,EAAON,OACTqW,QAAQ8G,KAAK,+BAA+B2c,iBAA2B,CACrE/zB,UACAgd,WACA6B,SAGN,CAEJ,GAYF,GAAItkB,EAAOH,0BAA4BugB,GAAiB3a,EAAS4zB,GAAe,CAK9E,MAAMtY,EAASJ,GAAUlb,EAAS4zB,EAAcnf,EAAQpR,UAAWoR,EAAQ/Q,eACrEuY,EAASV,GAAUD,EAAQ,cAC3BqC,EAAcgW,GAAUW,6BAA6Bn5B,IAAIsZ,IAC1D0H,MACAT,GAA4BJ,GACjC,GAAIqC,EAAY9B,aAAargB,IAAIygB,GACV,OAAjBhH,IACFA,GAAa,CACXG,KAAM,yBACNqI,OAAQ,eACR7B,cAAe+B,EAAY/B,cAC3BK,SACAjhB,KAAMgF,EACNmb,OAAQyY,QAGP,CACL,MAAMW,EAAkBxY,GAAyB4B,EAAa1B,GAC9DG,GAA0BmY,EAAiB,IhCb/C,SACJv5B,EACAmgB,EACAoC,EACAiX,EACA5Y,EACAS,GAEA,MAAMe,EAAyB,CAC7BoX,YACAC,kBAAmB,EACnBtZ,SACAS,gBACA8Y,mBAAoB1Z,KACpBuC,gBAEFhB,GAAajd,KAAK,CAAE8d,UAASpiB,SAC7B,IACE,OAAOqhB,GACT,SACEE,GAAaoY,KACf,CACF,CgCRYC,CAAoB50B,EAAS4zB,EAAc5W,EAAU1B,EAAQiZ,EAAgB3Y,cAAeiY,GAChG,CACF,MACEA,GAEJ,CACA,GAAI56B,IAAS,CACX,MAAM47B,EAAc5B,GAAeW,GAC/BiB,EAEFA,EAAY70B,EAASgd,cDhIEhiB,EAAYuI,EAAkB3D,GAC3D,IAAIkD,EAAUgwB,GAAM33B,IAAIH,GACnB8H,IACHA,EAAU,GACVgwB,GAAMv3B,IAAIP,EAAM8H,IAGlB,MAAMnH,EAAWmH,EAAQgyB,KAAKpY,GAAKA,EAAEnZ,WAAaA,GAC9C5H,EACFA,EAASiE,MAAQA,EAEjBkD,EAAQxD,KAAK,CAAEiE,WAAU3D,SAE7B,CCsHQm1B,CAAe/0B,EAAS4zB,EAAc5W,GDzGThiB,EC0GRgF,EDzG3BgzB,GAAap3B,IAAIZ,GC2Gf,CACA,MACF,CD9GI,IAA+BA,EC+GnC,MAAM44B,EAAepwB,EAAa,GAClC,IAAIwxB,EAAah1B,EAAgB4zB,GACjC,IAAK,IAAI13B,EAAI,EAAGA,EAAIsH,EAAanE,OAAS,EAAGnD,IAAK,CAChD,MAAM+4B,EAAUzxB,EAAatH,GAC7B,GAAiB,MAAb84B,EACF,OAEFA,EAAYA,EAAUC,EACxB,CACA,MAAMC,EAAWF,EAAUxxB,EAAaA,EAAanE,OAAS,IAC9D,GAAI61B,IAAalY,EAAU,CACzB,GAAI5gB,OAAO+4B,SAASH,GASlB,YARIz6B,EAAON,OACTqW,QAAQ8G,KAAK,+CAAgD,CAC3DpX,UACAwD,eACA0xB,WACAlY,cAKN,IACEgY,EAAUxxB,EAAaA,EAAanE,OAAS,IAAM2d,CACrD,CAAE,MAAO6B,GACHtkB,EAAON,OACTqW,QAAQ8G,KAAK,wCAAyC,CACpDpX,UACAwD,eACA0xB,WACAlY,WACA6B,SAGN,CACF,CAEF,CEvLA,MAAMuW,GAAiC,IAAIx6B,iBCA3By6B,GAA0B5gB,EAAuBkf,EAAyB3W,GACxF,MAAMhd,EAAUyU,EAAQzZ,KAClBwI,EAAeiR,EAAQjR,aACzBA,EAAanE,QAAU,GACzB2D,EAAW,mDAAmDQ,EAAa8D,KAAK,QAElF,MAAQssB,KAAiB0B,GAAiB9xB,EACpCwxB,EAAah1B,EAAgB4zB,QACV,IAAdoB,GACThyB,EAAW,aAAa4wB,kCAE1BoB,EAAUM,EAAahuB,KAAK,MAAQ0V,CACtC,CCPM,SAAUuY,GAASz7B,EAAoB2a,GAC3C,MAAMuB,EAAeD,GAA6BtB,GAClD,GAAIuB,EAAazY,SAASD,QAAQnB,EAAqB,CACrD,MAAMqV,EAAcF,GAAqBmD,EAAQzZ,MAIjD,OAHoB,OAAhBwW,GACFxO,EAAW,oCAAoCyR,EAAQ/Q,iBCTvD,SAAqC8N,EAA2BgkB,GACtC,OAA1BhkB,EAAYuB,WACd/P,EAAW,wCAEb,MAAMyyB,EAAWt5B,EAAoBq5B,QACb,IAAbC,GACTzyB,EAAW,uBAAuBwyB,KAEpC,MAAMziB,EAAYvB,EAAYuB,UAAUuB,GAAGmhB,GAI3C,OAHkB,OAAd1iB,GACF/P,EAAW,+BAA+ByyB,sBAErC1iB,EAAU2E,KACnB,CDFWge,CAA2BlkB,EAAawE,EAAazY,SAASD,KACvE,CACE,OAAOxD,EAAMoY,IAAoB8D,EAErC,CEdA,MAAM2f,GAAoB,IAAI/6B,QAE9B,SAASg7B,GAAc31B,EAAiB4e,GACtCvO,QAAQuO,MAAM,+CAA+C5e,MAAa4e,EAC5E,CCeA,MAAMgX,GAA8D,CAClEC,eCtBiCrhB,EAAuBkf,EAAyB3W,GACjF,MAAMhd,EAAUyU,EAAQzZ,KAClB+6B,EAAYthB,EAAQjR,aAAa,GACf,kBAAbwZ,GACTha,EAAW,qEAAqEga,GAElFhd,EAAQg2B,UAAUC,OAAOF,EAAW/Y,EACtC,EDgBEkZ,cExBqCzhB,EAAuBkf,EAAyB3W,GACrF,MAAMhd,EAAUyU,EAAQzZ,KAClBm7B,EAAW1hB,EAAQjR,aAAa,GAClCxD,EAAQK,aAAa81B,KAAcnZ,GACrChd,EAAQmzB,aAAagD,EAAUnZ,EAEnC,EFmBEoZ,eGzBiC3hB,EAAuBkf,EAAyB3W,GACjF,MAAMqZ,EAAY5hB,EAAQjR,aAAa,GACjC4yB,EAAS3hB,EAAQzZ,KAAqBo7B,MACtBA,EAAcC,KACfrZ,IAClBoZ,EAAcC,GAAarZ,EAEhC,EHmBEsZ,iB5BqBmC7hB,EAAuBkf,EAAyB3W,GAC9EpD,GAAeoD,IAClBha,EAAW,oHAEb,MAAM4V,EAAQoE,EAERrhB,EAAWstB,GAAmB9tB,IAAIsZ,GACxC,GAAI9Y,GAAYA,EAASid,QAAUA,EACjC,OAIF,MAAM5Y,EAAUyU,EAAQzZ,KAClBu7B,EAAa9hB,EAAQjR,aAAa,GACd,iBAAf+yB,GAAiD,IAAtBA,EAAWl3B,QAC/C2D,EAAW,mEAGb,MAAM6M,EA9BR,SAAuB7P,GACrB,MAAMgZ,EAAgBvZ,EAAiBO,GACvC,GAAsB,OAAlBgZ,EACF,OAAO,KAET,MAAM6B,EAAcva,KAA4BnF,IAAI6d,GAIpD,YAH2B,IAAhB6B,GACT7X,EAAW,mBAAmBgW,0CAEzB/X,EAAwBjB,EACjC,CAoBmBkZ,CAAclZ,GACd,OAAb6P,GACF7M,EAAW,2DAA2DhD,EAAQC,QAAQC,sCAEnF2P,EAAS3N,iBAAiB1G,IAAI+6B,IACjCvzB,EAAW,YAAYuzB,iDAA0Dv2B,EAAQC,QAAQC,mBAI/FvE,IACFA,EAASsc,cACTgR,GAAmBrb,OAAO6G,IAG5B,MAAM+hB,EAAa,IAAIpM,QAAQpqB,GAC/B,IAAIiY,EAAmC,KAcvCA,EAAcW,EAAMb,UAbD,IAAInN,KACrB,MAAM6rB,EAAKD,EAAWlM,QACtB,IAAKmM,IAAOA,EAAG7hB,YAGb,OAFAqD,WACAgR,GAAmBrb,OAAO6G,GAG5B,MAAMiiB,EAAUD,EAA0CF,GAI1D,MAHsB,mBAAXG,GACT1zB,EAAW,WAAWuzB,4BAAqCE,EAAGx2B,QAAQC,mBAEjEia,QAAQC,MAAMsc,EAAwCD,EAAI7rB,KAGnEqe,GAAmB1tB,IAAIkZ,EAAS,CAAEmE,QAAOX,cAAaue,cACxD,G4BnEMG,GAA6D,CACjEzpB,cL3BgCuH,EAAuBkf,EAAyB3W,GAMhF,MAAM9P,EAAO8P,QAA8C,GAAK5W,OAAO4W,GAKvE,GAJIvI,EAAQ9D,YAAYimB,YAAc1pB,IACpCuH,EAAQ9D,YAAYimB,UAAY1pB,GAG9BjU,MAAYm8B,GAAgB55B,IAAIiZ,EAAQ9D,aAAc,CACxDykB,GAAgBx5B,IAAI6Y,EAAQ9D,aAC5B,MAAMc,EAAagD,EAAQ9D,YAAYc,WACvC,GAAIA,EAAY,CACd,MAAMnU,EAAOmX,EAAQ/Q,cACfgvB,EAAev5B,SAASw5B,cAAc,oBAAoBr1B,KAC1Ds1B,EAAaz5B,SAASw5B,cAAc,kBAAkBr1B,KAC5DmU,EAAWwe,aAAayC,EAAcje,EAAQ9D,aAC9Cc,EAAWwe,aAAa2C,EAAYne,EAAQ9D,YAAYqf,YAC1D,CACF,CACF,EKME6G,aV8GA1iB,EACA6H,EACAgB,GAEA,MAAM8Z,EAAe3iB,EAAYxQ,cAC3BoP,EAAYmB,GAA0BC,GACtC4iB,EAAajiB,GAAiCX,GAC9C6iB,EAAaplB,GAAuCmlB,GACpD7L,EAAOH,GAAehY,EAAWikB,EAAWha,GAClDhB,EAAQib,yBAAyB17B,IAAIw7B,EAAYn0B,MAAMC,QAAQma,GAAYA,EAAW,IAEtF,MAAMka,EAAat0B,MAAMC,QAAQm0B,IAC5BA,EAAU33B,SAAW6rB,EAAKU,eAAe5X,MACzCkX,EAAKU,eAAe5X,KAAO,EAChC,GAAIkjB,GAA8C,OAAhC/iB,EAAYnZ,KAAKyW,WAAqB,CACtD,IAAI0lB,EAAaxF,GAAgCx2B,IAAIgZ,EAAYnZ,MACjE,QAA0B,IAAfm8B,EAA4B,CACrC,MAAMxH,EAAW6B,GAAer2B,IAAIgZ,EAAYnZ,OAASmZ,EAAYnZ,KACrEm8B,EA5EN,SAAmCzH,EAAiBC,GAClD,IAAIyH,EAAgB1H,EAAU2H,gBAC1BC,EAAgB3H,EAASK,YACzBuH,GAAW,EACf,KAAwB,OAAlBH,GAAwB,CAC5B,GAAIA,EAAcv3B,WAAaC,KAAKC,cAC9Bq3B,EAAcv3B,WAAaC,KAAK8Q,WAA2D,MAA7CwmB,EAAclE,aAAavsB,QAAU,IAAa,CACpG4wB,GAAW,EACX,KACF,CACAH,EAAgBA,EAAcC,eAChC,CACA,KAAwB,OAAlBC,GAAwB,CAC5B,GAAIA,EAAcz3B,WAAaC,KAAKC,cAC9Bu3B,EAAcz3B,WAAaC,KAAK8Q,WAA2D,MAA7C0mB,EAAcpE,aAAavsB,QAAU,IAAa,CACpG4wB,GAAW,EACX,KACF,CACAD,EAAgBA,EAActH,WAChC,CACA,OAAOuH,CACT,CAuDmBC,CAA0BrjB,EAAYnZ,KAAM20B,GACzDgC,GAAgCp2B,IAAI4Y,EAAYnZ,KAAMm8B,EACxD,CACA,GAAIA,EAAY,CACd,MAAM1lB,EAAa0C,EAAYnZ,KAAKyW,WACpCA,EAAWyhB,YAAc,GACzBzhB,EAAWqe,YAAY3b,EAAYnZ,KACrC,CACF,CASA,IAAIy8B,EAAahG,GAAyBt2B,IAAIgZ,EAAYnZ,MACtD08B,EAAaR,EA3HS,IAT5B,SAA2B/iB,GACzB,OAAOud,GAAqBv2B,IAAIgZ,EAAYnZ,OAAS,EACvD,CAmI0B28B,CAAkBxjB,GAAa9U,OACnDmC,OAAOo2B,kBACX,QAA0B,IAAfH,EAA4B,CACrC,IAAI,MAAMI,KAAe3M,EAAKU,eAAgB,CAC5C,MAAMxC,EAAUqO,EAAWt8B,IAAI08B,QACR,IAAZzO,IACLsO,GAAc,GAAKtO,EAAQ8G,aAC7BhB,GAAoB/a,EAAYnZ,KAAMouB,IAEtCuF,GAAkBvF,GAClBA,EAAQgH,UACR4B,GAAiB7d,EAAaiV,GAC9BsO,GAAc,GAEXR,GACHO,EAAW7pB,OAAOiqB,GAGxB,CACIX,IACFzF,GAAyB7jB,OAAOuG,EAAYnZ,MAC5Cy8B,OAAa93B,EAEjB,CAEA,IAAIgwB,EAAWxb,EAAYnZ,KAC3B,MAAM88B,EAAkBz6B,EAAYy5B,EAAax5B,KAAO,IAAMxB,GACxDi8B,EAAmB/b,EAAQjO,aAAagqB,iBAKxCC,EAAiBnL,GAAsB3B,GAC7C,IAAI3X,EAAoC,KACpC2X,EAAKQ,WAAWrsB,QAAU6rB,EAAKW,YAAY7X,MAC1CkX,EAAKQ,WAAWrsB,OAAS,GACzBswB,EAAS/a,cAGZrB,EAAWpa,SAASm3B,yBACpBhd,GAAsBC,EAAUyI,EAAQtO,WAE1C,MAAM8kB,EAAUv5B,IACVwU,EAAO0G,EAAY1G,MAAQ,GAG3BwqB,EAAiBvG,GAAqBv2B,IAAIgZ,EAAYnZ,MAC5D,IAAI,MAAM0c,KAASwT,EAAKQ,WAAY,CAClC,IAAItC,EAEJ,GAAI8B,EAAKW,YAAYrwB,IAAIkc,GAAQ,CAC/B,MAAM1B,EAAeJ,GAAmBkiB,EAAiBpgB,GACzDqgB,EAAiBG,kBAAkBliB,EAAexE,IAMhD,GALA4X,OAAoC,IAAnB6O,EAAiCA,EAAetD,WAAQh1B,OAClD,IAAZypB,IACTA,EAAU4H,GAAc7c,IAGT,OAAbZ,EACEif,GACFjf,EAASuc,YAAY32B,SAASw5B,cAAc,mBAAmBllB,KAAQqpB,EAAax5B,QAAQoa,EAAMA,UAEpG0R,EAAQwG,SAASrc,GACbif,GACFjf,EAASuc,YAAY32B,SAASw5B,cAAc,iBAAiBllB,KAAQqpB,EAAax5B,QAAQoa,EAAMA,cAE7F,CAGL,GAAIiY,EAASK,cAAgB5G,EAAQsG,UAAW,CAC9C,GAAI8C,EAAS,CACX,MAAME,EAAev5B,SAASw5B,cAAc,mBAAmBllB,KAAQqpB,EAAax5B,QAAQoa,EAAMA,SAClGiY,EAASle,WAAYwe,aAAayC,EAAc/C,EAASK,aACzDL,EAAW+C,CACb,CACAtJ,EAAQ2G,WAAWJ,EACrB,CACA,GAAI6C,EAAS,CACX,MAAMI,EAAaz5B,SAASw5B,cAAc,iBAAiBllB,KAAQqpB,EAAax5B,QAAQoa,EAAMA,SACxFmb,EAAYzJ,EAAQuG,UAAYA,EACtCkD,EAAUphB,WAAYwe,aAAa2C,EAAYC,EAAU7C,YAC3D,CACF,CAEAvB,GAAgBrF,EAAS5X,EAAawK,UAEjB,IAAZoN,GACTpmB,EAAW,oCAAoC0U,EAAMA,kBAAkBof,EAAax5B,QAExF,KAAO,CAGL,GADA8rB,OAAiC,IAAfqO,EAA6BA,EAAWt8B,IAAIuc,IAAU,KAAO,KAC3EwT,EAAKS,eAAenwB,IAAIkc,GAAQ,CAElC,MAAMiZ,EAAgBxH,GAA0BC,GAChD,IAAI,MAAM+O,KAAgBxH,EACxBjC,GAAYyJ,EAAcnc,EAE9B,CAGgB,OAAZoN,GACFpmB,EAAW,oCAAoC0U,EAAMA,kBAAkBof,EAAax5B,SAMpD,OAAnB06B,GAA2BA,EAAex8B,IAAIkc,IACxDua,GAAkBtC,EAAUvG,EAAQsG,YAC1BC,EAASK,cAAgB5G,EAAQsG,WAC9CtG,EAAQ2G,WAAWJ,EAEvB,CACAA,EAAWvG,EAAQuG,UAAYA,OACL,IAAf8H,IACTA,EAAa,IAAI/8B,QACjB+2B,GAAyBl2B,IAAI4Y,EAAYnZ,KAAMy8B,IAEjDA,EAAWl8B,IAAImc,EAAO0R,EACxB,CACAoI,GAAej2B,IAAI4Y,EAAYnZ,KAAM20B,GACpB,OAAbpc,IAEFY,EAAYnZ,KAAKyW,WAAYwe,aAAa1c,EAAUY,EAAYnZ,KAAKg1B,aACrE1c,GAAsBC,EAAU,MAEpC,EUjRE6kB,GAAM9F,GACN+F,KAAQ/F,GACRgG,OAAUhG,GACViG,eIlCiC9jB,EAAuBkf,EAAyB3W,GACjF,MAAMhd,EAAUyU,EAAQzZ,KAElBw9B,EAAuBzP,GADR/oB,EAAQJ,MAC+B6U,EAAQ7Q,WACpE5D,EAAQqX,QAAU2F,IAAawb,CACjC,EJ8BEC,kB9BhCoChkB,EAAuBkf,EAAyB3W,GACpF,MAAMhd,EAAUyU,EAAQzZ,KAElBw9B,EAAuBzP,GADR/oB,EAAQJ,MAC+B6U,EAAQ7Q,WAC9D80B,EAAqB91B,MAAMC,QAAQma,GAAYA,EAAWgM,GAChEhpB,EAAQqX,QAAUqhB,EAAmBv4B,SAASq4B,EAChD,G8B6BMG,GAAoD,IAAIj+B,QACxDk+B,GAAiE,IAAIl+B,QAKrEm+B,GAAgE,IAAIn+B,QAE1E,SAASo+B,GAAarkB,EAAuBuH,GAC3C,MACMkM,EAAgBa,GADRwM,GAASvZ,EAAQliB,MAAO2a,GACQA,EAAQ5Q,YAEtD,IAAoD,IAAhD+0B,GAA+Bz9B,IAAIsZ,GAErC,YADAuH,EAAQ+c,uBAAuBz5B,KAAK,CAAEmV,UAAS7U,MAAOsoB,IAGxD,IAAIlQ,EAAK2gB,GAAYx9B,IAAIsZ,GACzB,QAAkB,IAAPuD,EAAX,CAIA,GAAI2gB,GAAYn9B,IAAIiZ,GAQlB,OAPImU,GAAuBnU,EAAQ9D,YAAwBqL,EAAQjO,eACjEiK,EAAKqd,GACLsD,GAAYp9B,IAAIkZ,EAASuD,IAEzBA,EAAK0b,QAEP1b,EAAGvD,EAASuH,EAASkM,GAKvB,GADAlQ,EAAK2e,GAAyBliB,EAAQ3Q,kBACpB,IAAPkU,EAAoB,CAC7B,MAAM4b,EAAenf,EAAQjR,aAAa,GAG1C,GAFAwU,EAAK6d,GAA0BjC,GAC/B+E,GAAYp9B,IAAIkZ,EAASuD,QACP,IAAPA,EAAoB,CACXvY,EAAiBgV,EAAQ9D,aAErCiY,GAAuBnU,EAAQ9D,YAAwBqL,EAAQjO,eACjEiK,EAAKqd,GACLsD,GAAYp9B,IAAIkZ,EAASuD,IAEzBA,EAAK0b,IAGP1b,EAAK0b,GACLiF,GAAYp9B,IAAIkZ,EAASuD,GAE7B,CACF,CACA,GAAIA,IAAO0b,GAAuB,CAEhC,GAAwB,WADRjf,EAAQzZ,KACZiF,QAAsB,CAChC,MAAMsD,EAAWkR,EAAQjR,aAAa,GACtC,GAAiB,UAAbD,GAAqC,kBAAbA,EAG1B,OAFAyY,EAAQ+c,uBAAuBz5B,KAAK,CAAEmV,UAAS7U,MAAOsoB,SACtD0Q,GAA+Br9B,IAAIkZ,GAAS,EAGhD,CACF,CACAuD,EAAGvD,EAASuH,EAASkM,EA3CrB,MAFElQ,EAAGvD,EAASuH,EAASkM,EA8CzB,CAEM,SAAUwG,GAAYja,EAAuBuH,GACjD,GAAIA,EAAQgd,kBAAkBx9B,IAAIiZ,GAChC,OAMF,GAJAuH,EAAQgd,kBAAkBp9B,IAAI6Y,IAIkB,IAA5CuH,EAAQjO,aAAakrB,mBAA8B,CACrD,MAAMlC,EAAajiB,GAAiCL,GACpD,GAAIuH,EAAQkd,mCAAmC19B,IAAIwgB,EAAQjO,cAAe,CACrDiO,EAAQkd,mCAAmC/9B,IAAI6gB,EAAQjO,cAC/DnS,IAAIm7B,EACjB,MACE/a,EAAQkd,mCAAmC39B,IAAIygB,EAAQjO,aAAc,IAAIxO,IAAI,CAC3Ew3B,IAGN,CACA,MAAMzF,EAAiB5I,GAAkBjU,GACzC,GAAuB,OAAnB6c,IAA4BA,EAAevN,iBAAiBtP,GAC9D,OAEF,GAA4B,UAAxBA,EAAQ3Q,YACV,OAEF,IAAmD,IAA/C+0B,GAA8B19B,IAAIsZ,GAAmB,CACvD,MAAM0kB,EAAY15B,EAAiBgV,EAAQ9D,aAC3C,GAAIwoB,QACiDx5B,IAA/CW,KAA4BnF,IAAIg+B,GAMlC,YDnIF,SAAgC1kB,EAAuBxU,GAC3D,GAAI01B,GAAkBn6B,IAAIiZ,GAAU,OACpCkhB,GAAkB/5B,IAAI6Y,GAEtB,MAAM2kB,EAAc,KAClBzD,GAAkB/nB,OAAO6G,GACzB,MAAM4kB,EAAiB3Q,GAAkBjU,IAClB,OAAnB4kB,GAA4BA,EAAetV,iBAAiBtP,KAGhE2N,GAAwB,CAAC3N,KAErB+J,EAAUK,IACd8W,GAAkB/nB,OAAO6G,GACzBmhB,GAAc31B,EAAS4e,IAGnBgC,EAAU6H,GAAkBjU,GAClC,GAAgB,OAAZoM,EAAkB,CACpB,MAAM+D,EAAS/D,EAAQ6D,kBAAkBjQ,EAAQ9D,YAAa1Q,EAASm5B,EAAa5a,GAQpF,YAPKqC,EAAQ0D,YAAY9P,EAAS,KAChCkhB,GAAkB/nB,OAAO6G,GACzBmQ,QAEA+Q,GAAkB/nB,OAAO6G,GACzBmQ,KAGJ,CAGA,MAAMjkB,EAAWL,IACjB,GAAiB,OAAbK,EAGF,OAFAg1B,GAAkB/nB,OAAO6G,QACzBmhB,GAAc31B,EAAS,IAAIiD,MAAM,0CAGnCgc,GAAyBve,GAAU4d,KAAKte,EAAS,KAC1CwU,EAAQ9D,YAAYiE,YAIzBwkB,IAHEzD,GAAkB/nB,OAAO6G,IAI1B+J,EACL,CCsFQ8a,CAAsB7kB,EAAS0kB,GAKnCN,GAA8Bt9B,IAAIkZ,GAAS,EAC7C,CAKA,IAAiC,IAA7BuH,EAAQud,kBAA6B9kB,EAAQpR,YAAc2Y,EAAQ3Y,UAErE,YADAy1B,GAAarkB,EAASuH,GAGxB,IAAItO,EAAwB+G,EAAQ9D,YAAYgE,cAOhD,GANIjH,aAAoB8rB,oBAAsB9rB,aAAoB+rB,cAChE/rB,EAAW8F,GAAsB9F,GAChB,OAAbA,GACF1K,EAAW,kDAGXyR,EAAQpR,YAAc2Y,EAAQ3Y,WAAaqK,IAAasO,EAAQtO,SAAU,CAC5E,MAAMK,EAAeC,GAAsBN,EAAU+G,EAAQpR,WACxC,OAAjB0K,GACF/K,EAAW,4BAA4ByR,EAAQpR,qCAEjD0K,EAAawJ,YAAY,WAAamiB,IACpC,MAAMC,EAAa,CACjBt2B,UAAWoR,EAAQpR,UACnBqK,SAAUA,EACVK,aAAcA,EACdjU,MAAO4/B,EACPV,kBAAmBhd,EAAQgd,kBAC3B/B,yBAA0Bjb,EAAQib,yBAClCiC,mCAAoCld,EAAQkd,mCAC5CH,uBAAwB/c,EAAQ+c,wBAElCD,GAAarkB,EAASklB,IAE1B,MACEb,GAAarkB,EAASuH,EAE1B,CKjKM,SAAUoG,GACd7d,EACA+vB,GAEA,IAAIsF,EAAe,EACnB,MAAMZ,EAAuC,IAAIz5B,IAC3C03B,EAA2E,IAAI75B,IAC/E87B,EAAqF,IAAI97B,IACzF27B,EAAmD,GAGzD,KAAMa,EAAer1B,EAASlF,QAAQ,CACpC,IAAIoV,EAAUlQ,EAASq1B,GACvB,MAAMv2B,EAAYoR,EAAQpR,UAC1B,IAAwC,IAApCoR,EAAQ9D,YAAYiE,YAAuB,CAEzCra,EAAON,OACTqW,QAAQmiB,IAAI,uDAAuDhe,EAAQ3Q,eAAe2Q,EAAQ/Q,oBAAoB+Q,EAAQzZ,KAAK6Z,WAAYJ,GAEjJmlB,IACA,QACF,CACA,IAAIlsB,EAAwB+G,EAAQ9D,YAAYgE,cAC5CjH,aAAoB8rB,oBAAsB9rB,aAAoB+rB,cAChE/rB,EAAW8F,GAAsB9F,GAChB,OAAbA,GACF1K,EAAW,kDAGf,MAAM+K,EAAeC,GAAsBN,EAAUrK,GAChC,OAAjB0K,GACF/K,EAAW,4BAA4BK,6BAGzC0K,EAAawJ,YAAY,WAAazd,IACpC,MAAMkiB,EAAyB,CAC7BtO,SAAUA,EACVrK,UAAWA,EACX0K,aAAcA,EACdjU,MAAOA,EACPk/B,kBAAmBA,EACnB/B,yBAA0BA,EAC1BiC,mCAAoCA,EACpCH,uBAAwBA,EAGxBQ,kBAAkB,EAClBjF,4BAA6BA,GAG/B,OAAG,CACD5F,GAAYja,EAASuH,GACrB4d,IAEA,MAAMC,EAA4Ct1B,EAASq1B,GAC3D,IAAKC,EAAiB,MACtB,MAAMC,EAAeD,EAAgBlpB,YAAYgE,cACjD,GAAIklB,EAAgBx2B,YAAcA,GAAay2B,IAAiB9d,EAAQtO,SAAU,MAClF+G,EAAUolB,CACZ,GAEJ,CAIA,IAAK,MAAMplB,QAAEA,EAAO7U,MAAEA,KAAWm5B,EAC/BrF,GAAsBjf,EAAS,CAAE6f,+BAA2D10B,GAG9F,IAAI,MAAQm3B,EAAYgD,KAAkB9C,EAAyBn0B,UACjEgP,GAAuCilB,EAAYgD,GAErD,IAAI,MAAQhsB,EAAcisB,KAAmBd,EAAmCp2B,UAC9EiL,EAAawJ,YAAY,WAAazd,IACpCA,EAAMyY,IAAuB3P,MAAMoc,KAAKgb,KAG9C,CjBrEM,SAAUC,GACdl5B,EACAm5B,GAEA,MAAOtrB,EAAiBoC,EAAaC,GAAmBF,GAA4BhQ,GAC9E8f,EAAU4H,GAA0B1nB,GAC1C,IAAK,MAAM/F,KAAQ4T,EACjB8C,GAAqB1W,EAAMk/B,GAG7B9X,GADoBvB,EAAQqC,WAAWlS,IA3BzC,SACEC,EACAipB,EACArZ,GAEA,IAAK,MAAM9d,KAASkO,EAClB4P,EAAQ6D,kBAAkB3hB,EAAM/H,KAAM+H,EAAM9C,QAAS,KACnD,MAAMsE,EAAW4M,GAAoBpO,GACb,IAApBwB,EAASlF,SACbqS,GAAqB3O,EAAM/H,KAAMk/B,GAEjC9X,GADoBvB,EAAQqC,WAAW3e,MAErCsa,IACFvO,QAAQuO,MAAM,gDAAgD9b,EAAM9C,YAAa4e,IAGvF,CAaEsb,CAAwBlpB,EAAiBipB,EAAmBrZ,EAC9D,CkBzCA,MAAMuZ,GAAiB,uBACjBC,GAAY,IAAI96B,IAAI,CAAC,SAAU,UAE/B,SAAU+6B,GAA0Bv5B,GACxC,IAAKxG,EAAOL,eACV,QA0BJ,SAA0B6G,GACxB,MAAM8N,EAAS1V,SAAS2V,iBAAiB/N,EAAMgO,WAAWwrB,WACpDC,EAAoB,GAE1B,KAAO3rB,EAAOQ,YACZmrB,EAAUl7B,KAAKuP,EAAO3K,aAGxB,IAAK,MAAMu2B,KAAYD,EACjBC,EAASC,eAAiBL,GAAU7+B,IAAIi/B,EAASC,cAAcz6B,UAGnE06B,GAAgBF,EAEpB,CArCEG,CAAiB75B,GAEjB,MAAM85B,EAAYj4B,MAAMoc,KAAKje,EAAKyyB,iBAAiB,aAEnD,IAAK,MAAM3C,KAAYgK,EACrB,G7FiByB,+B6FjBrBhK,EAASiK,aAAgC,CAC3C,MAAMC,EAAc5hC,SAAS6hC,cAAc,YACrC72B,EAAavB,MAAMoc,KAAK6R,EAAS1sB,YACvC,IAAI,IAAIjI,EAAI,EAAGA,EAAIiI,EAAW9E,OAAQnD,IAAK,CACzC,MAAM++B,EAAY92B,EAAWjI,GAC7B6+B,EAAY3R,QAAQ0G,YAAYmL,EAClC,CACA,IAAI,MAAM/E,KAAQrF,EAASqK,WACzBH,EAAY5H,aAAa+C,EAAK3zB,KAAM2zB,EAAKt2B,OAE3CixB,EAASsK,YAAYJ,GACrBT,GAA0BS,EAAY3R,QACxC,MACEkR,GAA0BzJ,EAASzH,QAGzC,CAkBA,SAASuR,GAAgBF,GACvB,MAAMvtB,EAAOutB,EAASttB,KAGtB,GAFAitB,GAAegB,UAAY,GAEtBhB,GAAeiB,KAAKnuB,GACvB,OAGFktB,GAAegB,UAAY,EAC3B,MAAM7nB,EAAWpa,SAASm3B,yBAC1B,IACIljB,EADAguB,EAAY,EAGhB,KAA+C,QAAvChuB,EAAQgtB,GAAe/sB,KAAKH,KAAiB,CAC/CE,EAAMsK,MAAQ0jB,GAChB7nB,EAASuc,YAAY32B,SAAS0X,eAAe3D,EAAKxG,MAAM00B,EAAWhuB,EAAMsK,SAG3E,MAAM3L,EAAWqB,EAAM,GACvBmG,EAASuc,YAAY32B,SAASw5B,cAAc,OAAO5mB,MAEnDqvB,EAAYhuB,EAAMsK,MAAQtK,EAAM,GAAG/N,MACrC,CAEI+7B,EAAYluB,EAAK7N,QACnBkU,EAASuc,YAAY32B,SAAS0X,eAAe3D,EAAKxG,MAAM00B,KAG1DX,EAAShpB,WAAYqV,aAAavT,EAAUknB,EAC9C,CC5EA,IAAIa,YAEYC,KACd,GAAID,GACF,OAAOA,GAET,MACM1wB,EAAiB,GACjBD,EAAWf,GAFE,MAE0BgB,EAA5BhB,CAAkCJ,IAMnD,OALA8xB,GAAiB,CACf7wB,WAJiB,MAKjBG,OACAD,YAEK2wB,EACT,CCfA,MAAME,GAAgB,uCAEtB,SAASC,GAA2BhwB,EAAmBiwB,GACrD,MAAMC,EAASD,EAAU7/B,EAAYC,EAC/B8/B,EAAYnwB,EAAUnB,QAAQ,KAC9BuxB,EAAUpwB,EAAUnB,QAAQ,KAClC,IAAIwxB,EACAC,EAWJ,IAVkB,IAAdH,GACFE,EAAWrwB,EAAU/E,MAAM,EAAGk1B,GAAWj1B,OACzCo1B,EAAStwB,EAAU/E,MAAMk1B,KACJ,IAAZC,GACTC,EAAWrwB,EAAU/E,MAAM,EAAGm1B,GAASl1B,OACvCo1B,EAAStwB,EAAU/E,MAAMm1B,KAEzBC,EAAWrwB,EAAU9E,OACrBo1B,EAAS,IAEM,MAAbD,EACFA,EAAWH,MACN,KAAIG,EAASrvB,WAAW,KAG7B,OAAOhB,EAFPqwB,EAAWH,EAAS9/B,EAAYigC,EAASp1B,MAAM,EAGjD,CACA,OAAIq1B,EAAO18B,OAAS,EACXy8B,EAAWC,EAEbD,CACT,CAEA,SAASE,GAAkB7uB,EAAcuuB,GACvC,MAAMtuB,EAAQouB,GAAcnuB,KAAKF,GACjC,GAAc,OAAVC,EACF,OAAOD,EAET,MAAM8uB,EAAgB7uB,EAAM,GACtBrB,EAAWqB,EAAM,GACjB8uB,EAAgB9uB,EAAM,GAE5B,OAAO6uB,EADUR,GAA2B1vB,EAAU2vB,GACpBQ,CACpC,CAEA,SAASC,GAAoBC,EAAmBV,GAC9C,MAAMW,EAAQD,EAAUl9B,MAAM,KAC9B,IAAIo9B,GAAU,EACd,MAAM1sB,EAASysB,EAAMlyB,IAAIoyB,IACvB,MAAMC,EAAUD,EAAK51B,OACrB,GAAuB,IAAnB61B,EAAQn9B,OAAc,OAAOk9B,EACjC,MAAME,EAAaD,EAAQlyB,QAAQ,KACnC,IAAmB,IAAfmyB,EAAmB,OAAOF,EAC9B,MAAMpwB,EAAWqwB,EAAQ91B,MAAM,EAAG+1B,GAAY91B,OACxC8E,EAAY+wB,EAAQ91B,MAAM+1B,EAAa,GAAG91B,OAC1C8I,EAAWgsB,GAA2BhwB,EAAWiwB,GACvD,OAAIjsB,IAAahE,GACf6wB,GAAU,EACH,GAAGnwB,MAAasD,KAElB8sB,IAET,OAAKD,EACE1sB,EAAOtI,KAAK,KADE80B,CAEvB,CAEM,SAAUM,GAA+BN,EAAmBV,GAChE,OAAOS,GAAoBC,EAAWV,EACxC,CAEM,SAAUiB,GAAqB57B,EAAwB26B,GAC3D,MAAMkB,EAAWriC,EAAOhB,kBAClBsV,EAAS1V,SAAS2V,iBACtB/N,EACAgO,WAAWE,aAAeF,WAAWC,cAGvC,KAAOH,EAAOQ,YAAY,CACxB,MAAMrU,EAAO6T,EAAO3K,YACpB,GAAIlJ,EAAK6E,WAAaC,KAAKmN,aAAc,CACvC,MAAM4vB,EAAU7hC,EAChB6hC,EAAQ1vB,KAAO6uB,GAAkBa,EAAQ1vB,KAAMuuB,GAC/C,QACF,CACA,MAAM17B,EAAUhF,EAChB,GAAIgF,aAAmB88B,oBACrB,SAEF,MAAM5G,EAAOl2B,EAAQK,aAAau8B,GAClC,GAAa,OAAT1G,EAAe,CACjB,MAAMzmB,EAAW0sB,GAAoBjG,EAAMwF,GACvCjsB,IAAaymB,GACfl2B,EAAQmzB,aAAayJ,EAAUntB,EAEnC,CACF,CACF,CChGM,SAAUstB,GAAY/hC,GAC1B,IAAIkJ,EAA2BlJ,EAC/B,MAAMsC,EAAiB,GACvB,KAAiC,OAA3B4G,EAAYuN,YAAqB,CACrC,MACMiG,EADgB9U,MAAMoc,KAAK9a,EAAYuN,WAAWtN,YACpCmG,QAAQpG,GAC5B5G,EAAK0/B,QAAQtlB,GACbxT,EAAcA,EAAYuN,UAC5B,CACA,OAAOnU,CACT,CCNM,SAAU2/B,GAAqB1pB,GACnC,MAAM2pB,EAA0C,GAC1CtuB,EAAkBD,GAAmB4E,GAC3C,IAAI,MAAM4pB,KAAkBvuB,EAAiB,CAC3C,MAAM6B,EAA0BjC,GAAwB2uB,GACxD,IAAIniC,EAAOmiC,EAQX,GACEA,EAAet9B,WAAaC,KAAKmN,cACK,IAAnCwD,EAAwBpR,QACmB,SAA3CoR,EAAwB,GAAG3M,aACG,OAA9Bq5B,EAAe1rB,WAClB,CACA,MAAMgpB,EAAWthC,SAAS0X,eAAe,IACzCssB,EAAe1rB,WAAWqV,aAAa2T,EAAU0C,GACjDniC,EAAOy/B,CACT,CACAyC,EAAmB59B,KAAK,CACtBoxB,SAAUqM,GAAY/hC,GACtBqT,qBAAsBoC,GAE1B,CACA,OAAOysB,CACT,CCjCM,SAAUE,GAAiB7pB,GAC/B,MAAMpP,EAAavB,MAAMoc,KAAKzL,EAASpP,YACvC,IAAI,MAAM82B,KAAa92B,EACrB,GAAI82B,EAAUp7B,WAAaC,KAAK8Q,UAAW,CAEd,MADPqqB,EAAU/H,aAAe,IAC7BvsB,QAEd4M,EAAS4c,YAAY8K,EAEzB,CAEJ,CCGA,MAAMoC,GAAiD,IAAIjgC,IAAyB,CAClF,CAAC,MAAQ7C,EAAOd,kBAChB,CAAC,KAAOc,EAAOb,iBACf,CAAC,SAAUa,EAAOZ,qBAClB,CAAC,OAAQY,EAAOX,qBAGZ0jC,GAAY/B,KAElB,SAASgC,GACPz5B,EACAgK,GAEA,MAAMjE,EAAUiE,EAAoBjK,WACpC,MAAO,IACFiK,EACHjK,WAAY,IAAIgG,EAASyzB,IACzBx5B,YAAaA,EAEjB,CAEA,SAAS05B,GACP9vB,EACA6F,EACA7E,EACAgtB,GAEA0B,GAAiB7pB,GACM,iBAAZmoB,GACTiB,GAAqBppB,EAAUmoB,GAEjC+B,GAA2B/vB,EAAU6F,EAAUmoB,GAO/C,MALqB,CACnBnoB,SAAUA,EACVzF,oBAAqBY,EACrBP,UAAW8uB,GAAqB1pB,GAGpC,UAGgBkqB,GAA2B/vB,EAAgBgwB,EAAiDhC,GAC1G,MAAMiC,EAAcpjC,EAAOX,kBACrBiV,EAAS1V,SAAS2V,iBACtB4uB,EACA3uB,WAAWC,aACX,CACE,UAAAE,CAAWlU,GACT,MAAMgF,EAAUhF,EAChB,GAAsC,aAAlCgF,EAAQC,QAAQC,cAA8B,CAEhD,IADiBF,EAAQK,aAAa9F,EAAOhB,oBAAsB,IACtD8F,OAAS,EACpB,OAAO0P,WAAWI,aAEtB,CACA,OAAOJ,WAAWK,WACpB,IAGJ,IAAIwuB,EAA2C,KAC/C,MAAMC,EAAqC,GACrChD,EAAmC,GACzC,KAAOhsB,EAAOQ,YAAY,CACxB,MAAMwhB,EAAWhiB,EAAO3K,YACxB22B,EAAUv7B,KAAKuxB,EACjB,CAEA,IAAI,MAAMA,KAAYgK,EAAW,CAC/B,IAAI9uB,EAAW8kB,EAASxwB,aAAa9F,EAAOhB,oBAAsB,GAC3C,iBAAZmiC,IACT3vB,EAAW2wB,GAA+B3wB,EAAU2vB,IAGtD,IAAI5tB,EADyBhC,GAAyBC,GACP,GAC/C,MAAMuB,EAAU+vB,GAAqBliC,IAAI2S,EAAoBhK,aAC7D,QAAuB,IAAZwJ,EACT,SAGF,MAAMxJ,EAAcgK,EAAoBhK,YAClCyP,EAAWsd,EAASzH,QACpB3b,EAAOkc,KACb,IAAIhc,EAAqC,KAGzC,MAAMmwB,EAA+B,QAAhBh6B,EACjBgK,EAAoBpK,cACpBg4B,EAEJ,GAAoB,SAAhB53B,EAAwB,CAEC,OAAvB85B,GACF56B,EAAW,oEAGb8K,EAAsByvB,GAA4B,OAAQK,EAAmB9vB,qBAC7EH,EAAe6vB,GAAiB9vB,EAAU6F,EAAUzF,EAAqBgwB,GACzEtwB,GAAsBC,EAAMC,EAAUC,GAEtC,MAAMowB,EAAuBF,EAAkBvpB,OACzC0pB,EAAc7kC,SAASw5B,cAAc,KAAKrlB,KAAWG,UACvB,IAAzBswB,GACTlN,EAASva,SACTynB,EAAqBxqB,SAASuc,YAAYkO,GAC1CD,EAAqB5vB,UAAU7O,KAAK,CAClCoxB,SAAUqM,GAAYiB,GACtB3vB,qBAAsBG,GAAwBwvB,MAGhDnN,EAASsK,YAAY6C,EAEzB,MAAO,GAAoB,WAAhBl6B,EAA0B,CAER,OAAvB85B,GACF56B,EAAW,sEAGb2K,EAAe6vB,GAAiB9vB,EAAU6F,EAAUzF,EAAqBgwB,GACzEtwB,GAAsBC,EAAMC,EAAUC,GACtC,MAAMqwB,EAAc7kC,SAASw5B,cAAc,KAAKrlB,KAAWG,KAGrDwwB,EAAWtU,KACXuU,EAAkC,CACtC3qB,SAAUpa,SAASm3B,yBACnBxiB,oBAAqByvB,GAA4B,OAAQK,EAAmB9vB,qBAC5EK,UAAW,IAEb+vB,EAAiB3qB,SAASuc,YAAYkO,GACtCE,EAAiB/vB,UAAU7O,KAAK,CAC9BoxB,SAAUqM,GAAYiB,GACtB3vB,qBAAsBG,GAAwBwvB,KAEhDxwB,GAAsBywB,EAAUvwB,EAAUwwB,GAC1C,MAAMH,EAAuBF,EAAkBvpB,OAC/CupB,EAAkBv+B,KAAK4+B,GACvB,MAAMC,EAAkBhlC,SAASw5B,cAAc,KAAKgL,KAAeM,UAE/B,IAAzBF,GACTlN,EAASva,SACTynB,EAAqBxqB,SAASuc,YAAYqO,GAC1CJ,EAAqB5vB,UAAU7O,KAAK,CAClCoxB,SAAUqM,GAAYoB,GACtB9vB,qBAAsBG,GAAwB2vB,MAGhDtN,EAASsK,YAAYgD,EAGzB,KAAO,CACLxwB,EAAe6vB,GAAiB9vB,EAAU6F,EAAUzF,EAAqBgwB,GACzEtwB,GAAsBC,EAAMC,EAAUC,GACtC,MAAMqwB,EAAc7kC,SAASw5B,cAAc,KAAKrlB,KAAWG,KAC3DojB,EAASsK,YAAY6C,EACvB,CAGoB,OAAhBl6B,GACF+5B,EAAkBx+B,OAAS,EAC3Bu+B,EAAqBjwB,GACI,WAAhB7J,EACT85B,EAAqBjwB,EACI,SAAhB7J,IACT85B,EAAqB,KACrBC,EAAkBx+B,OAAS,EAE/B,CACF,CCnLOvE,eAAesjC,GAAuBr9B,GAC3C,MAAMs9B,EAAWt9B,EAAKyyB,iBAAiBj5B,EAAOV,SAASC,OACjDwkC,EAA4B,SAC5B59B,eAAeG,YAAYtG,EAAOV,SAASC,OACjD,IAAI,MAAMkG,KAAWq+B,EAAU,CAC7B,MAAMtwB,EAAe/N,EACrBs+B,EAASh/B,KAAKyO,EAAawwB,kBAC7B,OACMljC,QAAQmjC,IAAIF,EACpB,CCNOxjC,eAAe2jC,GAAc19B,GAClC,GAAIA,IAAS5H,eAELilC,GAAuBjlC,UAE7BmhC,GAA0BnhC,UAC1BskC,GAA2BtkC,SAAUA,UACrC8gC,GAAmB9gC,SAASulC,KAAM,UAC7B,CACL,MAAMC,EAAa59B,EACf49B,EAAWC,KAAKvlC,aAAakB,EAAOhB,0BAEhCwB,EAAsB4jC,EAAWC,YAGnCR,GAAuBO,GAE7BrE,GAA0BqE,GAC1BlB,GAA2BkB,EAAYA,GACvC1E,GAAmB0E,EAAY,KACjC,CACF,CC3BO,MAAME,YCIAC,GACY,oBAAhBhX,YAA8B,QAAWA,YCY5CiX,GAA0B,qCAC1BC,GAAkB,0CAClBC,GAAgB,wCAChBC,GAAiB,0BAgBvB,SAASC,GAAoBC,GAC3B,OAAOA,EACJC,QAAQ,KAAM,WACdA,QAAQ,KAAM,WACdA,QAAQ,KAAM,WACdA,QAAQ,UAAW,WACnBA,QAAQ,UAAW,UACxB,CAEM,MAAOC,WAAYR,GACfS,WAA4B,KAC5BC,WAAsD,KACtDC,cAAgE,KAExE,QAAIl9B,GACF,OAAOtD,KAAKoB,aAAa,SAAW,SACtC,CAEA,WAAIqB,GACF,OAAOzC,KAAKoB,aAAa,YAAc,EACzC,CAEA,aAAIq/B,GAIF,OAHwB,OAApBzgC,KAAKsgC,aACPtgC,KAAKsgC,WAAatgC,KAAK0gC,kBAElB1gC,KAAKsgC,UACd,CAEA,aAAI1E,GAIF,OAHwB,OAApB57B,KAAKugC,aACPvgC,KAAKugC,WAAavgC,KAAK2gC,kBAElB3gC,KAAKugC,UACd,CAEA,gBAAIK,GAIF,OAH2B,OAAvB5gC,KAAKwgC,gBACPxgC,KAAKwgC,cAAgBxgC,KAAK6gC,qBAErB7gC,KAAKwgC,aACd,CAEA,WAAAM,CAAYtyB,GACV,OAAOxO,KAAK47B,UAAU1/B,IAAIsS,IAAS,IACrC,CAOA,aAAAuyB,GACE,MAAMC,EAAgBhhC,KAAKyC,QAC3B,IAAKu+B,EAAe,OAAO,EAC3B,MAAMC,EAAcD,EAAc/gC,MAAM,KAClCihC,EAActB,GAAQ3/B,MAAM,KAElC,OAAOghC,EAAY,KAAOC,EAAY,IAAMD,EAAY,KAAOC,EAAY,EAC7E,CAEA,YAAAC,CAAajzB,GACXlO,KAAKsgC,WAAapyB,CACpB,CAEA,eAAAkzB,CAAgBC,GACdrhC,KAAKwgC,cAAgBa,CACvB,CAEQ,cAAAX,GACN,MAAMY,EAASthC,KAAKuhC,cAClB,6DAEF,IAAKD,EAAQ,MAAO,CAAA,EACpB,IACE,OAAOpM,KAAKsM,MAAMF,EAAOrN,aAAe,KAC1C,CAAE,MACA,MAAO,CAAA,CACT,CACF,CAEQ,cAAA0M,GACN,MAAMz1B,EAAM,IAAI/M,IACVy9B,EAAY57B,KAAKu0B,iBAAsC,gBAC7D,IAAK,MAAMkN,KAAO7F,EAAW,CAC3B,MAAMhgC,EAAK6lC,EAAIrgC,aAAa,MACxBxF,GACFsP,EAAI5O,IAAIV,EAAI6lC,EAEhB,CACA,OAAOv2B,CACT,CAEQ,iBAAA21B,GACN,MAAMS,EAASthC,KAAKuhC,cAAc,8BAClC,IAAKD,EAAQ,MAAO,CAAA,EACpB,IACE,OAAOpM,KAAKsM,MAAMF,EAAOrN,aAAe,KAC1C,CAAE,MACA,MAAO,CAAA,CACT,CACF,CAEA,iBAAOyN,CAAW5/B,EAAYwB,GAC5B,MAAMtC,EAAU1F,EAAOV,SAASE,IAC1B6mC,EAAW7/B,aAAgB8/B,QAC7B9/B,EACAA,aAAgB+/B,SACd//B,EAAK3H,gBACL,KACN,IAAKwnC,EAAU,OAAO,KAEtB,OADWA,EAASJ,cAAc,GAAGvgC,WAAiBsC,MAExD,CASA,uBAAOw+B,CAAiBC,GACtB,MAAMC,EAAOD,EAAgBE,QAC7B,IAAKD,GAAsB,iBAARA,EAAkB,MAAO,CAAA,EAC5C,MAAM9zB,EAA4B,CAAA,EAClC,IAAK,MAAO+C,EAAKtQ,KAAUxD,OAAO0G,QAAQm+B,GACnC/wB,EAAIzD,WAAW,MAAyB,mBAAV7M,IACjCuN,EAAK+C,GAAOtQ,GAGhB,OAAOuN,CACT,CAEA,mBAAOg0B,CAAaC,EAAgB1B,GAElC,MAAM2B,EAAaloC,SAAS6hC,cAAc,UAC1CqG,EAAWlO,aAAa,OAAQ,oBAChCkO,EAAWnO,YAAciM,GAAoBhL,KAAKC,UAAUsL,IAC5D0B,EAAMtR,YAAYuR,GAGlB,MAAMC,ErFjJD1+B,MAAMoc,KAAKzR,GAAmByC,QqFkJnC,IAAK,MAAMvC,KAAQ6zB,EAAO,CACxB,MAAM3zB,EAAeY,GAAsBd,GAC3C,IAAKE,EAAc,SAEnB,MAAM+yB,EAAMvnC,SAAS6hC,cAAc,YACnC0F,EAAIvN,aAAa,KAAM1lB,GAEvB,MAAM8zB,EAAa5zB,EAAaG,oBAC1B/B,EAAsC,SAA3Bw1B,EAAWz9B,YACxB,QACA,GAAGy9B,EAAWz9B,gBAAgBy9B,EAAW79B,gBAC7Cg9B,EAAIvN,aAAa54B,EAAOhB,kBAAmBwS,GAE3C,MAAMqd,EAAUzb,EAAa4F,SAASiuB,WAAU,GAChDd,EAAItX,QAAQ0G,YAAY1G,GAExBgY,EAAMtR,YAAY4Q,EACpB,CAGA,MAAMe,EzBtKD7+B,MAAMoc,KAAKgU,IyBuKhB,GAAIyO,EAASpiC,OAAS,EAAG,CACvB,MAAMqiC,EAAqD,CAAA,EAC3D,IAAK,IAAIxlC,EAAI,EAAGA,EAAIulC,EAASpiC,OAAQnD,IAAK,CACxC,MAAMlB,EAAOymC,EAASvlC,GAChB4G,EAAUiwB,GAAiB/3B,GACjC,GAAuB,IAAnB8H,EAAQzD,OAAc,SAC1B,MAAMxE,EAAK,WAAWqB,IACrBlB,EAAiBm4B,aAAa,kBAAmBt4B,GAClD,MAAMylC,EAAiC,CAAA,EACvC,IAAK,MAAMv9B,KAASD,EAClBw9B,EAAMv9B,EAAMQ,UAAYR,EAAMnD,MAEhC8hC,EAAU7mC,GAAMylC,CAClB,CACA,GAAIlkC,OAAO4T,KAAK0xB,GAAWriC,OAAS,EAAG,CACrC,MAAMsiC,EAAcxoC,SAAS6hC,cAAc,UAC3C2G,EAAYxO,aAAa,OAAQ,oBACjCwO,EAAYxO,aAAa,qBAAsB,IAC/CwO,EAAYzO,YAAciM,GAAoBhL,KAAKC,UAAUsN,IAC7DN,EAAMtR,YAAY6R,EACpB,CACF,CzBlLF3O,GAAatc,OyBqLb,CAKA,kCAAOkrB,CAA4B7gC,GACjC,MAAM8N,EAAS1V,SAAS2V,iBAAiB/N,EAAMgO,WAAWE,cACpD4yB,EAAsB,GAC5B,KAAOhzB,EAAOQ,YAAY,CACxB,MAAMwtB,EAAUhuB,EAAO3K,aACnB86B,GAAgB3D,KAAKwB,EAAQ1vB,OAAS8xB,GAAc5D,KAAKwB,EAAQ1vB,QACnE00B,EAASviC,KAAKu9B,EAElB,CACA,IAAK,MAAMA,KAAWgF,EACpBhF,EAAQvmB,QAEZ,CAKA,+BAAOwrB,CAAyB/gC,GAC9B,MAAM8N,EAAS1V,SAAS2V,iBAAiB/N,EAAMgO,WAAWE,cACpD4yB,EAAsB,GAC5B,KAAOhzB,EAAOQ,YAAY,CACxB,MAAMwtB,EAAUhuB,EAAO3K,YACnB66B,GAAwB1D,KAAKwB,EAAQ1vB,OACvC00B,EAASviC,KAAKu9B,EAElB,CACA,IAAK,MAAMA,KAAWgF,EACpBhF,EAAQvmB,QAEZ,CAOA,0BAAOyrB,CAAoBhhC,GACzB,MAAM8N,EAAS1V,SAAS2V,iBAAiB/N,EAAMgO,WAAWE,cACpD+yB,EAAsD,GAE5D,KAAOnzB,EAAOQ,YAAY,CACxB,MAAMwtB,EAAUhuB,EAAO3K,YACjBkJ,EAAQ8xB,GAAe7xB,KAAKwvB,EAAQ1vB,MACtCC,GACF40B,EAAc1iC,KAAK,CAAEu9B,UAASv/B,KAAM8P,EAAM,IAE9C,CAEA,IAAK,MAAMyvB,QAAEA,EAAOv/B,KAAEA,KAAU0kC,EAAe,CAC7C,MAAMC,EAAc9oC,SAASw5B,cAAc,OAAOr1B,KAClDu/B,EAAQprB,WAAYwe,aAAagS,EAAapF,GAE9C,IAAIqF,EAAuBrF,EAAQ7M,YACnC6M,EAAQvmB,SAER,MAAM6rB,EAAa,kBAAkB7kC,IACrC,KAAO4kC,GAAS,CACd,MAAM3rB,EAAoB2rB,EAAQlS,YAClC,GAAIkS,EAAQriC,WAAaC,KAAKmN,cAAiBi1B,EAAoB/0B,OAASg1B,EAAY,CACtFD,EAAQzwB,WAAY0e,YAAY+R,GAChC,KACF,CACAA,EAAQzwB,WAAY0e,YAAY+R,GAChCA,EAAU3rB,CACZ,CACF,CACF,CAYA,iBAAO6rB,CAAWrhC,GAChB,MAAM29B,EAAOvlC,SAASulC,KAGhB2D,EAActhC,EAAKyyB,iBAAiBj5B,EAAOV,SAASE,KACpDuoC,EAAiB,IAAIllC,IAC3B,IAAK,MAAMmlC,KAAWF,EAAa,CACjC,MAAMxH,EAAY0H,EAAQ/O,iBAAsC,gBAChE,IAAK,MAAMkN,KAAO7F,EAAW,CAC3B,MAAMhgC,EAAK6lC,EAAIrgC,aAAa,MACxBxF,GACFynC,EAAe/mC,IAAIV,EAAI6lC,EAE3B,CACF,CAGA,MAAM8B,EAAUrpC,SAAS2V,iBAAiB4vB,EAAM3vB,WAAWE,cACrD+yB,EAA2B,GACjC,KAAOQ,EAAQnzB,YAAY,CACzB,MAAMwtB,EAAU2F,EAAQt+B,YACpB86B,GAAgB3D,KAAKwB,EAAQ1vB,OAC/B60B,EAAc1iC,KAAKu9B,EAEvB,CACA,IAAK,MAAMnK,KAAgBsP,EAAe,CACxC,MAAM50B,EAAQ4xB,GAAgB3xB,KAAKqlB,EAAavlB,MAG1Cg1B,EAAa,SAFN/0B,EAAM,UACNA,EAAM,KAEnB,IAAI80B,EAAUxP,EAAa1C,YAC3B,KAAOkS,GAAS,CACd,MAAM3rB,EAAO2rB,EAAQlS,YACrB,GAAIkS,EAAQriC,WAAaC,KAAKmN,cAAiBi1B,EAAoB/0B,OAASg1B,EAAY,CACtFD,EAAQ5rB,SACR,KACF,CACA4rB,EAAQ5rB,SACR4rB,EAAU3rB,CACZ,CACAmc,EAAapc,QACf,CAGAgpB,GAAIyC,oBAAoBrD,GAGxB,MAAM+D,EAAUtpC,SAAS2V,iBAAiB4vB,EAAM3vB,WAAWE,cACrDyzB,EAAqD,GAC3D,KAAOD,EAAQpzB,YAAY,CACzB,MAAMwtB,EAAU4F,EAAQv+B,YACxB,GAAI66B,GAAwB1D,KAAKwB,EAAQ1vB,MAAO,CAC9C,MAAMM,EAAOovB,EAAQ1vB,KAAKjO,MAAM,KAAK,GACrCwjC,EAAapjC,KAAK,CAAEu9B,UAASpvB,QAC/B,CACF,CACA,IAAK,MAAMovB,QAAEA,EAAOpvB,KAAEA,KAAUi1B,EAAc,CAC5C,MAAMhC,EAAM4B,EAAennC,IAAIsS,GAC/B,GAAIizB,EAAK,CACP,MAAMiC,EAAWxpC,SAAS6hC,cAAc,YAClC4B,EAAW8D,EAAIrgC,aAAa9F,EAAOhB,mBACrCqjC,GAAU+F,EAASxP,aAAa54B,EAAOhB,kBAAmBqjC,GAC9D,MAAMgG,EAAWzpC,SAASs3B,WAAWiQ,EAAItX,SAAS,GAClD,GAAIwZ,EAASz+B,WAAW9E,OAAS,EAC/BsjC,EAASvZ,QAAQ0G,YAAY8S,QAE7B,IAAK,MAAM3hB,KAASre,MAAMoc,KAAK0hB,EAAIv8B,YACjCw+B,EAASvZ,QAAQ0G,YAAY32B,SAASs3B,WAAWxP,GAAO,IAG5D4b,EAAQprB,WAAYqV,aAAa6b,EAAU9F,EAC7C,CACF,CAGA,MAAMgG,EAAgB9hC,EAAKyyB,iBAAiB,qBAC5C,IAAK,MAAMiD,KAAMoM,EACfpM,EAAGrD,gBAAgB,mBAIrB,IAAK,MAAMqD,KAAM4L,EACf5L,EAAGngB,QAEP,ECpWF,MAAMwsB,GAAmB,IAAIvjC,IAAI,CAAC,MAAO,KAAM,SAAU,SAsEzD,SAASwjC,GACPxU,GAEA,MAAM+C,EAAiB,IAAI1O,GAC3B,GAAqB,IAAjB2L,EAAMlvB,OACR,MAAO,CAAEqR,aAAc,GAAI9B,gBAAiB,GAAI0iB,kBAIlD,MAAM0R,EAASzU,EAAM,GAAG9c,WAClBue,EAAczB,EAAMA,EAAMlvB,OAAS,GAAG2wB,YAGtCiT,EAAU9pC,SAAS6hC,cAAc,OACvC,IAAK,MAAMhgC,KAAQuzB,EACjB0U,EAAQnT,YAAY90B,GAItB,MAAO4T,EAAiBoC,GAAeD,GAA4BkyB,GAE7DvyB,EAAe4gB,EAAepO,WAAWlS,EAAa,CAC1DoS,iBAAiB,EACjBG,kBAAkB,IAIpB,GAAIyf,EACF,KAAOC,EAAQjiB,YACbgiB,EAAO/S,aAAagT,EAAQjiB,WAAYgP,GAI5C,MAAO,CACLtf,eACA9B,kBACA0iB,iBAEJ,CAqGA,SAAS4R,GAAuBniC,EAAYqU,EAAc3H,GACxD,MAMMH,EANqC,CACzCupB,IAAOt8B,EAAOd,iBACd2+B,GAAM79B,EAAOb,gBACb4+B,OAAU/9B,EAAOZ,oBACjB0+B,KAAQ99B,EAAOX,mBAEUwb,GAC3B,IAAK9H,EAAS,OAAO,KAErB,MAAM61B,EAAU,KAAK71B,KAAWG,IAC1BoB,EAAS1V,SAAS2V,iBAAiB/N,EAAMgO,WAAWE,cAC1D,KAAOJ,EAAOQ,YAAY,CACxB,MAAMwtB,EAAUhuB,EAAO3K,YACvB,GAAI24B,EAAQ1vB,OAASg2B,EACnB,OAAOtG,CAEX,CACA,OAAO,IACT,CAKA,SAASuG,GAAiBriC,EAAgBqgC,GACxC,MAAM1zB,EAAW3M,EACjB,IAAIsiC,EAAgD,KAEpD,IAAK,MAAO51B,EAAMizB,KAAQU,EAAMvG,UAAW,CAGzC,IAAI/sB,EADyBhC,GADZ40B,EAAIrgC,aAAa9F,EAAOhB,oBAAsB,IAEhB,GAC/C,MAAMuK,EAAcgK,EAAoBhK,YAIpB,SAAhBA,GAA0Bu/B,EAC5Bv1B,EAAsB,IACjBu1B,EACHx/B,WAAY,IAAIw/B,EAAkBx/B,WAAY03B,MAC9Cz3B,YAAa,QAEU,WAAhBA,GAA4Bu/B,IACrCv1B,EAAsB,IACjBA,EACHzK,UAAWggC,EAAkBhgC,YAKb,OAAhBS,GAEuB,WAAhBA,EADTu/B,EAAoBv1B,EAGK,SAAhBhK,IACTu/B,EAAoB,MAGtB,MAAM9vB,EAAWpa,SAASs3B,WAAWiQ,EAAItX,SAAS,GAC5CsS,EAA0B,QAAhB53B,EAAwBgK,EAAoBpK,mBAAgB/D,EAC5Ey9B,GAAiB7pB,GACM,iBAAZmoB,GACTiB,GAAqBppB,EAAUmoB,GAEjC+B,GAA2B/vB,EAAU6F,EAAUmoB,GAO/CluB,GAAsBC,EAAMC,EALP,CACnB6F,WACAzF,sBACAK,UAAW8uB,GAAqB1pB,IAGpC,CACF,CAOOzY,eAAewoC,GAAgBviC,SAC9Bq9B,GAAuBr9B,GAG7B,MAAMshC,EAActhC,EAAKyyB,iBAAiBj5B,EAAOV,SAASE,KAC1D,IAAK,MAAMwoC,KAAWF,EAAa,CACjC,MAAMjB,EAAQmB,EACd,IAAKnB,EAAMpB,gBAKT,OAJA1vB,QAAQ8G,KACN,kDAAkDgqB,EAAM1/B,qBAAqBm9B,qCAE/ES,GAAI8C,WAAWrhC,IACR,CAEX,CAGA,IAAK,MAAMwhC,KAAWF,EACpBe,GAAiBriC,EAAMwhC,GAIzB,MAAMgB,EAzSR,SAA0BxiC,GACxB,MAAMwiC,EAAsB,GACtB10B,EAAS1V,SAAS2V,iBAAiB/N,EAAMgO,WAAWE,cACpD+yB,EAA2B,GAGjC,KAAOnzB,EAAOQ,YACZ2yB,EAAc1iC,KAAKuP,EAAO3K,aAG5B,IAAK,MAAM24B,KAAWmF,EAAe,CACnC,MAAMwB,EAAaxE,GAAgB3xB,KAAKwvB,EAAQ1vB,MAChD,IAAKq2B,EAAY,SAEjB,MAAMpuB,EAAOouB,EAAW,GAClBne,EAAOme,EAAW,GAClBnH,EAAQhX,EAAKnmB,MAAM,KAEzB,IAAIuO,EACAnQ,EACAoa,EAAuB,KAEd,QAATtC,GAEF3H,EAAO4uB,EAAM,GACb/+B,EAAO++B,EAAM,GACb3kB,EAAQlQ,SAAS60B,EAAM,GAAI,MAG3B5uB,EAAO4uB,EAAM,GACb/+B,EAAO++B,EAAM31B,MAAM,GAAGY,KAAK,MAI7B,MAAMinB,EAAgB,GACtB,IAAI2T,EAAUrF,EAAQ7M,YACtB,MAAMmS,EAAa,SAAS/sB,SAAYiQ,IACxC,KAAO6c,IACDA,EAAQriC,WAAaC,KAAKmN,cAAiBi1B,EAAoB/0B,OAASg1B,IAG5E5T,EAAMjvB,KAAK4iC,GACXA,EAAUA,EAAQlS,YAGpBuT,EAAOjkC,KAAK,CAAE8V,OAAM3H,OAAMnQ,OAAMoa,QAAO6W,SACzC,CAEA,OAAOgV,CACT,CAwPiBE,CAAiBtqC,SAASulC,OAtM3C,SAAuB39B,EAAYwiC,GAEjC,MAAMG,EAA+C,IAAItmC,IAEzD,IAAK,MAAMumC,KAASJ,EAAQ,CAC1B,GAA2B,IAAvBI,EAAMpV,MAAMlvB,OAAc,SAE9B,MAAM+pB,EAAUiH,GAAuBsT,EAAMpV,QAGvC7d,aAAEA,EAAY9B,gBAAEA,EAAe0iB,eAAEA,GAAmByR,GAA6BY,EAAMpV,OAC7FJ,GAA2B/E,EAASkI,GAIpC,IAAK,MAAMt2B,KAAQ4T,EACb5T,EAAK6E,WAAaC,KAAKC,cACxB/E,EAAiBm4B,aAAa,qBAAsB,IAGzDnF,GAAqB5E,EAAS1Y,GAC9B4d,GAAkBlF,EAASxa,GAE3B,MAAM+hB,EAAgC,GACtC,IAAK,MAAMlc,KAAW/D,EAChB+D,EAAQ/Q,iBAAiBvH,GAC3Bw0B,EAAcrxB,KAAKmV,GAKvB,GAFA4U,GAA0BD,EAASuH,GAEhB,QAAfgT,EAAMvuB,MAAkC,OAAhBuuB,EAAMjsB,MAAgB,CAChD,MAAMksB,EAAqBV,GAAuBniC,EAAM,MAAO4iC,EAAMl2B,MACrE,GAAIm2B,EAAoB,CACtB,MAAM7wB,EAAYwX,GAAgB,KAAMoZ,EAAMjsB,OAC9Cka,GAAkBgS,EAAoB7wB,EAAWqW,GAEjD2I,GAAmB6R,EADFD,EAAMpV,MAAMoV,EAAMpV,MAAMlvB,OAAS,IAElD0vB,GAAiB6U,EAAoBxa,GAMrCoF,GAAyBpF,EAFJxT,GADJvY,EAAYsmC,EAAMrmC,KAAO,IAAMxB,GACEiX,IAIlDue,EAAepO,WAAWxS,EAAc,CACtC0S,iBAAiB,EACjBE,kBAAkB,EAClBC,kBAAkB,IAIpB,IAAI7J,EAAUgqB,EAAkBvoC,IAAIwoC,EAAMl2B,MACrCiM,IACHA,EAAU,GACVgqB,EAAkBnoC,IAAIooC,EAAMl2B,KAAMiM,IAEpCA,EAAQpa,KAAKyT,EACf,CACF,KAAO,CACL,MAAM6wB,EAAqBV,GAAuBniC,EAAM4iC,EAAMvuB,KAAMuuB,EAAMl2B,MACtEm2B,IACF7U,GAAiB6U,EAAoBxa,GAErCkI,EAAepO,WAAWxS,EAAc,CACtC0S,iBAAiB,EACjBE,kBAAkB,EAClBC,kBAAkB,IAGxB,CACF,CAGA,IAAK,MAAO9V,EAAMiM,KAAYgqB,EAAmB,CAC/C,MAAME,EAAqBV,GAAuBniC,EAAM,MAAO0M,GAC/D,IAAKm2B,EAAoB,SAEzB,MAAMl2B,EAAWk2B,EAAmBjvB,cAE9BhH,EAAeY,GAAsBd,GAC3C,IAAKE,EAAc,SACnB,MAAMtK,EAAYsK,EAAaG,oBAAoBzK,UAC7CK,EAAgBiK,EAAaG,oBAAoBpK,cACjDqK,EAAeC,GAAsBN,EAAUrK,GAChD0K,GACLA,EAAawJ,YAAY,WAAazd,IACpC,MAAM4wB,EAAO5wB,EAAM4J,GACfd,MAAMC,QAAQ6nB,IAChBC,GAAqBD,EAAMhR,IAGjC,CACF,CAyGEmqB,CAAc1qC,SAASulC,KAAM6E,GAG7BjE,GAAIsC,4BAA4BzoC,SAASulC,MAGzC,MAAMoF,EAAiE,GACvE,IAAK,MAAMrN,KAAM4L,EACX5L,EAAGhlB,aACLqyB,EAAWxkC,KAAK,CAAEm3B,KAAIuM,OAAQvM,EAAGhlB,WAAY8E,KAAMkgB,EAAGzG,cACtDyG,EAAGngB,UAQPgpB,GAAIyC,oBAAoB5oC,SAASulC,MAGjC,MAAO9vB,EAAiBoC,GAAeD,GAA4B5X,SAASulC,MAI5E,IAAK,MAAM1jC,KAAQ4T,EACjB,GAAI5T,EAAK6E,WAAaC,KAAKC,aAAc,CACvC,MAAM02B,EAAKz7B,EACNy7B,EAAGp9B,aAAa,wBACnBqY,GAAqB1W,EAAM,MAC3By7B,EAAGtD,aAAa,qBAAsB,IAE1C,MAEEzhB,GAAqB1W,EAAM,MAK/B,MAAM+oC,EAAiC,GACjCC,EAAqC,GAErCC,EADiBxb,GAA0BtvB,SAASulC,MACfxb,WAAWlS,GAEtD,IAAK,MAAMyD,KAAWwvB,EACpB,GAA4B,UAAxBxvB,EAAQ3Q,YACZ,GAAIg/B,GAAiBtnC,IAAIiZ,EAAQ3Q,aAC/BkgC,EAAmB1kC,KAAKmV,OACnB,IAAIA,EAAQ/Q,cAAcvD,SAASrE,GAExC,SAEAioC,EAAezkC,KAAKmV,EACtB,CAKF,IAAK,MAAMA,KAAWuvB,EACpB,GAA4B,QAAxBvvB,EAAQ3Q,YAAuB,CACjC,MAAMogC,EAAUpvB,GAAiCL,GAE3C1G,EAAeC,GADJyG,EAAQ9D,YAAYgE,cACgBF,EAAQpR,WACzD0K,GACFA,EAAawJ,YAAY,WAAazd,IACpC,MAAM8F,EAAQ9F,EAAM2a,EAAQ/Q,eACxBd,MAAMC,QAAQjD,IAChBkS,GAAuCoyB,EAAStkC,IAIxD,CAIFwiB,GAAwB2hB,GAGxB,IAAK,MAAMtN,GAAEA,EAAEuM,OAAEA,EAAMzsB,KAAEA,KAAUutB,EACjCd,EAAO/S,aAAawG,EAAIlgB,GAI1B,MAAM4tB,EAAsBpjC,EAAKyyB,iBAAiBj5B,EAAOV,SAASE,KAClE,IAAK,MAAMwoC,KAAW4B,EAAqB,CACzC,MACM7D,EADQiC,EACM1C,aACpB,IAAK,MAAOhlC,EAAIupC,KAAYhoC,OAAO0G,QAAQw9B,GAAQ,CACjD,MAAMp/B,EAASH,EAAKy/B,cAAc,qBAAqB3lC,OACvD,GAAKqG,EACL,IAAK,MAAOqC,EAAU3D,KAAUxD,OAAO0G,QAAQshC,GAC5CljC,EAAeqC,GAAY3D,CAEhC,CACF,CAGA,MAAMykC,EAAetjC,EAAKyyB,iBAAiB,wBAC3C,IAAK,MAAMiD,KAAM4N,EACf5N,EAAGrD,gBAAgB,sBAGrB,OAAO,CACT,CC5bA,MAAMkR,GAAsE,IAAI5pC,QAC1E6pC,GAAoD,IAAI7pC,QAKxD8pC,GAAwC,IAAIjlC,IAM5C,SAAUyO,GAAsBN,EAAenL,GACnD,IAAIkiC,EAAqBH,GAAyBnpC,IAAIuS,GACtD,OAAK+2B,GAGEA,EAAmBtpC,IAAIoH,IAFrB,IAGX,CAKM,SAAUmiC,GAAiBh3B,GAC/B,OAAO62B,GAAoBppC,IAAIuS,IAAarS,QAAQC,SACtD,UAEgBqpC,GAAsBj3B,EAAenL,EAAcvC,GAEjE,IAAIykC,EAAqBH,GAAyBnpC,IAAIuS,GAEtD,GAAgB,OAAZ1N,EAAkB,CAEpB,IAAKykC,EACH,OAEF,MAAM9iB,EAAU8iB,EAAmBtpC,IAAIoH,GACvCkiC,EAAmB72B,OAAOrL,GACM,IAA5BkiC,EAAmBzwB,MACrBswB,GAAyB12B,OAAOF,QAElB/N,IAAZgiB,IACF6iB,GAAkB52B,OAAO+T,GACJ,OAAjB1M,IACFA,GAAa,CAAEG,KAAM,6BAA8B7S,OAAMmL,WAAU1N,QAAS2hB,KAG5EpnB,EAAON,OACTqW,QAAQrW,MAAM,qCAAqCsI,KAEvD,KAAO,CAEL,IAAKkiC,EAAoB,CACvBA,EAAqB,IAAIrnC,IACzBknC,GAAyB/oC,IAAImS,EAAU+2B,GAGvC,MAAMG,GAAa3rC,KAAY+G,EAA+B3G,eAAe,cAC7E,GAAkC,iBAA9BqU,EAAS5O,YAAYyD,MAAyD,aAA9BmL,EAAS5O,YAAYyD,KAAqB,CAC5F,MAAMsiC,EAAQ,IAAIxpC,QAAeC,IAC/BwpC,eAAehqC,UACb,GAAI8pC,EAAW,OACStB,GAAgB51B,UAE9B+wB,GAAc/wB,EAExB,YACQ+wB,GAAc/wB,GAEtBpS,QAGJipC,GAAoBhpC,IAAImS,EAAUm3B,EACpC,MAAO,GAAkC,eAA9Bn3B,EAAS5O,YAAYyD,KAAuB,CACrD,MAAMsiC,EAAQ,IAAIxpC,QAAeC,IAC/BwpC,eAAehqC,gBACP2jC,GAAc/wB,GACpBpS,QAGJipC,GAAoBhpC,IAAImS,EAAUm3B,EACpC,CACF,CACIJ,EAAmBjpC,IAAI+G,IACzBS,EAAW,4BAA4BT,6BAEzCkiC,EAAmBlpC,IAAIgH,EAAMvC,GAC7BwkC,GAAkB5oC,IAAIoE,GACD,OAAjBiV,IACFA,GAAa,CAAEG,KAAM,2BAA4B7S,OAAMmL,WAAU1N,YAE/DzF,EAAON,OACTqW,QAAQrW,MAAM,mCAAmCsI,KAASvC,EAE9D,CACF,CCtFA,MAAM+kC,GAAiD,IAAIxlC,IAKrD,SAAUylC,GAA4Brd,GAC1Cod,GAAqBnpC,IAAI+rB,EAC3B,CAiJA,MAAMsd,GAAU,IAvHhB,MACUC,oBAA6C,GACrD,WAAApmC,GACA,CAEA,sBAAAqmC,CACE9vB,EACA2G,EAAsC,MAEtC,MAAMopB,EAA0D,IAApCnmC,KAAKimC,oBAAoB7lC,OACrDJ,KAAKimC,oBAAoB5lC,KAAK,CAAE+V,kBAAiB2G,YAC7CopB,GACFN,eAAe,KACb,MAAMO,EAAgBpmC,KAAKimC,oBAC3BjmC,KAAKimC,oBAAsB,GAC3BjmC,KAAK65B,aAAauM,IAGxB,CAGA,eAAAC,CACEC,EACAC,GAEAvmC,KAAK65B,aAAayM,EAAkBp7B,IAAI,CAACkL,EAAiBqC,KAAK,CAC7DrC,kBACA2G,QAASwpB,IAAW9tB,IAAU,QAElC,CAEQ,YAAAohB,CAAauM,GAOnB,MAAMI,EAA2B,IAAIroC,IACrC,IAAK,MAAMqlB,KAAU4iB,EAAe,CAClC,MAAM/oB,EAAWmpB,EAAyBtqC,IAAIsnB,EAAOpN,iBAElC,OAAjBJ,UACUqH,GACY,OAAnBmG,EAAOzG,SACPM,EAASV,gBAAkB6G,EAAOzG,QAAQJ,eAE7C3G,GAAa,CACXG,KAAM,wBACNC,gBAAiBoN,EAAOpN,gBACxBqwB,qBAAsBppB,EAASV,cAC/B+pB,oBAAqBljB,EAAOzG,QAAQJ,gBAGxC6pB,EAAyBlqC,IAAIknB,EAAOpN,gBAAiBoN,EAAOzG,QAC9D,CACA,MAAM4pB,EAAkC,GAClCtR,EAA8B,IAAIl3B,IACxC,IAAK,MAAOiY,EAAiB2G,KAAYypB,EAA0B,CACjE,GAAgB,OAAZzpB,GAAoBA,EAAQF,K3GtGF,G2GsG+B,CAG3DxL,QAAQuO,MAAM,8EAA+E,CAC3FvhB,KAAM+X,EAAgB3C,iBAAiBnV,SAASD,KAChD+F,UAAWgS,EAAgB3C,iBAAiBrP,UAC5CuY,cAAeI,EAAQJ,cACvBE,IAAKE,EAAQF,IACb+pB,Q3G9G0B,K2GgHP,OAAjB5wB,IACFA,GAAa,CACXG,KAAM,wBACNC,kBACAuG,cAAeI,EAAQJ,cACvBE,IAAKE,EAAQF,MAGjB,QACF,CAKA,MAAM/Y,EAAQyS,GAAuBH,GACrC,QAAc1V,IAAVoD,EAGJ,GAAIA,aAAiBxD,IACnB,IAAI,MAAMkV,KAAW1R,GACqB,IAApC0R,EAAQ9D,YAAYiE,cAIxBgxB,EAAgBtmC,KAAKmV,GACL,OAAZuH,GACFsY,EAA4B/4B,IAAIkZ,EAASuH,SAGF,IAAlCjZ,EAAM4N,YAAYiE,cAC3BgxB,EAAgBtmC,KAAKyD,GACL,OAAZiZ,GACFsY,EAA4B/4B,IAAIwH,EAAOiZ,GAG7C,CAEIsY,EAA4BtgB,KAAO,EACrCoO,GAAwBwjB,EAAiBtR,GAEzClS,GAAwBwjB,GAzH9B,SAAoCE,GAClC,IAAK,MAAMne,KAAYod,GACrBpd,EAASme,EAEb,CA0HIC,CAA2B,IAAIxmC,IAAIkmC,EAAyBz1B,QAC9D,YAMcg2B,KACd,OAAOf,EACT,CC7JO,MAAMgB,GAAuB,qCC6EpBC,KACd,MAAMC,EAAU1lC,WACV9E,EAAWwqC,EAAQF,IACzB,QAAiBtmC,IAAbhE,EAOF,ODpFqC,IC8EjCA,EAAS+F,SAEX4O,QAAQ8G,KACN,kEAAkEzb,EAAS+F,oEAGxE/F,EAET,MAAMgF,EAtER,WACE,MAAMylC,EAAU,IAAIhpC,IACdipC,EAAY,IAAI9mC,IAChB+mC,EAAaC,IACjB,GAAuB,IAAnBF,EAAUryB,KAEZ,YADAuyB,EAAOC,SAAS,MAGlB,MAAMC,EAAWF,EAAO1rC,GACxB0rC,EAAOC,SAAUhkC,IACf,IAAK,MAAMmlB,KAAY0e,EACrB1e,EAAS+e,UAAUD,EAAUjkC,MAInC,MAAO,CACLd,QDhCqC,ECiCrC0kC,UACA,QAAAO,CAASJ,GACP,IAAIH,EAAQ5qC,IAAI+qC,EAAO1rC,IAAvB,CAGAurC,EAAQ7qC,IAAIgrC,EAAO1rC,GAAI0rC,GACvBD,EAAUC,GACV,IAAK,MAAM5e,KAAY0e,EACrB1e,EAASif,qBAAqBL,EAJhC,CAMF,EACA,UAAAM,CAAWJ,GACT,MAAMF,EAASH,EAAQjrC,IAAIsrC,GAC3B,QAAe9mC,IAAX4mC,EAAJ,CAGAA,EAAOC,SAAS,MAChBJ,EAAQx4B,OAAO64B,GACf,IAAK,MAAM9e,KAAY0e,EACrB1e,EAASmf,uBAAuBL,EAJlC,CAMF,EACA,WAAAM,CAAYpf,GACV0e,EAAUzqC,IAAI+rB,GAEd,IAAK,MAAM4e,KAAUH,EAAQ5gB,SAC3B8gB,EAAUC,GACV5e,EAASif,qBAAqBL,GAEhC,MAAO,KACL,GAAKF,EAAUz4B,OAAO+Z,GAGtB,IAAK,MAAM4e,KAAUH,EAAQ5gB,SAC3B8gB,EAAUC,GAGhB,EAEJ,CAcmBS,GAEjB,OADAb,EAAQF,IAAwBtlC,EACzBA,CACT,CAKA,MAAMsmC,GAAsCnB,IACrB,OAAjB7wB,IACFA,GAAa,CAAEG,KAAM,qBAAsB8xB,UAAWpB,KAQ1D,SAASqB,GAAQC,GACf,MAAMC,EAA6B,OAAjBpyB,I3E1Gd,SAA0BmyB,GAC9BnyB,GAAemyB,CACjB,C2EyGEE,CAAgBF,GAChB,MAAMG,EAAoB,OAATH,EFjGb,IAAwCzf,EEkGxC4f,IAAaF,EACfrC,GAA4BiC,KAClBM,GAAYF,IFpGoB1f,EEqGZsf,GFpGhClC,GAAqBn3B,OAAO+Z,GEsG9B,CAEA,SAAS6f,GAA0BxnC,GACjC,MAAO,CACLuC,KAAMvC,EAAQuC,KACdmL,SAAU1N,EAAQ0N,SAClB1N,UACAynC,MAAO,CACL/c,KAAM1qB,EAAQ0nC,UACd1nC,QAASA,EAAQ2nC,aACjBllC,OAAQzC,EAAQ4nC,YAChBC,OAAQ7nC,EAAQ8nC,aAElBC,kBAAmB/nC,EAAQ+nC,kBAC3BvuB,gBAAiBxZ,EAAQwZ,gBACzBwuB,iBAAkBhoC,EAAQgoC,iBAC1BC,kBAAmBjoC,EAAQioC,kBAE/B,CAEA,SAASC,GAAoB3lC,EAAcmL,GACzC,OAAOM,GAAsBN,EAAUnL,IACrCS,EAAW,4CAA4CT,KAC3D,CAQA,IAAI4lC,GAA2C,cAM/BC,KACd,GAAInvC,IACF,OAEF,GAAyB,OAArBkvC,GACF,OAEF,MAAM5B,EAA0B,CAC9B1rC,GAjBK,SAAWgN,KAAKwgC,SAAS1/B,SAAS,IAAIjC,MAAM,EAAG,IAkBpD6R,KAAM,QACN+vB,eAAgBzJ,GAChB,gBAAA0J,GACE,MAAMC,EAAoC,GAC1C,IAAK,MAAMxoC,KHrKRwkC,GGsKDgE,EAAUlpC,KAAKkoC,GAA0BxnC,IAE3C,OAAOwoC,CACT,EACA,IAAAx4B,CAAKzN,EAAcmL,GACjB,MAAM1N,EAAUkoC,GAAoB3lC,EAAMmL,GACpCkC,EAAmB,GAoBzB,OAnBA5P,EAAQuX,YAAY,WAAazd,IAK/B,IAAK,MAAMoW,KAAO9T,OAAO4T,KAAKlW,GAC5B,IAAIoW,EAAI/P,SAAS,OAAQ+P,EAAIzD,WAAW,KAAxC,CAGA,IACE,GAAkE,mBAAtD3S,EAA6CoW,GACvD,QAEJ,CAAE,MAEF,CACAN,EAAOtQ,KAAK4Q,EARZ,IAWGN,CACT,EACA,IAAA64B,CAAKlmC,EAAcmL,EAAgBpQ,EAAcoc,GAE/C,IAAI9J,EAIJ,OALgBs4B,GAAoB3lC,EAAMmL,GAElC6J,YAAY,WAAazd,IAC/B8V,EAAU9V,EAAmF,SAAEwD,EAAMoc,GAAW,MAE3G9J,CACT,EACA,KAAA84B,CAAMnmC,EAAcmL,EAAgBpQ,EAAcsC,EAAgB8Z,GAChDwuB,GAAoB3lC,EAAMmL,GAClC6J,YAAY,WAAazd,SACf6F,IAAZ+Z,GAAyBA,EAAQra,OAAS,EAI3CvF,EAA4F,SAAEwD,EAAMoc,EAAS9Z,GAE7G9F,EAA6CwD,GAAQsC,GAG5D,EACA4mC,SAAUW,IAEZgB,GAAmB5B,EACnBL,KAA0BS,SAASJ,EACrC,CCvOOzrC,eAAe6tC,GAAoBpI,EAA2Bh+B,GACnE,IAAIqmC,EAAoC,KACxC,MAAMC,EAAe,mBAAmBtmC,MACxC,GAAmC,mBAAxBumC,IAAIC,gBAAgC,CAE7C,MAAMC,EAAO,IAAIC,KAAK,CAAC1I,EAAOrzB,KAAO27B,GAAe,CAAEzzB,KAAM,2BACtD8zB,EAAMJ,IAAIC,gBAAgBC,GAChC,IACEJ,QAAqBO,OAAOD,EAC9B,SAEEJ,IAAIM,gBAAgBF,EACtB,CACF,KAAO,CAGL,MAAMG,EAAMC,KAAKljC,OAAOmjC,kBAAiB,IAAIC,aAAcC,OAAOlJ,EAAOrzB,KAAO27B,KAChFD,QAAqBO,OAAO,sCAAsCE,IACpE,CACA,OAAQT,GAAgD,iBAAzBA,EAAac,QAAwBd,EAAac,QAAoB,CAAA,CACvG,CCrBO5uC,eAAe6uC,GAAmBT,GACvC,IAEE,aADqBC,OAA0BD,IACjCQ,SAAW,CAAA,CAC3B,CAAE,MAAOhtB,GACP1Z,EAAW,+BAA+B0Z,IAC5C,CACF,CCHA,MAAMktB,GACIC,kBAAkDjnC,MAAM7G,GAAgBuxB,UAAK3tB,GAC7EmqC,QAAkB,EAE1B,iBAAA5R,CACE6R,EACA1tB,GAEsC,OAAlC0tB,EAAoBh3B,WACtB/P,EAAW,mFAEb,MAAMwO,EAAcu4B,EAChB9qC,KAAK6qC,SAAW/tC,GAClBiH,EAAW,6EAEb,MAAMgnC,EAAkB/qC,KAAK4qC,kBAAkB5qC,KAAK6qC,QAAU,GAC9D,QAA+B,IAApBE,EAAkC,CACvCA,EAAgBzsC,SAASqB,cAAgB,IAAM4S,EAAYjU,SAASqB,eACtEoE,EAAW,0HAGb,MAAMinC,EAAuBz4B,EAAYjU,SAASY,kBAAkBqT,EAAYjU,SAASY,kBAAkBkB,OAAS,GAChH2qC,EAAgBzsC,WAAa0sC,GAC/BjnC,EAAW,sHAEf,MAOMwO,EAAYuB,UAAU1T,SAAWmS,EAAYjU,SAASqB,eACxDoE,EAAW,+FAA+FwO,EAAYuB,UAAU1T,4DAA4DmS,EAAYjU,SAASqB,mBAKrN,IAAI6sB,EAFJxsB,KAAK4qC,kBAAkB5qC,KAAK6qC,SAAWt4B,EACvCvS,KAAK6qC,UAEL,IACEre,EAAWpP,EAAS7K,EACtB,SACMia,aAAoBpwB,QACtBowB,EAASye,QAAQ,KACfjrC,KAAK6qC,UACL7qC,KAAK4qC,kBAAkB5qC,KAAK6qC,cAAWnqC,KAGzCV,KAAK6qC,UACL7qC,KAAK4qC,kBAAkB5qC,KAAK6qC,cAAWnqC,EAE3C,CACA,OAAO8rB,CACT,ECxDF,MAAM/S,GAA6E,IAAIhe,QAEjF,SAAUyvC,GAAwBp8B,EAA6BxL,GACnE,IAAI5B,EAAW+X,GAAuBvd,IAAI4S,QAClB,IAAbpN,IACTA,EAAW,IAAIvD,IACfsb,GAAuBnd,IAAIwS,EAAcpN,IAE3C,IAAIiY,EAAQjY,EAASxF,IAAIoH,GAKzB,YAJqB,IAAVqW,IACTA,EAAQ,IAAIe,GAAapX,EAAMwL,EAAaxL,MAC5C5B,EAASpF,IAAIgH,EAAMqW,IAEdA,CACT,CCAA,MAAMwxB,GAA+D,IAAI1vC,QAEnE,SAAU2vC,GAAoBt8B,GAClC,MAAMrO,EAAS0qC,GAA6BjvC,IAAI4S,GAChD,QAAsB,IAAXrO,EACT,OAAOA,EAET,MAAM4qC,EAAQ,IAAIC,MAAMnuC,OAAOouC,OAAO,MAAO,CAC3C,GAAArvC,CAAIsvC,EAAiBC,GACnB,GAAoB,iBAATA,GAGN38B,EAAag6B,kBAAkBvsC,IAAIkvC,GAGxC,OAAOP,GAAwBp8B,EAAc28B,EAC/C,EACAlvC,IAAG,CAACivC,EAAiBC,IACI,iBAATA,GAAqB38B,EAAag6B,kBAAkBvsC,IAAIkvC,GAExEC,QAAO,IACE/nC,MAAMoc,KAAKjR,EAAag6B,mBAEjC,wBAAA6C,CAAyBH,EAAiBC,GACxC,GAAoB,iBAATA,GAAqB38B,EAAag6B,kBAAkBvsC,IAAIkvC,GACjE,MAAO,CACLG,cAAc,EACdC,YAAY,EACZlrC,MAAOuqC,GAAwBp8B,EAAc28B,GAInD,EACA,GAAAnvC,GACEyH,EAAW,mEACb,EACA,cAAA+nC,GACE/nC,EAAW,oEACb,IAGF,OADAonC,GAA6B7uC,IAAIwS,EAAcu8B,GACxCA,CACT,CC7BA,MAAMU,GAA2Bh5B,OAAO,sCAOlCi5B,GAA6B,IAAIvwC,QAuCjC,SAAUwwC,GAAkBn9B,EAA6Bo9B,GAC7D,MAAMC,EAAUH,GAA2B9vC,IAAI4S,GAC/C,QAAuB,IAAZq9B,EAGX,IAAK,MAAM7oC,KAAQ6oC,EAAQp7B,OACpBm7B,EAAU3vC,IAAI+G,IACjB6oC,EAAQx9B,OAAOrL,EAGrB,CAQM,SAAU8oC,GAAuBt9B,EAA6BxL,GAClE,MAAM6oC,EAAUH,GAA2B9vC,IAAI4S,GAC/C,QAAuB,IAAZq9B,EACT,OAEF,MAAMjgC,EAAOigC,EAAQjwC,IAAIoH,QACL,IAAT4I,GAIXigC,EAAQ7vC,IAAIgH,EAAM,CAChB+oC,OAAwB,SAAhBngC,EAAKmgC,OAAoBngC,EAAKmgC,OAASN,GAC/CnsB,MAAOziB,OAAOgE,GAAG+K,EAAK0T,MAAO,MAAQ,KAAOmsB,IAEhD,CCnFA,MAAMO,GAAsB,IAAIhsC,IAY1B,SAAUisC,GAAyBz9B,GACvCw9B,GAAoB39B,OAAOG,EAC7B,UAKgB09B,KACd,OAAOF,EACT,CC/BA,MAAM7yB,GAA4E,IAAIhe,QAYhF,SAAUgxC,GAAiB39B,GAC/B,OAAO2K,GAAuBvd,IAAI4S,IAAiB,IAAI3Q,GACzD,CAeM,SAAUuuC,GAAgB59B,GAI9By9B,GAAyBz9B,GACzB,MAAMjL,EAAU4V,GAAuBvd,IAAI4S,GAC3C,QAAuB,IAAZjL,EAGX,IAAK,MAAMC,KAASD,EAAQ0iB,SAC1BziB,EAAM6oC,YAAYC,QAClB9oC,EAAM6oC,WAAa,KACnB7oC,EAAMuoC,OAAS,OACfvoC,EAAM8b,MAAQ,KACdwsB,GAAuBt9B,EAAchL,EAAMR,KAE/C,CCzBA,MAAMupC,GAAyB,CAACC,EAAMC,IAAUA,EAG1CC,GAAuC,IAAI1sC,IAE3C,SAAU2sC,GAA0Bn+B,EAA6BjU,GACrE,MAAMqyC,EAAYryC,EAAkCiD,GACpD,QAAwB,IAAbovC,EAGT,YADAjB,GAAkBn9B,EAAck+B,IAGV,iBAAbE,GAAsC,OAAbA,GAClCnpC,EAAW,GAAGjG,mEAEhB,MAAM+F,EAAU,IAAI1F,IACpB,IAAK,MAAOmF,EAAM6pC,KAAQhwC,OAAO0G,QAAQqpC,GAAsC,CACzD,IAAhB5pC,EAAKlD,QACP2D,EAAW,GAAGjG,4CAEZwF,EAAKpC,SAAStE,IAChBmH,EAAW,GAAGjG,YAA6BwF,qCAAwC1G,uBAEjF0G,EAAKpC,SAASrE,IAChBkH,EAAW,GAAGjG,YAA6BwF,qCAAwCzG,uBAEjFyG,EAAKkK,WAAW,MAClBzJ,EAAW,GAAGjG,YAA6BwF,oDAMzCA,KAAQnG,OAAOktB,WACjBtmB,EAAW,GAAGjG,YAA6BwF,qGAEzCwL,EAAa65B,YAAYpsC,IAAI+G,IAC/BS,EAAW,GAAGjG,YAA6BwF,qDAEzCwL,EAAa+5B,YAAYtsC,IAAI+G,IAC/BS,EAAW,GAAGjG,YAA6BwF,qDAE1B,iBAAR6pC,GAA4B,OAARA,GAC7BppC,EAAW,GAAGjG,YAA6BwF,8DAE7C,MAAM8pC,EAAaD,EACc,mBAAtBC,EAAW9F,QACpBvjC,EAAW,GAAGjG,YAA6BwF,iCAE7C,MAAM+pC,OAAqC,IAApBD,EAAWE,KAC9BD,GAAsC,mBAApBD,EAAWE,MAC/BvpC,EAAW,GAAGjG,YAA6BwF,+BAEzC+pC,KAAa,YAAaD,IAC5BrpC,EAAW,GAAGjG,YAA6BwF,kFAEF,IAApB8pC,EAAWzhC,MACQ,mBAApByhC,EAAWzhC,MAC/B5H,EAAW,GAAGjG,YAA6BwF,+BAE7C,MAAMQ,EAAsB,CAC1BR,OACA8pC,WAAY,CACVzhC,KAAOyhC,EAAWzhC,MAAkD,KACpE27B,OAAQ8F,EAAW9F,OACnBgG,KAAOF,EAAWE,MAAmCT,GACrDU,QAASH,EAAWG,SAEtBlB,OAAQ,OACRzsB,MAAO,KACP+sB,WAAY,KACZa,aAAc,IAAIltC,KAGdgD,KAAQzI,IACZA,EAAMyI,GAAQQ,EAAMspC,WAAWG,SAEjC1pC,EAAQvH,IAAIgH,EAAMQ,EACpB,ED7FI,SAA2BgL,EAA6BjL,GAC5D4V,GAAuBnd,IAAIwS,EAAcjL,EAC3C,CC4FE4pC,CAAiB3+B,EAAcjL,GAG/BooC,GAAkBn9B,EAAc,IAAIxO,IAAIuD,EAAQkN,QAClD,CC7FA,MAAM28B,GAAgE,IAAIjyC,QACpEkyC,GAA+D,IAAIlyC,QAEzE,SAASmyC,GACP9+B,EACA++B,EACAC,GAEA,OAAO,IAAIxC,MAAMnuC,OAAOouC,OAAO,MAAO,CACpC,GAAArvC,CAAIsvC,EAAiBC,GACnB,GAAoB,iBAATA,EACT,OAEF,MAAM3nC,EAAQ2oC,GAAiB39B,GAAc5S,IAAIuvC,GACjD,YAAqB,IAAV3nC,EAGJgqC,EAAKhqC,QAHZ,CAIF,EACAvH,IAAG,CAACivC,EAAiBC,IACI,iBAATA,GAAqBgB,GAAiB39B,GAAcvS,IAAIkvC,GAExEC,QAAO,IACE/nC,MAAMoc,KAAK0sB,GAAiB39B,GAAciC,QAEnD,wBAAA46B,CAAyBH,EAAiBC,GACxC,GAAoB,iBAATA,EACT,OAEF,MAAM3nC,EAAQ2oC,GAAiB39B,GAAc5S,IAAIuvC,GACjD,YAAqB,IAAV3nC,EAGJ,CACL8nC,cAAc,EACdC,YAAY,EACZlrC,MAAOmtC,EAAKhqC,SANd,CAQF,EACA,GAAAxH,GACEyH,EAAW,GAAG8pC,4DAChB,EACA,cAAA/B,GACE/nC,EAAW,GAAG8pC,6DAChB,GAEJ,CAEM,SAAUE,GAAyBj/B,GACvC,MAAMrO,EAASitC,GAA8BxxC,IAAI4S,GACjD,QAAsB,IAAXrO,EACT,OAAOA,EAET,MAAM4qC,EAAQuC,GACZ9+B,EACA/Q,EACC+F,GAAUA,EAAMuoC,QAGnB,OADAqB,GAA8BpxC,IAAIwS,EAAcu8B,GACzCA,CACT,CAEM,SAAU2C,GAAwBl/B,GACtC,MAAMrO,EAASktC,GAA6BzxC,IAAI4S,GAChD,QAAsB,IAAXrO,EACT,OAAOA,EAET,MAAM4qC,EAAQuC,GACZ9+B,EACA9Q,EACC8F,GAAUA,EAAM8b,OAGnB,OADA+tB,GAA6BrxC,IAAIwS,EAAcu8B,GACxCA,CACT,CAMM,SAAU4C,GAAqBn/B,GACnC4+B,GAA8B/+B,OAAOG,GACrC6+B,GAA6Bh/B,OAAOG,EACtC,CC7EA,IAAIo/B,GAA+C,KCa5CryC,eAAesyC,GACpB7G,EACA37B,EACAyiC,EACAjG,GAYA,IAAIkG,EAA0C,KAO1CC,EAA0C,KAC9C,MAAMC,EAAU,KACd,GAAKF,GAAYA,IAAaC,EAA9B,CAGAA,EAAWD,EAGX,IACOA,EAASG,YAAY9uB,YAAOhf,EAAW,OAC9C,CAAE,MAEF,CARA,GAUF0tC,EAAOlsC,iBAAiB,QAASqsC,EAAS,CAAEE,MAAM,IAClD,IACE,MAAMC,QAAiBpH,EAAO37B,EAAMyiC,GAEpC,GADAC,EAiCJ,SAAiBK,EAA0BN,GAYzC,GAAgE,mBAApDM,GAAsCC,UAChD,OAUJ9yC,gBACE+yC,EACAR,GAEA,MAAMS,EAASD,EAAOD,YAQhBJ,EAAU,KACTM,EAAOlpB,SAASmpB,MAAM,SAE7BV,EAAOlsC,iBAAiB,QAASqsC,EAAS,CAAEE,MAAM,IAClD,IACE,OAAS,CACP,MAAMM,KAAEA,EAAIpuC,MAAEA,SAAgBkuC,EAAOrF,OACrC,GAAIuF,EACF,aAEIpuC,CACR,CACF,SACEytC,EAAOjsC,oBAAoB,QAASosC,GACpCM,EAAOG,aACT,CACF,CAtCWC,CAAwBP,EAAqCN,GAEtE,GAA4E,mBAAhEM,IAAsC37B,OAAOm8B,eACvD,OAAOR,EAET,MAAM,IAAIS,UACR,oGAEJ,CAtDeC,CAAQV,EAAUN,GAAQr7B,OAAOm8B,iBACxCd,EAAOiB,QAMT,YADAd,IAGF,OAAS,CACP,MAAM59B,QAAe09B,EAAS/2B,OAC9B,GAAI3G,EAAOo+B,KACT,MAEF,GAAIX,EAAOiB,QACT,OAEFlH,EAAKmF,KAAK38B,EAAOhQ,MACnB,CACA,GAAIytC,EAAOiB,QACT,OAEFlH,EAAK4G,MACP,CAAE,MAAOtxB,GACP,GAAI2wB,EAAOiB,QACT,OAEFlH,EAAKmH,KAAK7xB,EACZ,SACE2wB,EAAOjsC,oBAAoB,QAASosC,EACtC,CACF,CC/DM,SAAUgB,GAAazgC,GAC3B,MAAMjL,EAAU4oC,GAAiB39B,GACjC,GAAqB,IAAjBjL,EAAQkR,KAAZ,ENxBI,SAAgCjG,GACpCw9B,GAAoB3vC,IAAImS,EAC1B,CMyBE0gC,CAAsB1gC,GACtB,IAAK,MAAMhL,KAASD,EAAQ0iB,SAC1BkpB,GAAY3gC,EAAchL,EAH5B,CAKF,CAYM,SAAU2rC,GAAY3gC,EAA6BhL,GACvDA,EAAM6oC,YAAYC,QAClB,MAAMD,EAAa,IAAI+C,gBACvB5rC,EAAM6oC,WAAaA,EAInB,MAAMgD,EFVF,SAAoB7gC,EAA6BhL,GACrD,MAAM8rC,EAAS9rC,EAAMspC,WAAWzhC,KAChC,GAAe,OAAXikC,EAEF,YADA9rC,EAAM0pC,aAAa/1B,QAGrB,MAAMo4B,EAAoB3B,GACpB4B,EAAW,IAAIxvC,IAErB,IAAIqvC,EADJzB,GAAY4B,EAEZ,IACEhhC,EAAawJ,YAAY,WAAazd,IACpC80C,EAAYC,EAAO/0C,IAEvB,SAGEqzC,GAAY2B,CACd,CACIF,aAAqBvzC,SACvB2H,EACE,GAAGjG,YAA6BgG,EAAMR,2DAG1C,MAAMysC,EAAiB,GAAGhyC,IAAqCnB,IAAYkH,EAAMR,OAC3E0sC,EAAgB,GAAGhyC,IAAoCpB,IAAYkH,EAAMR,OAC/E,IAAK,MAAM2sC,KAAOH,EAAU,CAC1B,MAAMxxC,EAAW2xC,EAAIx8B,iBAAiBnV,SAEpC2xC,EAAIx8B,iBAAiB3E,eAAiBA,GACrCxQ,EAASD,OAASyF,EAAMR,MAAQhF,EAASD,OAAS0xC,GAAkBzxC,EAASD,OAAS2xC,GAEvFjsC,EACE,GAAGjG,YAA6BgG,EAAMR,gDAAgDhF,EAASD,yFAG/FC,EAASqB,cAAgB,GAC3BoE,EACE,GAAGjG,YAA6BgG,EAAMR,6CAA6ChF,EAASD,kDAGlG,CAEA,OADAyF,EAAM0pC,aAAesC,EACdH,CACT,CElCoBO,CAAUphC,EAAchL,GAI1CgL,EAAawJ,YAAY,WAAazd,IACpCA,EAAMiJ,EAAMR,MAAQQ,EAAMspC,WAAWG,UAGvC4C,GAAmBrhC,EAAchL,EAAO,SAAU,MAElD,MAAMspC,EAAatpC,EAAMspC,WACnBjF,EAAqB,CACzB,IAAAmF,CAAKP,GAEHj+B,EAAawJ,YAAY,WAAazd,IACpCA,EAAMiJ,EAAMR,MAAQ8pC,EAAWE,KAAKzyC,EAAMiJ,EAAMR,MAAOypC,IAE3D,EACA,IAAAgC,GACEoB,GAAmBrhC,EAAchL,EAAO,OAAQ,KAClD,EACA,IAAAwrC,CAAK1vB,GAEHuwB,GAAmBrhC,EAAchL,EAAO,QAAS8b,GAGjD+sB,EAAWC,OACb,GAEGuB,GAAcf,EAAW9F,OAAQqI,EAAWhD,EAAWyB,OAAQjG,EACtE,CAgBM,SAAUgI,GACdrhC,EACAhL,EACAuoC,EACAzsB,GAEA9b,EAAMuoC,OAASA,EACfvoC,EAAM8b,MAAQA,EACd,MAAM1T,EP5FF,SAA0B4C,EAA6BxL,GAC3D,OACE0oC,GAA2B9vC,IAAI4S,IAAe5S,IAAIoH,IAAS,CAAE+oC,OAAQ,OAAQzsB,MAAO,KAExF,COwFewwB,CAAgBthC,EAAchL,EAAMR,MAC3C+sC,EAAgBnkC,EAAKmgC,SAAWA,EAChCiE,GAAgBnzC,OAAOgE,GAAG+K,EAAK0T,MAAOA,IACvCywB,GAAkBC,MPtFnB,SACJxhC,EACAxL,EACA+oC,EACAzsB,GAEA,IAAIusB,EAAUH,GAA2B9vC,IAAI4S,QACtB,IAAZq9B,IACTA,EAAU,IAAIhuC,IACd6tC,GAA2B1vC,IAAIwS,EAAcq9B,IAE/CA,EAAQ7vC,IAAIgH,EAAM,CAAE+oC,SAAQzsB,SAC9B,CO6EE2wB,CAAgBzhC,EAAchL,EAAMR,KAAM+oC,EAAQzsB,GAClD9Q,EAAawJ,YAAY,WAAazd,IAChCw1C,GACFx1C,EAAM21C,YAAY,GAAGzyC,IAAqCnB,IAAYkH,EAAMR,QAE1EgtC,GACFz1C,EAAM21C,YAAY,GAAGxyC,IAAoCpB,IAAYkH,EAAMR,UAGjF,CChJM,SAAUmtC,GAASntC,GACvB,OAAO,WACL,MAAMy+B,EAAU/hC,KAAK8O,aACrB,IAAKizB,EAAS,OACd,IAAIphC,EACJ,IACEohC,EAAQzpB,YAAY,WAAazd,IAC/B8F,EAAQ9F,EAAMyI,IAElB,CAAE,MAAOma,GAEP,YADApM,QAAQ8G,KAAK,gCAAgC7U,aAAiBma,EAEhE,CACA,OAAO9c,CACT,CACF,CAEM,SAAU+vC,GAASptC,GACvB,OAAO,SAA6B3C,GAClC,MAAMohC,EAAU/hC,KAAK8O,aAChBizB,GACLA,EAAQzC,kBAAkB5f,KAAK,KAC7BqiB,EAAQzpB,YAAY,WAAazd,IAC/BA,EAAMyI,GAAQ3C,KAGpB,CACF,CAEM,SAAUgwC,GAAOrtC,EAAcstC,GACnC,OAAIA,EACK,YAAgCjlC,GACrC,MAAMo2B,EAAU/hC,KAAK8O,aACrB,GAAKizB,EACL,OAAOA,EAAQzC,kBAAkB5f,KAAK,KACpC,IAAI/O,EACJ,OAAOoxB,EAAQvnB,iBAAiB,WAAY3e,MAAOhB,IACjD8V,QAAe9V,EAAMyI,MAASqI,KAC7B+T,KAAK,IAAM/O,IAElB,EAEK,YAAgChF,GACrC,MAAMo2B,EAAU/hC,KAAK8O,aACrB,GAAKizB,EACL,OAAOA,EAAQzC,kBAAkB5f,KAAK,KACpC,IAAI/O,EAIJ,OAHAoxB,EAAQzpB,YAAY,WAAazd,IAC/B8V,EAAS9V,EAAMyI,MAASqI,KAEnBgF,GAEX,CACF,CAEM,SAAUkgC,GAAmBvtC,GACjC,OAAOA,EAAKkK,WAAW,IACzB,CD4KAu4B,GAjDA,SAAqCc,GACnC,MAAMyF,EAAsBE,KAC5B,GAAiC,IAA7BF,EAAoBv3B,KAEtB,OAEF,MAAM+7B,EAA+D,GACrE,IAAK,MAAMhiC,KAAgBw9B,EACzB,IAAK,MAAMxoC,KAAS2oC,GAAiB39B,GAAcyX,SACjD,IAAK,MAAM0pB,KAAOnsC,EAAM0pC,aACtB,GAAI3G,EAAMtqC,IAAI0zC,GAAM,CAClBa,EAAKzwC,KAAK,CAAEyO,eAAchL,UAC1B,KACF,CAIN,IAAK,MAAMgL,aAAEA,EAAYhL,MAAEA,KAAWgtC,EAOpC,GACGxE,EAAoB/vC,IAAIuS,IACzB29B,GAAiB39B,GAAc5S,IAAI4H,EAAMR,QAAUQ,EAIrD,IACE2rC,GAAY3gC,EAAchL,EAC5B,CAAE,MAAO2Z,GACP3Z,EAAM6oC,YAAYC,QAOhBN,EAAoB/vC,IAAIuS,IACxB29B,GAAiB39B,GAAc5S,IAAI4H,EAAMR,QAAUQ,GAEnDqsC,GAAmBrhC,EAAchL,EAAO,QAAS2Z,EAErD,CAEJ,GEhNA,MAAMvf,GAAwC,IAAIC,IAWlD,MAAM4yC,GACK1yC,KACAG,SACAmB,cACAqxC,aACAC,gBACA3yC,SAUT,WAAAuB,CAAYxB,GAEV,MAAMG,EAAWH,EAAK4B,MAAM,KACtBixC,EAAqB1yC,EAASiJ,QACpC,IAAI0pC,EAAkB,EAClBC,EAAgB,EAChBzxC,EAAgB,EAChBqxC,EAA6B,OACjC,MAAMC,EAAqC,GAG3C,IAAI,IAAIh0C,EAAI,EAAGA,EAAIuB,EAAS4B,OAAQnD,IAAK,CACvC,MAAM+4B,EAAUx3B,EAASvB,GACzB,GAAgB,MAAZ+4B,EAEFkb,EAAmBj0C,GAAK,IACxBg0C,EAAgB5wC,KAAK,MACrB8wC,IACAxxC,QACK,CACL,MAAMyK,EAAS7H,OAAOyzB,GACjBzzB,OAAOuD,MAAMsE,KAEhB8mC,EAAmBj0C,GAAK,IACxBg0C,EAAgB5wC,KAAK+J,GACrBgnC,IACAzxC,IAEJ,CACF,CAEA,MACMrB,EAAWF,EADM8yC,EAAmB7oC,KAAK,OAI3C8oC,EAAkB,GAAKC,EAAgB,KAGvCJ,EAFEG,IAAoBxxC,EAEP,UACNyxC,IAAkBzxC,EAEZ,MAGA,WAGnBK,KAAK3B,KAAOA,EACZ2B,KAAKxB,SAAWA,EAChBwB,KAAKL,cAAgBA,EACrBK,KAAKgxC,aAAeA,EACpBhxC,KAAKixC,gBAAkBA,EACvBjxC,KAAK1B,SAAWA,CAClB,EAaI,SAAU+yC,GAAmB/tC,GACjC,IAAIguC,EAEJ,OAAOpzC,GAAOhC,IAAIoH,KAAUpF,GAAO5B,IAAIgH,EAAMguC,EAAW,IAAIP,GAAgBztC,IAAQguC,EACtF,CCvHA,MAAMC,GAAgF,IAAI91C,QAQpF,SAAU+1C,GACd5+B,EACA6+B,GAEmB,OAAfA,EACFF,GAAiC5iC,OAAOiE,GAExC2+B,GAAiCj1C,IAAIsW,EAAS6+B,EAElD,CAEM,SAAUC,GACd9+B,GAEA,MAAM6+B,EAAaF,GAAiCr1C,IAAI0W,GACpD6+B,IACFA,EAAWxmB,OAAQ,EAEvB,CCcA,SAAS0mB,GAAc1f,EAAmBzzB,GACxC,IAAImC,EAAasxB,EACjB,IAAK,IAAIh1B,EAAI,EAAGA,EAAIuB,EAAS4B,OAAQnD,IAAK,CAExC,GAAIE,OAAOwD,KAAWA,EACpB,OAEFA,EAAQua,QAAQhf,IAAIyE,EAAOnC,EAASvB,GACtC,CACA,OAAO0D,CACT,CAEA,SAASixC,GACP3vC,EACA2Q,EACAi/B,EACAz3B,EACAtL,GAEA,MAAM6lB,EAAe/hB,EAAQtU,SAASE,SAAS,GAC/C,GAAIm2B,IAAiBh3B,EAEnB,OAAOg0C,GAAcvG,GAAoBt8B,GAAe8D,EAAQtU,SAASE,UAE3E,GAAIm2B,IAAiB52B,EAKnB,OAAO4zC,GAAc5D,GAAyBj/B,GAAe8D,EAAQtU,SAASE,UAEhF,GAAIm2B,IAAiB32B,EACnB,OAAO2zC,GAAc3D,GAAwBl/B,GAAe8D,EAAQtU,SAASE,UAE/E,KAAIoU,EAAQtU,SAASD,QAAQ4D,GAYtB,CACL,MACM6vC,EAAcC,GAAa9vC,EADX2Q,EAAQ8D,eAAiB3S,EAAW,4CAA4C6O,EAAQtU,SAASD,QAC/DwzC,EAAUz3B,GAC5D3b,EAAcmU,EAAQtU,SAASE,SAASoU,EAAQtU,SAASE,SAAS4B,OAAS,GACjF,GAAI3B,IAAgB5B,EAAU,CAC5B,MAAM4b,EAAQ7F,EAAQkB,WAAW2E,OAAS1U,EAAW,+CAA+C6O,EAAQtU,SAASD,QACrH,OAAO6c,QAAQhf,IAAI41C,EAAar5B,EAClC,CACE,OAAOyC,QAAQhf,IAAI41C,EAAarzC,EAEpC,CApBE,IAAIqQ,EAAa65B,YAAYpsC,IAAIqW,EAAQtU,SAASD,MAQhD,OAAO6c,QAAQhf,IAAI+F,EAAQ2Q,EAAQtU,SAASD,MAP5C+b,EAAQ43B,YAAYp/B,GACpB,IACE,OAAOsI,QAAQhf,IAAI+F,EAAQ2Q,EAAQtU,SAASD,KAAMwzC,EACpD,SACEz3B,EAAQ63B,YACV,CAeN,CAEA,SAASC,GACPjwC,EACA2Q,EACAi/B,EACAz3B,EACAtL,GAEA,MACMgpB,EAAa5jB,GADCX,GAAoBzE,EAAc8D,EAAQtU,UACHsU,EAAQkB,WAC7D29B,ED1GF,SACJ7+B,GAEA,OAAO2+B,GAAiCr1C,IAAI0W,IAAY,IAC1D,CCsGqBu/B,CAAoCra,GACvD,GAAmB,OAAf2Z,IAA4C,IAArBA,EAAWxmB,MACpC,OAAOwmB,EAAW9wC,MAEpB,MAAMA,EAAQixC,GAAc3vC,EAAQ2Q,EAASi/B,EAAUz3B,EAAStL,GAKhE,OAJA0iC,GAAoC1Z,EAAY,CAC9Cn3B,MAAOA,EACPsqB,OAAO,IAEFtqB,CACT,CAEM,SAAUoxC,GACd9vC,EACA2Q,EACAi/B,EACAz3B,IC3HI,SACJA,EACAxH,GAGA,IAAIwH,EAAQg4B,YAIRh4B,EAAQi4B,mBAAqB,EAAG,CAClC,MAAMC,EAAcl4B,EAAQm4B,iBACtBC,EAAWF,GAAah0C,UAAY,KACpCwQ,EAAesL,EAAQtL,aAC7B,GAAiB,OAAb0jC,GACE1jC,EAAa65B,YAAYpsC,IAAIi2C,EAASn0C,OACxCm0C,EAASn0C,OAASuU,EAAQtU,SAASD,OAGnCyQ,EAAa2jC,qBAAqB7/B,EAAQtU,SAASD,KAAMm0C,EAASn0C,MAK9DuU,EAAQtU,SAASqB,cAAgB,GAAK6yC,EAAS7yC,cAAgB,GAAG,CACpE,MAAM+yC,EAAYj+B,GAAgB7B,EAAQtU,SAAUk0C,GACpD,GAAIE,EAAY,EAAG,CACjB,IAAIC,GAAW,EACf,IAAK,IAAIC,EAAQ,EAAGA,EAAQF,EAAWE,IACrC,GAAIhgC,EAAQkB,WAAWuB,GAAGu9B,KAAWN,EAAax+B,WAAWuB,GAAGu9B,GAAQ,CACtED,GAAW,EACX,KACF,CAEF,GAAIA,EACF,IAAK,IAAIC,EAAQ,EAAGA,EAAQF,EAAWE,IACrC9jC,EAAa+jC,sBAAsBjgC,EAAQtU,SAASc,oBAAoBwzC,GAG9E,CACF,CAGN,CACF,CDkFEE,CAAgB14B,EAASxH,GN3FrB,SAAkC9D,EAA6B8D,GACnE,GAAkB,OAAds7B,GACF,OAEF,MAAMz6B,EAAmBF,GAAoBzE,EAAc8D,EAAQtU,UACnE4vC,GAAUvxC,IAAIuX,GAA2BT,EAAkBb,EAAQkB,WACrE,CMuFEi/B,CAAwB34B,EAAQtL,aAAc8D,GAC9C,MAAM9D,EAAesL,EAAQtL,aAG7B,OAFkB8D,EAAQtU,SAASqB,cAAgB,GACjCmP,EAAa65B,YAAYpsC,IAAIqW,EAAQtU,SAASD,MAEvD6zC,GAAuBjwC,EAAQ2Q,EAASi/B,EAAUz3B,EAAStL,GAE3D8iC,GAAc3vC,EAAQ2Q,EAASi/B,EAAUz3B,EAAStL,EAE7D,CEvHM,SAAUkkC,GACd54B,EACA64B,GAEA,GAAmC,IAA/B74B,EAAQi4B,mBACV,OAAO,KAET,MAAMz/B,EAAUwH,EAAQm4B,iBACxB,GAAgB,OAAZ3/B,EACF,OAAO,KAET,MAAM6F,EAA4B7F,EAAQtU,SAASW,oBAAoBg0C,GACvE,YAAqB,IAAVx6B,EACF,KAEF7F,EAAQkB,WAAWuB,GAAGoD,IAAU,IACzC,CC3BM,SAAUy6B,GACdjxC,EACA2Q,EACAi/B,EACAz3B,GAEA,GAAIxH,EAAQtU,SAASD,QAAQ4D,EAAQ,OAAO,EAC5C,MAAMyU,EAAgB9D,EAAQ8D,cAC9B,GAAsB,OAAlBA,EAAwB,OAAO,EACnC,MAAMo7B,EAAcC,GAAa9vC,EAAQyU,EAAem7B,EAAUz3B,GAClE,GAAoB,OAAhB03B,GAAgD,iBAAhBA,GAAmD,mBAAhBA,EACrE,OAAO,EAET,MAAMrzC,EAAcmU,EAAQtU,SAASG,YACrC,GAAIA,IAAgB5B,EAAU,CAC5B,MAAM4b,EAAQ7F,EAAQkB,WAAW2E,MACjC,MAAwB,iBAAVA,GAAsBA,KAASq5B,CAC/C,CACA,OAAOrzC,KAAeqzC,CACxB,CC1BA,MAAMqB,GAA4D,IAAI13C,QAMhE,SAAU23C,GAAqBxgC,EAAwBygC,GAC1C,OAAbA,EACFF,GAAuBxkC,OAAOiE,GAE9BugC,GAAuB72C,IAAIsW,EAASygC,EAExC,CCmCA,SAASC,GACPv2B,EACAw2B,EACAt/B,GAEA,MACMrU,EAAiBxB,EADJ2e,EAAQ3d,oBAAoBm0C,IAEzCC,EAAoBjgC,GAAoBwJ,EAAQjO,aAAclP,GAC9D8W,EAAgBC,GAAmB/W,EAAgBqU,GAEnD8jB,EAAYplB,GADOuB,GAA2Bs/B,EAAmBv/B,IAEjE8J,EAAWhB,EAAQ02B,WAAWxgC,IAAoByD,GAGlDg9B,EA7CR,SAAoBC,EAAqBC,GACvC,OAAQA,GACN,IAAK,MACH,OAAOD,EAASpnB,WAClB,IAAK,MACH,OAAOonB,EAASlnB,WAClB,IAAK,MACH,OAAOknB,EAAS/mB,YAClB,IAAK,SACH,OAAO+mB,EAASjnB,eAClB,IAAK,SACH,OAAOinB,EAAShnB,eAClB,QAIE,OAHIrxB,EAAON,OACTqW,QAAQmiB,IAAI,wBAAwBogB,KAE/B,GAEb,CA2BsBC,CAFH/nB,GAAepV,EAAc5C,UAAWikB,EAAWha,GAE3BhB,EAAQ62B,YACjD,GAAIL,IAAyBx2B,EAAQhe,cAAcqB,OAAS,EAC1D2c,EAAQ+2B,kBAAkBzzC,QAAQqzC,QAElC,IAAI,MAAM5/B,KAAa4/B,EACrBJ,GACEv2B,EACAw2B,EAAuB,EACvBz/B,EAIR,CAoCA,MAAMigC,GAA8B,GAUpC,SAASC,GACPj3B,EACAk3B,EACAC,EACAC,EACAR,GAEA,MAA8B,SAA1B52B,EAAQq3B,eAGRr3B,EAAQjO,aAAaulC,mBAAmB93C,IAAI03C,GAFvC,CAAEK,SAAUX,EAASlnB,WAAY8nB,UAAW,MAKnB,IAA9BZ,EAAS/mB,YAAY7X,MAA+C,IAAjC4+B,EAASjnB,eAAe3X,KAExB,IAAjC4+B,EAAShnB,eAAe5X,KACnB,CAAEu/B,SAAUX,EAASlnB,WAAY8nB,UAAW,MAG9C,CAAED,SAAUP,GAAeQ,UAAW,MAExC,CAAED,SAAUX,EAAS/mB,YAAa2nB,UAAWZ,EAASjnB,eAC/D,CAEA,MAAM8nB,GAAgC,GAYtC,SAASC,GACP13B,EACA23B,EACAC,GAEA,MAAMC,EAAe73B,EAAQjO,aAAa+lC,0BAC1C,IAAKD,GAAsC,IAAtBA,EAAa7/B,KAChC,OAAOy/B,GAET,IAAI7jC,EAA6B,KACjC,MAAMmkC,EAAkB,CAACJ,GACnB5jC,EAAO,IAAIxQ,IAAYw0C,GAC7B,IAAK,IAAI73C,EAAI,EAAGA,EAAI63C,EAAM10C,OAAQnD,IAAK,CACrC,MAAMoB,EAAOy2C,EAAM73C,GACnB,GAAI23C,EAAar4C,IAAI8B,GAAO,CAC1B,MAAMC,EAAWF,EAAYC,GAC7B,GAAIC,EAASqB,gBAAkBg1C,EAAYh1C,cACzC,OAAO,MAERgR,IAAW,IAAItQ,KAAK/B,EACvB,CACA,MAAMy2C,EAAWh4B,EAAQi4B,UAAU94C,IAAImC,GACvC,GAAI02C,EACF,IAAK,MAAM/yB,KAAS+yB,EACbjkC,EAAKvU,IAAIylB,KACZlR,EAAKnU,IAAIqlB,GACT8yB,EAAMz0C,KAAK2hB,GAInB,CACA,OAAOrR,GAAU6jC,EACnB,CAgKM,SAAUS,GACd7wC,EACA0K,EACAomC,EACAnM,EACAC,EACAmM,EACA1B,EACAG,EACAx2B,EACAnX,GAMA,MAAMmvC,EAAYF,EAAa52C,SAASD,KACxC,IAAK0qC,EAAiBxsC,IAAI64C,KAAepM,EAAkBzsC,IAAI64C,GAE7D,OADAh4B,EAAS83B,GACF,GAET,MAAMn4B,EAAmB,CAEvBjO,aAAcA,EACdkmC,UAAWjM,EACXsM,WAAYrM,EACZr4B,OAAQ,IAAIrQ,IACZ60C,YAAaA,EACbG,QAAS,IAAIh1C,IACbmzC,WAAYA,EACZG,WAAYA,EACZQ,cAAenuC,GAASmuC,eAAiB,QAG3C,OA9LF,SACEr3B,EACAm4B,EACA93B,GAEA,MAAMm4B,EAAsB,CAAC,CAAE3iC,QAASsiC,EAAcM,MAAO,IAE7D,KAAOD,EAAMn1C,OAAS,GAAG,CACvB,MAAMwS,QAAEA,EAAO4iC,MAAEA,GAAUD,EAAM7f,MAIjC,GAHI8f,EA1LqB,KA2LvBzxC,EAAW,6FAAgH6O,EAAQtU,SAASD,QAE1I0e,EAAQu4B,QAAQ/4C,IAAIqW,GACtB,SAEFmK,EAAQu4B,QAAQ34C,IAAIiW,GACpBwK,EAASxK,GACT,MAAMqhC,EAAarhC,EAAQtU,SAASD,KAC9Bo3C,EAAYD,EAAQ,EAGpBE,EAA4B,GAO5BC,EAAa54B,EAAQi4B,UAAU94C,IAAI+3C,GACzC,GAAI0B,EACF,IAAI,MAAM1F,KAAO0F,EAAY,CAC3B,MAAMhB,EAAcv2C,EAAY6xC,GAChC,GAAIlzB,EAAQo4B,YAAY54C,IAAI03C,IAAeU,EAAYl2C,cAAgB5B,EAAU,CAE/E,MAAMkhB,EAAWhB,EAAQ02B,WAAWxgC,IAAoBL,GAGlDmlB,EAAYplB,GADCuB,GADCX,GAAoBwJ,EAAQjO,aAAc8D,EAAQtU,UACXsU,EAAQkB,YAG7D8hC,EAAY5B,GAAuBj3B,EAASk3B,EAAYlc,EAAWha,EADxD+N,GAAelZ,EAAQkB,UAAWikB,EAAWha,IAE9D,IAAI,MAAMjK,KAAa8hC,EAAUtB,SAAU,CACzC,MAAMuB,EAAal/B,GAAmBg+B,EAAa7gC,GACnDiJ,EAAQpM,OAAOhU,IAAIk5C,GACnBH,EAAYr1C,KAAK,CAAEuS,QAASijC,EAAYL,MAAOC,GACjD,CACA,GAA4B,OAAxBG,EAAUrB,UAAoB,CAChC,MAAMuB,EAAiBrB,GAA0B13B,EAASkzB,EAAK0E,GAC/D,GAAuB,OAAnBmB,EAEF,IAAI,MAAMhiC,KAAa8hC,EAAUrB,UAAW,CAC1C,MAAMsB,EAAal/B,GAAmBg+B,EAAa7gC,GACnDiJ,EAAQpM,OAAOhU,IAAIk5C,GACnBH,EAAYr1C,KAAK,CAAEuS,QAASijC,EAAYL,MAAOC,GACjD,MACK,GAAIK,EAAe11C,OAAS,EAEjC,IAAI,MAAM0T,KAAa8hC,EAAUrB,UAC/B,IAAI,MAAMj2C,KAAYw3C,EAAgB,CACpC,MAAMD,EAAal/B,GAAmBrY,EAAUwV,GAChDiJ,EAAQpM,OAAOhU,IAAIk5C,GACnBH,EAAYr1C,KAAK,CAAEuS,QAASijC,EAAYL,MAAOC,GACjD,CAKN,CACF,KAAO,CACL,MAAMI,EAAal/B,GAAmBg+B,EAAa/hC,EAAQkB,WAC3DiJ,EAAQpM,OAAOhU,IAAIk5C,GACnBH,EAAYr1C,KAAK,CAAEuS,QAASijC,EAAYL,MAAOC,GACjD,CACF,CAiBF,MAAMM,EAAch5B,EAAQs4B,WAAWn5C,IAAI+3C,GAC3C,GAAI8B,EACF,IAAI,MAAM9F,KAAO8F,EAAa,CAC5B,MAAMpB,EAAcv2C,EAAY6xC,GAC1B/kB,EAAqC,GAC3C,GAAIypB,EAAYh1C,cAAgB,EAAG,CAIjC,MAAMyV,EAAcX,GAAgB7B,EAAQtU,SAAUq2C,GAEtD,GADoBA,EAAYh1C,cAAgByV,GAAgB,EAChD,CACd,IAAItB,EACAsB,EAAc,GAIU,OAAtBxC,EAAQkB,WACV/P,EAAW,wEAAwE6O,EAAQtU,SAASD,QAEtGyV,EAAYlB,EAAQkB,UAAWuB,GAAGD,EAAc,IAIhDtB,EAAY,KAEd,MAAMkiC,EAA+B,CAEnClnC,aAAciO,EAAQjO,aAEtBglC,kBAAmB,GACnB/0C,cAAe41C,EAAY51C,cAC3BK,oBAAqBu1C,EAAYv1C,oBACjCq0C,WAAY12B,EAAQ02B,WACpBG,WAAY72B,EAAQ62B,YAEtBN,GAAoB0C,EAAe5gC,EAAatB,GAChDoX,EAAY7qB,QAAQ21C,EAAclC,kBACpC,KAAO,CAGqB,OAAtBlhC,EAAQkB,WACV/P,EAAW,wEAAwE6O,EAAQtU,SAASD,QAEtG,MAAMyV,EAAYlB,EAAQkB,UAAUuB,GAAGD,EAAc,GACrD8V,EAAY7qB,KAAKyT,EACnB,CACF,MAGEoX,EAAY7qB,KAAK,MAEnB,IAAI,MAAMyT,KAAaoX,EAAa,CAClC,MAAM2qB,EAAal/B,GAAmBg+B,EAAa7gC,GACnDiJ,EAAQpM,OAAOhU,IAAIk5C,GACnBH,EAAYr1C,KAAK,CAAEuS,QAASijC,EAAYL,MAAOC,GACjD,CACF,CAIF,IAAI,IAAIx4C,EAAIy4C,EAAYt1C,OAAS,EAAGnD,GAAK,EAAGA,IAC1Cs4C,EAAMl1C,KAAKq1C,EAAYz4C,GAE3B,CACF,CAmCEg5C,CAAgBl5B,EAASm4B,EAAc93B,GAChCzZ,MAAMoc,KAAKhD,EAAQpM,OAC5B,CCzVA,SAASulC,GACPtjC,EACAklB,EACA+Z,EACAz3B,GAEA,MAAM8D,EAAqB5iB,EAAOH,yBAC7B+hB,MAAkCT,OACnC,KACEupB,EAAUe,KAChBf,EAAQE,uBAAuBpO,EAAY5Z,GAE3C+2B,GACE76B,EAAQhW,UACRgW,EAAQtL,aACR8D,EACAwH,EAAQtL,aAAai6B,iBACrB3uB,EAAQtL,aAAak6B,kBACrB5uB,EAAQtL,aAAa25B,UACrBoJ,EACA,MACCgE,IAEC,GAAIA,IAAejjC,EAAS,OAC5B,MACMujC,EAAgBjiC,GADCX,GAAoB6G,EAAQtL,aAAc+mC,EAAWv3C,UACXu3C,EAAW/hC,WAC5E49B,GAAsCyE,GAEtCnQ,EAAQE,uBAAuBiQ,EAAej4B,IAIhD,CAAEk2B,cAAe,QAErB,CAEA,SAASgC,GACPn0C,EACA2Q,EACAklB,EACAn3B,EACAkxC,EACAz3B,GAEA,IACE,KAAIxH,EAAQtU,SAASD,QAAQ4D,GAkBtB,CACL,MAAMyU,EAAgB9D,EAAQ8D,cAC9B,GAAsB,OAAlBA,EACF,OAAOwE,QAAQ5e,IAAI2F,EAAQ2Q,EAAQtU,SAASD,KAAMsC,GAEpD,MAAMmxC,EAAcC,GAAa9vC,EAAQyU,EAAem7B,EAAUz3B,GAC5D3b,EAAcmU,EAAQtU,SAASE,SAASoU,EAAQtU,SAASE,SAAS4B,OAAS,GACjF,GAAI3B,IAAgB5B,EAAU,CAC5B,MAAM4b,EAAQ7F,EAAQkB,WAAW2E,OAAS1U,EAAW,+CAA+C6O,EAAQtU,SAASD,QACrH,OAAO6c,QAAQ5e,IAAIw1C,EAAar5B,EAAO9X,EACzC,CACE,OAAOua,QAAQ5e,IAAIw1C,EAAarzC,EAAakC,EAEjD,CA9BE,IAAIyZ,EAAQtL,aAAa+5B,YAAYtsC,IAAIqW,EAAQtU,SAASD,MAexD,OAAO6c,QAAQ5e,IAAI2F,EAAQ2Q,EAAQtU,SAASD,KAAMsC,GATlDyZ,EAAQ43B,YAAYp/B,GACpBwH,EAAQi8B,eACR,IACE,OAAOn7B,QAAQ5e,IAAI2F,EAAQ2Q,EAAQtU,SAASD,KAAMsC,EAAOkxC,EAC3D,SACEz3B,EAAQk8B,aACRl8B,EAAQ63B,YACV,CAkBN,SACEiE,GAAYtjC,EAASklB,EAAY+Z,EAAUz3B,EAC7C,CACF,CAEA,SAASm8B,GACPt0C,EACA2Q,EACAklB,EACAn3B,EACAkxC,EACAz3B,GAGA,IAAI1D,EAAgB9D,EAAQ8D,eAAiB3S,EAAW,4CAA4C6O,EAAQtU,SAASD,QACjHg1C,EF/HA,SAA+BzgC,GACnC,OAAOugC,GAAuBj3C,IAAI0W,IAAY,IAChD,CE6HiB4jC,CAAqB9/B,GACpC,GAAiB,OAAb28B,EAAmB,CACrB,MAAMvB,EAAcC,GAAa9vC,EAAQyU,EAAem7B,EAAUz3B,IAAY,GACxE8Q,EAAcM,GAAqBsmB,IAAgB,GACzDuB,EAAW,CACT1yC,MAAO,IAAImxC,GAAc5mB,YAAa,IAAIA,IAE5CkoB,GAAqB18B,EAAe28B,EACtC,CACA,IACE,OAAO+C,GAAcn0C,EAAQ2Q,EAASklB,EAAYn3B,EAAOkxC,EAAUz3B,EACrE,SACE,MAAM3B,EAAQ46B,EAAS1yC,MAAM0K,QAAQ1K,GAC/B81C,EAAqB1E,GAAa9vC,EAAQyU,EAAem7B,EAAUz3B,IAAY,GAC/Es8B,EAAqB/yC,MAAMC,QAAQ6yC,GAAuBjrB,GAAqBirB,IAAuB,GAAM,GAC5GE,EAAW/jC,EAAQkB,UAAW2E,MAC9B3E,GAAuB,IAAV2E,EACjB46B,EAAUnoB,YAAYzS,GACtB6S,GAAgB5U,EAAc5C,cAChC4iC,EAAmBC,GAAY7iC,EAI/B,GADqB,IAAIxT,IAAIm2C,GACZ1hC,OAASs+B,EAAU1yC,MAAMP,OAAQ,CAChD,IAAI,IAAInD,EAAI,EAAGA,EAAIy5C,EAAmBt2C,OAAQnD,IAC5Cy5C,EAAmBz5C,GAAGwb,MAAQxb,EAGhCm2C,GAAqB18B,EAAe,KACtC,CACF,CACF,CAEM,SAAUkgC,GACZ30C,EACA2Q,EACAjS,EACAkxC,EACAz3B,GAEF,MAAMtL,EAAesL,EAAQtL,aACvBzQ,EAAOuU,EAAQtU,SAASD,KAO9B,KAAMA,KAAQ4D,IAAqC,OAA1B2Q,EAAQ8D,gBAA2B5H,EAAa45B,aAAansC,IAAI8B,GAAO,CAC/F,MAAMyzC,EAAcC,GAAa9vC,EAAQ2Q,EAAQ8D,cAAem7B,EAAUz3B,GAC1E,GAA2B,iBAAhB03B,GAA4C,OAAhBA,EAAsB,CAG3D,MAAMrzC,EAAcmU,EAAQtU,SAASG,YAC/BwS,EAA+BxS,IAAgB5B,EACjD+V,EAAQkB,WAAW2E,MACnBha,EACJ,IAAIo4C,EACAC,GAAiB,EACrB,GAAIx7C,EAAOD,iBAA6B,OAAVsF,GAAmC,iBAAVA,GAAqB,CAE1E,MAAMpE,OAAcmE,IAARuQ,GAAqBA,KAAO6gC,EAClC7b,OAAmBv1B,IAARuQ,EAAqB6gC,EAA6C7gC,QAAOvQ,EAC1F,GAAInE,GAAOY,OAAOgE,GAAG80B,EAAUt1B,GAC7B,OAAO,EAETk2C,EAAc5gB,EACd6gB,GAAiB,CACnB,CACA,MAAMC,EAAYnkC,EAAQtU,SAASqB,cAAgB,GACjCmP,EAAa65B,YAAYpsC,IAAI8B,GAEzCy5B,EAAa5jB,GADCX,GAAoBzE,EAAc8D,EAAQtU,UACHsU,EAAQkB,WAC9C,OAAjBkC,IACFA,GAAa,CACXG,KAAM,cACNC,gBAAiB0hB,EACjBn3B,QACAs1B,SAAU4gB,EACVG,YAAaF,IAGjB,IAIE,YAHYp2C,IAARuQ,GACFlN,EAAW,+CAA+C1F,KAErD6c,QAAQ5e,IAAIw1C,EAAa7gC,EAAKtQ,EACvC,SACEu1C,GAAYtjC,EAASklB,EAAY+Z,EAAUz3B,GACvC28B,GACFvF,GAAoC1Z,EAAY,CAC9Cn3B,MAAOA,EACPsqB,OAAO,IAIX,MAAMpT,EAAY/I,EAAamoC,iBAAiB54C,GAChD,GAAIwZ,EAAW,CACb,MAAMpJ,EAAWK,EAAaL,SAC1BA,aAAoB+rB,YACtB/rB,EAASkxB,KAAKuX,cAAc,IAAIC,YAAYt/B,EAAW,CACrD6F,OAAQ/c,EACRy2C,SAAS,IAGf,CACF,CACF,CACF,CASA,IAAIP,EACAC,GAAiB,EACrB,GAAIx7C,EAAOD,iBAA6B,OAAVsF,GAAmC,iBAAVA,GAAqB,CAC1E,MAAMs1B,EAAW8b,GAAa9vC,EAAQ2Q,EAASi/B,EAAUz3B,GACzD,GAAI84B,GAAajxC,EAAQ2Q,EAASi/B,EAAUz3B,IAAYjd,OAAOgE,GAAG80B,EAAUt1B,GAC1E,OAAO,EAETk2C,EAAc5gB,EACd6gB,GAAiB,CACnB,CAEA,MAAMO,EAAcvoC,EAAa45B,aAAansC,IAAIqW,EAAQtU,SAASD,MAC7D04C,EAAYnkC,EAAQtU,SAASqB,cAAgB,GACjCmP,EAAa65B,YAAYpsC,IAAIqW,EAAQtU,SAASD,MAE1Dy5B,EAAa5jB,GADCX,GAAoBzE,EAAc8D,EAAQtU,UACHsU,EAAQkB,WAC9C,OAAjBkC,IACFA,GAAa,CACXG,KAAM,cACNC,gBAAiB0hB,EACjBn3B,QACAs1B,SAAU4gB,EACVG,YAAaF,IAGjB,IACE,OAAIO,EACKd,GAAsBt0C,EAAQ2Q,EAASklB,EAAYn3B,EAAOkxC,EAAUz3B,GAEpEg8B,GAAcn0C,EAAQ2Q,EAASklB,EAAYn3B,EAAOkxC,EAAUz3B,EAEvE,SACM28B,GACFvF,GAAoC1Z,EAAY,CAC9Cn3B,MAAOA,EACPsqB,OAAO,IAIX,MAAMpT,EAAY/I,EAAamoC,iBAAiBrkC,EAAQtU,SAASD,MACjE,GAAIwZ,EAAW,CACb,MAAMpJ,EAAWK,EAAaL,SAC1BA,aAAoB+rB,YACtB/rB,EAASkxB,KAAKuX,cAAc,IAAIC,YAAYt/B,EAAW,CACrD6F,OAAQ/c,EACRy2C,SAAS,IAGf,CACF,CACF,CC9QM,SAAU/6C,GACd4F,EACAq1C,EACAzF,EACAz3B,GAEA,MAAO,CAAC/b,EAAcoc,EAAmB9Z,KACvC,MAAMrC,EAAWF,EAAYC,GAC7B,GAAI+b,EAAQi4B,mBAAqB,EAAG,CAClC,MAAMG,EAAWp4B,EAAQm4B,kBAAkBj0C,UAAY,KACjDwQ,EAAesL,EAAQtL,aACZ,OAAb0jC,GAAqBA,EAASn0C,OAASC,EAASD,MAE9CyQ,EAAa65B,YAAYpsC,IAAIi2C,EAASn0C,OACxCyQ,EAAa2jC,qBAAqBn0C,EAASD,KAAMm0C,EAASn0C,KAGhE,CAEIC,EAASgB,wBAAwBc,OAASqa,EAAQra,QACpD2D,EAAW,mCAAmC1F,KAGhD,IAAIyV,EAA+B,KACnC,IAAI,IAAI7W,EAAI,EAAGA,EAAIqB,EAASgB,wBAAwBc,OAAQnD,IAAK,CAC/D,MAAMs6C,EAAyBj5C,EAASgB,wBAAwBrC,GAC1Du6C,EAAkB7gC,GAAmB4gC,EAAwBzjC,GAE7DoX,EAAcM,GADHumB,GAAa9vC,EAAQu1C,EAAiB3F,EAAUz3B,IAE9C,MAAf8Q,GACFnnB,EAAW,0BAA0BwzC,EAAuBl5C,QAG9DyV,EAAYoX,EADEzQ,EAAQxd,KAEpB8G,EAAW,wBAAwBwzC,EAAuBl5C,OAC9D,CAGA,MAAMuU,EAAU+D,GAAmBrY,EAAUwV,GAE7C,UADqC,IAAVnT,GAEzB,OAAOoxC,GAAa9vC,EAAQ2Q,EAASi/B,EAAUz3B,GAE/Cw8B,GAAa30C,EAAQ2Q,EAASjS,EAAOkxC,EAAUz3B,GAGrD,CCxDA,MAAMq9B,GAAyB,IAAIh8C,QCQ7B,SAAUi8C,GACdz1C,EACA01C,EACA9F,EACAz3B,GAEA,MAAM9b,EAAWq5C,EAAgBr5C,SACjC,OAAQq5C,EAAgB3G,cACtB,IAAK,OACH,OAAO,KACT,IAAK,UAGH,OAAOgC,GAAoB54B,EAFF9b,EAASS,cAAcsW,IAAG,IACjDtR,EAAW,6BAA6B4zC,EAAgBr5C,SAASD,UAEjE0F,EAAW,wBAAwB4zC,EAAgBr5C,SAASD,QAEhE,IAAK,MAAO,CACV,IAAI4V,EAAqC,KACzC,IAAI,IAAIhX,EAAI,EAAGA,EAAI06C,EAAgBr5C,SAASqB,cAAe1C,IAAK,CAC9D,MAAMs6C,EAAyBI,EAAgBr5C,SAASgB,wBAAwBrC,IAC9E8G,EAAW,mCAAmC4zC,EAAgBr5C,SAASD,QAOzE4V,GAJgDuX,GADpBumB,GAAa9vC,EADX0U,GAAmB4gC,EAAwBtjC,GACD49B,EAAUz3B,KAEhFrW,EAAY,wBAAwBwzC,EAAuBl5C,SACvCs5C,EAAgB1G,gBAAgBh0C,IACpD8G,EAAW,0BAA0B4zC,EAAgBr5C,SAASD,UAE9D0F,EAAW,wBAAwBwzC,EAAuBl5C,OAC9D,CACA,OAAO4V,CACT,CACA,IAAK,UACHlQ,EAAW,+CAA+C4zC,EAAgBr5C,SAASD,QAGzF,CCzCA,SAASu5C,GACPx9B,EACA7H,EACA6K,QAEmC,IAAxBhD,EAAQ7H,aACjBxO,EAAW,2BAEbqW,EAAQy9B,eAAetlC,GACvB,IACE6H,EAAQ43B,YAAYz/B,GACpB,IACE,OAAO6K,GACT,SACEhD,EAAQ63B,YACV,CACF,SACE73B,EAAQ09B,kBACV,CACF,CCGA,MAAMC,GAA4B,GAAGh6C,IAAqCnB,IACpEo7C,GAA2B,GAAGh6C,IAAoCpB,IAKlEq7C,GAA0B,IAAIx8C,QAW9B,SAAUS,GACd+F,EACAwpC,EACAoG,EACAz3B,GAEA,MAAM3B,EAAQvb,EAAoBuuC,GAClC,QAAqB,IAAVhzB,EAAuB,CACG,IAA/B2B,EAAQi4B,oBACVtuC,EAAW,oDAAoD0nC,EAAK/hC,gBAEtE,MAAM4oC,EAAcl4B,EAAQm4B,iBAKtBC,EAAWF,GAAah0C,SAC1Bk0C,IAAap4B,EAAQg4B,YAAch4B,EAAQtL,cAAc65B,YAAYpsC,IAAIi2C,EAASn0C,OACpF+b,EAAQtL,aAAaopC,8BAA8B1F,EAASn0C,MAE9D,MAAMyV,EAAYw+B,GAAax+B,UAC/B,OAAOA,GAAW2G,QAAQhC,IAAU1U,EAAW,wBAAwB0nC,EAAK/hC,aAC9E,CACA,GAAoB,iBAAT+hC,EAAmB,CAC5B,GAAgB,MAAZA,EAAK,GAAY,CACnB,OAAQA,GACN,IAAK,gBACH,OAAOrxB,EAAQtL,aAEjB,IAAK,UACH,MAAO,CAACzQ,EAAcoc,IHpE1B,SACJxY,EACAwpC,EACAoG,EACAz3B,GAEE,MAAMne,EAAYI,GAAQ4F,EAAQwpC,EAAMoG,EAAUz3B,GAClD,MAAO,CAAC/b,EAAcoc,KACpB,MAAM09B,EAA6C,IAAIh6C,IACjDG,EAAWF,EAAYC,GAC7B,GAAI+b,EAAQi4B,mBAAqB,EAAG,CAClC,MAAMG,EAAWp4B,EAAQm4B,kBAAkBj0C,UAAY,KACjDwQ,EAAesL,EAAQtL,aACZ,OAAb0jC,GAAqBA,EAASn0C,OAASC,EAASD,MAE9CyQ,EAAa65B,YAAYpsC,IAAIi2C,EAASn0C,OACxCyQ,EAAa2jC,qBAAqBn0C,EAASD,KAAMm0C,EAASn0C,KAGhE,CAEA,QAAuB,IAAZoc,EAAyB,CAClC,IAAI,IAAIxd,EAAI,EAAGA,EAAIqB,EAASgB,wBAAwBc,OAAQnD,IAAK,CAC/D,MAAMm7C,EAAkB95C,EAASgB,wBAAwBrC,GACnD6W,EAAYk/B,GAAoB54B,EAASg+B,EAAgB/5C,MAC/D,GAAIyV,EAAW,CACb2G,EAAU3G,EAAU2G,QACpB,KACF,CACF,MACuB,IAAZA,IACTA,EAAU,GAEd,CACA,MAAM49B,EAAsB,CAC1B/4C,EACAg5C,EACAxkC,EACA2G,EACA+b,EACA+hB,EACAvrC,KAEA,MAAMuqC,EAAyBj4C,EAAwBg5C,IAAqB,KAC5E,GAA+B,OAA3Bf,EAEF,YADAvqC,EAAQ3M,KAAKk4C,GAGf,MAAMf,EAAkB7gC,GAAmB4gC,EAAwBzjC,GAC7DmiB,EAAWwhB,GAAuBv7C,IAAIs7C,GACtCz5B,EAAWg0B,GAAa9vC,EAAQu1C,EAAiB3F,EAAUz3B,GAE3D8Q,EADWY,GAAehY,EAAWmiB,EAAUlY,GACxB0O,WACvBhU,EAAQgC,EAAQ+b,IAAa,KAEnC,GADA2hB,EAAkB77C,IAAIk7C,EAAiBz5B,GACzB,OAAVtF,EACF,IAAI,IAAIxb,EAAI,EAAGA,EAAIiuB,EAAY9qB,OAAQnD,IAAK,CAC1C,MAAM6W,EAAYoX,EAAYjuB,GAC9Bo7C,EACE/4C,EACAg5C,EAAmB,EACnBxkC,EACA2G,EACA+b,EAAW,EACX+hB,EAAc//B,OAAO1E,EAAU2E,OAC/BzL,EACJ,KACK,CACL,MAAM8G,EAAYoX,EAAYzS,IAC5B1U,EAAW,wBAAwBwzC,EAAuBl5C,QACvDi6C,EAAmB,EAAKh5C,EAAwBc,OACnDi4C,EACE/4C,EACAg5C,EAAmB,EACnBxkC,EACA2G,EACA+b,EAAW,EACX+hB,EAAc//B,OAAO1E,EAAU2E,OAC/BzL,GAIFA,EAAQ3M,KAAKk4C,EAAc//B,OAAO1E,EAAU2E,OAEhD,GAEI+/B,EAA4B,GAClCH,EACE/5C,EAASgB,wBACT,EACA,KACAmb,EACA,EACA,GACA+9B,GAEF,MAAMC,EAAsB,GAC5B,IAAI,IAAIx7C,EAAI,EAAGA,EAAIu7C,EAAcp4C,OAAQnD,IACvCw7C,EAAap4C,KAAKpE,EAChBqC,EAASD,KACTm6C,EAAcv7C,KAGlB,IAAI,MAAO2V,EAASmL,KAAao6B,EAAkBt0C,UACjD4zC,GAAuBn7C,IAAIsW,EAASmL,GAEtC,OAAO06B,EAEX,CGvCiBC,CACLz2C,EACAwpC,EACAoG,EACAz3B,EAJKs+B,CAKLr6C,EAAMoc,GAGZ,IAAK,cACH,OAAQpc,GCvFZ,SACJ4D,EACAq1C,EACAzF,EACAz3B,GAEA,MAAMtL,EAAesL,EAAQtL,aAC7B,OAAQzQ,IACN,MAAMs5C,EAAkBtG,GAAmBhzC,GACrCyV,EAAY4jC,GAAaz1C,EAAQ01C,EAAiB9F,EAAUz3B,GAC5DxH,EAAU+D,GAAmBghC,EAAgBr5C,SAAUwV,GAEvDgkB,EAAa5jB,GADCX,GAAoBzE,EAAc8D,EAAQtU,UACHsU,EAAQkB,WAC7DkyB,EAAUe,KAChBf,EAAQE,uBAAuBpO,GAE/Bmd,GACE76B,EAAQhW,UACRgW,EAAQtL,aACR8D,EACAwH,EAAQtL,aAAai6B,iBACrB3uB,EAAQtL,aAAak6B,kBACrB5uB,EAAQtL,aAAa25B,UACrBoJ,EACA,MACCgE,IAEC,MACMM,EAAgBjiC,GADCX,GAAoBzE,EAAc+mC,EAAWv3C,UACHu3C,EAAW/hC,WAC5E49B,GAAsCyE,GAEtCnQ,EAAQE,uBAAuBiQ,KAIvC,CDqDmBwC,CACL12C,EACAwpC,EACAoG,EACAz3B,EAJKu+B,CAKLt6C,GAGN,IAAK,WACH,MAAO,CAACA,EAAcoc,EAAmB9Z,IAChCtE,GACL4F,EACAwpC,EACAoG,EACAz3B,EAJK/d,CAKLgC,EAAMoc,EAAS9Z,GAGrB,IAAK,mBACH,OAAQtC,GErFZ,SACJmtC,EACA8L,EACAsB,EACAx+B,GAEA,OAAQ/b,IAC6B,IAA/B+b,EAAQi4B,oBACVtuC,EAAW,2DAA2D1F,OAExE,MAAMm0C,EAAWp4B,EAAQm4B,kBAAkBj0C,UACzCyF,EAAW,4CACP+K,EAAesL,EAAQtL,aACzBsL,EAAQtL,aAAa65B,YAAYpsC,IAAIi2C,EAASn0C,OAChDm0C,EAASn0C,OAASA,GAClByQ,EAAa2jC,qBAAqBp0C,EAAMm0C,EAASn0C,MAGvD,CFoEmBw6C,CACL52C,EACAwpC,EACAoG,EACAz3B,EAJKy+B,CAKLx6C,GAGN,IAAK,qBACH,OAAW0a,GG7Gf,SACJyyB,EACA8L,EACAsB,EACAx+B,GAEA,OAAWrB,IACTqB,EAAQi8B,eACR,IACE,OAAOt9B,GACT,SACEqB,EAAQk8B,YACV,EAEJ,CHgGmBwC,CACL72C,EACAwpC,EACAoG,EACAz3B,EAJK0+B,CAKL//B,GAGN,KAAKpb,EACH,OAAOytC,GAAoBhxB,EAAQtL,cAErC,KAAK/Q,EACH,OAAOgwC,GAAyB3zB,EAAQtL,cAE1C,KAAK9Q,EACH,OAAOgwC,GAAwB5zB,EAAQtL,cAS3C,IAAK28B,EAAKj+B,WAAWuqC,MAA+BtM,EAAKj+B,WAAWwqC,IAClE,MAEJ,CACA,MAAML,EAAkBtG,GAAmB5F,GACrC33B,EAAY4jC,GAAaz1C,EAAQ01C,EAAiB9F,EAAUz3B,GAC5DrD,EAAeJ,GAAmBghC,EAAgBr5C,SAAUwV,GAClE,OAAOi+B,GACL9vC,EACA8U,EACA86B,EACAz3B,EAEJ,CAAO,GAAoB,iBAATqxB,EAAmB,CACnC,MAAMlrC,EAtHV,SAA2B6Z,GACzB,IAAI7Z,EAAQ03C,GAAwB/7C,IAAIke,GAKxC,YAJqB,IAAV7Z,IACTA,EAAQ,IAAIpC,IACZ85C,GAAwB37C,IAAI8d,EAAS7Z,IAEhCA,CACT,CA+GkBw4C,CAAkB3+B,GAC1B3Z,EAASF,EAAMrE,IAAIuvC,GACzB,QAAsB,IAAXhrC,EACT,OAAOA,EAET,IAAIu4C,EACJ,OAAQvN,GACN,KAAK34B,GACHkmC,EAAM,CAACzmC,EAAkB6K,EAAWvhB,cD/HrCA,eACLue,EACA7H,EACA6K,GAEA,aAAaw6B,GAAgBx9B,EAAS7H,EAAa6K,EACrD,CC0HiB67B,CAAoB7+B,EAAS7H,EAAa6K,GAEnD,MAEF,KAAKpK,GACHgmC,EAAM,CAACzmC,EAAkB6K,EAAW,kBD5I1ChD,EACA7H,EACA6K,GAEA,OAAOw6B,GAAgBx9B,EAAS7H,EAAa6K,EAC/C,CCwIiBy6B,CAAez9B,EAAS7H,EAAa6K,GAE9C,MAEF,KAAKnK,GACH+lC,EAAOpmC,GACEm/B,GACL9vC,EACA2Q,EACAi/B,EACAz3B,GAGJ,MAEF,KAAKlH,GACH8lC,EAAOpmC,GACEsgC,GACLjxC,EACA2Q,EACAi/B,EACAz3B,GAGJ,MAEF,KAAKjH,GACH6lC,EAAM,CAACpmC,EAAwBjS,IACtBi2C,GACL30C,EACA2Q,EACAjS,EACAkxC,EACAz3B,GAGJ,MAEF,KAAKhH,GACH4lC,EAAM,II7MPn9C,eACLoG,EACAq1C,EACAzF,GAGA,MAAMz0B,EAAWlC,QAAQhf,IAAI+F,EAAQ5E,GACb,mBAAb+f,SACHA,EAAS87B,KAAKrH,EAExB,CJoMiBsH,CACLl3C,EACAmR,EACAy+B,GAIJ,MAEF,KAAKx+B,GACH2lC,EAAM,IKzNR,SACJ/2C,EACAq1C,EACAzF,GAGA,MAAMz0B,EAAWlC,QAAQhf,IAAI+F,EAAQ3E,GACb,mBAAb8f,GACTA,EAAS87B,KAAKrH,EAElB,CLgNiBuH,CACLn3C,EACAoR,EACAw+B,GAIJ,MAEF,KAAKv+B,GACH0lC,EACEK,GM1NJ,SACJp3C,EACAo3C,EACAxH,EACAz3B,GAEA,MAAMgD,EAAoBlC,QAAQhf,IAAI+F,EAAQ1E,GAC9C,GAAwB,mBAAb6f,EAAyB,CAClC,MAAMorB,EAAqB,IAAIloC,IAEzBg5C,EAAqD,CAAA,EAC3D,IAAK,MAAMC,KAAOF,EAAM,CACtB,MAAM/6C,EAAWi7C,EAAI9lC,iBAAiBnV,SACtC,IAAIk7C,EAOJ,GALEA,EADED,EAAI9lC,iBAAiBrP,YAAcgW,EAAQhW,UAClC9F,EAASD,KAETC,EAASD,KAAO,IAAMk7C,EAAI9lC,iBAAiBrP,UAExDokC,EAAM7rC,IAAI68C,GACNl7C,EAASqB,cAAgB,EAAG,CAC9B,MAAM8a,EAAU8+B,EAAIzlC,UAAW2G,SAAW,GACpCg/B,EAAcH,EAAkBE,QACX,IAAhBC,EACTH,EAAkBE,GAAY,CAAC/+B,GAE/Bg/B,EAAYp5C,KAAKoa,EAErB,CACF,CACA,OAAO2C,EAAS87B,KAAKrH,EAAUluC,MAAMoc,KAAKyoB,GAAQ8Q,EACpD,CACF,CN4LiBI,CACLz3C,EACAo3C,EACAxH,EACAz3B,GAGJ,MAEF,QACE,OAAOc,QAAQhf,IACb+F,EACAwpC,EACAoG,GAKN,OADAtxC,EAAMjE,IAAImvC,EAAMuN,GACTA,CACT,CACF,COlQA,MAAMW,GACIC,cACAC,WACAC,cAAsDn2C,MAAM7G,GAAgBuxB,UAAK3tB,GACjFq5C,oBAA6B,EAC7BC,aACAC,YACAC,cAAwB,EAEhC,WAAAr6C,CACE4O,EACArK,EACA+1C,GAEAn6C,KAAK65C,WAAaz1C,EAClB,MAAM0K,EAAeC,GAAsBN,EAAUzO,KAAK65C,YACrC,OAAjB/qC,GACF/K,EAAW,0CAA0C/D,KAAK65C,0BAE5D75C,KAAK45C,cAAgB9qC,EACrB9O,KAAKi6C,YAAcE,CACrB,CAEA,aAAI/1C,GACF,OAAOpE,KAAK65C,UACd,CAEA,gBAAI/qC,GACF,OAAO9O,KAAK45C,aACd,CAEA,oBAAIrH,GACF,IAAI3/B,EAOJ,OANI5S,KAAK+5C,oBAAsB,IAC7BnnC,EAAU5S,KAAK85C,cAAc95C,KAAK+5C,0BAEb,IAAZnnC,GACT7O,EAAW,oCAEN6O,CACT,CAEA,sBAAIy/B,GACF,OAAOryC,KAAK+5C,mBAAqB,CACnC,CAEA,eAAIxnC,GACF,OAAOvS,KAAKg6C,YACd,CAEA,WAAAhI,CAAYp/B,GACV5S,KAAK+5C,qBACD/5C,KAAK+5C,oBAAsBj9C,GAC7BiH,EAAW,wEAEb/D,KAAK85C,cAAc95C,KAAK+5C,oBAAsBnnC,CAChD,CAEA,UAAAq/B,GACE,GAAIjyC,KAAK+5C,mBAAqB,EAC5B,OAAO,KAET,MAAMnnC,EAAU5S,KAAK85C,cAAc95C,KAAK+5C,oBAMxC,YALuB,IAAZnnC,GACT7O,EAAW,0BAA0B/D,KAAK+5C,oCAE5C/5C,KAAK85C,cAAc95C,KAAK+5C,yBAAsBr5C,EAC9CV,KAAK+5C,qBACEnnC,CACT,CAEA,cAAAilC,CAAetlC,GACbvS,KAAKg6C,aAAeznC,CACtB,CAEA,gBAAAulC,GACE93C,KAAKg6C,kBAAet5C,CACtB,CAEA,cAAI0xC,GACF,OAAOpyC,KAAKk6C,cAAgB,CAC9B,CAEA,YAAA7D,GACEr2C,KAAKk6C,eACP,CAEA,UAAA5D,GACEt2C,KAAKk6C,eACP,CAEA,GAAAh+C,CACE+F,EACAwpC,EACAoG,GAEA,OAAOuI,GAAQn4C,EAAQwpC,EAAMoG,EAAU7xC,KACzC,CAEA,GAAA1D,CACE2F,EACAwpC,EACA9qC,EACAkxC,GAKA,MAHyB,aAArB7xC,KAAKi6C,aACPl2C,EAAW,UAAU/D,KAAK65C,4BC/F1B,SACJ53C,EACAwpC,EACA9qC,EACAkxC,EACAz3B,GAEA,GAAoB,iBAATqxB,EAAmB,CAC5B,MAAMkM,EAAkBtG,GAAmB5F,GACrC33B,EAAY4jC,GAAaz1C,EAAQ01C,EAAiB9F,EAAUz3B,GAElE,OAAOw8B,GACL30C,EAFmB0U,GAAmBghC,EAAgBr5C,SAAUwV,GAIhEnT,EACAkxC,EACAz3B,EAEJ,CACE,OAAOc,QAAQ5e,IACb2F,EACAwpC,EACA9qC,EACAkxC,EAGN,CDuEWwI,CAAQp4C,EAAQwpC,EAAM9qC,EAAOkxC,EAAU7xC,KAChD,CAEA,GAAAzD,CACE0F,EACAwpC,GAEA,OAAOvwB,QAAQ3e,IAAI0F,EAAQwpC,EAE7B,EE1HF,MAAM6O,GAAuE,IAAI7+C,QCJjF,MAAM8+C,GAA2E,IAAI9+C,QAW/E,SAAU++C,GAA8B5wB,EAAuBxlB,GACnE,MAAMq2C,EAAWF,GAA2Br+C,IAAI0tB,GAChD,OAAK6wB,EAGEA,EAASv+C,IAAIkI,IAAc,KAFzB,IAGX,CCFA,MAAMs2C,GAAqF,IAAIj/C,QACzFk/C,GAAqF,IAAIl/C,QACzFm/C,GAAsE,IAAIn/C,QAC1Eo/C,GAAmE,IAAIp/C,QAE7E,SAASq/C,GAA2BC,EAA2BvlC,GAK7D,MAAO,CAAEwlC,iBAHgBznC,GAAoBwnC,EADvB38C,EAAYoX,EAAQjR,aAAakD,MAAM,GAAGY,KAAKzL,KAI1Cq+C,iBAFEplC,GAAiCL,GACf/B,iBAEjD,CAsCM,SAAUynC,GAAyBtxB,EAAuBoxB,GAC9D,IAAIG,EAAeT,GAAsBx+C,IAAI0tB,GAK7C,QAJ4B,IAAjBuxB,IACTA,EAAe,IAAIh9C,IACnBu8C,GAAsBp+C,IAAIstB,EAAcuxB,IAEtCA,EAAa5+C,IAAIy+C,GACnB,OAAOG,EAAaj/C,IAAI8+C,GAE1B,IAAII,EAAeT,GAAsBz+C,IAAI0tB,QACjB,IAAjBwxB,IACTA,EAAe,IAAIj9C,IACnBw8C,GAAsBr+C,IAAIstB,EAAcwxB,IAG1C,MAAMC,EAAwBT,GAA+B1+C,IAAI0tB,GACjE,QAAqC,IAA1ByxB,EAET,OAAO,KAET,IAAIC,EAA0C,KAC9C,IAAI,MAAMC,KAA6BF,EAErC,GAAKL,EAAiB18C,SAASO,sBAAsBtC,IAAIg/C,EAA0BP,iBAAiB18C,UAApG,CAGIi9C,EAA0BP,iBAAiB18C,SAASE,SAAS4B,SAAW46C,EAAiB18C,SAASE,SAAS4B,QAC7G2D,EAAW,6CAEbu3C,EAAqBC,EACrB,KALA,CAOF,GAA2B,OAAvBD,EAEF,OAAO,KAGT,MAAME,EAAiBX,GAA4B3+C,IAAIo/C,QAEzB,IAAnBE,GACTz3C,EAAW,gEAGb,MAAM03C,EAAyBT,EAAiB18C,SAASE,SAASiJ,MAAM6zC,EAAmBN,iBAAiB18C,SAASE,SAAS4B,QAExHs7C,EAAgBt9C,EADAk9C,EAAmBL,iBAAiB38C,SAASE,SAASga,OAAOijC,GACnCpzC,KAAKzL,IAE/C++C,EAAoB5sC,GADT6a,EAAalU,cAC4B8lC,EAAep3C,WAC/C,OAAtBu3C,GACF53C,EAAW,4BAA4By3C,EAAep3C,2CAExD,MAAM62C,EAAmB1nC,GAAoBooC,EAAmBD,GAChEP,EAAa7+C,IAAI0+C,EAAkBC,GACnCG,EAAa9+C,IAAI2+C,EAAkBD,GAYnC,O5IvHI,SAA2Bj/C,EAAYyZ,GAC3C,MAAMlQ,EAAWF,EAAkBrJ,GAClB,OAAbuJ,EACFD,EAAkBtJ,EAAM,CAACyZ,IAEzBlQ,EAASjF,KAAKmV,EAElB,C4I8GEomC,CAAiBhyB,EAPgB,IAC5B4xB,EACHl3C,SAAU02C,EAAiB18C,SAASD,KACpCkG,aAAcy2C,EAAiB18C,SAASE,SACxCiG,cAAew2C,EAAiB38C,SAASD,KACzCqG,cAAeu2C,EAAiB38C,WAI3B28C,CACT,CCrHM,SAAUY,GAAiBC,GAC/B,OAfF,SAA8BC,GAC5B,MAAMC,EAAQ7+C,OAAO8+C,eAAeF,GAC9BG,EAAQ/+C,OAAOouC,OAAOyQ,GACtBG,EAAch/C,OAAOi/C,0BAA0BL,GACrD,IAAI,MAAM9qC,KAAOkrC,EAAa,CAC5B,MAAM94C,EAAa84C,EAAYlrC,IACH,IAAxB5N,EAAWg5C,WACbh5C,EAAWg5C,UAAW,EAE1B,CAEA,OADAl/C,OAAOm/C,iBAAiBJ,EAAOC,GACxBD,CACT,CAGSK,CAAqBT,EAC9B,CCHA,MAAMU,GACIC,cACAC,mBACR,WAAA78C,CAAY+pB,EAAuBxlB,GACjCpE,KAAKy8C,cAAgB7yB,EACrB5pB,KAAK08C,mBAAqBlC,GAA8B5wB,EAAcxlB,IAAcL,EAAW,6CACjG,CAEA,GAAA7H,CAAI+F,EAAqBwpC,EAAuBoG,GAC9C,GAAoB,iBAATpG,EA2CT,OAAOvwB,QAAQhf,IAAI+F,EAAQwpC,EAAMoG,GA3CL,CAC5B,GAAa,SAATpG,EAEF,OAEF,GAAgB,MAAZA,EAAK,GACP,OAGF,GAAIzrC,KAAK08C,mBAAmB/T,YAAYpsC,IAAIkvC,IAASA,KAAQxpC,EAC3D,OAAOiZ,QAAQhf,IAAI+F,EAAQwpC,EAAMoG,GAGnC,MAAM8K,EAAgBv+C,EAAYqtC,GAC5BuP,EAAmBznC,GAAoBvT,KAAK08C,mBAAoBC,GAChE1B,EAAmBC,GAAyBl7C,KAAKy8C,cAAezB,GACtE,GAAyB,OAArBC,EAA2B,CAC7B,MAAM1oC,EAAcF,GAAqBrS,KAAKy8C,eAC9C,IAAI97C,EAgBJ,OAfAs6C,EAAiBnsC,aAAawJ,YAAY,WAAazd,IACrDA,EAAMmY,IAAsBT,EAAa,KACvC5R,EAAQ9F,EAAMogD,EAAiB38C,SAASD,MACxC,IAAIyV,EAA+B,KACf,OAAhBvB,GAAkD,OAA1BA,EAAYuB,WAClCmnC,EAAiB38C,SAASqB,cAAgB,IAG5CmU,EAAYvB,EAAYuB,UAAUuB,GAAG4lC,EAAiB38C,SAASqB,cAAgB,KJ1CzF,SAA6CmW,EAA6CnV,GAC9F25C,GAAgCh+C,IAAIwZ,EAAsBnV,EAC5D,CI4CYi8C,CADwB1oC,GAA2B+mC,EAAkBnnC,GACjBnT,OAGjDA,CACT,CAEA,GAAI8qC,KAAQxpC,EACV,OAAOiZ,QAAQhf,IAAI+F,EAAQwpC,EAAMoG,GAGnC9tC,EAAW,aAAa0nC,4EAC1B,CAGF,CAEA,GAAAnvC,CAAI2F,EAAqBwpC,EAAuB9qC,EAAYkxC,GAC1D,GAAoB,iBAATpG,EAyBT,OAAOvwB,QAAQ5e,IAAI2F,EAAQwpC,EAAM9qC,EAAOkxC,GAzBZ,CAE5B,GAAI7xC,KAAK08C,mBAAmB7T,YAAYtsC,IAAIkvC,IAASA,KAAQxpC,EAC3D,OAAOiZ,QAAQ5e,IAAI2F,EAAQwpC,EAAM9qC,EAAOkxC,GAG1C,MAAM8K,EAAgBv+C,EAAYqtC,GAC5BuP,EAAmBznC,GAAoBvT,KAAK08C,mBAAoBC,GAChE1B,EAAmBC,GAAyBl7C,KAAKy8C,cAAezB,GACtE,GAAyB,OAArBC,EAA2B,CAC7B,MAAM1oC,EAAcF,GAAqBrS,KAAKy8C,eAM9C,OALAxB,EAAiBnsC,aAAawJ,YAAY,WAAazd,IACrDA,EAAMmY,IAAsBT,EAAa,KACvC1X,EAAMogD,EAAiB38C,SAASD,MAAQsC,OAGrC,CACT,CAEA,GAAI8qC,KAAQxpC,EACV,OAAOiZ,QAAQ5e,IAAI2F,EAAQwpC,EAAM9qC,EAAOkxC,GAG1C9tC,EAAW,aAAa0nC,4EAC1B,CAGF,CAEA,GAAAlvC,CAAI0F,EAAqBwpC,GACvB,GAAoB,iBAATA,EAAmB,CAC5B,GAAgB,MAAZA,EAAK,GACP,OAAO,EAGT,IAAKzrC,KAAK08C,mBAAmB/T,YAAYpsC,IAAIkvC,IAASzrC,KAAK08C,mBAAmB7T,YAAYtsC,IAAIkvC,KAAUA,KAAQxpC,EAC9G,OAAO,EAGT,MAAM06C,EAAgBv+C,EAAYqtC,GAC5BuP,EAAmBznC,GAAoBvT,KAAK08C,mBAAoBC,GAEtE,OAAyB,OADAzB,GAAyBl7C,KAAKy8C,cAAezB,IAKlEvP,KAAQxpC,CAKd,CACE,OAAOiZ,QAAQ3e,IAAI0F,EAAQwpC,EAE/B,ECpHF,MAAMoR,GACIH,mBACR,WAAA78C,CAAY+pB,EAAuBxlB,GACjCpE,KAAK08C,mBAAqBlC,GAA8B5wB,EAAcxlB,IAAcL,EAAW,6CACjG,CAEA,GAAA7H,CAAI+F,EAAqBwpC,EAAuBoG,GAC9C,GAAoB,iBAATpG,EAAmB,CAC5B,MAAMkR,EAAgBv+C,EAAYqtC,GAE5BqR,EAAkB5oC,GADCX,GAAoBvT,KAAK08C,mBAAoBC,GACD,MACrE,OLR6C7mC,EKQHgnC,ELPvCxC,GAAgCp+C,IAAI4Z,EKQzC,CACE,OAAOoF,QAAQhf,IAAI+F,EAAQwpC,EAAMoG,GLVjC,IAA6C/7B,CKYjD,CAEA,GAAAxZ,CAAI2F,EAAqBwpC,EAAuB9qC,EAAYkxC,GAC1D,GAAoB,iBAATpG,EAAmB,CAC5B,MAAMkR,EAAgBv+C,EAAYqtC,GAC5BuP,EAAmBznC,GAAoBvT,KAAK08C,mBAAoBC,GAItE,OAHA38C,KAAK08C,mBAAmBpkC,YAAY,WAAazd,IAC/CA,EAAM21C,YAAYwK,EAAiB18C,SAASD,SAEvC,CACT,CACE,OAAO6c,QAAQ5e,IAAI2F,EAAQwpC,EAAM9qC,EAAOkxC,EAE5C,EChCF,MAAMkL,GACIL,mBACR,WAAA78C,CAAY+pB,EAAuBxlB,GACjCpE,KAAK08C,mBAAqBlC,GAA8B5wB,EAAcxlB,IAAcL,EAAW,6CACjG,CAEA,GAAA7H,CAAI+F,EAAqBwpC,EAAuBoG,GAC9C,GAAoB,iBAATpG,EAAmB,CAC5B,IAAI9qC,EAIJ,OAHAX,KAAK08C,mBAAmBpkC,YAAY,WAAazd,IAC/C8F,EAAQ9F,EAAM4wC,KAET9qC,CACT,CACE,OAAOua,QAAQhf,IAAI+F,EAAQwpC,EAAMoG,EAErC,CAEA,GAAAv1C,CAAI2F,EAAqBwpC,EAAuB9qC,EAAYkxC,GAC1D,MAAoB,iBAATpG,GACTzrC,KAAK08C,mBAAmBpkC,YAAY,WAAazd,IAC/CA,EAAM4wC,GAAQ9qC,KAET,GAEAua,QAAQ5e,IAAI2F,EAAQwpC,EAAM9qC,EAAOkxC,EAE5C,EClBF,MAAMmL,GAAYC,GAA4B,IAAmBA,EAE3D,SAAUC,GACdC,EACAC,EACAC,EACAxiD,GAGA,YNnB4C+uB,EAAuBxlB,EAAmB0K,GACtF,IAAI2rC,EAAWF,GAA2Br+C,IAAI0tB,GACzC6wB,IACHA,EAAW,IAAIt8C,IACfo8C,GAA2Bj+C,IAAIstB,EAAc6wB,IAE/CA,EAASn+C,IAAI8H,EAAW0K,EAC1B,CMWEwuC,CAA8BF,EAAWC,EAAWF,GAChDC,EAAUhjD,aAAakB,EAAOhB,mBAAoB,CACpD,MAAMgL,GAAYF,EAAkBg4C,IAAc,IAAIvyC,OACpD2K,GAAWA,EAAQjR,aAAa,KAAO84C,aLKLzzB,EAAuBxlB,EAAmBkB,GAChF,GAAwB,IAApBA,EAASlF,OACX,OAEF,MAAM26C,EAAaP,GAA8B5wB,EAAcxlB,GAC5C,OAAf22C,GACFh3C,EAAW,8CAEb,MAAMw5C,EAAmB,IAAIp/C,IACvBq/C,EAAmB,IAAIr/C,IAC7B,IAAK,MAAMqX,KAAWlQ,EAAU,CAC9B,MAAMm4C,EAAc3C,GAA2BC,EAAYvlC,GAC3D,IAAI6lC,EAAwBT,GAA+B1+C,IAAI0tB,QAC1B,IAA1ByxB,EACTT,GAA+Bt+C,IAAIstB,EAAc,IAAItpB,IAAI,CAACm9C,KAE1DpC,EAAsB1+C,IAAI8gD,GAE5B,MAAMzC,EAAmByC,EAAYzC,iBAC/BC,EAAmBwC,EAAYxC,iBACrCJ,GAA4Bv+C,IAAImhD,EAAajoC,GAC7C+nC,EAAiBjhD,IAAI0+C,EAAkBC,GACvCuC,EAAiBlhD,IAAI2+C,EAAkBD,EACzC,CACAN,GAAsBp+C,IAAIstB,EAAc2zB,GACxC5C,GAAsBr+C,IAAIstB,EAAc4zB,EAC1C,CK7BIE,CAAwBN,EAAWC,EAAW/3C,GAC9C,MAAM23C,EFYJ,SAA2BrzB,EAAuBxlB,GACtD,MAAMgW,EAAU,IAAIyiC,GAAuBjzB,EAAcxlB,GACzD,OAAO,IAAIknC,MAAM,CAAA,EAAIlxB,EACvB,CEfuBujC,CAAiBP,EAAWC,GACzCtC,EHoGJ,SAA2BnxB,EAAuBxlB,GACtD,MAAMgW,EAAU,IAAIoiC,GAAuB5yB,EAAcxlB,GACnD22C,EAAaP,GAA8B5wB,EAAcxlB,GAE5C,OAAf22C,GACFh3C,EAAW,8CAG8B,OAAvCg3C,EAAW6C,yBACb75C,EAAW,2DAEPg3C,EAAW6C,2BAA2Bh0B,GAC1C7lB,EAAW,+DAA+Dg3C,EAAW6C,2BAEvF,MAAM/iD,EAAS+uB,EAAqBmxB,EAAW6C,yBAI/C,MAHqB,iBAAV/iD,GAAgC,OAAVA,GAC/BkJ,EAAW,kDAAkDg3C,EAAW6C,2BAEnE,IAAItS,MAAMuQ,GAAiBhhD,GAAQuf,EAC5C,CGvHuByjC,CAAiBT,EAAWC,GAC/CF,EAAkBW,gBAAgB/C,GAClC59C,OAAO4gD,eAAeX,EAAWC,EAAW,CAC1CnhD,IAAK8gD,GAASC,GACdpR,YAAY,EACZD,cAAc,GAElB,KAAO,CACLuR,EAAkBW,gBAAgBjC,GAAiBhhD,IACnD,MAAMoiD,EDHJ,SAAgCrzB,EAAuBxlB,GAC3D,MAAMgW,EAAU,IAAI2iC,GAA4BnzB,EAAcxlB,GAC9D,OAAO,IAAIknC,MAAM,CAAA,EAAIlxB,EACvB,CCAuB4jC,CAAsBZ,EAAWC,GACpDlgD,OAAO4gD,eAAeX,EAAWC,EAAW,CAC1CnhD,IAAK8gD,GAASC,GACdpR,YAAY,EACZD,cAAc,GAElB,CAEA,GlG1CI,SAAqChiB,EAAuB9a,GAChE,IAAI+a,EAAyBH,GAAqCxtB,IAAI0tB,GACjEC,IACHA,EAAyB,IAAIpuB,QAC7BiuB,GAAqCptB,IAAIstB,EAAcC,IAEzDA,EAAuBvtB,IAAIwS,GAAc,EAC3C,CkGkCEmvC,CAA2Bb,EAAWD,GAClC3/C,KAA0C4/C,EAAW,CACvD,MAAMc,EAAQd,EAAkB5/C,GACZ,mBAAT0gD,EACTA,EAAKhF,KAAKkE,EAAWC,GAAWvO,MAAOlvB,IACrC7b,EAAW,YAAYvG,MAA2CoiB,aAAiB3b,MAAQ2b,EAAM5b,QAAUmD,OAAOyY,QAGpH7b,EAAW,GAAGvG,uBAElB,CACF,CCVA,SAAS2gD,GACPtjD,GAKA,MAAM8tC,EAA2B,IAAIroC,IAC/BuoC,EAA2B,IAAIvoC,IAC/B67C,EAlBR,SAAmCJ,GACjC,IAAII,EAA2B,CAAA,EAC3BH,EAAQD,EACZ,KAAOC,GAASA,IAAU7+C,OAAOktB,WAC/BltB,OAAOihD,OAAOjC,EAAah/C,OAAOi/C,0BAA0BJ,IAC5DA,EAAQ7+C,OAAO8+C,eAAeD,GAEhC,OAAOG,CACT,CAUsBkC,CAA0BxjD,GAC9C,IAAI,MAAQoW,EAAK5N,KAAgBlG,OAAO0G,QAAQs4C,GAChB,mBAAnB94C,EAAWnH,KACpBysC,EAAYhsC,IAAIsU,GAEY,mBAAnB5N,EAAW/G,KACpBusC,EAAYlsC,IAAIsU,GAGpB,MAAO,CACL03B,cAAaE,cAEjB,CAEM,MAAOyV,WAAcze,GACzB0e,oCAAqC,EAErC,uBAAO9Y,CAAiBh3B,GACtB,OAAOg3B,GAAiBh3B,EAC1B,CAEQwzB,QACAuc,qBAA+B,EAG/BC,mBAAkC,IAAIn+C,IAGtCo+C,2BAA0C,IAAIp+C,IAC9CsY,MAAgB,UAChB+lC,cAAwB,EACxBC,mBACAC,mBAA0C,KAC1CC,0BACAC,0BAAiD,KACjDC,gBACAC,gBAAuC,KACvCC,iBAAwD,KACxDC,iBAAkE,KAClEC,WAA0B,IAAI9+C,IAC9B++C,cAA6B,IAAI/+C,IACjCg/C,aAA4B,IAAIh/C,IAChCi/C,aAA4B,IAAIj/C,IAChCsqC,6B1CjCR,OAAO,IAAID,EACb,C0CgCiD6U,GACvCC,mBAA4C,IAAIthD,IAChDuhD,kBAA2C,IAAIvhD,IAC/CwhD,SAAwB,IAAIr/C,IAC5BwqB,SAAW,EACX80B,UAAyB,KACzBC,gBAAkC,KAClCC,yBAA0C,KAC1CC,kBAA4C,CAAA,EAC5CC,mBAAkC,IAAI1/C,IACtC2/C,iBAAgC,IAAI3/C,IACpC4/C,MAAgB,EAMhBC,mBAA6B,EAI7BC,0BAAoC,EAE5C,WAAAvgD,GACEwZ,QACArZ,KAAK4+C,mBAAqB,IAAIxiD,QAAeC,IAC3C2D,KAAK6+C,mBAAqBxiD,IAE5B2D,KAAK8+C,0BAA4B,IAAI1iD,QAAeC,IAClD2D,KAAK++C,0BAA4B1iD,IAEnC2D,KAAKg/C,gBAAkB,IAAI5iD,QAAeC,IACxC2D,KAAKi/C,gBAAkB5iD,IAEzB2D,KAAKk/C,iBAAmB,IAAI9iD,QAA8BC,IACxD2D,KAAKm/C,iBAAmB9iD,GAE5B,CAEA,UAAYgkD,GAIV,YAH4B,IAAjBrgD,KAAKiiC,SACdl+B,EAAW,GAAGzI,EAAOV,SAASC,wCAEzBmF,KAAKiiC,OACd,CAEA,UAAYoe,CAAO1/C,GACjBX,KAAKggD,mBChIH,SAA0CnlD,GAC9C,MAAMylD,EAAQ,IAAIhgD,IACZ4sC,EAAYryC,EAAkC6C,GACpD,QAAwB,IAAbwvC,EACT,OAAOoT,EAEJ38C,MAAMC,QAAQspC,IACjBnpC,EAAW,GAAGrG,kCAEhB,IAAK,MAAM4F,KAAQ4pC,EACG,iBAAT5pC,GAAqC,IAAhBA,EAAKlD,QACnC2D,EAAW,GAAGrG,wCAEZ4F,IAAS3F,GACXoG,EAAW,GAAGrG,YAAoC4F,kDAAqD3F,OAErG2iD,EAAM/jD,IAAI+G,IACZS,EAAW,GAAGrG,YAAoC4F,qBAEpDg9C,EAAM3jD,IAAI2G,GAEZ,OAAOg9C,CACT,CD0G8BC,CAAgC5/C,GAC1DX,KAAKigD,iBEnIH,SAAwCplD,GAC5C,MAAMylD,EAAQ,IAAIhgD,IACZ4sC,EAAYryC,EAAkC+C,GACpD,QAAwB,IAAbsvC,EACT,OAAOoT,EAEJ38C,MAAMC,QAAQspC,IACjBnpC,EAAW,GAAGnG,kCAEhB,IAAK,MAAM0F,KAAQ4pC,EACG,iBAAT5pC,GAAqC,IAAhBA,EAAKlD,QACnC2D,EAAW,GAAGnG,wCAEZ0iD,EAAM/jD,IAAI+G,IACZS,EAAW,GAAGnG,YAAkC0F,qBAElDg9C,EAAM3jD,IAAI2G,GAEZ,OAAOg9C,CACT,CFgH4BE,CAA8B7/C,GACtDX,KAAKiiC,QAAUthC,EAOfX,KAAKw+C,oBAAsBjhD,KAA+BoD,EAE1DiZ,GAAwB5Z,eGvI1B8O,EACAjU,EACA0f,GAEA,MAAM2yB,EAAYryC,EAAkCgD,GACpD,QAAwB,IAAbqvC,EAAX,CAGwB,iBAAbA,GAAsC,OAAbA,GAClCnpC,EAAW,GAAGlG,uEAEhB,IAAK,MAAOyF,EAAM8W,KAAYjd,OAAO0G,QAAQqpC,GACtC3yB,EAAgBhe,IAAI+G,IACvBS,EAAW,GAAGlG,YAAwByF,uCAEjB,mBAAZ8W,GACTrW,EAAW,GAAGlG,YAAwByF,0BAE1BoW,GAAsB5K,EAAcxL,GAC5CwV,UAAUsB,EAZlB,CAcF,CHmHIqmC,CAAqBzgD,KAAMW,EAAOX,KAAKigD,kBACvCjgD,KAAKo/C,WAAW3nC,QAChBzX,KAAKq/C,cAAc5nC,QACnBzX,KAAKs/C,aAAa7nC,QAGlBzX,KAAKu/C,aAAa9nC,QAClBzX,KAAK2/C,SAASloC,QACd,MAAMipC,EAAYvC,GAAax9C,GAC/B,IAAI,MAAMtC,KAAQqiD,EAAU/X,YAC1B3oC,KAAKs/C,aAAa3iD,IAAI0B,GAExB,IAAI,MAAMA,KAAQqiD,EAAU7X,YAC1B7oC,KAAKu/C,aAAa5iD,IAAI0B,GrCvGtB,IAA8ByQ,EqC6GhCm/B,GAAqBjuC,MrC5GvB0sC,GADkC59B,EqC8GZ9O,MrC1GtBusC,GAAyBz9B,GACzB2K,GAAuB9K,OAAOG,GqC0G5Bm+B,GAA0BjtC,KAAMW,GAI5BX,KAAK2+C,cAAmC,OAAnB3+C,KAAK4/C,YAAuB5lD,MACnDu1C,GAAavvC,MAMbA,KAAKogD,0BAA4BpgD,KAAKmgD,oBAExCngD,KAAKi/C,mBACP,CAEA,QAAI37C,GACF,OAAOtD,KAAK4Y,KACd,CAEQ,mBAAA+nC,GACN,IAAK3gD,KAAK5F,aAAa,cAAe,OAAO,KAC7C,MAAMkJ,EAAOtD,KAAKoB,aAAa,SAAW,UACpCU,EAAO9B,KAAKwS,WAClB,IAAK1Q,EAAM,OAAO,KAClB,MAAMqgC,EAAQ9B,GAAIqB,WAAW5/B,EAAMwB,GACnC,IAAK6+B,EAAO,OAAO,KACnB,MAAMj0B,EAAOi0B,EAAM1B,UACnB,OAAOtjC,OAAO4T,KAAK7C,GAAM9N,OAAS,EAAI8N,EAAO,IAC/C,CAEQ,iBAAM0yC,GAEZ,MAAMC,EAAY7mD,IAAuC,KAA7BgG,KAAK2gD,sBACjC,IACE,GAAI3gD,KAAK5F,aAAa,SAAU,CAC9B,MAAMS,EAAQmF,KAAKoB,aAAa,SAChCpB,KAAKqgD,OIlNP,SAA6BzkD,GACjC,MAAM0lC,EAASpnC,SAAS4mD,eAAellD,GACvC,GAAI0lC,GAA0B,qBAAhBA,EAAOnrB,KACnB,IAEE,OADa+e,KAAKsM,MAAMF,EAAOrN,aAAe,KAEhD,CAAE,MAAOxW,GACP1Z,EAAW,4CAA8C0Z,EAC3D,CAEF,MAAO,CAAA,CACT,CJuMsBsjC,CAAmBlmD,EACnC,MAAO,GAAImF,KAAK5F,aAAa,OAAQ,CACnC,MAAM4mD,EAAMhhD,KAAKoB,aAAa,OAC1B4/C,GAAOA,EAAIC,SAAS,SACtBjhD,KAAKqgD,aKvNRxkD,eAAgCouC,GACrC,IACE,MAAMiX,QAAiBC,MAAMlX,GAK7B,OAJKiX,EAASE,IACZr9C,EAAW,8BAA8Bm9C,EAASG,oBAEjCH,EAAS/gB,MAE9B,CAAE,MAAO1iB,GAEP,OADApM,QAAQuO,MAAM,4BAA6BnC,GACpC,CAAA,CACT,CACF,CL2M8B6jC,CAAiBN,GAC5BA,GAAOA,EAAIC,SAAS,OAC7BjhD,KAAKqgD,aAAe3V,GAAmBsW,GAEvCj9C,EAAW,8BAA8Bi9C,IAE7C,MAAO,GAAIhhD,KAAK5F,aAAa,QAAS,CACnC,MAAM+lC,EAAOngC,KAAKoB,aAAa,QAC9BpB,KAAKqgD,OAASnrB,KAAKsM,MAAMrB,EAC7B,KAAO,CACL,MAAMmB,EAASthC,KAAKuhC,cAAiC,yBACrD,GAAID,EACFthC,KAAKqgD,aAAe3W,GAAoBpI,EAAQ,GAAGthC,KAAK4Y,aACnD,CACL,MAAM2oC,EAAUC,WAAW,KACzBnwC,QAAQ8G,KAAK,wDAAwD7c,EAAOV,SAASC,6BAA6BmF,KAAK4Y,Y1J1MrG,K0J6MpB5Y,KAAKqgD,aAAergD,KAAKk/C,iBACzBuC,aAAaF,EACf,CACF,CACF,CAAE,MAAM9jC,GACN1Z,EAAW,+BAA+B0Z,IAC5C,CAEA,GAAiB,OAAbojC,GAAqB7gD,KAAKiiC,QAC5B,IAAK,MAAOhxB,EAAKtQ,KAAUxD,OAAO0G,QAAQg9C,GAAW,CACnD,GAAI5vC,KAAOjR,KAAKiiC,QAAS,CACvB,MAAMyf,EAAOvkD,OAAOwuC,yBAAyB3rC,KAAKiiC,QAAShxB,GAE3D,GAAIywC,IAASA,EAAKxlD,KAAOwlD,EAAKplD,KAAM,SAEpC,GAAiC,mBAAtB0D,KAAKiiC,QAAQhxB,GAAqB,QAC/C,CACAjR,KAAKiiC,QAAQhxB,GAAOtQ,CACtB,OAEIX,KAAKg/C,gBACXh/C,KAAK4Y,MAAQ5Y,KAAKoB,aAAa,SAAW,UAC1CskC,GAAsB1lC,KAAKyO,SAAWzO,KAAK4Y,MAAO5Y,KACpD,CAEQ,iCAAM2hD,GACZ,GAAI3hD,KAAK5F,aAAa,kBAAmB,CAIvC,MAAMoY,EAAaxS,KAAKwS,WAClBovC,EAAiBpvC,aAAsBgoB,WACzChoB,EAAWmtB,KACXntB,aAAsBovB,QACpBpvB,EACA,KACAuH,EAAgB6nC,EAAiBphD,EAAiBohD,GAAkB,KACnD,OAAnBA,GAA6C,OAAlB7nC,GAC7BhW,EAAW,8BAA8BzI,EAAOV,SAASC,oDAGrD2X,aAAsBgoB,YAAgBx6B,KAAK5F,aAAa,SAC5D2J,EAAW,iHAEb,MAAM65C,EAA0B59C,KAAKoB,aAAa,wBAC5CK,eAAeG,YAAYmY,EAAc9Y,eAE3C2gD,EAAexnD,aAAakB,EAAOhB,0BAC/BwB,EAAsB8lD,GAExBhE,KAA2BgE,GAC/B79C,EAAW,qCAAqC65C,yBAElD,MAAM/iD,EAAS+mD,EAAuBhE,GACjB,iBAAV/iD,GAAgC,OAAVA,GAC/BkJ,EAAW,uBAAuB65C,0CAEpC59C,KAAK6/C,gBAAkB+B,EACvB5hD,KAAK8/C,yBAA2BlC,EAChCV,GAAiBl9C,KAAMA,KAAK6/C,gBAAiB7/C,KAAK8/C,yBAA0BjlD,EAC9E,CACF,CAEQ,iCAAMgnD,SACN7hD,KAAKwa,iBAAiB,WAAY3e,MAAOhB,IAEzCwC,KAAiCxC,SAC7BA,EAAMuY,OAGlB,CAEQ,oBAAM0uC,CAAeC,EAAsBriB,GACjD,IAAI7kC,EACJ,IACE,GAAImF,KAAK5F,aAAa,OAAQ,CAC5B,MAAM4mD,EAAMhhD,KAAKoB,aAAa,OAC1B4/C,EAAIC,SAAS,OACfpmD,QAAc6vC,GAAmBsW,GAEjCj9C,EAAW,8BAA8Bi9C,IAE7C,KAAO,CACL,MAAM1f,EAASthC,KAAKuhC,cAAiC,yBACjDD,EACFzmC,QAAc6uC,GAAoBpI,EAAQygB,EAAY/gD,QAAQC,eAE9D8C,EAAW,mCAAmCg+C,EAAY/gD,QAAQC,kBAEtE,CACF,CAAE,MAAOwc,GACP1Z,EAAW,8BAA8B0Z,IAC3C,WMhUsBskC,EAAsBriB,EAAwB7kC,GACtE,MAAMmG,EAAU+gD,EAAY/gD,QAAQC,cAMpC,GAHKD,EAAQE,SAAS,MACpB6C,EAAW,SAAS/C,kEAElBS,eAAevF,IAAI8E,GAGrB,YADAqQ,QAAQ8G,KAAK,0BAA0BnX,oDAKzC,MAAM4wB,EAAW13B,SAAS6hC,cAAc,YACxCnK,EAASowB,UAAYtiB,EAAWsiB,UAChC,MAAMC,EAAiBviB,EAAWwiB,KAG5BC,EAAsBx+C,MAAMC,QAAQ/I,EAAM4C,IAC5C5C,EAAM4C,GACN,GACE4E,EAAiC8/C,EAAU/hD,OAAS,ECvBtD,SAA2BY,EAAiBmhD,GAYhD,MAAO,CACL7/C,SAAU,cACVG,QAAS,EACTG,WAdwCu/C,EAAUj3C,IAAK5G,IAAQ,CAC/DhB,KAAMgB,EACNf,MAAO,GAAGvC,KAAWsD,eAarBvB,OAPiCo/C,EAAUj3C,IAAK5G,IAAQ,CACxDhB,KAAMgB,KAQV,CDMM89C,CAAiBphD,EAASmhD,GAC1B,KACElL,EAA2CkL,EAAU/hD,OAAS,ECNhE,SAAiCY,EAAiBmhD,GACtD,MAAMj3C,EAA8B,CAAA,EACpC,IAAK,MAAM5G,KAAY69C,EACrBj3C,EAAI5G,GAAY,GAAGtD,KAAWsD,YAEhC,OAAO4G,CACT,CDCMm3C,CAAuBrhD,EAASmhD,GAChC,CAAA,EAGEG,EAAmB,GAAGhnD,EAAOV,SAASC,oBAEtC0nD,EAAa,cAAc15B,YAC/B01B,gBAAkB3sB,EAClB2sB,sBAAwB0D,EACxB1D,kBAAoBl8C,EACpBk8C,wBAA0BtH,EAElBuL,QAA6B,KAErC,iBAAArJ,GACE,IAAIn5C,KAAK5F,aAAa6D,KACtB+B,KAAKwiD,QAAUxiD,KAAKyiD,aAAa,CAAEP,KAAMK,EAAWN,iBACpDjiD,KAAKwiD,QAAQ3xB,YAAY0xB,EAAW3wB,SAASzH,QAAQoY,WAAU,IAG3DplC,OAAO4T,KAAKwxC,EAAWtL,kBAAkB72C,OAAS,GAAG,CACvD,MAAM2hC,EAAU/hC,KAAKwiD,QAAQjhB,cAAc+gB,GACvCvgB,GACFA,EAAQzC,kBAAkB5f,KAAK,KAC7BqiB,EAAQ2gB,oBAAoBH,EAAWtL,mBAG7C,CACF,CAEA,gBAAInoC,GACF,OAAO9O,KAAKwiD,SAASjhB,cAAc+gB,EACrC,GAIInG,EAAch/C,OAAOi/C,0BAA0BvhD,GACrD,IAAK,MAAOyI,EAAMo+C,KAASvkD,OAAO0G,QAAQs4C,GAAc,CACtD,GAAItL,GAAmBvtC,GAAO,SAE9B,MAAMq/C,EAA8B,CAAE/W,cAAc,EAAMC,YAAY,GACtE,GAA0B,mBAAf6V,EAAK/gD,MAAsB,CACpC,MAAMiwC,EAA2C,kBAAjC8Q,EAAK/gD,MAAMd,aAAayD,KACxCq/C,EAAQhiD,MAAQgwC,GAAOrtC,EAAMstC,EAC/B,MACE+R,EAAQzmD,IAAMu0C,GAASntC,GACvBq/C,EAAQrmD,IAAMo0C,GAASptC,GAEzBnG,OAAO4gD,eAAewE,EAAWl4B,UAAW/mB,EAAMq/C,EACpD,CAGAlhD,eAAemhD,OAAO5hD,EAASuhD,EACjC,CNkPIM,CAAUd,EAAariB,EAAY7kC,GACnCmF,KAAKkgD,MAAO,EACZlgD,KAAK2+C,cAAe,EACpB3+C,KAAK4/C,UAAY,KACjB5/C,KAAK6+C,uBACL7+C,KAAK++C,6BACP,CAEQ,8BAAA+D,GACN9iD,KAAKsY,YAAY,WAAazd,IAExByC,KAAoCzC,GACtCA,EAAMwY,OAGZ,CAEA,uBAAM8lC,GACJn5C,KAAK4/C,UAAY5/C,KAAK0V,cAKtB,MAAMqtC,IAAsB/iD,KAAKmgD,mBACjC,GAAKngD,KAAK2+C,aAYE3+C,KAAKkgD,MAAQnxC,GAAsB/O,KAAK4/C,UAAW5/C,KAAK4Y,SAAW5Y,MAI7E0lC,GAAsB1lC,KAAK4/C,UAAW5/C,KAAK4Y,MAAO5Y,UAhB5B,CAEtB,MAAMwS,EAAaxS,KAAKwS,WACxB,GAAIA,aAAsBgoB,YACtBhoB,EAAWmtB,KAAKvlC,aAAa6D,GAE/B,kBADM+B,KAAK8hD,eAAetvC,EAAWmtB,KAAMntB,SAGvCxS,KAAK2hD,oCACL3hD,KAAK4gD,cACX5gD,KAAK2+C,cAAe,EACpB3+C,KAAK6+C,sBACP,CAaA,GALK7+C,KAAK5F,aAAa,gBAAiBJ,WAChCgG,KAAK6hD,8BAIT7nD,KAAWgG,KAAK5F,aAAa,cAAe,OACxCqrC,GAAiBzlC,KAAKyO,UAE5B,MAAMnL,EAAOtD,KAAKoB,aAAa,SAAW,UACpCq/B,EAAYJ,GAAIyB,iBAAiB9hC,MACjCmiC,EAAQjoC,SAAS6hC,cAAczgC,EAAOV,SAASE,KACrDqnC,EAAMjO,aAAa,OAAQ5wB,GAC3B6+B,EAAMjO,aAAa,UAAW0L,IAC9BS,GAAI6B,aAAaC,EAAO1B,GACxBzgC,KAAKwS,YAAYwe,aAAamR,EAAOniC,KACvC,CAmBGhG,KACkB,OAAnBgG,KAAK4/C,WACLmD,IAAsB/iD,KAAKmgD,oBAC3BngD,KAAKogD,4BAA8B2C,GAEnCxT,GAAavvC,MAGfA,KAAK++C,6BACP,CAEA,oBAAA3F,GACE,GAAuB,OAAnBp5C,KAAK4/C,UAMP,IACE5/C,KAAK8iD,gCACP,SACEpd,GAAsB1lC,KAAKyO,SAAUzO,KAAK4Y,MAAO,MzCxZf9J,EyCyZR9O,KzCxZhCyZ,GAAuB9K,OAAOG,GCyC1B,SAAgCA,GACpCq8B,GAA6Bx8B,OAAOG,EACtC,CwC8WQk0C,CAAsBhjD,MACtB4Z,GAAwB5Z,MAKxB0sC,GAAgB1sC,MAChBiuC,GAAqBjuC,MACrBA,KAAK4/C,UAAY,IACnB,CzCnaA,IAAoC9wC,CyCqaxC,CAEA,qBAAIwwB,GACF,OAAOt/B,KAAK4+C,kBACd,CAEA,4BAAIqE,GACF,OAAOjjD,KAAK8+C,yBACd,CAEA,aAAIrW,GACF,OAAOzoC,KAAKo/C,UACd,CAEA,gBAAI1W,GACF,OAAO1oC,KAAKq/C,aACd,CAEA,eAAI1W,GACF,OAAO3oC,KAAKs/C,YACd,CAEA,eAAIzW,GACF,OAAO7oC,KAAKu/C,YACd,CAEA,oBAAIzmB,GACF,OAAO94B,KAAK4qC,iBACd,CAEA,qBAAI5B,GACF,OAAOhpC,KAAKy/C,kBACd,CAEA,oBAAI1W,GACF,OAAO/oC,KAAK0/C,iBACd,CAEA,WAAIj9C,GACF,OAAOzC,KAAK8qB,QACd,CAEA,YAAIrc,GAIF,OAHuB,OAAnBzO,KAAK4/C,WACP77C,EAAW,oCAEN/D,KAAK4/C,SACd,CAEA,2BAAIhC,GACF,OAAO59C,KAAK8/C,wBACd,CAEA,oBAAI7I,GACF,OAAOj3C,KAAK+/C,iBACd,CAEA,qBAAIjX,GACF,OAAO9oC,KAAKggD,kBACd,CAEA,mBAAIzlC,GACF,OAAOva,KAAKigD,gBACd,CAEA,mBAAAyC,CAAoBx3C,GAClBlL,KAAK+/C,kBAAoB70C,CAC3B,CAEQ,cAAAg4C,CACNh4C,EACA+oC,EACAkP,GAEA,MAAMC,EAAOl4C,EAAIhP,IAAI+3C,GACrB,YAAavzC,IAAT0iD,GACFl4C,EAAI5O,IAAI23C,EAAY,CAACkP,KACd,IACGC,EAAKliD,SAASiiD,KACxBC,EAAK/iD,KAAK8iD,IACH,EAGX,CAiBA,oBAAA1Q,CAAqBwB,EAAoBkP,GACvC,OAAOnjD,KAAKkjD,eAAeljD,KAAKy/C,mBAAoBxL,EAAYkP,EAClE,CAWA,mBAAAE,CAAoBpP,EAAoBkP,GACtC,OAAOnjD,KAAKkjD,eAAeljD,KAAK0/C,kBAAmBzL,EAAYkP,EACjE,CAEA,WAAAn0C,CAAY3Q,EAAcwG,GAKxB,GAJoB,QAAhBA,IACF7E,KAAKo/C,WAAWziD,IAAI0B,GACpB2B,KAAKq/C,cAAc1iD,IAAI0B,EAAO,IAAMxB,KAEjCmD,KAAK2/C,SAASpjD,IAAI8B,GAAO,CAC5B,MAAMC,EAAWF,EAAYC,GAE7B,GADA2B,KAAK2/C,SAAShjD,IAAI0B,GACU,OAAxBC,EAASQ,WAAqB,CAChC,IAAIwkD,EAAkBhlD,EACtB,KAAqC,OAA/BglD,EAAgBxkD,YACfkB,KAAKqjD,oBAAoBC,EAAgBxkD,WAAYwkD,EAAgBjlD,OAG1EilD,EAAkBllD,EAAYklD,EAAgBxkD,WAElD,CACF,CACF,CAEQ,YAAAykD,CAAgB90C,EAAgB0rC,EAAwB/8B,GAC9D,IACE,MAAMq2B,EVhcN,SACJhlC,EACA5T,EACAuJ,EACA+1C,GAEA,MAAM//B,EAAU,IAAIu/B,GAAalrC,EAAUrK,EAAW+1C,GAEtD,OADmB,IAAI7O,MAAmBzwC,EAAsBuf,EAElE,CUubyBopC,CAAiB/0C,EAAUzO,KAAKqgD,OAAQrgD,KAAK4Y,MAAOuhC,GACvE,OAAO/8B,EAASq2B,EAClB,SAEA,CACF,CAEA,sBAAMj5B,CAAiB2/B,EAAwB/8B,GAC7C,aAAapd,KAAKujD,aAAavjD,KAAKyO,SAAU0rC,EAAY/8B,EAC5D,CAEA,WAAA9E,CAAY6hC,EAAwB/8B,GAClCpd,KAAKujD,aAAavjD,KAAKyO,SAAU0rC,EAAY/8B,EAC/C,CAEA,WAAAqmC,GAEE,OADAzjD,KAAK8qB,WACE9qB,KAAK8qB,QACd,CAEA,sBAAIkP,GACF,OAAOh6B,KAAKw+C,mBACd,CAEA,qBAAInK,GACF,OAAOr0C,KAAKy+C,kBACd,CAEA,mBAAA5L,CAAoBx0C,GAClB2B,KAAKy+C,mBAAmB9hD,IAAI0B,EAC9B,CAEA,6BAAIw2C,GACF,OAAO70C,KAAK0+C,0BACd,CAEA,2BAAAxG,CAA4B75C,GAC1B2B,KAAK0+C,2BAA2B/hD,IAAI0B,EACtC,CAEA,YAAAqlD,CAAajY,EAAciW,GACzBvkD,OAAO4gD,eAAe/9C,KAAKqgD,OAAQ5U,EAAMiW,GACrCjW,IAASluC,IACXyC,KAAKw+C,qBAAsB,EAE/B,CAEA,eAAAV,CAAgBjjD,GACTmF,KAAK2+C,aAGR3+C,KAAKqgD,OAASxlD,EAFdmF,KAAKm/C,mBAAmBtkD,EAI5B,WQrnBc8oD,KACTliD,eAAevF,IAAIZ,EAAOV,SAASE,MACtC2G,eAAemhD,OAAOtnD,EAAOV,SAASE,IAAKulC,IAExC5+B,eAAevF,IAAIZ,EAAOV,SAASC,QACtC4G,eAAemhD,OAAOtnD,EAAOV,SAASC,MAAOyjD,GAEjD,CCNM,SAAUsF,GAAetoD,GrK4DzB,IAAoBuoD,EqK3DpBvoD,KrK2DoBuoD,EqK1DZvoD,GrK2DMV,UAChBuC,OAAOihD,OAAO/jD,EAAQO,SAAUipD,EAAcjpD,UAED,iBAApCipD,EAAcvpD,oBACvBD,EAAQC,kBAAoBupD,EAAcvpD,mBAEG,iBAApCupD,EAActpD,oBACvBF,EAAQE,kBAAoBspD,EAActpD,mBAEE,iBAAnCspD,EAAcrpD,mBACvBH,EAAQG,iBAAmBqpD,EAAcrpD,kBAEE,iBAAlCqpD,EAAcppD,kBACvBJ,EAAQI,gBAAkBopD,EAAcppD,iBAEO,iBAAtCopD,EAAcnpD,sBACvBL,EAAQK,oBAAsBmpD,EAAcnpD,qBAEC,iBAApCmpD,EAAclpD,oBACvBN,EAAQM,kBAAoBkpD,EAAclpD,mBAER,iBAAzBkpD,EAAc9oD,SACvBV,EAAQU,OAAS8oD,EAAc9oD,QAEE,kBAAxB8oD,EAAc7oD,QACvBX,EAAQW,MAAQ6oD,EAAc7oD,OAEY,kBAAjC6oD,EAAc5oD,iBACvBZ,EAAQY,eAAiB4oD,EAAc5oD,gBAEiB,kBAA/C4oD,EAAc3oD,+BACvBb,EAAQa,6BAA+B2oD,EAAc3oD,8BAED,kBAA3C2oD,EAAc1oD,2BACvBd,EAAQc,yBAA2B0oD,EAAc1oD,0BAEC,kBAAzC0oD,EAAczoD,yBACvBf,EAAQe,uBAAyByoD,EAAczoD,wBAEL,kBAAjCyoD,EAAcxoD,iBACvBhB,EAAQgB,eAAiBwoD,EAAcxoD,iBqKjGzCsoD,KAEAxa,IACF,CCwUM,SAAU2a,GACd1W,GAEA,OAAOA,CACT,CCvTO,MAAM2W,GAAiD,CAE5D/9C,GAAK,CAAEg+C,YAAa,SAAYC,SAAS,EAAOC,WAAY,UAAWC,YAAa,MAAsBC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,QAC7In+C,GAAK,CAAE69C,YAAa,SAAYC,SAAS,EAAOC,WAAY,UAAWC,YAAa,MAAsBC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,QAC7Il+C,IAAK,CAAE49C,YAAa,UAAWC,SAAS,EAAOC,WAAY,UAAWC,YAAa,CAAC,WAAqBC,QAAS,EAAGC,QAAS,GAC9H/9C,GAAK,CAAE09C,YAAa,SAAYC,SAAS,EAAOC,WAAY,UAAWC,YAAa,CAAC,SAAU,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC7I/9C,GAAK,CAAEy9C,YAAa,MAAeC,SAAS,EAAOC,WAAY,UAAWC,YAAa,CAAC,SAAU,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAChJ99C,GAAK,CAAEw9C,YAAa,SAAYC,SAAS,EAAOC,WAAY,UAAWC,YAAa,CAAC,SAAU,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC7I79C,GAAK,CAAEu9C,YAAa,MAAeC,SAAS,EAAOC,WAAY,UAAWC,YAAa,CAAC,SAAU,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAEhJ59C,IAAK,CAAEs9C,YAAa,KAAMC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC3H39C,IAAK,CAAEq9C,YAAa,KAAMC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC3H19C,IAAK,CAAEo9C,YAAa,KAAMC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC3Hz9C,IAAK,CAAEm9C,YAAa,KAAMC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC3Hx9C,IAAK,CAAEk9C,YAAa,KAAMC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAE3Hv9C,IAAS,CAAEi9C,YAAa,UAA2BC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WACpJvpD,OAAS,CAAEipD,YAAa,kBAAmBC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAE5Ip9C,GAAQ,CAAE88C,YAAa,SAAsBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,GACjIh9C,GAAQ,CAAE28C,YAAa,SAAsBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,GACjI/8C,IAAQ,CAAE08C,YAAa,YAAmBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,GAC9H38C,KAAQ,CAAEs8C,YAAa,WAAoBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,GAC/H58C,MAAQ,CAAEu8C,YAAa,sBAAuBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,SAAU,WAC1Jx8C,OAAQ,CAAEk8C,YAAa,kBAAuBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,SAAU,WAC1Jv8C,IAAQ,CAAEi8C,YAAa,wBAAyBC,SAAS,EAAMC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,SAAU,WAC3Jr8C,IAAQ,CAAE+7C,YAAa,eAAwBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WACjJn8C,IAAQ,CAAE67C,YAAa,SAAsBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,GAEjI/7C,IAAS,CAAE07C,YAAa,SAAkBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,SAAU,UAAWC,QAAS,EAAGC,QAAS,GACxI77C,MAAS,CAAEw7C,YAAa,aAAcC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,SAAU,UAAWC,QAAS,EAAGC,QAAS,GACpI37C,MAAS,CAAEs7C,YAAa,OAAoBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC9Ix7C,MAAS,CAAEk7C,YAAa,OAAoBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC9Iv7C,KAAS,CAAEi7C,YAAa,OAAoBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAC9It7C,QAAS,CAAEg7C,YAAa,YAAeC,SAAS,EAAOC,WAAY,SAAUC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAEzIr7C,KAAU,CAAE+6C,YAAa,YAAaC,SAAS,EAAOC,WAAY,SAAUC,YAAa,MAAOC,QAAS,EAAGC,QAAS,GACrHj7C,KAAU,CAAE46C,YAAa,YAAaC,SAAS,EAAOC,WAAY,SAAUC,YAAa,MAAOC,QAAS,EAAGC,QAAS,GACrH/6C,SAAU,CAAE06C,YAAa,YAAaC,SAAS,EAAOC,WAAY,SAAUC,YAAa,MAAOC,QAAS,EAAGC,QAAS,GACrH96C,IAAU,CAAEy6C,YAAa,gBAAmBC,SAAS,EAAOC,WAAY,SAAUC,YAAa,MAAOC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,WAEzIv6C,MAAU,CAAEi6C,YAAa,QAAqBC,SAAS,EAAOC,WAAY,UAAeC,YAAa,MAAYC,QAAS,EAAGC,QAAS,GACvIr6C,OAAU,CAAEg6C,YAAa,QAAqBC,SAAS,EAAOC,WAAY,UAAeC,YAAa,MAAYC,QAAS,EAAGC,QAAS,GACvIp6C,SAAU,CAAE+5C,YAAa,cAAeC,SAAS,EAAOC,WAAY,cAAeC,YAAa,MAAYC,QAAS,EAAGC,QAAS,EAAGC,SAAU,CAAC,QAC/Ip6C,QAAU,CAAE85C,YAAa,UAAmBC,SAAS,EAAOC,WAAY,UAAeC,YAAa,MAAYC,QAAS,EAAGC,QAAS,GACrIj6C,OAAU,CAAE45C,YAAa,QAAqBC,SAAS,EAAOC,WAAY,SAAeC,YAAa,MAAYC,QAAS,EAAGC,QAAS,GACvIh6C,OAAU,CAAE25C,YAAa,SAAoBC,SAAS,EAAOC,WAAY,SAAeC,YAAa,MAAYC,QAAS,EAAGC,QAAS,GACtI/5C,KAAU,CAAE05C,YAAa,eAAkBC,SAAS,EAAOC,WAAY,cAAeC,YAAa,CAAC,UAAWC,QAAS,EAAGC,QAAS,ICnCzHE,GAAuB,WAmCpBC,KACd,MAAO,CACL/hD,QArCgC,EAsChCgiD,OAAQ,CACNC,cAAeppD,EAAOhB,kBACtB0G,QAAS1F,EAAOV,SAASC,MACzB8pD,cAAe/nD,EACfgoD,SAAU/nD,EACVgoD,WAAY,CACVrvC,QtK/EyB,IsKgFzBsvC,UtK/E4B,IsKgF5B9sC,StK/E0B,IsKgF1B5T,UtK/E4B,IsKgF5ByG,OAAQ9N,GAGVgoD,qBAAsBphD,MAAMoc,KAAKxa,IAGnCqF,QAASzN,OAAO4T,KAAKxG,IACrBy6C,WAAYjB,GACZkB,kBAAmB,CACjB5nD,EACAC,EACAC,EACAC,GAEF0nD,iBAAkB,CAChBznD,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAGN,CChGA,MAAMmnD,GAAwC,IAAI7kD,IAAI,CACpD,gBACA,gBACA,+BACA,wBAGI8kD,GAAkCjoD,OAAOC,OAAO,IAOhD,SAAUioD,GAAgBC,GAC9B,IAAKhqD,EAAOF,uBAAwB,OAAOgqD,GAC3C,MAAMG,EAA0B,GAMhC,gBAQAD,EACAE,EACAvsC,GAEA,MAAMwsC,EAAaH,EAASI,mBAC5B,GAAmB,OAAfD,GAA6C,iBAAfA,EAAyB,OAG3D,IAAK,MAAMxzB,KAAa90B,OAAO4T,KAAK00C,GAC7BN,GAAiB5oD,IAAI01B,IACxBhZ,EAAK,CAAE9C,KAAM,iCAAkC8b,cAInD,MAAM0zB,EAAaF,EAAW,kBAAkBE,WAChD,GAAIA,QAAiD,OAErD,IAAK,MAAOC,EAAKxI,KAAcjgD,OAAO0G,QAAQ8hD,GAAa,CACzD,MAAME,EAAOL,EAAmBI,GAChC3sC,EAAK,CAAE9C,KAAM,yBAA0ByvC,MAAKE,OAAiB,OAATD,IACvC,OAATA,EAKJE,GAAoBH,EAAKxI,EAAWyI,EAAM5sC,GAHxCA,EAAK,CAAE9C,KAAM,iBAAkBqI,OAAQ,uBAAwBonC,OAInE,CACF,CApCEI,CAAwBV,EAAUW,GAJpB1iD,IACZgiD,EAAOllD,KAAKkD,GACS,OAAjByS,IAAuBA,GAAazS,KAGnCgiD,CACT,CAoCA,SAASQ,GACPH,EACAM,EACAL,EACA5sC,GAGA,MAAMmkC,EACa,OAAjB8I,GAAiD,iBAAjBA,EAA6BA,EAAsC,CAAA,EACrG,IAAK,MAAOhqC,EAAQuE,KAAetjB,OAAO0G,QAAQu5C,EAAU+I,aAAe,CAAA,GAAK,CAC9E,IAAKN,EAAKO,eAAe7pD,IAAI2f,GAAS,CACpCjD,EAAK,CAAE9C,KAAM,iBAAkBqI,OAAQ,iBAAkBonC,MAAK1pC,WAC9D,QACF,CACA,MAAMmqC,EAAYR,EAAKO,eAAelqD,IAAIggB,GACpCoqC,EAAe7lC,GAAYld,MACL,iBAAjB+iD,GAA6BA,IAAiBD,GACvDptC,EAAK,CAAE9C,KAAM,iBAAkBqI,OAAQ,iBAAkBonC,MAAK1pC,SAAQoqC,eAAcD,aAExF,CACA,IAAK,MAAMnqC,KAAU/e,OAAO4T,KAAKqsC,EAAUr6C,QAAU,CAAA,GAC9C8iD,EAAK9iD,OAAOxG,IAAI2f,IACnBjD,EAAK,CAAE9C,KAAM,iBAAkBqI,OAAQ,iBAAkBonC,MAAK1pC,WAGlE,IAAK,MAAMA,KAAU/e,OAAO4T,KAAKqsC,EAAUl6C,UAAY,CAAA,GAChD2iD,EAAK3iD,SAAS3G,IAAI2f,IACrBjD,EAAK,CAAE9C,KAAM,iBAAkBqI,OAAQ,iBAAkBonC,MAAK1pC,UAGpE,CAMA,SAAS+pC,GAAuBL,GAC9B,MAAMlkD,EAAWL,IACXklD,EAAO7kD,GAAUxF,IAAI0pD,GAC3B,QAAallD,IAAT6lD,EAAoB,OAAO,KAC/B,MAAMnkD,EAAemkD,EAA2ClkD,WAChE,GACkB,OAAhBD,GAC0B,iBAAhBA,GAC8C,gBAApDA,EAAuCE,SAE3C,OAAO,KAET,MAAMkkD,EAAOpkD,EAMPgkD,EAAiB,IAAIjoD,IAC3B,IAAK,MAAMsoD,KAAY9iD,MAAMC,QAAQ4iD,EAAK5jD,YAAc4jD,EAAK5jD,WAAa,GAC1C,iBAAnB6jD,GAAUnjD,MAA+C,iBAAnBmjD,EAASljD,OACxD6iD,EAAe9pD,IAAImqD,EAASnjD,KAAMmjD,EAASljD,OAG/C,MAAMR,EAAS,IAAIzC,IACnB,IAAK,MAAMmK,KAAS9G,MAAMC,QAAQ4iD,EAAKzjD,QAAUyjD,EAAKzjD,OAAS,GAClC,iBAAhB0H,GAAOnH,MAAmBP,EAAOpG,IAAI8N,EAAMnH,MAExD,MAAMJ,EAAW,IAAI5C,IACrB,IAAK,MAAM+2B,KAAW1zB,MAAMC,QAAQ4iD,EAAKtjD,UAAYsjD,EAAKtjD,SAAW,GACtC,iBAAlBm0B,GAAS/zB,MAAmBJ,EAASvG,IAAI06B,EAAQ/zB,MAE9D,MAAO,CAAE8iD,iBAAgBrjD,SAAQG,WACnC"}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../../src/config.ts","../../src/bindings/initializeBindingPromiseByNode.ts","../../src/define.ts","../../src/address/PathInfo.ts","../../src/getCustomElement.ts","../../src/platform/customElementRegistry.ts","../../src/protocol/wcBindableReader.ts","../../src/raiseError.ts","../../src/bindTextParser/expandSpread.ts","../../src/structural/resolveNodePath.ts","../../src/bindings/getBindingsByNode.ts","../../src/structural/define.ts","../../src/filters/errorMessages.ts","../../src/filters/builtinFilters.ts","../../src/bindTextParser/parseFilters.ts","../../src/bindTextParser/parseFilterArgs.ts","../../src/bindTextParser/utils.ts","../../src/bindTextParser/parsePropPart.ts","../../src/bindTextParser/parseStatePart.ts","../../src/bindTextParser/parseBindTextsForElement.ts","../../src/bindings/parseCommentNode.ts","../../src/structural/fragmentInfoByUUID.ts","../../src/bindings/getParseBindTextResults.ts","../../src/bindTextParser/parseBindTextForEmbeddedNode.ts","../../src/bindings/getSubscriberNodes.ts","../../src/bindings/collectNodesAndBindingInfos.ts","../../src/bindings/getBindingInfos.ts","../../src/list/loopContextByNode.ts","../../src/list/lastListValueByAbsoluteStateAddress.ts","../../src/proxy/symbols.ts","../../src/address/AbsolutePathInfo.ts","../../src/address/AbsoluteStateAddress.ts","../../src/apply/rootNodeByFragment.ts","../../src/address/calcWildcardLen.ts","../../src/list/getListIndexByBindingInfo.ts","../../src/binding/getAbsoluteStateAddressByBinding.ts","../../src/devtools/sink.ts","../../src/binding/getBindingSetByAbsoluteStateAddress.ts","../../src/address/StateAddress.ts","../../src/binding/getStateAddressByBindingInfo.ts","../../src/event/handlerBindingRegistry.ts","../../src/event/checkboxHandler.ts","../../src/token/Token.ts","../../src/event/EventToken.ts","../../src/event/eventTokenRegistry.ts","../../src/event/eventTokenHandler.ts","../../src/command/CommandToken.ts","../../src/event/handler.ts","../../src/event/radioHandler.ts","../../src/event/isPossibleTwoWay.ts","../../src/propagation/propagation.ts","../../src/event/twowayHandler.ts","../../src/bindings/observerSkip.ts","../../src/bindings/DefinitionCoordinator.ts","../../src/bindings/initialSync.ts","../../src/bindings/BindingSession.ts","../../src/bindings/replaceToReplaceNode.ts","../../src/webComponent/completeWebComponent.ts","../../src/apply/getFilteredValue.ts","../../src/apply/applyChangeToCheckbox.ts","../../src/createEmptyArray.ts","../../src/apply/applyChangeToCommand.ts","../../src/bindings/indexBindingsByContent.ts","../../src/polyfills.ts","../../src/getUUID.ts","../../src/list/createListIndex.ts","../../src/list/listIndexesByList.ts","../../src/list/createListDiff.ts","../../src/list/stableListOrder.ts","../../src/bindings/bindingsByContent.ts","../../src/bindings/bindingSessionByContent.ts","../../src/bindings/nodesByContent.ts","../../src/bindings/bindLoopContextToContent.ts","../../src/structural/activateContent.ts","../../src/structural/contentsByNode.ts","../../src/createEmptySet.ts","../../src/structural/createContent.ts","../../src/bindings/initializeBindings.ts","../../src/structural/rowPlan.ts","../../src/apply/applyChangeToFor.ts","../../src/apply/applyChangeToIf.ts","../../src/apply/ssrPropertyStore.ts","../../src/apply/applyChangeToProperty.ts","../../src/event/getInputAttributeMirror.ts","../../src/apply/applyChangeToText.ts","../../src/apply/applyChangeToWebComponent.ts","../../src/apply/getValue.ts","../../src/list/getIndexValueByLoopContext.ts","../../src/apply/scheduleDeferredApply.ts","../../src/apply/applyChange.ts","../../src/apply/applyChangeToClass.ts","../../src/apply/applyChangeToAttribute.ts","../../src/apply/applyChangeToStyle.ts","../../src/apply/applyChangeToRadio.ts","../../src/apply/applyChangeFromBindings.ts","../../src/mustache/convertMustacheToComments.ts","../../src/structural/createNotFilter.ts","../../src/structural/expandShorthandPaths.ts","../../src/structural/getNodePath.ts","../../src/structural/getFragmentNodeInfos.ts","../../src/structural/optimizeFragment.ts","../../src/structural/collectStructuralFragments.ts","../../src/waitForStateInitialize.ts","../../src/buildBindings.ts","../../src/version.ts","../../src/platform/HTMLElementBase.ts","../../src/components/Ssr.ts","../../src/hydrateBindings.ts","../../src/stateElementByName.ts","../../src/updater/updater.ts","../../src/devtools/types.ts","../../src/devtools/bridge.ts","../../src/stateLoader/loadFromInnerScript.ts","../../src/stateLoader/loadFromScriptFile.ts","../../src/list/loopContext.ts","../../src/command/commandTokenRegistry.ts","../../src/command/commandNamespace.ts","../../src/stream/lastNotified.ts","../../src/stream/activeStateElements.ts","../../src/stream/streamRegistry.ts","../../src/stream/processStreamsDeclaration.ts","../../src/stream/streamNamespace.ts","../../src/stream/argsTrace.ts","../../src/stream/consumeSource.ts","../../src/stream/streamRuntime.ts","../../src/dcc/dccPropertyFactories.ts","../../src/address/ResolvedAddress.ts","../../src/cache/cacheEntryByAbsoluteStateAddress.ts","../../src/proxy/methods/getByAddress.ts","../../src/proxy/methods/checkDependency.ts","../../src/proxy/methods/getContextListIndex.ts","../../src/proxy/methods/hasByAddress.ts","../../src/proxy/methods/swapInfo.ts","../../src/dependency/walkDependency.ts","../../src/proxy/methods/setByAddress.ts","../../src/proxy/apis/resolve.ts","../../src/proxy/apis/getAll.ts","../../src/proxy/methods/getListIndex.ts","../../src/proxy/methods/setLoopContext.ts","../../src/proxy/traps/get.ts","../../src/proxy/apis/postUpdate.ts","../../src/proxy/apis/trackDependency.ts","../../src/proxy/apis/untrackDependency.ts","../../src/proxy/apis/connectedCallback.ts","../../src/proxy/apis/disconnectedCallback.ts","../../src/proxy/apis/updatedCallback.ts","../../src/proxy/StateHandler.ts","../../src/proxy/traps/set.ts","../../src/webComponent/lastValueByAbsoluteStateAddress.ts","../../src/webComponent/stateElementByWebComponent.ts","../../src/webComponent/MappingRule.ts","../../src/webComponent/meltFrozenObject.ts","../../src/webComponent/innerState.ts","../../src/webComponent/outerState.ts","../../src/webComponent/plainOuterState.ts","../../src/webComponent/bindWebComponent.ts","../../src/components/State.ts","../../src/command/processCommandTokensDeclaration.ts","../../src/event/processEventTokensDeclaration.ts","../../src/event/processOnDeclaration.ts","../../src/stateLoader/loadFromScriptJson.ts","../../src/stateLoader/loadFromJsonFile.ts","../../src/dcc/defineDCC.ts","../../src/dcc/wcBindable.ts","../../src/registerComponents.ts","../../src/bootstrapState.ts","../../src/defineState.ts","../../src/filters/filterMeta.ts","../../src/manifest.ts","../../src/contract/contractAnalyzer.ts"],"sourcesContent":["import { IConfig, IWritableConfig } from \"./types.js\";\n\nexport function inSsr(): boolean {\n // キャッシュしない: SSR モードはプロセスの属性ではなく「現在の document」の\n // 属性。@wcstack/server はグローバル document を差し替えてサーバーレンダリング\n // した後、同一プロセスでクライアント側ハイドレーションが走る(SSR→hydrate の\n // e2e が該当)。サーバーフェーズの判定をキャッシュするとクライアントフェーズが\n // SSR モード扱いになり、hydrateBindings の代わりに buildBindings が選ばれて\n // connectedCallbackPromise が永久に未解決になる。\n const html = document.documentElement;\n return html ? html.hasAttribute('data-wcs-server') : false;\n}\n\ninterface IInternalConfig {\n bindAttributeName: string;\n commentTextPrefix: string;\n commentForPrefix: string;\n commentIfPrefix: string;\n commentElseIfPrefix: string;\n commentElsePrefix: string;\n tagNames: {\n state: string;\n ssr: string;\n };\n locale: string;\n debug: boolean;\n enableMustache: boolean;\n enableDirectionalInitialSync: boolean;\n enablePropagationContext: boolean;\n enableContractAnalyzer: boolean;\n sameValueGuard: boolean;\n}\n\nconst _config: IInternalConfig = {\n bindAttributeName: 'data-wcs',\n commentTextPrefix: 'wcs-text',\n commentForPrefix: 'wcs-for',\n commentIfPrefix: 'wcs-if',\n commentElseIfPrefix: 'wcs-elseif',\n commentElsePrefix: 'wcs-else',\n tagNames: {\n state: 'wcs-state',\n ssr: 'wcs-ssr',\n },\n locale: 'en',\n debug: false,\n enableMustache: true,\n enableDirectionalInitialSync: true,\n enablePropagationContext: true,\n // Phase 5b の dev-time contract analyzer は意図的に explicit opt-in(既定 off)。\n // wcstack は buildless / zero-config で NODE_ENV 相当の確実な dev/prod 判定が無く、\n // hostname や minification の heuristic で auto-ON すると誤検出で prod にコストを\n // 乗せうるため、dev 既定 ON は採らない。利用側が setConfig で明示有効化する\n // (docs/architecture-hardening/10-defaulting-rollout-status.md §C)。\n enableContractAnalyzer: false,\n sameValueGuard: true,\n};\n\n// backward compatible export (read-only usage)\nexport const config: IConfig = _config as IConfig;\n\nexport function getConfig(): IConfig {\n return config;\n}\n\nexport function setConfig(partialConfig: IWritableConfig): void {\n if (partialConfig.tagNames) {\n Object.assign(_config.tagNames, partialConfig.tagNames);\n }\n if (typeof partialConfig.bindAttributeName === \"string\") {\n _config.bindAttributeName = partialConfig.bindAttributeName;\n }\n if (typeof partialConfig.commentTextPrefix === \"string\") {\n _config.commentTextPrefix = partialConfig.commentTextPrefix;\n }\n if (typeof partialConfig.commentForPrefix === \"string\") {\n _config.commentForPrefix = partialConfig.commentForPrefix;\n }\n if (typeof partialConfig.commentIfPrefix === \"string\") {\n _config.commentIfPrefix = partialConfig.commentIfPrefix;\n }\n if (typeof partialConfig.commentElseIfPrefix === \"string\") {\n _config.commentElseIfPrefix = partialConfig.commentElseIfPrefix;\n }\n if (typeof partialConfig.commentElsePrefix === \"string\") {\n _config.commentElsePrefix = partialConfig.commentElsePrefix;\n }\n if (typeof partialConfig.locale === \"string\") {\n _config.locale = partialConfig.locale;\n }\n if (typeof partialConfig.debug === \"boolean\") {\n _config.debug = partialConfig.debug;\n }\n if (typeof partialConfig.enableMustache === \"boolean\") {\n _config.enableMustache = partialConfig.enableMustache;\n }\n if (typeof partialConfig.enableDirectionalInitialSync === \"boolean\") {\n _config.enableDirectionalInitialSync = partialConfig.enableDirectionalInitialSync;\n }\n if (typeof partialConfig.enablePropagationContext === \"boolean\") {\n _config.enablePropagationContext = partialConfig.enablePropagationContext;\n }\n if (typeof partialConfig.enableContractAnalyzer === \"boolean\") {\n _config.enableContractAnalyzer = partialConfig.enableContractAnalyzer;\n }\n if (typeof partialConfig.sameValueGuard === \"boolean\") {\n _config.sameValueGuard = partialConfig.sameValueGuard;\n }\n}\n","import { IInitializeBindingPromise } from \"./types\";\n\nconst bindingPromiseByNode = new WeakMap<Node, IInitializeBindingPromise>();\n// resolve 済みマーク。エントリ未生成のまま resolve されたノードは、後から\n// wait された時に「生成して即 resolve」で追いつく。\nconst resolvedNodes = new WeakSet<Node>();\n\nlet id = 0;\n\nexport function getInitializeBindingPromiseByNode(node: Node): IInitializeBindingPromise {\n let bindingPromise = bindingPromiseByNode.get(node) || null;\n if (bindingPromise !== null) {\n return bindingPromise;\n }\n let resolveFn = undefined;\n const promise = new Promise<void>((resolve) => {\n resolveFn = resolve;\n });\n bindingPromise = {\n id: ++id,\n promise,\n resolve: resolveFn!\n };\n bindingPromiseByNode.set(node, bindingPromise);\n if (resolvedNodes.has(node)) {\n bindingPromise.resolve();\n }\n return bindingPromise;\n}\n\nexport async function waitInitializeBinding(node: Node): Promise<void> {\n const bindingPromise = getInitializeBindingPromiseByNode(node);\n await bindingPromise.promise;\n}\n\nexport function resolveInitializedBinding(node: Node): void {\n // ホットパス: リスト行では全 subscriber ノードがここを通るが、await する消費者\n // (boundComponent / shadowRoot host)はほぼ居ない。既存エントリが無ければ\n // Promise+closure を生成せず resolve 済みマークだけ残す(15 万個級の割り当て削減)。\n const existing = bindingPromiseByNode.get(node);\n if (typeof existing !== \"undefined\") {\n existing.resolve();\n return;\n }\n resolvedNodes.add(node);\n}\n","export const DELIMITER = '.';\nexport const WILDCARD = '*';\nexport const MAX_WILDCARD_DEPTH = 128;\nexport const MAX_LOOP_DEPTH = 128;\n// 因果伝播(Phase 3)の 1 transaction あたり hop 上限。超過分の未処理 record は\n// quarantine し(適用済みの値は戻さない)、updater から例外は投げない。\nexport const MAX_PROPAGATION_HOPS = 32;\n\n// data-wcs バインディング構文 `[prop][#mod]: [path][@state][|filter...]` の区切り文字(単一正本)。\n// これらは「死守の壁(構文契約)」であり値は不変。manifest.syntax.delimiters で公開される。\nexport const BINDING_SEPARATOR = ';'; // 複数バインディングの区切り\nexport const PROP_VALUE_SEPARATOR = ':'; // 左辺(prop)と右辺(path)の区切り\nexport const MODIFIER_SEPARATOR = '#'; // prop と修飾子の区切り\nexport const STATE_NAME_SEPARATOR = '@'; // path と @stateName の区切り\nexport const FILTER_SEPARATOR = '|'; // フィルタパイプの区切り\n\n/**\n * stackIndexByIndexName\n * インデックス名からスタックインデックスへのマッピング\n * $1 => 0\n * $2 => 1\n * :\n * ${i + 1} => i\n * i < MAX_WILDCARD_DEPTH\n */\nconst tmpIndexByIndexName: { [key: PropertyKey]: number } = {};\nfor (let i = 0; i < MAX_WILDCARD_DEPTH; i++) {\n tmpIndexByIndexName[`$${i+1}`] = i;\n}\nexport const INDEX_BY_INDEX_NAME: { [key: PropertyKey]: number } = Object.freeze(tmpIndexByIndexName);\n\nexport const NO_SET_TIMEOUT = 60 * 1000; // 1分\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nexport const STATE_CONNECTED_CALLBACK_NAME = \"$connectedCallback\";\nexport const STATE_DISCONNECTED_CALLBACK_NAME = \"$disconnectedCallback\";\nexport const STATE_UPDATED_CALLBACK_NAME = \"$updatedCallback\";\n\nexport const WEBCOMPONENT_STATE_READY_CALLBACK_NAME = \"$stateReadyCallback\";\n\nexport const STATE_BINDABLES_NAME = \"$bindables\";\nexport const STATE_COMMAND_TOKENS_NAME = \"$commandTokens\";\nexport const STATE_COMMAND_NAMESPACE_NAME = \"$command\";\nexport const STATE_EVENT_TOKENS_NAME = \"$eventTokens\";\nexport const STATE_ON_NAME = \"$on\";\nexport const STATE_STREAMS_NAME = \"$streams\";\nexport const STATE_STREAM_STATUS_NAMESPACE_NAME = \"$streamStatus\";\nexport const STATE_STREAM_ERROR_NAMESPACE_NAME = \"$streamError\";\nexport const DCC_DEFINITION_ATTRIBUTE = \"data-wc-definition\";\n","import { WILDCARD } from \"../define.js\";\nimport { IPathInfo } from \"./types.js\";\n\nconst _cache: Map<string, IPathInfo> = new Map();\n\nlet id: number = 0;\nexport function getPathInfo(path: string): IPathInfo {\n let pathInfo = _cache.get(path);\n if (typeof pathInfo !== \"undefined\") {\n return pathInfo;\n }\n pathInfo = Object.freeze(new PathInfo(path));\n _cache.set(path, pathInfo);\n return pathInfo;\n}\n\nclass PathInfo implements IPathInfo {\n readonly id: number = ++id;\n readonly path: string;\n readonly segments: string[];\n readonly lastSegment: string;\n readonly cumulativePaths: string[];\n readonly cumulativePathSet: Set<string>;\n readonly cumulativePathInfos: IPathInfo[];\n readonly cumulativePathInfoSet: Set<IPathInfo>;\n readonly parentPath: string | null;\n readonly wildcardPaths: string[];\n readonly wildcardPathSet: Set<string>;\n readonly indexByWildcardPath: Record<string, number>;\n readonly wildcardPathInfos: IPathInfo[];\n readonly wildcardPathInfoSet: Set<IPathInfo>;\n readonly wildcardParentPaths: string[];\n readonly wildcardParentPathSet: Set<string>;\n readonly wildcardParentPathInfos: IPathInfo[];\n readonly wildcardParentPathInfoSet: Set<IPathInfo>;\n readonly wildcardPositions: number[];\n readonly lastWildcardPath: string | null;\n readonly lastWildcardInfo: IPathInfo | null;\n readonly wildcardCount: number;\n readonly parentPathInfo: IPathInfo | null;\n constructor(path: string) {\n // Helper to get or create StructuredPathInfo instances, avoiding redundant creation for self-reference\n const getPattern = (_path: string): IPathInfo => {\n return (path === _path) ? this : getPathInfo(_path);\n };\n \n // Split the pattern into individual path segments (e.g., \"items.*.name\" → [\"items\", \"*\", \"name\"])\n const segments = path.split(\".\");\n \n // Arrays to track all cumulative paths from root to each segment\n const cumulativePaths = [];\n const cumulativePathInfos: IPathInfo[] = [];\n \n // Arrays to track wildcard-specific information\n const wildcardPaths = [];\n const indexByWildcardPath: Record<string, number> = {}; // Maps wildcard path to its index position\n const wildcardPathInfos = [];\n const wildcardParentPaths = []; // Paths of parent segments for each wildcard\n const wildcardParentPathInfos = [];\n const wildcardPositions = [];\n \n let currentPatternPath = \"\", prevPatternPath = \"\";\n let wildcardCount = 0;\n \n // Iterate through each segment to build cumulative paths and identify wildcards\n for(let i = 0; i < segments.length; i++) {\n currentPatternPath += segments[i];\n \n // If this segment is a wildcard, track it with all wildcard-specific metadata\n if (segments[i] === WILDCARD) {\n wildcardPaths.push(currentPatternPath);\n indexByWildcardPath[currentPatternPath] = wildcardCount; // Store wildcard's ordinal position\n wildcardPathInfos.push(getPattern(currentPatternPath));\n wildcardParentPaths.push(prevPatternPath); // Parent path is the previous cumulative path\n wildcardParentPathInfos.push(getPattern(prevPatternPath));\n wildcardPositions.push(i);\n wildcardCount++;\n }\n \n // Track all cumulative paths for hierarchical navigation (e.g., \"items\", \"items.*\", \"items.*.name\")\n cumulativePaths.push(currentPatternPath);\n cumulativePathInfos.push(getPattern(currentPatternPath));\n \n // Save current path as previous for next iteration, then add separator\n prevPatternPath = currentPatternPath;\n currentPatternPath += \".\";\n }\n \n // Determine the deepest (last) wildcard path and the parent path of the entire pattern\n const lastWildcardPath = wildcardPaths.length > 0 ? wildcardPaths[wildcardPaths.length - 1] : null;\n const parentPath = cumulativePaths.length > 1 ? cumulativePaths[cumulativePaths.length - 2] : null;\n \n // Assign all analyzed data to readonly properties\n this.path = path;\n this.segments = segments;\n this.lastSegment = segments[segments.length - 1];\n this.cumulativePaths = cumulativePaths;\n this.cumulativePathSet = new Set(cumulativePaths); // Set for fast lookup\n this.cumulativePathInfos = cumulativePathInfos;\n this.cumulativePathInfoSet = new Set(cumulativePathInfos);\n this.wildcardPaths = wildcardPaths;\n this.wildcardPathSet = new Set(wildcardPaths);\n this.indexByWildcardPath = indexByWildcardPath;\n this.wildcardPathInfos = wildcardPathInfos;\n this.wildcardPathInfoSet = new Set(wildcardPathInfos);\n this.wildcardParentPaths = wildcardParentPaths;\n this.wildcardParentPathSet = new Set(wildcardParentPaths);\n this.wildcardParentPathInfos = wildcardParentPathInfos;\n this.wildcardParentPathInfoSet = new Set(wildcardParentPathInfos);\n this.wildcardPositions = wildcardPositions;\n this.lastWildcardPath = lastWildcardPath;\n this.lastWildcardInfo = lastWildcardPath ? getPattern(lastWildcardPath) : null;\n this.parentPath = parentPath;\n this.parentPathInfo = parentPath ? getPattern(parentPath) : null;\n this.wildcardCount = wildcardCount;\n }\n}\n","\nconst cache = new WeakMap<Node, string | null>();\n\nexport function getCustomElement(node: Node): string | null {\n const cached = cache.get(node);\n if (cached !== undefined) {\n return cached;\n }\n let value: string | null = null;\n try {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return value;\n }\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n if (tagName.includes(\"-\")) {\n return value = tagName;\n }\n if (element.hasAttribute(\"is\")) {\n const is = element.getAttribute(\"is\")!;\n if (is.includes(\"-\")) {\n return value = is;\n }\n }\n return value;\n } finally {\n cache.set(node, value);\n }\n}\n","export interface ICustomElementRegistryAdapter {\n get(name: string): CustomElementConstructor | undefined;\n whenDefined(name: string): Promise<CustomElementConstructor>;\n upgrade?(root: Node): void;\n}\n\nexport interface ICustomElementRegistryOwner {\n readonly customElements?: unknown;\n}\n\n/**\n * Resolve the registry at operation time so importing the runtime remains safe\n * when browser globals are absent. The owner hook is reserved for scoped\n * registries; current callers fall back to the global registry.\n */\nexport function getCustomElementRegistry(\n owner: ICustomElementRegistryOwner | null = null,\n): ICustomElementRegistryAdapter | null {\n const globalRegistry = (globalThis as { readonly customElements?: unknown }).customElements;\n const registry = owner?.customElements ?? globalRegistry;\n if (typeof registry !== \"object\" || registry === null) return null;\n\n const candidate = registry as Partial<ICustomElementRegistryAdapter>;\n if (typeof candidate.get !== \"function\" || typeof candidate.whenDefined !== \"function\") {\n return null;\n }\n return candidate as ICustomElementRegistryAdapter;\n}\n\nexport function upgradeCustomElement(\n registry: ICustomElementRegistryAdapter,\n root: Node,\n): void {\n registry.upgrade?.(root);\n}\n","// ===========================================================================\n// AUTO-GENERATED FILE - DO NOT EDIT.\n// Generated from /protocol/wc-bindable-reader.ts by scripts/sync-protocol-types.mjs.\n// Run `node scripts/sync-protocol-types.mjs` after editing the source.\n// ===========================================================================\n\nimport type {\n IWcBindable,\n IWcBindableCommand,\n IWcBindableInput,\n IWcBindableProperty,\n} from \"./wcBindable.js\";\n\nexport const MIN_WC_BINDABLE_VERSION = 1;\n\nexport interface WcBindableElement {\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions,\n ): void;\n readonly constructor: {\n readonly wcBindable: IWcBindable;\n };\n}\n\nexport interface ReadBindableResult {\n readonly target: WcBindableElement;\n readonly liveDeclaration: IWcBindable;\n readonly knownProperties: ReadonlyMap<string, IWcBindableProperty>;\n readonly declaredInputs: ReadonlyMap<string, IWcBindableInput>;\n readonly declaredCommands: ReadonlyMap<string, IWcBindableCommand>;\n}\n\n/**\n * Repository-local conformance mirror of @wc-bindable/core's\n * getWcBindableDeclaration(). Discovery has one path only:\n * target.constructor.wcBindable.\n *\n * The declaration remains live. The maps are read-time indexes and are not a\n * clone, freeze, or normalized replacement for liveDeclaration.\n */\nexport function readBindableDeclaration(target: unknown): ReadBindableResult | null {\n try {\n if (target === null || (typeof target !== \"object\" && typeof target !== \"function\")) {\n return null;\n }\n\n const candidate = target as {\n readonly addEventListener?: unknown;\n readonly removeEventListener?: unknown;\n readonly constructor?: { readonly wcBindable?: IWcBindable };\n };\n const addEventListener = candidate.addEventListener;\n const removeEventListener = candidate.removeEventListener;\n const declaration = candidate.constructor?.wcBindable;\n\n if (typeof addEventListener !== \"function\" || typeof removeEventListener !== \"function\") {\n return null;\n }\n if (declaration?.protocol !== \"wc-bindable\") return null;\n if (!Number.isInteger(declaration.version) || declaration.version < MIN_WC_BINDABLE_VERSION) {\n return null;\n }\n\n const knownProperties = readNamedList(declaration.properties, isValidPropertyDescriptor);\n if (knownProperties === null) return null;\n\n const declaredInputs = declaration.inputs === undefined\n ? new Map<string, IWcBindableInput>()\n : readNamedList(declaration.inputs, isValidInputDescriptor);\n if (declaredInputs === null) return null;\n\n const declaredCommands = declaration.commands === undefined\n ? new Map<string, IWcBindableCommand>()\n : readNamedList(declaration.commands, isValidCommandDescriptor);\n if (declaredCommands === null) return null;\n\n return {\n target: target as WcBindableElement,\n liveDeclaration: declaration,\n knownProperties,\n declaredInputs,\n declaredCommands,\n };\n } catch {\n return null;\n }\n}\n\nfunction isValidPropertyDescriptor(value: unknown): value is IWcBindableProperty {\n if (typeof value !== \"object\" || value === null) return false;\n const descriptor = value as Partial<IWcBindableProperty>;\n if (typeof descriptor.name !== \"string\" || descriptor.name.length === 0) return false;\n if (typeof descriptor.event !== \"string\" || descriptor.event.length === 0) return false;\n return descriptor.getter === undefined || typeof descriptor.getter === \"function\";\n}\n\nfunction isValidInputDescriptor(value: unknown): value is IWcBindableInput {\n if (typeof value !== \"object\" || value === null) return false;\n const descriptor = value as Partial<IWcBindableInput>;\n if (typeof descriptor.name !== \"string\" || descriptor.name.length === 0) return false;\n return descriptor.attribute === undefined || typeof descriptor.attribute === \"string\";\n}\n\nfunction isValidCommandDescriptor(value: unknown): value is IWcBindableCommand {\n if (typeof value !== \"object\" || value === null) return false;\n const descriptor = value as Partial<IWcBindableCommand>;\n if (typeof descriptor.name !== \"string\" || descriptor.name.length === 0) return false;\n return descriptor.async === undefined || typeof descriptor.async === \"boolean\";\n}\n\nfunction readNamedList<T extends { readonly name: string }>(\n value: unknown,\n isValidEntry: (entry: unknown) => entry is T,\n): ReadonlyMap<string, T> | null {\n if (!Array.isArray(value)) return null;\n const entries = new Map<string, T>();\n for (const entry of value) {\n if (!isValidEntry(entry) || entries.has(entry.name)) return null;\n entries.set(entry.name, entry);\n }\n return entries;\n}\n","\nexport function raiseError(message: string): never {\n throw new Error(`[@wcstack/state] ${message}`);\n}","import { getPathInfo } from \"../address/PathInfo\";\nimport { config } from \"../config\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry, upgradeCustomElement } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\nimport { ParseBindTextResult } from \"./types\";\n\nfunction makeExpandedEntry(\n name: string,\n base: string,\n stateName: string,\n): ParseBindTextResult {\n // Dot-relative spread keeps the loop item root (`.`) without producing `..foo`.\n const expandedPath = base === \".\" ? `.${name}` : `${base}.${name}`;\n return {\n propName: name,\n propSegments: [name],\n propModifiers: [],\n statePathName: expandedPath,\n statePathInfo: getPathInfo(expandedPath),\n stateName,\n inFilters: [],\n outFilters: [],\n bindingType: 'prop',\n };\n}\n\nfunction dedupKey(r: ParseBindTextResult): string | null {\n switch (r.bindingType) {\n case 'prop':\n case 'event':\n case 'radio':\n case 'checkbox':\n return `${r.bindingType}::${r.propName}`;\n case 'spread':\n return null;\n default:\n return null;\n }\n}\n\nexport interface IExpandSpreadOptions {\n /**\n * When false, raise an error if the custom element class is not yet defined.\n * When true (default), leave the spread entry in place so the caller can\n * defer expansion via customElements.whenDefined.\n */\n readonly allowDeferred?: boolean;\n}\n\n/**\n * Expand spread bind-text entries (`...: target`) into per-prop entries\n * by enumerating wcBindable.properties + inputs of the element's class.\n *\n * Behavior:\n * - With `allowDeferred: true` (default): if class is not yet defined, the\n * spread entry stays so the caller can wait via customElements.whenDefined.\n * - With `allowDeferred: false`: raises if class is not defined.\n * - Duplicate propName: last-wins (explicit binding overrides spread).\n * - When config.debug, console.debug logs each override.\n * - Mid-`*` in target path is allowed (e.g. `...: stores.*.fetch`).\n *\n * Composite Profile (COMPOSITE.md / SPEC-extensions § 4) support:\n * - A composite shell exposes its synthesized declaration via the standard\n * `target.constructor.wcBindable` surface (§ 1 Discovery), so this function\n * handles it without any composite-specific code path.\n * - Composed property names use the `<sourceId>.<sourceName>` pattern\n * (e.g. \"s3.progress\"); we keep the dotted name as a single segment so\n * element member access stays flat (element[\"s3.progress\"], not nested).\n * - The expanded state path becomes `targetBase.s3.progress`, which resolves\n * as nested state access — author state as `{ s3: { progress: 0 } }` to\n * mirror the composed structure.\n * - Tier claim (Symbol.for(\"wc-bindable.composite.tiers\")) is not read here;\n * spread covers observation (T1) and writable inputs (T2) transparently\n * through normal property assignment, and commands stay out of spread by\n * design regardless of tier.\n */\nexport function expandSpread(\n node: Node,\n results: ParseBindTextResult[],\n options: IExpandSpreadOptions = {},\n): ParseBindTextResult[] {\n const allowDeferred = options.allowDeferred ?? true;\n if (!results.some(r => r.bindingType === 'spread')) {\n return results;\n }\n const expanded: ParseBindTextResult[] = [];\n const spreadOrigin = new WeakSet<ParseBindTextResult>();\n for (const result of results) {\n if (result.bindingType !== 'spread') {\n expanded.push(result);\n continue;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n raiseError(`Spread binding requires an element node.`);\n }\n const element = node as Element;\n const tagName = getCustomElement(element);\n if (tagName === null) {\n raiseError(`Spread binding \"${result.statePathName}\" requires a custom element with wcBindable, but <${element.tagName.toLowerCase()}> is not a custom element.`);\n }\n const registry = getCustomElementRegistry();\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${tagName}>.`);\n }\n const customClass = registry.get(tagName);\n if (typeof customClass === \"undefined\") {\n if (!allowDeferred) {\n raiseError(`Spread binding \"${result.statePathName}\" requires <${tagName}> to be registered. Define the custom element before initializing this binding.`);\n }\n // Deferred: keep spread entry intact; caller retries via whenDefined.\n expanded.push(result);\n continue;\n }\n upgradeCustomElement(registry, element);\n const bindable = readBindableDeclaration(element);\n if (bindable === null) {\n raiseError(`Spread binding \"${result.statePathName}\" requires <${tagName}> to expose a valid wcBindable declaration.`);\n }\n const targetBase = result.statePathName;\n const stateName = result.stateName;\n const seen = new Set<string>();\n for (const name of bindable.knownProperties.keys()) {\n if (seen.has(name)) continue;\n seen.add(name);\n const entry = makeExpandedEntry(name, targetBase, stateName);\n spreadOrigin.add(entry);\n expanded.push(entry);\n }\n // properties win over inputs when the name overlaps because they carry the\n // full property contract (for example change events).\n for (const name of bindable.declaredInputs.keys()) {\n if (seen.has(name)) continue;\n seen.add(name);\n const entry = makeExpandedEntry(name, targetBase, stateName);\n spreadOrigin.add(entry);\n expanded.push(entry);\n }\n }\n // Last-wins de-duplication\n const lastIndexByKey = new Map<string, number>();\n for (let i = 0; i < expanded.length; i++) {\n const key = dedupKey(expanded[i]);\n if (key !== null) {\n lastIndexByKey.set(key, i);\n }\n }\n const final: ParseBindTextResult[] = [];\n for (let i = 0; i < expanded.length; i++) {\n const key = dedupKey(expanded[i]);\n if (key === null) {\n final.push(expanded[i]);\n continue;\n }\n if (lastIndexByKey.get(key) === i) {\n final.push(expanded[i]);\n } else if (config.debug && spreadOrigin.has(expanded[i])) {\n const overrider = expanded[lastIndexByKey.get(key)!];\n const tagText = node.nodeType === Node.ELEMENT_NODE\n ? `<${(node as Element).tagName.toLowerCase()}>`\n : 'node';\n console.debug(`[@wcstack/state] spread: prop \"${expanded[i].propName}\" of ${tagText} overridden by explicit binding (statePath: \"${overrider.statePathName}\").`);\n }\n }\n return final;\n}\n\nexport function hasUnresolvedSpread(results: ParseBindTextResult[]): boolean {\n return results.some(r => r.bindingType === 'spread');\n}\n","\nexport function resolveNodePath(root: Node, path: number[]): Node | null {\n let currentNode = root;\n if (path.length === 0) return currentNode;\n // path.reduce()だと途中でnullになる可能性があるので、\n for(let i = 0; i < path.length; i++) {\n currentNode = currentNode?.childNodes[path[i]] ?? null;\n if (currentNode === null) break;\n }\n return currentNode;\n}","import { IBindingInfo } from \"../binding/types\";\n\nconst bindingsByNode = new WeakMap<Node, IBindingInfo[]>();\n\nexport function getBindingsByNode(node: Node): IBindingInfo[] | null {\n return bindingsByNode.get(node) || null;\n}\n\nexport function setBindingsByNode(node: Node, bindings: IBindingInfo[]): void {\n bindingsByNode.set(node, bindings);\n}\n\nexport function addBindingByNode(node: Node, binding: IBindingInfo): void {\n const bindings = getBindingsByNode(node);\n if (bindings === null) {\n setBindingsByNode(node, [binding]);\n } else {\n bindings.push(binding);\n }\n}","import { BindingType } from \"../types.js\";\n\nexport const STRUCTURAL_BINDING_TYPE_SET: Set<BindingType> = new Set([\n \"if\",\n \"elseif\",\n \"else\",\n \"for\",\n]);\n","/**\n * errorMessages.ts\n *\n * Error message generation utilities used by filter functions.\n *\n * Main responsibilities:\n * - Throws clear error messages when filter options or value type checks fail\n * - Takes function name as argument to specify which filter caused the error\n *\n * Design points:\n * - optionsRequired: Error when required option is not specified\n * - optionMustBeNumber: Error when option value is not a number\n * - valueMustBeNumber: Error when value is not a number\n * - valueMustBeBoolean: Error when value is not boolean\n * - valueMustBeDate: Error when value is not a Date\n */\nimport { raiseError } from \"../raiseError\";\n\n/**\n * Throws error when filter requires at least one option but none provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function optionsRequired(fnName:string): never {\n raiseError(`filter ${fnName} requires at least one option`);\n}\n\n/**\n * Throws error when filter option must be a number but invalid value provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function optionMustBeNumber(fnName:string): never {\n raiseError(`filter ${fnName} requires a number as option`);\n}\n\n/**\n * Throws error when filter requires numeric value but non-number provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeNumber(fnName:string): never {\n raiseError(`filter ${fnName} requires a number value`);\n}\n\n/**\n * Throws error when filter requires numeric value but non-number provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeString(fnName:string): never {\n raiseError(`filter ${fnName} requires a string value`);\n}\n\n/**\n * Throws error when filter requires boolean value but non-boolean provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeBoolean(fnName:string): never {\n raiseError(`filter ${fnName} requires a boolean value`);\n} \n\n/**\n * Throws error when filter requires Date value but non-Date provided.\n * \n * @param fnName - Name of the filter function\n * @returns Never returns (always throws)\n */\nexport function valueMustBeDate(fnName:string): never {\n raiseError(`filter ${fnName} requires a date value`);\n}","/**\n * builtinFilters.ts\n *\n * Implementation file for built-in filter functions available in Structive.\n *\n * Main responsibilities:\n * - Provides filters for conversion, comparison, formatting, and validation of numbers, strings, dates, booleans, etc.\n * - Defines functions with options for each filter name, enabling flexible use during binding\n * - Designed for common use as both input and output filters\n *\n * Design points:\n * - Comprehensive coverage of diverse filters: eq, ne, lt, gt, inc, fix, locale, uc, lc, cap, trim, slice, pad, int, float, round, date, time, ymd, falsy, truthy, defaults, boolean, number, string, null, etc.\n * - Rich type checking and error handling for option values\n * - Centralized management of filter functions with FilterWithOptions type, easy to extend\n * - Dynamic retrieval of filter functions from filter names and options via builtinFilterFn\n */\nimport { config } from \"../config.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { optionMustBeNumber, optionsRequired, valueMustBeBoolean, valueMustBeDate, valueMustBeNumber } from \"./errorMessages.js\";\nimport { FilterFn, FilterWithOptions } from \"./types\";\n\nfunction validateNumberString(value: string): boolean {\n if (!value || isNaN(Number(value))) {\n return false;\n }\n return true;\n}\n\n/**\n * Equality filter - compares value with option.\n * \n * @param options - Array with comparison value as first element\n * @returns Filter function that returns boolean\n */\nconst eq = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('eq');\n return (value: unknown): boolean => {\n // Align types for comparison\n if (typeof value === 'number') {\n if (!validateNumberString(opt)) {optionMustBeNumber('eq');}\n return value === Number(opt);\n }\n if (typeof value === 'string') {\n return value === opt;\n }\n // Strict equality for others\n return value === opt;\n }\n}\n\n/**\n * Inequality filter - compares value with option.\n * \n * @param options - Array with comparison value as first element\n * @returns Filter function that returns boolean\n */\nconst ne = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('ne');\n return (value: unknown): boolean => {\n // Align types for comparison\n if (typeof value === 'number') {\n if (!validateNumberString(opt)) {optionMustBeNumber('ne');}\n return value !== Number(opt);\n }\n if (typeof value === 'string') {\n return value !== opt;\n }\n // Strict equality for others\n return value !== opt;\n }\n}\n\n/**\n * Boolean NOT filter - inverts boolean value.\n * \n * @param options - Unused\n * @returns Filter function that returns inverted boolean\n */\nconst not = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => {\n if (typeof value !== 'boolean') {valueMustBeBoolean('not');}\n return !value;\n }\n}\n\n/**\n * Less than filter - checks if value is less than option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst lt = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('lt');\n if (!validateNumberString(opt)) {optionMustBeNumber('lt');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('lt');}\n return value < Number(opt);\n }\n}\n\n/**\n * Less than or equal filter - checks if value is less than or equal to option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst le = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('le');\n if (!validateNumberString(opt)) {optionMustBeNumber('le');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('le');}\n return value <= Number(opt);\n }\n}\n\n/**\n * Greater than filter - checks if value is greater than option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst gt = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('gt');\n if (!validateNumberString(opt)) {optionMustBeNumber('gt');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('gt');}\n return value > Number(opt);\n }\n}\n\n/**\n * Greater than or equal filter - checks if value is greater than or equal to option.\n * \n * @param options - Array with comparison number as first element\n * @returns Filter function that returns boolean\n */\nconst ge = (options?:string[]): FilterFn<boolean> => {\n const opt = options?.[0] ?? optionsRequired('ge');\n if (!validateNumberString(opt)) {optionMustBeNumber('ge');}\n return (value: unknown): boolean => {\n if (typeof value !== 'number') {valueMustBeNumber('ge');}\n return value >= Number(opt);\n }\n}\n\n/**\n * Increment filter - adds option value to input value.\n * \n * @param options - Array with increment number as first element\n * @returns Filter function that returns incremented number\n */\nconst inc = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('inc');\n if (!validateNumberString(opt)) {optionMustBeNumber('inc');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('inc');}\n return value + Number(opt);\n }\n}\n\n/**\n * Decrement filter - subtracts option value from input value.\n * \n * @param options - Array with decrement number as first element\n * @returns Filter function that returns decremented number\n */\nconst dec = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('dec');\n if (!validateNumberString(opt)) {optionMustBeNumber('dec');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('dec');}\n return value - Number(opt);\n }\n}\n\n/**\n * Multiply filter - multiplies value by option.\n * \n * @param options - Array with multiplier number as first element\n * @returns Filter function that returns multiplied number\n */\nconst mul = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('mul');\n if (!validateNumberString(opt)) {optionMustBeNumber('mul');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('mul');}\n return value * Number(opt);\n }\n}\n\n/**\n * Divide filter - divides value by option.\n * \n * @param options - Array with divisor number as first element\n * @returns Filter function that returns divided number\n */\nconst div = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('div');\n if (!validateNumberString(opt)) {optionMustBeNumber('div');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('div');}\n return value / Number(opt);\n }\n}\n\n/**\n * Modulo filter - returns remainder of division.\n * \n * @param options - Array with divisor number as first element\n * @returns Filter function that returns remainder\n */\nconst mod = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? optionsRequired('mod');\n if (!validateNumberString(opt)) {optionMustBeNumber('mod');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('mod');}\n return value % Number(opt);\n }\n}\n\n/**\n * Fixed decimal filter - formats number to fixed decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns formatted string\n */\nconst fix = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? \"0\";\n if (!validateNumberString(opt)) {optionMustBeNumber('fix');}\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('fix');}\n return value.toFixed(Number(opt));\n }\n}\n\n/**\n * Locale number filter - formats number according to locale.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns localized number string\n */\nconst locale = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('locale');}\n return value.toLocaleString(opt);\n }\n}\n\n/**\n * Uppercase filter - converts string to uppercase.\n * \n * @param options - Unused\n * @returns Filter function that returns uppercase string\n */\nconst uc = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).toUpperCase();\n }\n}\n\n/**\n * Lowercase filter - converts string to lowercase.\n * \n * @param options - Unused\n * @returns Filter function that returns lowercase string\n */\nconst lc = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).toLowerCase();\n }\n}\n\n/**\n * Capitalize filter - capitalizes first character of string.\n * \n * @param options - Unused\n * @returns Filter function that returns capitalized string\n */\nconst cap = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n const v = String(value);\n if (v.length === 0) {return v;}\n if (v.length === 1) {return v.toUpperCase();}\n return v.charAt(0).toUpperCase() + v.slice(1);\n }\n}\n\n/**\n * Trim filter - removes whitespace from both ends of string.\n * \n * @param options - Unused\n * @returns Filter function that returns trimmed string\n */\nconst trim = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).trim();\n }\n}\n\n/**\n * Slice filter - extracts portion of string from specified index.\n * \n * @param options - Array with start index and optional end index\n * @returns Filter function that returns sliced string\n */\nconst slice = (options?:string[]): FilterFn<string> => {\n const numberedOpts: number[] = [];\n const opt1 = options?.[0] ?? optionsRequired('slice');\n if (!validateNumberString(opt1)) {optionMustBeNumber('slice');}\n numberedOpts.push(Number(opt1));\n const opt2 = options?.[1];\n if (typeof opt2 !== 'undefined') {\n if (!validateNumberString(opt2)) {optionMustBeNumber('slice');}\n numberedOpts.push(Number(opt2));\n }\n return (value: unknown): string => {\n return String(value).slice(...numberedOpts);\n }\n}\n\n/**\n * Substring filter - extracts substring from specified position and length.\n * \n * @param options - Array with start index and length\n * @returns Filter function that returns substring\n */\nconst substr = (options?:string[]): FilterFn<string> => {\n const opt1 = options?.[0] ?? optionsRequired('substr');\n if (!validateNumberString(opt1)) {optionMustBeNumber('substr');}\n const opt2 = options?.[1] ?? optionsRequired('substr');\n if (!validateNumberString(opt2)) {optionMustBeNumber('substr');}\n return (value: unknown): string => {\n return String(value).substr(Number(opt1), Number(opt2));\n }\n}\n\n/**\n * Pad filter - pads string to specified length from start.\n * \n * @param options - Array with target length and pad string (default: '0')\n * @returns Filter function that returns padded string\n */\nconst pad = (options?:string[]): FilterFn<string> => {\n const opt1 = options?.[0] ?? optionsRequired('pad');\n if (!validateNumberString(opt1)) {optionMustBeNumber('pad');}\n const opt2 = options?.[1] ?? '0';\n return (value: unknown): string => {\n return String(value).padStart(Number(opt1), opt2);\n }\n}\n\n/**\n * Repeat filter - repeats string specified number of times.\n * \n * @param options - Array with repeat count as first element\n * @returns Filter function that returns repeated string\n */\nconst rep = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? optionsRequired('rep');\n if (!validateNumberString(opt)) {optionMustBeNumber('rep');}\n return (value: unknown): string => {\n return String(value).repeat(Number(opt));\n }\n}\n\n/**\n * Reverse filter - reverses character order in string.\n * \n * @param options - Unused\n * @returns Filter function that returns reversed string\n */\nconst rev = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value).split('').reverse().join('');\n }\n}\n\n/**\n * Integer filter - parses value to integer.\n * \n * @param options - Unused\n * @returns Filter function that returns integer\n */\nconst int = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return parseInt(String(value), 10);\n }\n}\n\n/**\n * Float filter - parses value to floating point number.\n * \n * @param options - Unused\n * @returns Filter function that returns float\n */\nconst float = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return parseFloat(String(value));\n }\n}\n\n/**\n * Round filter - rounds number to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns rounded number\n */\nconst round = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('round');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('round');}\n const optValue = Math.pow(10, Number(opt));\n return Math.round(value * optValue) / optValue;\n }\n}\n\n/**\n * Floor filter - rounds number down to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns floored number\n */\nconst floor = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('floor');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('floor');}\n const optValue = Math.pow(10, Number(opt));\n return Math.floor(value * optValue) / optValue;\n }\n}\n\n/**\n * Ceiling filter - rounds number up to specified decimal places.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns ceiled number\n */\nconst ceil = (options?:string[]): FilterFn<number> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('ceil');}\n return (value: unknown): number => {\n if (typeof value !== 'number') {valueMustBeNumber('ceil');}\n const optValue = Math.pow(10, Number(opt));\n return Math.ceil(value * optValue) / optValue;\n }\n}\n\n/**\n * Percent filter - formats number as percentage string.\n * \n * @param options - Array with decimal places as first element (default: 0)\n * @returns Filter function that returns percentage string with '%'\n */\nconst percent = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? '0';\n if (!validateNumberString(opt)) {optionMustBeNumber('percent');}\n return (value: unknown): string => {\n if (typeof value !== 'number') {valueMustBeNumber('percent');}\n return `${(value * 100).toFixed(Number(opt))}%`;\n }\n}\n\n/**\n * Date filter - formats Date object as localized date string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns date string\n */\nconst date = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('date');}\n return value.toLocaleDateString(opt);\n }\n}\n\n/**\n * Time filter - formats Date object as localized time string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns time string\n */\nconst time = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('time');}\n return value.toLocaleTimeString(opt);\n }\n}\n\n/**\n * DateTime filter - formats Date object as localized date and time string.\n * \n * @param options - Array with locale string as first element (default: config.locale)\n * @returns Filter function that returns datetime string\n */\nconst datetime = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? config.locale;\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('datetime');}\n return value.toLocaleString(opt);\n }\n}\n\n/**\n * Year-Month-Day filter - formats Date object as YYYY-MM-DD string.\n * \n * @param options - Array with separator string as first element (default: '-')\n * @returns Filter function that returns formatted date string\n */\nconst ymd = (options?:string[]): FilterFn<string> => {\n const opt = options?.[0] ?? '-';\n return (value: unknown): string => {\n if (!(value instanceof Date)) {valueMustBeDate('ymd');}\n const year = value.getFullYear().toString();\n const month = (value.getMonth() + 1).toString().padStart(2, '0');\n const day = value.getDate().toString().padStart(2, '0');\n return `${year}${opt}${month}${opt}${day}`;\n }\n}\n\n/**\n * Falsy filter - checks if value is falsy.\n * \n * @param options - Unused\n * @returns Filter function that returns true for false/null/undefined/0/''/NaN\n */\nconst falsy = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value);\n}\n\n/**\n * Truthy filter - checks if value is truthy.\n * \n * @param options - Unused\n * @returns Filter function that returns true for non-falsy values\n */\nconst truthy = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean =>value !== false && value !== null && value !== undefined && value !== 0 && value !== '' && !Number.isNaN(value);\n}\n\n/**\n * Default filter - returns default value if input is falsy.\n * \n * @param options - Array with default value as first element\n * @returns Filter function that returns value or default\n */\nconst defaults = (options?:string[]): FilterFn<unknown> => {\n const opt = options?.[0] ?? optionsRequired('defaults');\n return (value: unknown): unknown => {\n if (value === false || value === null || value === undefined || value === 0 || value === '' || Number.isNaN(value)) {return opt;}\n return value;\n }\n}\n\n/**\n * Boolean filter - converts value to boolean.\n * \n * @param options - Unused\n * @returns Filter function that returns boolean\n */\nconst boolean = (_options?:string[]): FilterFn<boolean> => {\n return (value: unknown): boolean => {\n return Boolean(value);\n }\n}\n\n/**\n * Number filter - converts value to number.\n * \n * @param options - Unused\n * @returns Filter function that returns number\n */\nconst number = (_options?:string[]): FilterFn<number> => {\n return (value: unknown): number => {\n return Number(value);\n }\n}\n\n/**\n * String filter - converts value to string.\n * \n * @param options - Unused\n * @returns Filter function that returns string\n */\nconst string = (_options?:string[]): FilterFn<string> => {\n return (value: unknown): string => {\n return String(value);\n }\n}\n\n/**\n * Null filter - converts empty string to null.\n * \n * @param options - Unused\n * @returns Filter function that returns null for empty string, otherwise original value\n */\nconst _null = (_options?:string[]): FilterFn<unknown> => {\n return (value: unknown): unknown => {\n return (value === \"\") ? null : value;\n } \n}\n\nconst builtinFilters: FilterWithOptions = {\n \"eq\": eq,\n \"ne\": ne,\n \"not\": not,\n\n \"lt\": lt,\n \"le\": le,\n \"gt\": gt,\n \"ge\": ge,\n\n \"inc\": inc,\n \"dec\": dec,\n \"mul\": mul,\n \"div\": div,\n \"mod\": mod,\n\n \"fix\": fix,\n \"locale\": locale,\n \"uc\": uc,\n \"lc\": lc,\n \"cap\": cap,\n \"trim\": trim,\n \"slice\": slice,\n \"substr\": substr,\n \"pad\": pad,\n \"rep\": rep,\n \"rev\": rev,\n\n \"int\": int,\n \"float\": float,\n \"round\": round,\n \"floor\": floor,\n \"ceil\": ceil,\n \"percent\": percent,\n\n \"date\": date,\n \"time\": time,\n \"datetime\": datetime,\n \"ymd\": ymd,\n\n \"falsy\": falsy,\n \"truthy\": truthy,\n \"defaults\": defaults,\n\n \"boolean\": boolean,\n \"number\": number,\n \"string\": string,\n \"null\": _null,\n};\n\nexport const outputBuiltinFilters = builtinFilters;\nexport const inputBuiltinFilters = builtinFilters;\n\nexport const builtinFiltersByFilterIOType = {\n \"input\": inputBuiltinFilters,\n \"output\": outputBuiltinFilters,\n} as const;\n\n/**\n * Retrieves built-in filter function by name and options.\n * \n * @param name - Filter name\n * @param options - Array of option strings\n * @returns Function that takes FilterWithOptions and returns filter function\n */\nexport const builtinFilterFn = (name:string, options: string[]) => (filters: FilterWithOptions) => {\n const filter = filters[name];\n if (!filter) {\n raiseError(`filter not found: ${name}`);\n }\n return filter(options);\n}\n\n","import { builtinFilterFn, builtinFiltersByFilterIOType } from \"../filters/builtinFilters\";\nimport { FilterFn, FilterIOType } from \"../filters/types\";\nimport { raiseError } from \"../raiseError\";\nimport { IFilterInfo } from \"../types\";\nimport { parseFilterArgs } from \"./parseFilterArgs\";\n\nconst filterFnByKey: Map<string, FilterFn<unknown>> = new Map();\n\n// format: filterName(arg1,arg2) or filterName\n\nexport function parseFilters(filterTextList: string[], filterIOType: FilterIOType): IFilterInfo[] {\n const builtinFilters = builtinFiltersByFilterIOType[filterIOType];\n const filters: IFilterInfo[] = filterTextList.map((filterText) => {\n const openParenIndex = filterText.indexOf('(');\n const closeParenIndex = filterText.lastIndexOf(')');\n // check parentheses\n if (openParenIndex !== -1 && closeParenIndex === -1) {\n raiseError(`Invalid filter format: missing closing parenthesis in \"${filterText}\"`);\n }\n if (closeParenIndex !== -1 && openParenIndex === -1) {\n raiseError(`Invalid filter format: missing opening parenthesis in \"${filterText}\"`);\n }\n if (openParenIndex === -1) {\n // no arguments\n const filterName = filterText.trim();\n const filterKey = `${filterName}():${filterIOType}`;\n let filterFn = filterFnByKey.get(filterKey);\n if (typeof filterFn === 'undefined') {\n filterFn = builtinFilterFn(filterName, [])(builtinFilters);\n filterFnByKey.set(filterKey, filterFn);\n }\n return {\n filterName: filterName,\n args: [],\n filterFn: filterFn,\n };\n } else {\n const argsText = filterText.substring(openParenIndex + 1, closeParenIndex);\n const filterName = filterText.substring(0, openParenIndex).trim();\n const args = parseFilterArgs(argsText);\n const filterKey = `${filterName}(${args.join(',')}):${filterIOType}`;\n let filterFn = filterFnByKey.get(filterKey);\n if (typeof filterFn === 'undefined') {\n filterFn = builtinFilterFn(filterName, args)(builtinFilters);\n filterFnByKey.set(filterKey, filterFn);\n }\n return {\n filterName,\n args,\n filterFn,\n };\n }\n });\n return filters;\n}","export function parseFilterArgs(argsText: string): string[] {\n const args: string[] = [];\n let current = '';\n let inQuote: string | null = null;\n let hasQuote = false;\n\n for (let i = 0; i < argsText.length; i++) {\n const char = argsText[i];\n\n if (inQuote) {\n if (char === inQuote) {\n inQuote = null;\n } else {\n current += char;\n }\n } else if (char === '\"' || char === \"'\") {\n inQuote = char;\n hasQuote = true;\n } else if (char === ',') {\n args.push(current.trim());\n current = '';\n hasQuote = false;\n } else {\n current += char;\n }\n }\n\n const last = current.trim();\n if (last || hasQuote) {\n args.push(last);\n }\n\n return args;\n}\n","\nexport const trimFn = (s: string): string => s.trim();\n","import { DELIMITER, FILTER_SEPARATOR, MODIFIER_SEPARATOR } from \"../define\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { parseFilters } from \"./parseFilters\";\nimport { trimFn } from \"./utils\";\n\ntype PropPartParseResult = Pick<IBindingInfo, 'propName' | 'propSegments' | 'propModifiers' | 'inFilters'>;\n\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\n\n// format: propName#moodifier1,modifier2\n// propName-format: path.to.property (e.g., textContent, style.color, not include :)\n// special path: \n// 'attr.attributeName' for attributes (e.g., attr.href, attr.data-id)\n// 'style.propertyName' for style properties (e.g., style.backgroundColor, style.fontSize)\n// 'class.className' for class names (e.g., class.active, class.hidden)\n// 'onclick', 'onchange' etc. for event listeners\n\nexport function parsePropPart(propPart: string): PropPartParseResult {\n const pos = propPart.indexOf(FILTER_SEPARATOR);\n let propText: string = '';\n let filterTexts: string[] = [];\n let filtersText = '';\n let filters: IFilterInfo[] = [];\n if (pos !== -1) {\n propText = propPart.slice(0, pos).trim();\n filtersText = propPart.slice(pos + 1).trim();\n if (cacheFilterInfos.has(filtersText)) {\n filters = cacheFilterInfos.get(filtersText)!;\n } else {\n filterTexts = filtersText.split(FILTER_SEPARATOR).map(trimFn);\n filters = parseFilters(filterTexts, \"input\");\n cacheFilterInfos.set(filtersText, filters);\n }\n } else {\n propText = propPart.trim();\n }\n\n const [propName, propModifiersText] = propText.split(MODIFIER_SEPARATOR).map(trimFn);\n const propSegments = propName.split(DELIMITER).map(trimFn);\n const propModifiers = propModifiersText\n ? propModifiersText.split(',').map(trimFn)\n : [];\n return {\n propName,\n propSegments,\n propModifiers,\n inFilters: filters,\n };\n}","import { getPathInfo } from \"../address/PathInfo\";\nimport { FILTER_SEPARATOR, STATE_NAME_SEPARATOR } from \"../define\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { parseFilters } from \"./parseFilters\";\nimport { trimFn } from \"./utils\";\n\ntype StatePartParseResult = Pick<IBindingInfo, \n 'stateName' | 'statePathName' | 'statePathInfo' | 'outFilters'>;\n\nconst cacheFilterInfos = new Map<string, IFilterInfo[]>();\n\n// format: statePath@stateName|filter|filter\n// statePath-format: path.to.property (e.g., user.name.first, users.*.name, users.0.name, not include @)\n// stateName: optional, default is 'default'\n// filters-format: filterName or filterName(arg1,arg2)\nexport function parseStatePart(statePart: string): StatePartParseResult {\n const pos = statePart.indexOf(FILTER_SEPARATOR);\n let stateAndPath: string = '';\n let filterTexts: string[] = [];\n let filtersText = '';\n let filters: IFilterInfo[] = [];\n if (pos !== -1) {\n stateAndPath = statePart.slice(0, pos).trim();\n filtersText = statePart.slice(pos + 1).trim();\n if (cacheFilterInfos.has(filtersText)) {\n filters = cacheFilterInfos.get(filtersText)!;\n } else {\n filterTexts = filtersText.split(FILTER_SEPARATOR).map(trimFn);\n filters = parseFilters(filterTexts, \"output\");\n cacheFilterInfos.set(filtersText, filters);\n }\n } else {\n stateAndPath = statePart.trim();\n }\n const [statePathName, stateName = 'default'] = stateAndPath.split(STATE_NAME_SEPARATOR).map(trimFn);\n const pathInfo = getPathInfo(statePathName);\n return {\n stateName,\n statePathName,\n statePathInfo: pathInfo,\n outFilters: filters,\n };\n}\n","import { getPathInfo } from \"../address/PathInfo.js\";\nimport { BINDING_SEPARATOR, PROP_VALUE_SEPARATOR } from \"../define.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { STRUCTURAL_BINDING_TYPE_SET } from \"../structural/define.js\";\nimport { parsePropPart } from \"./parsePropPart.js\";\nimport { parseStatePart } from \"./parseStatePart.js\";\nimport { ParseBindTextResult } from \"./types.js\";\nimport { trimFn } from \"./utils.js\";\n\n// format: propPart:statePart; propPart:statePart; ...\n// special-propPart:\n// if: statePart (single binding for conditional rendering)\n// else: (single binding for conditional rendering, and statePart is ignored)\n// elseif: statePart only (single binding for conditional rendering)\n// for: statePart only (single binding for loop rendering)\n// onclick: statePart, onchange: statePart etc. (event listeners)\n// ...: statePart (spread — expand wcBindable properties+inputs of target object)\n\nexport function parseBindTextsForElement(bindText: string): ParseBindTextResult[] {\n const [ ...bindTexts ] = bindText.split(BINDING_SEPARATOR).map(trimFn).filter(s => s.length > 0);\n const results = bindTexts.map((bindText): ParseBindTextResult => {\n const separatorIndex = bindText.indexOf(PROP_VALUE_SEPARATOR);\n if (separatorIndex === -1) {\n raiseError(`Invalid bindText: \"${bindText}\". Missing ':' separator between propPart and statePart.`);\n }\n const propPart = bindText.slice(0, separatorIndex).trim();\n const statePart = bindText.slice(separatorIndex + 1).trim();\n if (propPart === 'else') {\n const pathInfo = getPathInfo('#else');\n return {\n propName: 'else',\n propSegments: ['else'],\n propModifiers: [],\n statePathName: '#else',\n statePathInfo: pathInfo,\n stateName: '',\n inFilters: [],\n outFilters: [],\n bindingType: 'else',\n };\n } else if (propPart === '...') {\n const stateResult = parseStatePart(statePart);\n if (stateResult.outFilters.length > 0) {\n raiseError(`Invalid spread binding \"${bindText}\": filters are not allowed on spread targets.`);\n }\n if (stateResult.statePathName.length === 0) {\n raiseError(`Invalid spread binding \"${bindText}\": spread target path is required.`);\n }\n return {\n propName: '...',\n propSegments: ['...'],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: 'spread',\n };\n } else if (propPart === 'if'\n || propPart === 'elseif'\n || propPart === 'for'\n || propPart === 'radio'\n || propPart === 'checkbox'\n ) {\n const stateResult = parseStatePart(statePart);\n return {\n propName: propPart,\n propSegments: [propPart],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: propPart,\n };\n } else {\n const stateResult = parseStatePart(statePart);\n const propResult = parsePropPart(propPart);\n // eventToken.<prop>: <name> は要素 dispatch を state へ流す pub/sub 配線。\n // 値適用ではないため bindingType 'event' として listener attach 経路に乗せる。\n if (propResult.propSegments[0] === 'eventToken') {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'event',\n };\n }\n if (propResult.propSegments[0].startsWith('on')) {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'event',\n };\n } else {\n return {\n ...propResult,\n ...stateResult,\n bindingType: 'prop',\n };\n }\n }\n });\n // check for sigle binding for 'if', 'elseif', 'else', 'for'\n if (results.length > 1) {\n const isIncludeSingleBinding = results.some(r => STRUCTURAL_BINDING_TYPE_SET.has(r.bindingType));\n if (isIncludeSingleBinding) {\n raiseError(`Invalid bindText: \"${bindText}\". 'if', 'elseif', 'else', and 'for' bindings must be single binding.`);\n }\n }\n return results;\n}\n\n","import { config } from \"../config\";\n\nconst bindTextByNode = new WeakMap<Node, string>();\n\n// format: <!--@@wcs-text:path-->\n// bind-stateはconfig.commentTextPrefixで変更可能\n// format: <!--@@wcs-for:UUID-->\n// bind-stateはconfig.commentForPrefixで変更可能\n// format: <!--@@wcs-if:UUID-->\n// bind-stateはconfig.commentIfPrefixで変更可能\n// format: <!--@@wcs-else:UUID-->\n// bind-stateはconfig.commentElsePrefixで変更可能\n// format: <!--@@wcs-elseif:UUID-->\n// bind-stateはconfig.commentElseIfPrefixで変更可能\nconst bindingTypeKeywordSet: Set<string> = new Set<string>([\n config.commentTextPrefix,\n config.commentForPrefix,\n config.commentIfPrefix,\n config.commentElseIfPrefix,\n config.commentElsePrefix,\n]);\n\n// format: <!--@@:path-->は<!--@@wcs-text:path-->と同義にする\nconst EMBEDDED_REGEX = new RegExp(`^\\\\s*@@\\\\s*(.*?)\\\\s*:\\\\s*(.+?)\\\\s*$`);\n\nexport function parseCommentNode(node: Node): string | null {\n const savedText = bindTextByNode.get(node);\n if (typeof savedText === \"string\") {\n return savedText;\n }\n if (node.nodeType !== Node.COMMENT_NODE) {\n return null;\n }\n const commentNode = node as Comment;\n const text = commentNode.data.trim();\n const match = EMBEDDED_REGEX.exec(text);\n if (match === null) {\n return null;\n }\n // 空の場合は wcs-text として扱う\n const keyword = match[1] || config.commentTextPrefix;\n if (!bindingTypeKeywordSet.has(keyword)) {\n return null;\n }\n bindTextByNode.set(node, match[2]);\n return match[2];\n}\n\nexport function getCommentNodeBindText(node: Node): string | null {\n return bindTextByNode.get(node) || null;\n}","import { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IFragmentInfo } from \"./types\";\n\nconst fragmentInfoByUUID = new Map<string, IFragmentInfo>();\n\nexport function setFragmentInfoByUUID(uuid: string, rootNode: Node, fragmentInfo: IFragmentInfo | null): void {\n if (fragmentInfo === null) {\n fragmentInfoByUUID.delete(uuid);\n } else {\n fragmentInfoByUUID.set(uuid, fragmentInfo);\n const bindingPartial = fragmentInfo.parseBindTextResult;\n const stateElement = getStateElementByName(rootNode, bindingPartial.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${bindingPartial.stateName}\" not found for fragment info.`);\n }\n stateElement.setPathInfo(bindingPartial.statePathName, bindingPartial.bindingType);\n for(const nodeInfo of fragmentInfo.nodeInfos) {\n for(const nodeBindingPartial of nodeInfo.parseBindTextResults) {\n const nodeStateElement = getStateElementByName(rootNode, nodeBindingPartial.stateName);\n if (nodeStateElement === null) {\n raiseError(`State element with name \"${nodeBindingPartial.stateName}\" not found for fragment info node.`);\n }\n nodeStateElement.setPathInfo(nodeBindingPartial.statePathName, nodeBindingPartial.bindingType);\n }\n }\n }\n}\n\nexport function getFragmentInfoByUUID(uuid: string): IFragmentInfo | null {\n return fragmentInfoByUUID.get(uuid) || null;\n}\n\nexport function getAllFragmentUUIDs(): string[] {\n return Array.from(fragmentInfoByUUID.keys());\n}","import { config } from \"../config\";\nimport { raiseError } from \"../raiseError\";\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\nimport { parseCommentNode } from \"./parseCommentNode\";\nimport { parseBindTextForEmbeddedNode } from \"../bindTextParser/parseBindTextForEmbeddedNode\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\n\nexport function getParseBindTextResults(node: Node): ParseBindTextResult[] {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n const bindText = element.getAttribute(config.bindAttributeName) || '';\n return parseBindTextsForElement(bindText);\n } else if (node.nodeType === Node.COMMENT_NODE) {\n const bindTextOrUUID = parseCommentNode(node);\n if (bindTextOrUUID === null) {\n raiseError(`Comment node binding text not found.`);\n }\n const fragmentInfo = getFragmentInfoByUUID(bindTextOrUUID);\n let parseBindingTextResult = fragmentInfo?.parseBindTextResult ?? null;\n let uuid: string | null = null;\n if (parseBindingTextResult === null) {\n // It is not a structural fragment UUID, so treat it as bindText\n parseBindingTextResult = parseBindTextForEmbeddedNode(bindTextOrUUID);\n uuid = null;\n } else {\n uuid = bindTextOrUUID;\n }\n return [{\n ...parseBindingTextResult,\n uuid: uuid,\n }]\n }\n return [];\n}","import { parseStatePart } from \"./parseStatePart.js\";\nimport { ParseBindTextResult } from \"./types.js\";\n\nexport function parseBindTextForEmbeddedNode(bindText: string): ParseBindTextResult {\n const stateResult = parseStatePart(bindText);\n return {\n propName: 'textContent',\n propSegments: ['textContent'],\n propModifiers: [],\n inFilters: [],\n ...stateResult,\n bindingType: 'text',\n }\n}","import { config } from \"../config\";\nimport { parseCommentNode } from \"./parseCommentNode\";\n\n/**\n * data-wcs 属性または埋め込みノード<!--{{}}-->を持つノードをすべて取得する\n * @param root \n * @returns \n */\n\nexport function getSubscriberNodes(root: Document | Element | DocumentFragment): Node[] {\n const subscriberNodes: Node[] = [];\n const walker = document.createTreeWalker(\n root, \n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, \n {\n acceptNode(node: Node) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as Element;\n const hasBinding = element.hasAttribute(config.bindAttributeName);\n return hasBinding\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP;\n } else {\n // Comment node\n return parseCommentNode(node) !== null\n ? NodeFilter.FILTER_ACCEPT \n : NodeFilter.FILTER_SKIP;\n }\n }\n }\n );\n \n while (walker.nextNode()) {\n subscriberNodes.push(walker.currentNode);\n }\n return subscriberNodes;\n}","import { expandSpread, hasUnresolvedSpread } from \"../bindTextParser/expandSpread\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { raiseError } from \"../raiseError\";\nimport { resolveNodePath } from \"../structural/resolveNodePath\";\nimport { IFragmentNodeInfo } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { getBindingInfos } from \"./getBindingInfos\";\nimport { setBindingsByNode } from \"./getBindingsByNode\";\nimport { getParseBindTextResults } from \"./getParseBindTextResults\";\nimport { getSubscriberNodes } from \"./getSubscriberNodes\";\nimport { resolveInitializedBinding } from \"./initializeBindingPromiseByNode\";\n\nconst registeredNodeSet = new WeakSet<Node>();\n\nexport interface IDeferredSpreadEntry {\n readonly node: Node;\n readonly tagName: string;\n readonly parseResults: ParseBindTextResult[];\n}\n\nfunction processParseResultsForNode(\n node: Node,\n parseResults: ParseBindTextResult[],\n options: { allowDeferred: boolean },\n): { bindings: IBindingInfo[], deferred: IDeferredSpreadEntry | null } {\n const expanded = expandSpread(node, parseResults, { allowDeferred: options.allowDeferred });\n if (hasUnresolvedSpread(expanded)) {\n const tagName = node.nodeType === Node.ELEMENT_NODE\n ? getCustomElement(node as Element)\n : null;\n if (tagName === null) {\n raiseError(`Spread binding deferred but element is not a custom element.`);\n }\n return { bindings: [], deferred: { node, tagName, parseResults } };\n }\n registeredNodeSet.add(node);\n const bindings = getBindingInfos(node, expanded);\n setBindingsByNode(node, bindings);\n resolveInitializedBinding(node);\n return { bindings, deferred: null };\n}\n\nexport function collectNodesAndBindingInfos(\n root: Document | Element | DocumentFragment\n): [ Node[], IBindingInfo[], IDeferredSpreadEntry[] ] {\n const subscriberNodes = getSubscriberNodes(root);\n const allBindings: IBindingInfo[] = [];\n const deferredSpreads: IDeferredSpreadEntry[] = [];\n for(const node of subscriberNodes) {\n if (registeredNodeSet.has(node)) continue;\n const parseResults = getParseBindTextResults(node);\n const result = processParseResultsForNode(node, parseResults, { allowDeferred: true });\n if (result.deferred !== null) {\n deferredSpreads.push(result.deferred);\n continue;\n }\n allBindings.push(...result.bindings);\n }\n return [subscriberNodes, allBindings, deferredSpreads];\n}\n\nexport function collectNodesAndBindingInfosByFragment(\n root: DocumentFragment,\n nodeInfos: IFragmentNodeInfo[],\n): [ Node[], IBindingInfo[] ] {\n const nodes: Node[] = [];\n const allBindings: IBindingInfo[] = [];\n for(const nodeInfo of nodeInfos) {\n const node = resolveNodePath(root, nodeInfo.nodePath);\n if (node === null) {\n raiseError(`Node not found by path [${nodeInfo.nodePath.join(', ')}] in fragment.`);\n }\n if (registeredNodeSet.has(node)) continue;\n const result = processParseResultsForNode(node, nodeInfo.parseBindTextResults, { allowDeferred: false });\n // deferred is impossible when allowDeferred=false (expandSpread raises instead)\n allBindings.push(...result.bindings);\n nodes.push(node);\n }\n return [nodes, allBindings];\n}\n\nexport function unregisterNode(node: Node): void {\n registeredNodeSet.delete(node);\n}\n\n/**\n * RowPlan 経路(createContent のプラン実体化)用。パース・spread 展開を経ずに\n * binding を組み立てた subscriber ノードを二重処理防止台帳へ載せる\n * (後続の collectNodesAndBindingInfos による再スキャンから保護)。\n */\nexport function markNodeRegistered(node: Node): void {\n registeredNodeSet.add(node);\n}\n\n/**\n * Re-process a deferred spread entry once the custom element class is\n * registered. Expands the captured parseResults, installs bindings, and\n * returns them so the caller can attach handlers and apply state values.\n */\nexport function processDeferredNode(entry: IDeferredSpreadEntry): IBindingInfo[] {\n const { node, parseResults } = entry;\n unregisterNode(node);\n const result = processParseResultsForNode(node, parseResults, { allowDeferred: false });\n return result.bindings;\n}\n","import { IBindingInfo } from \"../types\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\n\nexport function getBindingInfos(node: Node, parseBindingTextResults: ParseBindTextResult[]): IBindingInfo[] {\n const bindingInfos: IBindingInfo[] = [];\n for (const parseBindingTextResult of parseBindingTextResults) {\n if (parseBindingTextResult.bindingType !== 'text') {\n bindingInfos.push({\n ...parseBindingTextResult,\n node: node,\n replaceNode: node,\n });\n } else {\n // フラグメント登録時に事前正規化済みの Text ノードはそのまま replaceNode に\n // 使う(node === replaceNode なら replaceToReplaceNode は no-op)。\n // 実 DOM 上の wcs-text コメント(非フラグメント経路)は従来どおり\n // 空 Text を生成して実行時に差し替える。\n const replaceNode = node.nodeType === Node.TEXT_NODE\n ? node\n : document.createTextNode('');\n bindingInfos.push({\n ...parseBindingTextResult,\n node: node,\n replaceNode: replaceNode,\n });\n }\n }\n return bindingInfos;\n}\n","import { ILoopContext } from \"./types\";\n\nconst loopContextByNode = new WeakMap<Node, ILoopContext>();\n\nexport function getLoopContextByNode(node: Node): ILoopContext | null {\n let paramNode: Node | null = node;\n while (paramNode) {\n const loopContext = loopContextByNode.get(paramNode);\n if (loopContext) {\n return loopContext;\n }\n paramNode = paramNode.parentNode;\n }\n return null;\n}\n\nexport function setLoopContextByNode(node: Node, loopContext: ILoopContext | null): void {\n if (loopContext === null) {\n loopContextByNode.delete(node);\n return;\n }\n loopContextByNode.set(node, loopContext);\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\n\nconst lastListValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, readonly unknown[]> = new WeakMap();\n\nexport function getLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): readonly unknown[] {\n return lastListValueByAbsoluteStateAddress.get(address) ?? [];\n}\n\nexport function setLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress, value: readonly unknown[]): void {\n lastListValueByAbsoluteStateAddress.set(address, value);\n}\n\nexport function clearLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): void {\n lastListValueByAbsoluteStateAddress.delete(address);\n}\n\nexport function hasLastListValueByAbsoluteStateAddress(address: IAbsoluteStateAddress): boolean {\n return lastListValueByAbsoluteStateAddress.has(address);\n}\n","\nexport const setLoopContextAsyncSymbol: unique symbol = Symbol(\"$$setLoopContextAsync\");\nexport const setLoopContextSymbol: unique symbol = Symbol(\"$$setLoopContext\");\nexport const getByAddressSymbol: unique symbol = Symbol(\"$$getByAddress\");\nexport const hasByAddressSymbol: unique symbol = Symbol(\"$$hasByAddress\");\nexport const setByAddressSymbol: unique symbol = Symbol(\"$$setByAddress\");\nexport const connectedCallbackSymbol: unique symbol = Symbol(\"$$connectedCallback\");\nexport const disconnectedCallbackSymbol: unique symbol = Symbol(\"$$disconnectedCallback\");\nexport const updatedCallbackSymbol: unique symbol = Symbol(\"$$updatedCallback\");\n","import { IStateElement } from \"../components/types\";\nimport { IAbsolutePathInfo, IPathInfo } from \"./types\";\n\nconst _cache: WeakMap<IStateElement, WeakMap<IPathInfo, IAbsolutePathInfo>> = new WeakMap();\n\nexport function getAbsolutePathInfo(stateElement: IStateElement, pathInfo: IPathInfo): IAbsolutePathInfo {\n if (_cache.has(stateElement)) {\n const pathMap = _cache.get(stateElement)!;\n if (pathMap.has(pathInfo)) {\n return pathMap.get(pathInfo)!;\n }\n } else {\n _cache.set(stateElement, new WeakMap());\n }\n const absolutePathInfo = Object.freeze(new AbsolutePathInfo(stateElement, pathInfo));\n _cache.get(stateElement)!.set(pathInfo, absolutePathInfo);\n return absolutePathInfo;\n}\n\nclass AbsolutePathInfo implements IAbsolutePathInfo {\n readonly pathInfo: IPathInfo;\n readonly stateName: string;\n readonly stateElement: IStateElement;\n readonly parentAbsolutePathInfo: IAbsolutePathInfo | null;\n constructor(stateElement: IStateElement, pathInfo: IPathInfo) {\n this.pathInfo = pathInfo;\n this.stateName = stateElement.name;\n this.stateElement = stateElement;\n if (pathInfo.parentPathInfo === null) {\n this.parentAbsolutePathInfo = null;\n } else {\n this.parentAbsolutePathInfo = getAbsolutePathInfo(stateElement, pathInfo.parentPathInfo);\n }\n }\n}","import { WILDCARD } from \"../define\";\nimport { IListIndex } from \"../list/types\";\nimport { IAbsolutePathInfo, IAbsoluteStateAddress } from \"./types\";\n\nconst _cache: WeakMap<IListIndex, WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>> = new WeakMap();\nconst _cacheNullListIndex: WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress> = new WeakMap();\n\nclass AbsoluteStateAddress implements IAbsoluteStateAddress {\n readonly absolutePathInfo: IAbsolutePathInfo;\n readonly listIndex: IListIndex | null;\n private _parentAbsoluteAddress: IAbsoluteStateAddress | null | undefined;\n\n constructor(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null) {\n this.absolutePathInfo = absolutePathInfo;\n this.listIndex = listIndex;\n }\n\n get parentAbsoluteAddress(): IAbsoluteStateAddress | null {\n if (typeof this._parentAbsoluteAddress !== 'undefined') {\n return this._parentAbsoluteAddress;\n }\n const parentAbsolutePathInfo = this.absolutePathInfo.parentAbsolutePathInfo;\n if (parentAbsolutePathInfo === null) {\n return null;\n }\n const lastSegment = this.absolutePathInfo.pathInfo.segments[this.absolutePathInfo.pathInfo.segments.length - 1];\n let parentListIndex: IListIndex | null = null;\n if (lastSegment === WILDCARD) {\n parentListIndex = this.listIndex?.parentListIndex ?? null;\n } else {\n parentListIndex = this.listIndex;\n }\n return this._parentAbsoluteAddress = createAbsoluteStateAddress(\n parentAbsolutePathInfo,\n parentListIndex\n );\n }\n}\n\nexport function createAbsoluteStateAddress(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex | null): IAbsoluteStateAddress {\n if (listIndex === null) {\n let cached = _cacheNullListIndex.get(absolutePathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new AbsoluteStateAddress(absolutePathInfo, null);\n _cacheNullListIndex.set(absolutePathInfo, cached);\n return cached;\n } else {\n let cacheByAbsolutePathInfo = _cache.get(listIndex);\n if (typeof cacheByAbsolutePathInfo === \"undefined\") {\n cacheByAbsolutePathInfo = new WeakMap<IAbsolutePathInfo, IAbsoluteStateAddress>();\n _cache.set(listIndex, cacheByAbsolutePathInfo);\n }\n let cached = cacheByAbsolutePathInfo.get(absolutePathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new AbsoluteStateAddress(absolutePathInfo, listIndex);\n cacheByAbsolutePathInfo.set(absolutePathInfo, cached);\n return cached;\n }\n}\n","\nconst rootNodeByFragment: WeakMap<DocumentFragment, Node> = new WeakMap();\n\nexport function setRootNodeByFragment(fragment: DocumentFragment, rootNode: Node | null): void {\n if (rootNode === null) {\n rootNodeByFragment.delete(fragment);\n } else {\n rootNodeByFragment.set(fragment, rootNode);\n }\n}\n\nexport function getRootNodeByFragment(fragment: DocumentFragment): Node | null {\n return rootNodeByFragment.get(fragment) || null;\n}\n","import { IPathInfo } from \"./types.js\";\n\nconst cacheCalcWildcardLen: Map<string, number> = new Map(); \n\nexport function calcWildcardLen(pathInfo: IPathInfo, targetPathInfo: IPathInfo): number {\n let path1: IPathInfo;\n let path2: IPathInfo;\n if (pathInfo.wildcardCount === 0 || targetPathInfo.wildcardCount === 0) {\n return 0;\n }\n if (pathInfo.wildcardCount === 1 \n && targetPathInfo.wildcardCount > 0 \n && targetPathInfo.wildcardPathSet.has(pathInfo.path)) {\n return 1;\n }\n if (pathInfo.id < targetPathInfo.id) {\n path1 = pathInfo;\n path2 = targetPathInfo;\n } else {\n path1 = targetPathInfo;\n path2 = pathInfo;\n }\n const key = `${path1.path}\\t${path2.path}`;\n let len = cacheCalcWildcardLen.get(key);\n if (typeof len !== \"undefined\") {\n return len;\n }\n const matchPath = path1.wildcardPathSet.intersection(path2.wildcardPathSet);\n len = matchPath.size;\n cacheCalcWildcardLen.set(key, len);\n return len;\n}\n\n","import { calcWildcardLen } from \"../address/calcWildcardLen\";\nimport { IBindingInfo } from \"../types\";\nimport { getLoopContextByNode } from \"./loopContextByNode\";\nimport { IListIndex, ILoopContext } from \"./types\";\n\nconst listIndexByBindingInfoByLoopContext: WeakMap<ILoopContext, WeakMap<IBindingInfo, IListIndex | null>> = new WeakMap();\n\nexport function getListIndexByBindingInfo(bindingInfo: IBindingInfo): IListIndex | null {\n const loopContext = getLoopContextByNode(bindingInfo.node);\n if (loopContext === null) {\n return null;\n }\n let listIndexByBindingInfo = listIndexByBindingInfoByLoopContext.get(loopContext);\n if (typeof listIndexByBindingInfo === \"undefined\") {\n listIndexByBindingInfo = new WeakMap<IBindingInfo, IListIndex | null>();\n listIndexByBindingInfoByLoopContext.set(loopContext, listIndexByBindingInfo);\n } else {\n const listIndex = listIndexByBindingInfo.get(bindingInfo);\n if (typeof listIndex !== \"undefined\") {\n return listIndex;\n }\n }\n\n let listIndex: IListIndex | null = null;\n try {\n const wildcardLen = calcWildcardLen(loopContext.pathInfo, bindingInfo.statePathInfo);\n if (wildcardLen > 0) {\n listIndex = loopContext.listIndex.at(wildcardLen - 1);\n }\n return listIndex;\n } finally {\n listIndexByBindingInfo.set(bindingInfo, listIndex);\n }\n\n}\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { IAbsoluteStateAddress } from \"../address/types\";\nimport { getRootNodeByFragment } from \"../apply/rootNodeByFragment\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"./types\";\n\nconst absoluteStateAddressByBinding: WeakMap<IBindingInfo, IAbsoluteStateAddress> = new WeakMap();\n\n/**\n * binding の解決済み root を返す。knownRootNode があれば getRootNode() と\n * fragment フォールバックを省略する(リスト行活性化のホットパス)。\n */\nexport function resolveBindingRootNode(binding: IBindingInfo, knownRootNode?: Node | null): Node {\n if (knownRootNode != null) {\n return knownRootNode;\n }\n let rootNode: Node = binding.replaceNode.getRootNode() as Node;\n // binding.replaceNodeはisConnected=trueになっていることが前提、切断されている場合はraiseErrorを返す\n if (binding.replaceNode.isConnected === false) {\n // DocumentFragmentでバッファリングされている場合は、ルートノードをDocumentFragmentから実際のルートノードに切り替える\n const rootNodeByFragment = getRootNodeByFragment(rootNode as DocumentFragment);\n if (rootNodeByFragment === null) {\n raiseError(`Cannot get absolute state address for disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`);\n } else {\n rootNode = rootNodeByFragment;\n }\n }\n return rootNode;\n}\n\nexport function getAbsoluteStateAddressByBinding(binding: IBindingInfo, knownRootNode?: Node | null): IAbsoluteStateAddress {\n // 切断されていても、キャッシュされていれば絶対状態アドレスを返す。\n let absoluteStateAddress: IAbsoluteStateAddress | null = null;\n absoluteStateAddress = absoluteStateAddressByBinding.get(binding) || null;\n if (absoluteStateAddress !== null) {\n return absoluteStateAddress;\n }\n\n const rootNode: Node = resolveBindingRootNode(binding, knownRootNode);\n\n const listIndex = getListIndexByBindingInfo(binding);\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n const absolutePathInfo = getAbsolutePathInfo(stateElement, binding.statePathInfo);\n absoluteStateAddress = \n createAbsoluteStateAddress(absolutePathInfo, listIndex);\n absoluteStateAddressByBinding.set(binding, absoluteStateAddress);\n return absoluteStateAddress;\n}\n\nexport function clearAbsoluteStateAddressByBinding(binding: IBindingInfo) {\n absoluteStateAddressByBinding.delete(binding);\n}","/**\n * devtools/sink.ts\n *\n * 計装点が参照するホットパス唯一の接点。依存ゼロの葉モジュールにすることで、\n * 計装される側(stateElementByName / setByAddress / binding / token)と\n * bridge の間の循環 import を避ける。\n *\n * コスト規範(protocol §1-1): フック未接続時、計装点のコストは\n * `devtoolsSink !== null` の分岐 1 個。イベントオブジェクトの生成は\n * 必ずこのチェックの内側で行うこと。\n */\n\nimport type { DevtoolsSink } from \"./types\";\n\n/** live binding としてエクスポート。計装点は `if (devtoolsSink !== null)` で参照する */\nexport let devtoolsSink: DevtoolsSink | null = null;\n\nexport function setDevtoolsSink(sink: DevtoolsSink | null): void {\n devtoolsSink = sink;\n}\n","import { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { IAbsolutePathInfo, IAbsoluteStateAddress } from \"../address/types\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { IListIndex } from \"../list/types\";\nimport { IBindingInfo } from \"./types\";\n\n/**\n * 絶対アドレス → 登録 binding の台帳。\n *\n * リスト行の絶対アドレスは (absolutePathInfo, listIndex) の組ごとに一意で、\n * 登録される binding は通常 1 本しかない。アドレスごとに Set を確保すると\n * 行×binding の数だけ Set アロケーションが積み上がるため、単一値で持ち\n * 2 本目から Set に昇格する(interestedSessionsByNode と同じ前例)。\n */\nconst bindingsByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, IBindingInfo | Set<IBindingInfo>> = new WeakMap();\n\n/**\n * 参照専用の取得。未登録アドレスにエントリを生成・キャッシュしない\n * (リスト置換の drain は大量のバインディング無しアドレスを照会するため、\n * 生成すると空エントリが溜まり続ける)。\n * 戻り値は単一 binding(登録 1 本)か Set(2 本以上)のどちらか。\n * 呼び出し側は Set を変異してはならない(instanceof で分岐できるよう\n * ReadonlySet でなく Set 型で返す)。\n */\nexport function peekBindingsByAbsoluteStateAddress(\n absoluteStateAddress: IAbsoluteStateAddress,\n): IBindingInfo | Set<IBindingInfo> | undefined {\n return bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n}\n\nexport function addBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\n const current = bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n if (typeof current === \"undefined\") {\n bindingsByAbsoluteStateAddress.set(absoluteStateAddress, binding);\n } else if (current instanceof Set) {\n current.add(binding);\n } else if (current !== binding) {\n bindingsByAbsoluteStateAddress.set(absoluteStateAddress, new Set([current, binding]));\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-added\", absoluteAddress: absoluteStateAddress, binding });\n }\n}\n\nexport function clearBindingSetByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): void {\n bindingsByAbsoluteStateAddress.delete(absoluteStateAddress);\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-cleared\", absoluteAddress: absoluteStateAddress });\n }\n}\n\nexport function removeBindingByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, binding: IBindingInfo): void {\n const current = bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n if (typeof current === \"undefined\") {\n return;\n }\n if (current instanceof Set) {\n current.delete(binding);\n } else if (current === binding) {\n bindingsByAbsoluteStateAddress.delete(absoluteStateAddress);\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-removed\", absoluteAddress: absoluteStateAddress, binding });\n }\n}\n\n/**\n * パターン索引台帳(リスト行バインディング専用・docs/state-row-instantiation-redesign.md §3-3)。\n *\n * 行バインディングは (absolutePathInfo, listIndex) の 2 段キーで登録し、登録側では\n * AbsoluteStateAddress の intern(アドレスオブジェクト割当 + listIndex ごとの\n * intern 用 WeakMap)を一切行わない。書き込み側(setByAddress → enqueue)は従来\n * どおり intern 済みアドレスを使うため、drain はアドレスの構成要素\n * (absolutePathInfo / listIndex — どちらもオブジェクト同一性が保証済み)で\n * このパターン台帳を引ける。リオーダーは listIndex 同一性キーの帰結として\n * 従来同様ゼロタッチ。wholesale destroy は従来同様削除ゼロ(listIndex ごと GC 崩壊)。\n *\n * devtools 計装(state:binding-added/removed)はプロトコル契約なので、sink 接続時に\n * 限りアドレスを intern してイベントを流す(フック未接続時のコストは分岐 1 個の規範を維持)。\n */\nconst patternLedger: WeakMap<IAbsolutePathInfo, WeakMap<IListIndex, IBindingInfo | Set<IBindingInfo>>> = new WeakMap();\n\nexport function addBindingByPattern(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex, binding: IBindingInfo): void {\n let rowMap = patternLedger.get(absolutePathInfo);\n if (typeof rowMap === \"undefined\") {\n rowMap = new WeakMap();\n patternLedger.set(absolutePathInfo, rowMap);\n }\n const current = rowMap.get(listIndex);\n if (typeof current === \"undefined\") {\n rowMap.set(listIndex, binding);\n } else if (current instanceof Set) {\n current.add(binding);\n } else if (current !== binding) {\n rowMap.set(listIndex, new Set([current, binding]));\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-added\", absoluteAddress: createAbsoluteStateAddress(absolutePathInfo, listIndex), binding });\n }\n}\n\nexport function removeBindingByPattern(absolutePathInfo: IAbsolutePathInfo, listIndex: IListIndex, binding: IBindingInfo): void {\n const rowMap = patternLedger.get(absolutePathInfo);\n if (typeof rowMap === \"undefined\") {\n return;\n }\n const current = rowMap.get(listIndex);\n if (typeof current === \"undefined\") {\n return;\n }\n if (current instanceof Set) {\n current.delete(binding);\n } else if (current === binding) {\n rowMap.delete(listIndex);\n }\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:binding-removed\", absoluteAddress: createAbsoluteStateAddress(absolutePathInfo, listIndex), binding });\n }\n}\n\n/**\n * drain(updater)用の統合参照。従来台帳 → パターン台帳の順に引く。\n * 従来台帳を先に引くのは、listIndex 付きでも旧経路(SSR ハイドレーション等)で\n * アドレス台帳に登録される可能性を許容するため(取りこぼし防止)。\n */\nexport function peekBindingsForAddress(\n absoluteStateAddress: IAbsoluteStateAddress,\n): IBindingInfo | Set<IBindingInfo> | undefined {\n const entry = bindingsByAbsoluteStateAddress.get(absoluteStateAddress);\n if (typeof entry !== \"undefined\") {\n return entry;\n }\n if (absoluteStateAddress.listIndex === null) {\n return undefined;\n }\n return patternLedger.get(absoluteStateAddress.absolutePathInfo)?.get(absoluteStateAddress.listIndex);\n}\n","import { WILDCARD } from \"../define\";\nimport { IListIndex } from \"../list/types\";\nimport { IPathInfo, IStateAddress } from \"./types\";\n\nconst _cache: WeakMap<IListIndex, WeakMap<IPathInfo, IStateAddress>> = new WeakMap();\nconst _cacheNullListIndex: WeakMap<IPathInfo, IStateAddress> = new WeakMap();\n\nclass StateAddress implements IStateAddress {\n readonly pathInfo: IPathInfo;\n readonly listIndex: IListIndex | null;\n private _parentAddress: IStateAddress | null | undefined;\n\n constructor(pathInfo: IPathInfo, listIndex: IListIndex | null) {\n this.pathInfo = pathInfo;\n this.listIndex = listIndex;\n }\n\n get parentAddress(): IStateAddress | null {\n if (typeof this._parentAddress !== 'undefined') {\n return this._parentAddress;\n }\n const parentPathInfo = this.pathInfo.parentPathInfo;\n if (parentPathInfo === null) {\n return null;\n }\n const lastSegment = this.pathInfo.segments[this.pathInfo.segments.length - 1];\n let parentListIndex: IListIndex | null = null;\n if (lastSegment === WILDCARD) {\n parentListIndex = this.listIndex?.parentListIndex ?? null;\n } else {\n parentListIndex = this.listIndex;\n }\n return this._parentAddress = createStateAddress(parentPathInfo, parentListIndex);\n }\n}\n\nexport function createStateAddress(pathInfo: IPathInfo, listIndex: IListIndex | null): IStateAddress {\n if (listIndex === null) {\n let cached = _cacheNullListIndex.get(pathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new StateAddress(pathInfo, null);\n _cacheNullListIndex.set(pathInfo, cached);\n return cached;\n } else {\n let cacheByPathInfo = _cache.get(listIndex);\n if (typeof cacheByPathInfo === \"undefined\") {\n cacheByPathInfo = new WeakMap<IPathInfo, IStateAddress>();\n _cache.set(listIndex, cacheByPathInfo);\n }\n let cached = cacheByPathInfo.get(pathInfo);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n cached = new StateAddress(pathInfo, listIndex);\n cacheByPathInfo.set(pathInfo, cached);\n return cached;\n }\n}","import { createStateAddress } from \"../address/StateAddress\";\nimport { IStateAddress } from \"../address/types\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\n\nconst stateAddressByBindingInfo: WeakMap<IBindingInfo, IStateAddress> = new WeakMap();\n\nexport function getStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\n let stateAddress: IStateAddress | null = null;\n stateAddress = stateAddressByBindingInfo.get(bindingInfo) || null;\n if (stateAddress !== null) {\n return stateAddress;\n }\n if (bindingInfo.statePathInfo.wildcardCount > 0) {\n const listIndex = getListIndexByBindingInfo(bindingInfo);\n if (listIndex === null) {\n raiseError(`Cannot resolve state address for binding with wildcard statePathName \"${bindingInfo.statePathName}\" because list index is null.`);\n }\n stateAddress = createStateAddress(bindingInfo.statePathInfo, listIndex);\n } else {\n stateAddress = createStateAddress(bindingInfo.statePathInfo, null);\n }\n stateAddressByBindingInfo.set(bindingInfo, stateAddress);\n return stateAddress;\n}\n\n// call for change loopContext\nexport function clearStateAddressByBindingInfo(bindingInfo: IBindingInfo) {\n stateAddressByBindingInfo.delete(bindingInfo);\n}","import { IBindingInfo } from \"../types\";\n\n/**\n * イベントハンドラ登録の台帳。\n *\n * 旧実装は Map<string, Set<IBindingInfo>>(文字列キーの強参照 Map)で binding を\n * 保持していたため、binding.node → 行 DOM サブツリー全体が解放不能だった\n * (detach 系はほぼ呼ばれないため、リスト削除後も全イベントバインディングが\n * 永久保持されるリーク。clear-10k 後に 10k 行分の detached DOM が残留していた)。\n *\n * WeakSet(帰属判定・冪等性)と件数カウンタ(「最後の 1 件が外れたらハンドラを\n * 掃除する」判定)に分離し、binding を強参照しない。GC で binding が消えた場合\n * カウンタは減らないが、残るのはキー文字列と数値のみで実害はない。\n */\nexport interface IHandlerBindingRegistry {\n /** binding を key に登録する。新規登録なら true を返す(既登録は冪等に false) */\n add(key: string, binding: IBindingInfo): boolean;\n /** binding を key から外す。key の登録件数が 0 になったら true を返す */\n remove(key: string, binding: IBindingInfo): boolean;\n has(key: string, binding: IBindingInfo): boolean;\n countOf(key: string): number;\n readonly keyCount: number;\n clear(): void;\n}\n\nexport function createHandlerBindingRegistry(): IHandlerBindingRegistry {\n const attachedByKey = new Map<string, WeakSet<IBindingInfo>>();\n const countByKey = new Map<string, number>();\n return {\n add(key: string, binding: IBindingInfo): boolean {\n let attached = attachedByKey.get(key);\n if (typeof attached === \"undefined\") {\n attached = new WeakSet<IBindingInfo>();\n attachedByKey.set(key, attached);\n }\n if (attached.has(binding)) {\n return false;\n }\n attached.add(binding);\n countByKey.set(key, (countByKey.get(key) ?? 0) + 1);\n return true;\n },\n remove(key: string, binding: IBindingInfo): boolean {\n const attached = attachedByKey.get(key);\n if (typeof attached === \"undefined\" || !attached.has(binding)) {\n return false;\n }\n attached.delete(binding);\n const next = (countByKey.get(key) ?? 1) - 1;\n if (next <= 0) {\n attachedByKey.delete(key);\n countByKey.delete(key);\n return true;\n }\n countByKey.set(key, next);\n return false;\n },\n has(key: string, binding: IBindingInfo): boolean {\n return attachedByKey.get(key)?.has(binding) ?? false;\n },\n countOf(key: string): number {\n return countByKey.get(key) ?? 0;\n },\n get keyCount(): number {\n return countByKey.size;\n },\n clear(): void {\n attachedByKey.clear();\n countByKey.clear();\n },\n };\n}\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n let eventName = 'input';\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nconst checkboxEventHandlerFunction = (\n stateName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n) => (event: Event): any => {\n const node = event.target as HTMLInputElement;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n if (node.type !== 'checkbox') {\n console.warn(`[@wcstack/state] event.target is not a checkbox input element.`);\n return;\n }\n const checked = node.checked;\n const newValue = node.value;\n let filteredNewValue: unknown = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n let currentValue = state[statePathName];\n if (Array.isArray(currentValue)) {\n if (checked) {\n if (currentValue.indexOf(filteredNewValue) === -1) {\n state[statePathName] = currentValue.concat(filteredNewValue);\n }\n } else {\n const index = currentValue.indexOf(filteredNewValue);\n if (index !== -1) {\n state[statePathName] = currentValue.toSpliced(index, 1);\n }\n }\n } else {\n if (checked) {\n state[statePathName] = [filteredNewValue];\n } else {\n state[statePathName] = [];\n }\n }\n });\n });\n}\n\nexport function attachCheckboxEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n let checkboxEventHandler = handlerByHandlerKey.get(key);\n if (typeof checkboxEventHandler === \"undefined\") {\n checkboxEventHandler = checkboxEventHandlerFunction(\n binding.stateName,\n binding.statePathName,\n binding.inFilters\n );\n handlerByHandlerKey.set(key, checkboxEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, checkboxEventHandler);\n bindingRegistry.add(key, binding);\n return true;\n }\n return false;\n}\n\nexport function detachCheckboxEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"checkbox\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n const checkboxEventHandler = handlerByHandlerKey.get(key);\n if (typeof checkboxEventHandler === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(eventName, checkboxEventHandler);\n\n if (bindingRegistry.countOf(key) === 0) {\n return false;\n }\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n return true;\n }\n return false;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n getHandlerKey,\n getEventName,\n checkboxEventHandlerFunction,\n};\n","// command-token / event-token が共有する pub/sub プリミティブ。\n// _subscribers は Set のため挿入順を保持する。\n// emit() は subscribe() された順に呼び出され、戻り値配列も同じ順序で返る。\n//\n// 「誰が subscribe し誰が emit するか」だけが command / event の違い:\n// - command-token: element が subscribe / state が emit\n// - event-token: state(`$on`) が subscribe / element(listener) が emit\n\nexport type TokenSubscriber = (...args: unknown[]) => unknown;\n\nexport interface IToken {\n readonly name: string;\n readonly size: number;\n subscribe(fn: TokenSubscriber): () => void;\n unsubscribe(fn: TokenSubscriber): boolean;\n emit(...args: unknown[]): unknown[];\n}\n\nexport class Token implements IToken {\n private _name: string;\n private _subscribers: Set<TokenSubscriber> = new Set();\n\n constructor(name: string) {\n this._name = name;\n }\n\n get name(): string {\n return this._name;\n }\n\n get size(): number {\n return this._subscribers.size;\n }\n\n subscribe(fn: TokenSubscriber): () => void {\n this._subscribers.add(fn);\n return () => {\n this._subscribers.delete(fn);\n };\n }\n\n unsubscribe(fn: TokenSubscriber): boolean {\n return this._subscribers.delete(fn);\n }\n\n emit(...args: unknown[]): unknown[] {\n const results: unknown[] = [];\n for (const fn of this._subscribers) {\n results.push(fn(...args));\n }\n return results;\n }\n}\n","import { devtoolsSink } from \"../devtools/sink\";\nimport { Token } from \"../token/Token\";\n\n// EventToken は共有 pub/sub プリミティブ Token の薄い特化(element→state 方向)。\n// instanceof による型判別を成立させるため独立クラスとして維持する。\n//\n// ownerStateName は devtools 計装(protocol §4.5)のための内部 optional 引数。\n// event-token-protocol の外部仕様は不変更。\nexport class EventToken extends Token {\n private _ownerStateName: string | null;\n\n constructor(name: string, ownerStateName?: string) {\n super(name);\n this._ownerStateName = ownerStateName ?? null;\n }\n\n emit(...args: unknown[]): unknown[] {\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"state:token-emit\",\n kind: \"event\",\n stateName: this._ownerStateName,\n tokenName: this.name,\n args,\n subscriberCount: this.size,\n });\n }\n return super.emit(...args);\n }\n}\n\nexport function isEventToken(value: unknown): value is EventToken {\n return value instanceof EventToken;\n}\n","import { IStateElement } from \"../components/types\";\nimport { EventToken } from \"./EventToken\";\n\nconst registryByStateElement: WeakMap<IStateElement, Map<string, EventToken>> = new WeakMap();\n\nexport function getOrCreateEventToken(stateElement: IStateElement, name: string): EventToken {\n let registry = registryByStateElement.get(stateElement);\n if (typeof registry === \"undefined\") {\n registry = new Map<string, EventToken>();\n registryByStateElement.set(stateElement, registry);\n }\n let token = registry.get(name);\n if (typeof token === \"undefined\") {\n token = new EventToken(name, stateElement.name);\n registry.set(name, token);\n }\n return token;\n}\n\nexport function clearEventTokenRegistry(stateElement: IStateElement): void {\n registryByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n registryByStateElement,\n};\n","/**\n * eventToken.<propertyName>: <eventTokenName> バインディングの attach ハンドラ。\n *\n * command-token の双対(element→state)。要素が dispatch する CustomEvent を受けて\n * event-token を emit し、state 側の `$on` ハンドラ群へ pub/sub で配送する。\n *\n * 設計(MVP スコープ: wc-bindable カスタム要素のみ):\n * - キーは生イベント名ではなく **wcBindable property 名**。実 DOM イベント名は\n * wcBindable.properties[].event から解決する(command-token が wcBindable.commands で\n * 検証するのと対称。コロンを含む namespaced event 名と binding 構文の `:` 衝突も回避)。\n * - <prop> が wcBindable.properties に宣言されていることは attach 時に検証する\n * (要素クラス参照のみで DOM 接続に非依存。fail-fast / typo 耐性)。\n * - <eventTokenName> が $eventTokens に宣言されていることは **発火時** に検証する\n * (state 解決が必要なため。詳細は下記の fire-time 解決の注記を参照)。\n * - subscriber 引数規約は `(state, event, ...listIndexes)`。\n * - modifier `#prevent` / `#stop` は既存イベント binding と同等にサポート。\n *\n * token はイベント発火ごとに registry から解決する(getOrCreateEventToken)。これにより\n * state の再 set で registry が作り直されても最新の subscriber 群へ配送できる。\n *\n * state element の解決と `$eventTokens` 検証は **発火時** に行う(attach 時ではない)。\n * 構造ブロック(for/if)や SSR hydration では、binding 初期化時にノードが detached な\n * DocumentFragment / wrapper 上にあり、その時点では element.getRootNode() から state を\n * 解決できないため。onclick / two-way ハンドラと同じく fire-time 解決に揃えている。\n */\n\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration, ReadBindableResult } from \"../protocol/wcBindableReader\";\nimport { IBindingInfo } from \"../types\";\nimport { getOrCreateEventToken } from \"./eventTokenRegistry\";\n\ninterface IEventTokenListener {\n readonly eventName: string;\n readonly handler: (event: Event) => void;\n}\n\nconst listenerByBinding: WeakMap<IBindingInfo, IEventTokenListener> = new WeakMap();\n\nfunction getWcBindable(element: Element): ReadBindableResult | null {\n const customTagName = getCustomElement(element);\n if (customTagName === null) {\n return null;\n }\n // attach 側で未定義要素は whenDefined 後に再試行するため、ここに来る時点で customClass は定義済み。\n return readBindableDeclaration(element);\n}\n\nexport function attachEventTokenHandler(binding: IBindingInfo): boolean {\n if (binding.propSegments[0] !== \"eventToken\") {\n return false;\n }\n const element = binding.node as Element;\n\n // カスタム要素が未定義なら定義後に再試行(wcBindable が必要なため)。\n const customTagName = getCustomElement(element);\n const registry = getCustomElementRegistry();\n if (customTagName !== null && registry?.get(customTagName) === undefined) {\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${customTagName}>.`);\n }\n return true;\n }\n\n // 再評価で二重 attach しない。\n if (listenerByBinding.has(binding)) {\n return true;\n }\n\n const propertyName = binding.propSegments[1];\n if (typeof propertyName !== \"string\" || propertyName.length === 0) {\n raiseError(`eventToken binding requires a property name (e.g., \"eventToken.error\").`);\n }\n\n const bindable = getWcBindable(element);\n if (bindable === null) {\n raiseError(`eventToken binding requires a wc-bindable custom element. <${element.tagName.toLowerCase()}> is not wc-bindable.`);\n }\n const propDesc = bindable.knownProperties.get(propertyName);\n if (typeof propDesc === \"undefined\") {\n raiseError(`Property \"${propertyName}\" is not declared in wcBindable.properties of <${element.tagName.toLowerCase()}>.`);\n }\n const eventName = propDesc.event;\n\n const tokenName = binding.statePathName;\n const stateName = binding.stateName;\n const modifiers = binding.propModifiers;\n const handler = (event: Event): void => {\n if (modifiers.includes(\"prevent\")) event.preventDefault();\n if (modifiers.includes(\"stop\")) event.stopPropagation();\n\n // state は発火時の live root から解決する(attach 時は detached の可能性があるため)。\n const rootNode = element.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for eventToken handler.`);\n }\n if (!stateElement.eventTokenNames.has(tokenName)) {\n raiseError(`eventToken \"${tokenName}\" is not declared in $eventTokens of state \"${stateName}\".`);\n }\n const loopContext = getLoopContextByNode(element);\n stateElement.createStateAsync(\"writable\", async (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n const indexes = loopContext?.listIndex.indexes ?? [];\n const token = getOrCreateEventToken(stateElement, tokenName);\n return token.emit(state, event, ...indexes);\n });\n });\n };\n\n element.addEventListener(eventName, handler);\n listenerByBinding.set(binding, { eventName, handler });\n return true;\n}\n\nexport function detachEventTokenHandler(binding: IBindingInfo): boolean {\n if (binding.propSegments[0] !== \"eventToken\") {\n return false;\n }\n const listener = listenerByBinding.get(binding);\n if (typeof listener === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(listener.eventName, listener.handler);\n listenerByBinding.delete(binding);\n return true;\n}\n\nexport const __private__ = {\n listenerByBinding,\n};\n","import { devtoolsSink } from \"../devtools/sink\";\nimport { Token } from \"../token/Token\";\nimport { ICommandToken } from \"./types\";\n\n// CommandToken は共有 pub/sub プリミティブ Token の薄い特化。\n// instanceof による型判別を成立させるため独立クラスとして維持する。\n//\n// ownerStateName は devtools 計装(protocol §4.5)のための内部 optional 引数。\n// command-token-protocol の外部仕様は不変更(registry が渡すだけで、\n// subscribe/emit の意味論には一切影響しない)。\nexport class CommandToken extends Token implements ICommandToken {\n private _ownerStateName: string | null;\n\n constructor(name: string, ownerStateName?: string) {\n super(name);\n this._ownerStateName = ownerStateName ?? null;\n }\n\n emit(...args: unknown[]): unknown[] {\n if (devtoolsSink !== null) {\n // subscriberCount 0 の emit(空撃ち)もそのまま流す — whenDefined 前の\n // command 空撃ちレース類をタイムラインで可視化するため\n devtoolsSink({\n type: \"state:token-emit\",\n kind: \"command\",\n stateName: this._ownerStateName,\n tokenName: this.name,\n args,\n subscriberCount: this.size,\n });\n }\n return super.emit(...args);\n }\n}\n\nexport function isCommandToken(value: unknown): value is ICommandToken {\n return value instanceof CommandToken;\n}\n","import { createStateAddress } from \"../address/StateAddress\";\nimport { IPathInfo } from \"../address/types\";\nimport { isCommandToken } from \"../command/CommandToken\";\nimport { ICommandToken } from \"../command/types\";\nimport { STATE_COMMAND_NAMESPACE_NAME } from \"../define\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { getByAddressSymbol, setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\n// onclick: $command.<name> のように、DOM イベントから command token を直接 emit する形式かを判定する。\n// 右辺が $command 名前空間配下のパス($command.<token>)のときに true。\nfunction isCommandTokenPath(statePathName: string): boolean {\n return statePathName.startsWith(STATE_COMMAND_NAMESPACE_NAME + \".\");\n}\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\n\nfunction getHandlerKey(binding: IBindingInfo): string {\n const modifierKey = binding.propModifiers.filter(m => m === 'prevent' || m === 'stop').sort().join(',');\n return `${binding.stateName}::${binding.statePathName}::${modifierKey}`;\n}\n\nconst stateEventHandlerFunction = (\n stateName: string,\n handlerName: string,\n modifiers: string[],\n statePathInfo: IPathInfo\n) => (event: Event): any => {\n if (modifiers.includes('prevent')) event.preventDefault();\n if (modifiers.includes('stop')) event.stopPropagation();\n\n const node = event.target as Element;\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for event handler.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n const isCommand = isCommandTokenPath(handlerName);\n stateElement.createStateAsync(\"writable\", async (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n const indexes = loopContext?.listIndex.indexes ?? [];\n if (isCommand) {\n // command token を解決して emit。引数はハンドラ呼び出しと同じく (event, ...listIndexes) を透過する。\n const token = state[getByAddressSymbol](createStateAddress(statePathInfo, null));\n if (!isCommandToken(token)) {\n raiseError(`Event binding \"${handlerName}\" did not resolve to a CommandToken. Declare the name in $commandTokens and reference it as $command.<name>.`);\n }\n return (token as ICommandToken).emit(event, ...indexes);\n }\n const handler = state[handlerName];\n if (typeof handler !== \"function\") {\n raiseError(`Handler \"${handlerName}\" is not a function on state \"${stateName}\".`);\n }\n return Reflect.apply(handler, state, [event, ...indexes]);\n });\n });\n}\n\nexport function attachEventHandler(binding: IBindingInfo): boolean {\n if (!binding.propName.startsWith(\"on\")) {\n return false;\n }\n const key = getHandlerKey(binding);\n let stateEventHandler = handlerByHandlerKey.get(key);\n if (typeof stateEventHandler === \"undefined\") {\n stateEventHandler = stateEventHandlerFunction(binding.stateName, binding.statePathName, binding.propModifiers, binding.statePathInfo);\n handlerByHandlerKey.set(key, stateEventHandler);\n }\n\n const eventName = binding.propName.slice(2);\n (binding.node as Element).addEventListener(eventName, stateEventHandler);\n\n bindingRegistry.add(key, binding);\n return true;\n}\n\nexport function detachEventHandler(binding: IBindingInfo): boolean {\n if (!binding.propName.startsWith(\"on\")) {\n return false;\n }\n const key = getHandlerKey(binding);\n const stateEventHandler = handlerByHandlerKey.get(key);\n if (typeof stateEventHandler === \"undefined\") {\n return false;\n }\n const eventName = binding.propName.slice(2);\n (binding.node as Element).removeEventListener(eventName, stateEventHandler);\n\n if (bindingRegistry.countOf(key) === 0) {\n return false;\n }\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n return true;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n getHandlerKey,\n};\n\n","import { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.statePathName}::${eventName}::${filterKey}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n let eventName = 'input';\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nconst radioEventHandlerFunction = (\n stateName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n) => (event: Event): any => {\n const node = event.target as HTMLInputElement;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n if (node.type !== 'radio') {\n console.warn(`[@wcstack/state] event.target is not a radio input element.`);\n return;\n }\n if (node.checked === false) {\n return;\n }\n const newValue = node.value;\n let filteredNewValue: unknown = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[statePathName] = filteredNewValue;\n });\n });\n}\n\nexport function attachRadioEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n let radioEventHandler = handlerByHandlerKey.get(key);\n if (typeof radioEventHandler === \"undefined\") {\n radioEventHandler = radioEventHandlerFunction(\n binding.stateName,\n binding.statePathName,\n binding.inFilters\n );\n handlerByHandlerKey.set(key, radioEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, radioEventHandler);\n bindingRegistry.add(key, binding);\n return true;\n }\n return false;\n}\n\nexport function detachRadioEventHandler(binding: IBindingInfo): boolean {\n if (binding.bindingType === \"radio\" && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const key = getHandlerKey(binding, eventName);\n const radioEventHandler = handlerByHandlerKey.get(key);\n if (typeof radioEventHandler === \"undefined\") {\n return false;\n }\n (binding.node as Element).removeEventListener(eventName, radioEventHandler);\n\n if (bindingRegistry.countOf(key) === 0) {\n return false;\n }\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n return true;\n }\n return false;\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n getHandlerKey,\n getEventName,\n radioEventHandlerFunction,\n};\n","import { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\n\nconst CHECK_TYPES = new Set([ 'radio', 'checkbox' ]);\nconst DEFAULT_VALUE_PROP_NAMES = new Set([ 'value', 'valueAsNumber', 'valueAsDate' ]);\n\nexport function isPossibleTwoWay(node: Node, propName: string): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return false;\n }\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n if (tagName === 'input') {\n const inputType = (element.getAttribute('type') || 'text').toLowerCase();\n if (inputType === 'button') {\n return false;\n }\n if (CHECK_TYPES.has(inputType) && propName === 'checked') {\n return true;\n }\n if (DEFAULT_VALUE_PROP_NAMES.has(propName)) {\n return true;\n }\n }\n if (tagName === 'select' && propName === 'value') {\n return true;\n }\n if (tagName === 'textarea' && propName === 'value') {\n return true;\n }\n const customTagName = getCustomElement(element);\n if (customTagName !== null) {\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine if property \"${propName}\" is suitable for two-way binding.`);\n }\n const bindable = readBindableDeclaration(element);\n if (bindable?.knownProperties.has(propName)) {\n return true;\n }\n }\n return false;\n}\n","/**\n * propagation/propagation.ts\n *\n * Phase 3 の因果伝播コア(feature flag `enablePropagationContext` 下)。\n * 依存は types のみの葉モジュールとし、twowayHandler / applyChangeToProperty /\n * setByAddress / updater の計装点から循環 import なしで参照できるようにする。\n *\n * wire 識別は (node × member × stateName × statePathName) で行う。設計書の\n * WriteReceipt は bindingId + generation を持つが、twoway handler は共有\n * handler(handlerByHandlerKey)で binding インスタンスに到達できないため、\n * runtime の edge / receipt 照合キーは wire 単位とする。BindingSession\n * generation との統合(再 attach 後の edge ID 非再利用)は session 側の\n * 計装が揃う段階で bindingGeneration に反映する。\n */\n\nimport { IPropagationContext, IWriteReceipt } from \"./types\";\n\nexport type PropagationEdgeDirection = \"to-element\" | \"to-state\";\n\nlet nextWireId = 1;\nlet nextTransactionId = 1;\nlet nextSynchronousScopeId = 1;\n\n// node を強参照しない wire 台帳。inner key = `${stateName}::${statePathName}::${member}`\nconst wireIdsByNode = new WeakMap<Node, Map<string, number>>();\n\nfunction wireKey(member: string, stateName: string, statePathName: string): string {\n return `${stateName}::${statePathName}::${member}`;\n}\n\n/**\n * wire(配線)の安定 ID を返す。edge ID の基底と receipt の bindingId に使う。\n */\nexport function getWireId(\n node: Node,\n member: string,\n stateName: string,\n statePathName: string,\n): number {\n let byKey = wireIdsByNode.get(node);\n if (typeof byKey === \"undefined\") {\n byKey = new Map();\n wireIdsByNode.set(node, byKey);\n }\n const key = wireKey(member, stateName, statePathName);\n let wireId = byKey.get(key);\n if (typeof wireId === \"undefined\") {\n wireId = nextWireId++;\n byKey.set(key, wireId);\n }\n return wireId;\n}\n\n/** wire × 方向 → edge ID。方向を含めるため再利用されない */\nexport function getEdgeId(wireId: number, direction: PropagationEdgeDirection): number {\n return direction === \"to-element\" ? wireId * 2 : wireId * 2 + 1;\n}\n\nconst EMPTY_EDGES: ReadonlySet<number> = new Set<number>();\n\n/** 外部 event / API update ごとの transaction 開始。current context は変更しない */\nexport function beginPropagationTransaction(originBindingId: number): IPropagationContext {\n return {\n transactionId: nextTransactionId++,\n originBindingId,\n visitedEdges: EMPTY_EDGES,\n hop: 0,\n };\n}\n\n/** edge を 1 つ通過した新しい context を返す(visitedEdges 追加・hop+1) */\nexport function extendPropagationContext(\n context: IPropagationContext,\n edgeId: number,\n): IPropagationContext {\n const visitedEdges = new Set(context.visitedEdges);\n visitedEdges.add(edgeId);\n return {\n transactionId: context.transactionId,\n originBindingId: context.originBindingId,\n visitedEdges,\n hop: context.hop + 1,\n };\n}\n\n// 同期 dynamic scope の current context(updater drain / element 書き込み中に設定)\nlet currentContext: IPropagationContext | null = null;\n\nexport function getCurrentPropagationContext(): IPropagationContext | null {\n return currentContext;\n}\n\nexport function runWithPropagationContext<T>(\n context: IPropagationContext | null,\n callback: () => T,\n): T {\n const previous = currentContext;\n currentContext = context;\n try {\n return callback();\n } finally {\n currentContext = previous;\n }\n}\n\n// WriteReceipt: 同期 scope 限定のスタック。scope 終了時に必ず破棄される\ninterface IActiveWriteReceipt {\n readonly receipt: IWriteReceipt;\n readonly node: Node;\n}\n\nconst receiptStack: IActiveWriteReceipt[] = [];\n\n/**\n * state → element 書き込みを receipt scope で包んで実行する。\n * setter が同期 dispatch する event は matchWriteReceipt でこの receipt を観測できる。\n */\nexport function runWithWriteReceipt<T>(\n node: Node,\n member: string,\n writtenValue: unknown,\n bindingId: number,\n transactionId: number,\n callback: () => T,\n): T {\n const receipt: IWriteReceipt = {\n bindingId,\n bindingGeneration: 0,\n member,\n transactionId,\n synchronousScopeId: nextSynchronousScopeId++,\n writtenValue,\n };\n receiptStack.push({ receipt, node });\n try {\n return callback();\n } finally {\n receiptStack.pop();\n }\n}\n\n/**\n * (node, member) に対する最も内側の active receipt を返す。\n * confirmation / normalization の判定(writtenValue との Object.is 比較)は\n * 呼び出し側が行う。scope 外(非同期に届いた event)では null。\n */\nexport function matchWriteReceipt(node: Node, member: string): IWriteReceipt | null {\n for (let i = receiptStack.length - 1; i >= 0; i--) {\n const active = receiptStack[i];\n if (active.node === node && active.receipt.member === member) {\n return active.receipt;\n }\n }\n return null;\n}\n\n// テスト用\nexport const __private__ = {\n receiptStack,\n};\n","import { isPossibleTwoWay } from \"./isPossibleTwoWay\";\nimport { config } from \"../config\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { beginPropagationTransaction, extendPropagationContext, getCurrentPropagationContext, getEdgeId, getWireId, matchWriteReceipt, runWithPropagationContext } from \"../propagation/propagation\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo, IFilterInfo } from \"../types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { createHandlerBindingRegistry } from \"./handlerBindingRegistry\";\n\nconst handlerByHandlerKey: Map<string, (event: Event) => any> = new Map();\n// binding を強参照しない台帳(handlerBindingRegistry.ts のリーク解説を参照)\nconst bindingRegistry = createHandlerBindingRegistry();\nconst producerValueObserversByNode = new WeakMap<Node, Map<string, Set<(value: unknown) => void>>>();\n\nconst DEFAULT_GETTER = (e: Event) => (e as CustomEvent).detail;\n\nfunction getHandlerKey(binding: IBindingInfo, eventName: string, hasGetter: boolean): string {\n const filterKey = binding.inFilters.map(f => f.filterName + '(' + f.args.join(',') + ')').join('|');\n return `${binding.stateName}::${binding.propName}::${binding.statePathName}::${eventName}::${filterKey}::${hasGetter ? 'g' : 'n'}`;\n}\n\nfunction getEventName(binding: IBindingInfo): string {\n const tagName = (binding.node as Element).tagName.toLowerCase();\n // 1.default event name\n let eventName = (tagName === 'select') ? 'change' : 'input';\n // 2.wcBindable protocol\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined. Cannot determine event name for two-way binding.`);\n }\n const propDesc = readBindableDeclaration(binding.node)?.knownProperties.get(binding.propName);\n if (propDesc) {\n eventName = propDesc.event;\n }\n }\n // 3.modifier\n for(const modifier of binding.propModifiers) {\n if (modifier.startsWith('on')) {\n eventName = modifier.slice(2);\n }\n }\n return eventName;\n}\n\nfunction getValueGetter(binding: IBindingInfo): ((event: Event) => any) | null {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const propDesc = readBindableDeclaration(binding.node)?.knownProperties.get(binding.propName);\n if (propDesc) {\n return propDesc.getter ?? DEFAULT_GETTER;\n }\n }\n return null;\n}\n\nconst twowayEventHandlerFunction = (\n stateName: string,\n propName: string,\n statePathName: string,\n inFilters: IFilterInfo[],\n valueGetter: ((event: Event) => any) | null,\n) => (event: Event): any => {\n const node = event.target as Element;\n if (node === null) {\n console.warn(`[@wcstack/state] event.target is null.`);\n return;\n }\n let newValue: any;\n if (valueGetter !== null) {\n newValue = valueGetter(event);\n } else {\n if (!(propName in node)) {\n console.warn(`[@wcstack/state] Property \"${propName}\" does not exist on target element.`);\n return;\n }\n newValue = (node as any)[propName];\n }\n let filteredNewValue = newValue;\n for(const filter of inFilters) {\n filteredNewValue = filter.filterFn(filteredNewValue);\n }\n const producerObservers = producerValueObserversByNode.get(node)?.get(propName);\n if (typeof producerObservers !== \"undefined\") {\n for (const observer of producerObservers) observer(filteredNewValue);\n }\n\n let propagationContext: ReturnType<typeof getCurrentPropagationContext> = null;\n if (config.enablePropagationContext) {\n // Phase 3: element → state edge の因果判定(設計書 §4)。\n const wireId = getWireId(node, propName, stateName, statePathName);\n const receipt = matchWriteReceipt(node, propName);\n if (receipt !== null && Object.is(receipt.writtenValue, newValue)) {\n // 規則 4: 同じ setter call stack 内で同じ member から Object.is 同値の\n // 通知が戻った場合だけ confirmation として再伝播を抑止する。\n // shadow diagnostic(§8): primitive なら same-value guard も同じ結論に\n // なるため、provenance だけが守っている非 primitive の echo を可視化する。\n if (config.debug) {\n console.debug(`[@wcstack/state] propagation: write confirmation suppressed echo.`, {\n node,\n propName,\n statePathName,\n transactionId: receipt.transactionId,\n coveredBySameValueGuard: config.sameValueGuard\n && (filteredNewValue === null || typeof filteredNewValue !== \"object\"),\n });\n }\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:suppressed\",\n reason: \"confirmation\",\n transactionId: receipt.transactionId,\n edgeId: getEdgeId(wireId, \"to-state\"),\n node,\n member: propName,\n });\n }\n return;\n }\n // receipt があるが値が異なる場合は正規化差分: element の確定値として受理し、\n // 新しい edge を通る変更として継続する(規則 5・decision gate)。\n const toStateEdgeId = getEdgeId(wireId, \"to-state\");\n const baseContext = getCurrentPropagationContext();\n if (baseContext !== null && baseContext.visitedEdges.has(toStateEdgeId)) {\n // 規則 2: 同じ transaction が同じ edge を再度通ろうとした場合だけ抑止\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:suppressed\",\n reason: \"visited-edge\",\n transactionId: baseContext.transactionId,\n edgeId: toStateEdgeId,\n node,\n member: propName,\n });\n }\n return;\n }\n // 規則 1: 外部 event(受け皿の context が無い)なら新しい transaction を開始\n propagationContext = extendPropagationContext(\n baseContext ?? beginPropagationTransaction(wireId),\n toStateEdgeId,\n );\n }\n\n const rootNode = node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for two-way binding.`);\n }\n\n const loopContext = getLoopContextByNode(node);\n const commitToState = (): void => {\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[statePathName] = filteredNewValue;\n });\n });\n };\n if (propagationContext !== null) {\n runWithPropagationContext(propagationContext, commitToState);\n } else {\n commitToState();\n }\n}\n\nexport function addTwowayValueObserver(\n node: Node,\n propName: string,\n observer: (value: unknown) => void,\n): () => void {\n let byProperty = producerValueObserversByNode.get(node);\n if (typeof byProperty === \"undefined\") {\n byProperty = new Map();\n producerValueObserversByNode.set(node, byProperty);\n }\n let observers = byProperty.get(propName);\n if (typeof observers === \"undefined\") {\n observers = new Set();\n byProperty.set(propName, observers);\n }\n observers.add(observer);\n return () => {\n observers?.delete(observer);\n if (observers?.size === 0) byProperty?.delete(propName);\n if (byProperty?.size === 0) producerValueObserversByNode.delete(node);\n };\n}\n\nexport function attachTwowayEventHandler(binding: IBindingInfo): void {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const registry = getCustomElementRegistry();\n const customClass = registry?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${customTagName}>.`);\n }\n return;\n }\n }\n\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const valueGetter = getValueGetter(binding);\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\n let twowayEventHandler = handlerByHandlerKey.get(key);\n if (typeof twowayEventHandler === \"undefined\") {\n twowayEventHandler = twowayEventHandlerFunction(\n binding.stateName,\n binding.propName,\n binding.statePathName,\n binding.inFilters,\n valueGetter\n );\n handlerByHandlerKey.set(key, twowayEventHandler);\n }\n (binding.node as Element).addEventListener(eventName, twowayEventHandler);\n bindingRegistry.add(key, binding);\n }\n}\n\nexport function detachTwowayEventHandler(binding: IBindingInfo): void {\n const customTagName = getCustomElement(binding.node as Element);\n if (customTagName !== null) {\n const registry = getCustomElementRegistry();\n const customClass = registry?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n if (registry === null) {\n return;\n }\n return;\n }\n }\n\n if (isPossibleTwoWay(binding.node, binding.propName) && binding.propModifiers.indexOf('ro') === -1) {\n const eventName = getEventName(binding);\n const valueGetter = getValueGetter(binding);\n const key = getHandlerKey(binding, eventName, valueGetter !== null);\n const twowayEventHandler = handlerByHandlerKey.get(key);\n if (typeof twowayEventHandler === \"undefined\") {\n return;\n }\n (binding.node as Element).removeEventListener(eventName, twowayEventHandler);\n\n if (bindingRegistry.remove(key, binding)) {\n handlerByHandlerKey.delete(key);\n }\n }\n}\n\nexport const __private__ = {\n handlerByHandlerKey,\n bindingRegistry,\n producerValueObserversByNode,\n getHandlerKey,\n getEventName,\n getValueGetter,\n twowayEventHandlerFunction,\n DEFAULT_GETTER,\n};\n","// framework 自身が detach し明示的に解体(deactivate/unmount)したノード。\n// BindingOwner の MutationObserver は削除サブツリー走査でこれらをスキップする。\n//\n// 根拠: 削除時の handleRemovedNode は binding を dispose するだけ(DOM 構造変更も\n// connect-snapshot 依存も無い)で、framework が unmount 経路で既に dispose 済みの\n// content に対しては純粋な冗長走査(forEachInclusive で削除サブツリー全体を歩く)に\n// なる。create(追加)経路は two-way の connect-time snapshot を observer に依存する\n// ため対象外だが、削除は依存が無いため安全に飛ばせる。\n//\n// マークは observer が削除を配送した時点で消費(削除)する。マーク〜配送の間隔は\n// 単一 microtask であり、その間に外部 DOM 変異は割り込めない(framework の drain は\n// 同期)ため、マークは framework 由来の削除にしか一致しない。\nconst observerSkipNodes = new WeakSet<Node>();\n\nexport function markObserverSkipOnRemove(node: Node): void {\n observerSkipNodes.add(node);\n}\n\n// マーク済みなら true を返しつつマークを消費する。未マークなら false。\nexport function consumeObserverSkipOnRemove(node: Node): boolean {\n if (!observerSkipNodes.has(node)) {\n return false;\n }\n observerSkipNodes.delete(node);\n return true;\n}\n\n// framework 自身がマウント(Content.appendTo / mountAfter)したノード。\n// 追加サブツリー走査の実質の仕事は connect-snapshot 待ち(observationPending)の\n// record への配送だけで、record 自体は同期マウント(activateContent → start)で\n// observer flush より先に active 済み。よって待ちがグローバルに 1 つも無ければ\n// 追加側走査も冗長であり丸ごとスキップできる(削除側スキップの対称形)。\n// マーク〜配送が単一 microtask で外部変異が割り込めない前提も削除側と同じ。\nconst observerSkipAddedNodes = new WeakSet<Node>();\n\nexport function markObserverSkipOnAdd(node: Node): void {\n observerSkipAddedNodes.add(node);\n}\n\n// マーク済みなら true を返しつつマークを消費する(削除側と同じ one-shot 契約)。\nexport function consumeObserverSkipOnAdd(node: Node): boolean {\n if (!observerSkipAddedNodes.has(node)) {\n return false;\n }\n observerSkipAddedNodes.delete(node);\n return true;\n}\n\n// connect-snapshot 待ち(two-way sync=connect で未接続のまま activate された record)の\n// グローバル件数。> 0 の間は追加側スキップを無効化して従来走査に戻す。\n// increment は settleInitialRecord、decrement は readProducerSnapshot(消化時)と\n// runTeardowns(未消化のまま終端した record のリーク防止)が担う。\nlet pendingObservationCount = 0;\n\nexport function incrementPendingObservation(): void {\n pendingObservationCount++;\n}\n\nexport function decrementPendingObservation(): void {\n pendingObservationCount--;\n}\n\nexport function hasPendingObservation(): boolean {\n return pendingObservationCount > 0;\n}\n","import { ICustomElementRegistryAdapter } from \"../platform/customElementRegistry\";\n\ninterface IDefinitionWaiter {\n active: boolean;\n readonly resolve: () => void;\n readonly reject: (error: unknown) => void;\n}\n\ninterface IDefinitionEntry {\n readonly waiters: Set<IDefinitionWaiter>;\n}\n\n/**\n * Shares one CustomElementRegistry.whenDefined() continuation per registry/tag.\n * Waiters can be removed independently, so a never-defined tag does not retain\n * binding records or their DOM nodes after teardown.\n */\nexport class DefinitionCoordinator {\n private readonly entries = new Map<string, IDefinitionEntry>();\n\n constructor(private readonly registry: ICustomElementRegistryAdapter) {}\n\n wait(\n tagName: string,\n resolve: () => void,\n reject: (error: unknown) => void = () => undefined,\n ): () => void {\n const normalizedTagName = tagName.toLowerCase();\n let entry = this.entries.get(normalizedTagName);\n if (typeof entry === \"undefined\") {\n entry = { waiters: new Set() };\n this.entries.set(normalizedTagName, entry);\n this.registry.whenDefined(normalizedTagName).then(\n () => this.settle(normalizedTagName, null),\n (error: unknown) => this.settle(normalizedTagName, error),\n );\n }\n\n const waiter: IDefinitionWaiter = { active: true, resolve, reject };\n entry.waiters.add(waiter);\n return () => {\n if (!waiter.active) return;\n waiter.active = false;\n entry?.waiters.delete(waiter);\n };\n }\n\n pendingCount(tagName: string): number {\n return this.entries.get(tagName.toLowerCase())?.waiters.size ?? 0;\n }\n\n private settle(tagName: string, error: unknown): void {\n const entry = this.entries.get(tagName);\n if (typeof entry === \"undefined\") return;\n this.entries.delete(tagName);\n const waiters = Array.from(entry.waiters);\n entry.waiters.clear();\n for (const waiter of waiters) {\n if (!waiter.active) continue;\n waiter.active = false;\n if (error === null) waiter.resolve();\n else waiter.reject(error);\n }\n }\n}\n\nconst coordinatorByRegistry = new WeakMap<ICustomElementRegistryAdapter, DefinitionCoordinator>();\n\nexport function getDefinitionCoordinator(\n registry: ICustomElementRegistryAdapter,\n): DefinitionCoordinator {\n let coordinator = coordinatorByRegistry.get(registry);\n if (typeof coordinator === \"undefined\") {\n coordinator = new DefinitionCoordinator(registry);\n coordinatorByRegistry.set(registry, coordinator);\n }\n return coordinator;\n}\n","import { getStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { config } from \"../config\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { hasByAddressSymbol, setLoopContextSymbol } from \"../proxy/symbols\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\n\nexport type InitialAuthority = \"state\" | \"element\" | \"auto\" | \"none\";\nexport type ResolvedInitialAuthority = Exclude<InitialAuthority, \"auto\">;\nexport type InitialSyncOn = \"call\" | \"connect\";\n\nexport interface IInitialSyncPolicy {\n readonly authority: InitialAuthority;\n readonly syncOn: InitialSyncOn;\n readonly observable: boolean;\n /**\n * wcBindable 宣言が properties のみ(output-only member)であること。\n * authority は初期同期のみを支配する(docs/architecture-hardening/09 §3.6)が、\n * output-only member への state→element 書き込みは初期に限らず契約として\n * 恒久ブロックする。その判定を authority と分離してここに持つ。\n */\n readonly outputOnly: boolean;\n}\n\nfunction readOption(\n binding: IBindingInfo,\n key: \"init\" | \"sync\",\n): string | null {\n let result: string | null = null;\n for (const modifier of binding.propModifiers) {\n const separator = modifier.indexOf(\"=\");\n if (separator < 0) continue;\n const modifierKey = modifier.slice(0, separator).trim();\n const value = modifier.slice(separator + 1).trim();\n if (modifierKey !== \"init\" && modifierKey !== \"sync\") {\n raiseError(`Unknown binding modifier \"${modifierKey}\" in \"${modifier}\".`);\n }\n if (modifierKey !== key) continue;\n if (result !== null) {\n raiseError(`Binding modifier \"${key}\" may only be specified once.`);\n }\n result = value;\n }\n return result;\n}\n\nfunction parseAuthority(value: string | null): InitialAuthority | null {\n if (value === null) return null;\n if (value === \"state\" || value === \"element\" || value === \"auto\" || value === \"none\") {\n return value;\n }\n return raiseError(`Invalid init modifier value \"${value}\".`);\n}\n\nfunction parseSyncOn(value: string | null): InitialSyncOn {\n if (value === null || value === \"call\") return \"call\";\n if (value === \"connect\") return \"connect\";\n return raiseError(`Invalid sync modifier value \"${value}\".`);\n}\n\nexport function hasInitialSyncModifier(binding: IBindingInfo): boolean {\n return binding.propModifiers.some((modifier) => modifier.includes(\"=\"));\n}\n\n// 頻出ポリシー(修飾子なしの通常バインディング)の凍結シングルトン。リスト行では\n// binding ごとに resolveInitialSyncPolicy が走るため、毎回のオブジェクト割り当てを\n// 避ける(record.initialPolicy は読み取り専用でしか使われない)。\nconst STATE_CALL_POLICY: IInitialSyncPolicy = Object.freeze({ authority: \"state\", syncOn: \"call\", observable: false, outputOnly: false });\nconst NONE_CALL_POLICY: IInitialSyncPolicy = Object.freeze({ authority: \"none\", syncOn: \"call\", observable: false, outputOnly: false });\n\nfunction statePolicy(authority: InitialAuthority, syncOn: IInitialSyncPolicy[\"syncOn\"]): IInitialSyncPolicy {\n if (authority === \"state\" && syncOn === \"call\") return STATE_CALL_POLICY;\n return { authority, syncOn, observable: false, outputOnly: false };\n}\n\nexport function resolveInitialSyncPolicy(binding: IBindingInfo): IInitialSyncPolicy {\n if (!config.enableDirectionalInitialSync) {\n if (hasInitialSyncModifier(binding)) {\n raiseError(\"init=/sync= modifiers require enableDirectionalInitialSync.\");\n }\n return STATE_CALL_POLICY;\n }\n\n const explicitAuthority = parseAuthority(readOption(binding, \"init\"));\n const syncOn = parseSyncOn(readOption(binding, \"sync\"));\n if (binding.bindingType === \"event\") {\n if (explicitAuthority !== null && explicitAuthority !== \"none\") {\n raiseError(\"Event bindings only allow init=none.\");\n }\n return syncOn === \"call\" ? NONE_CALL_POLICY : { authority: \"none\", syncOn, observable: false, outputOnly: false };\n }\n // command.<name>: $command.<method> は命令的な command-token 配線。bindingType は\n // \"prop\" だが propName (\"command.<name>\") は wcBindable property ではないため、下の\n // property authority 検証(未宣言なら raiseError)に掛けてはならない。値の初期同期を\n // 持たない配線なので、現行互換の \"state\" authority を返す(command token は従来通り\n // 初期 apply で配線される)。\n if (binding.propSegments[0] === \"command\") {\n return statePolicy(\"state\", syncOn);\n }\n if (binding.bindingType !== \"prop\") {\n if (explicitAuthority !== null && explicitAuthority !== \"state\" && explicitAuthority !== \"none\") {\n raiseError(`Binding type \"${binding.bindingType}\" does not support init=${explicitAuthority}.`);\n }\n return statePolicy(explicitAuthority ?? \"state\", syncOn);\n }\n\n const declaration = readBindableDeclaration(binding.node);\n if (declaration === null) {\n return statePolicy(explicitAuthority ?? \"state\", syncOn);\n }\n const hasOutput = declaration.knownProperties.has(binding.propName);\n const hasInput = declaration.declaredInputs.has(binding.propName);\n if (!hasOutput && !hasInput) {\n raiseError(`Property \"${binding.propName}\" is not declared by wcBindable.`);\n }\n\n const allowed = hasOutput && hasInput\n ? new Set<InitialAuthority>([\"state\", \"element\", \"auto\", \"none\"])\n : hasOutput\n ? new Set<InitialAuthority>([\"element\", \"none\"])\n : new Set<InitialAuthority>([\"state\", \"none\"]);\n const defaultAuthority: InitialAuthority = hasOutput && !hasInput ? \"element\" : \"state\";\n const authority = explicitAuthority ?? defaultAuthority;\n if (!allowed.has(authority)) {\n raiseError(`init=${authority} is incompatible with wcBindable member \"${binding.propName}\".`);\n }\n if (syncOn === \"connect\" && !hasOutput) {\n raiseError(`sync=connect requires observable property \"${binding.propName}\".`);\n }\n return { authority, syncOn, observable: hasOutput, outputOnly: hasOutput && !hasInput };\n}\n\nexport function isBindingStateInitialized(binding: IBindingInfo): boolean {\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n const address = getStateAddressByBindingInfo(binding);\n let initialized = false;\n stateElement.createState(\"readonly\", (state) => {\n initialized = state[hasByAddressSymbol](address);\n });\n return initialized;\n}\n\nexport function resolveInitialAuthority(\n binding: IBindingInfo,\n authority: InitialAuthority,\n): ResolvedInitialAuthority {\n if (authority !== \"auto\") return authority;\n return isBindingStateInitialized(binding) ? \"state\" : \"element\";\n}\n\nexport function commitProducerValue(binding: IBindingInfo, value: unknown): void {\n let filteredValue = value;\n for (const filter of binding.inFilters) {\n filteredValue = filter.filterFn(filteredValue);\n }\n const rootNode = binding.node.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for initial binding sync.`);\n }\n const loopContext = getLoopContextByNode(binding.node);\n stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[binding.statePathName] = filteredValue;\n });\n });\n}\n","import { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { IAbsoluteStateAddress } from \"../address/types\";\nimport { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { IAbsolutePathInfo } from \"../address/types\";\nimport { clearAbsoluteStateAddressByBinding, getAbsoluteStateAddressByBinding, resolveBindingRootNode } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { addBindingByAbsoluteStateAddress, addBindingByPattern, removeBindingByAbsoluteStateAddress, removeBindingByPattern } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { IListIndex } from \"../list/types\";\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { config } from \"../config\";\nimport { detachCheckboxEventHandler, attachCheckboxEventHandler } from \"../event/checkboxHandler\";\nimport { detachEventTokenHandler, attachEventTokenHandler } from \"../event/eventTokenHandler\";\nimport { detachEventHandler, attachEventHandler } from \"../event/handler\";\nimport { detachRadioEventHandler, attachRadioEventHandler } from \"../event/radioHandler\";\nimport { detachTwowayEventHandler, attachTwowayEventHandler, addTwowayValueObserver } from \"../event/twowayHandler\";\nimport { isPossibleTwoWay } from \"../event/isPossibleTwoWay\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry, upgradeCustomElement } from \"../platform/customElementRegistry\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IBindingInfo } from \"../types\";\nimport { consumeObserverSkipOnAdd, consumeObserverSkipOnRemove, decrementPendingObservation, hasPendingObservation, incrementPendingObservation } from \"./observerSkip\";\nimport { DefinitionCoordinator, getDefinitionCoordinator } from \"./DefinitionCoordinator\";\nimport { commitProducerValue, hasInitialSyncModifier, IInitialSyncPolicy, ResolvedInitialAuthority, resolveInitialAuthority, resolveInitialSyncPolicy } from \"./initialSync\";\nimport { replaceToReplaceNode } from \"./replaceToReplaceNode\";\nimport type { IRowPlan } from \"../structural/types\";\n\nexport type BindingPhase =\n | \"discovered\"\n | \"waiting-definition\"\n | \"ready-to-attach\"\n | \"attaching\"\n | \"synchronizing\"\n | \"active\"\n | \"failed\"\n | \"disposed\";\n\nexport interface IBindingRecord {\n readonly id: number;\n readonly info: IBindingInfo;\n readonly generation: number;\n phase: BindingPhase;\n /**\n * 追加の後始末クロージャ(radio/checkbox/observer/定義キャンセル等の希少ケース)。\n * 頻出の後始末(イベント detach・双方向 detach・アドレス台帳解除)はクロージャで\n * なく record のフラグ/フィールドから runTeardowns がデータ駆動で実行するため、\n * 大多数の record では null のまま(行あたり Set×5 + クロージャ×10 の割当を排除)。\n */\n teardowns: Set<() => void> | null;\n}\n\ninterface IBindingOptions {\n registerAddress: boolean;\n registerPathInfo: boolean;\n applyOnReconnect: boolean;\n}\n\ninterface IInternalBindingRecord extends IBindingRecord {\n /**\n * generation はプラン行のプール再利用(record オブジェクト再利用)で更新するため\n * 内部表現では書き込み可能にする(IBindingRecord 公開面は readonly のまま)\n */\n generation: number;\n readonly session: BindingSession;\n readonly anchor: Node;\n readonly options: IBindingOptions;\n address: IAbsoluteStateAddress | null;\n /**\n * パターン索引台帳((absolutePathInfo, listIndex) 2 段キー)への登録。リスト行の\n * binding は address を intern せずこちらに登録する。address とは排他。\n */\n patternPathInfo: IAbsolutePathInfo | null;\n patternListIndex: IListIndex | null;\n pendingDefinitions: number;\n initialPolicy: IInitialSyncPolicy | null;\n resolvedAuthority: ResolvedInitialAuthority | null;\n initialSettled: boolean;\n /**\n * 最初の shouldApplyState 相談(= 初期 state sweep / 初回 render の選別)を\n * 消費済みか。authority は初期同期のみを支配する(09 §3.6)ため、初回相談は\n * authority で答え、以降の定常 apply は output-only 契約と connect-snapshot\n * 未解決だけをブロックする。\n */\n initialApplyDone: boolean;\n /** initialPolicy.outputOnly のミラー(settle 時確定・定常ゲートの分岐を総域にする) */\n outputOnlyMember: boolean;\n observationPending: boolean;\n eventSequence: number;\n hasProducerValue: boolean;\n producerValue: unknown;\n /** attachEventHandler 済み(dispose 時に detachEventHandler をデータ駆動実行) */\n eventAttached: boolean;\n /** attachTwowayEventHandler 済み(dispose 時に detachTwowayEventHandler をデータ駆動実行) */\n twowayAttached: boolean;\n}\n\ninterface IDeferredDefinition {\n readonly node: Node;\n active: boolean;\n cancel: (() => void) | null;\n}\n\ninterface IObservableRoot extends Node {\n contains(other: Node | null): boolean;\n}\n\nlet nextRecordId = 0;\nlet nextGeneration = 0;\n\nconst recordByBinding = new WeakMap<IBindingInfo, IInternalBindingRecord>();\nconst sessionByRoot = new WeakMap<Node, BindingSession>();\n\n// binding の構造キーは不変フィールドのみから決まる。リスト行の初期化では同一 binding に\n// 対し remember() が2回呼ばれる(createContent 内 initializeBindingsByFragment と\n// activateContent の registerAddress 目的の initialize)ため、2度目の文字列生成を避けるべく\n// binding 単位でメモ化する。プロファイル上 bindingKey は create-10k の JS 自己時間で上位。\nconst bindingKeyByBinding = new WeakMap<IBindingInfo, string>();\n\n// node → その node に関心を持つ session(anchor として binding を覚えている、\n// または定義待ちタスクを抱えている)。BindingOwner は mutation で増減した\n// サブツリーを1回だけ走査し、ここに登録された session だけへ per-node 配送する。\n// 全 session ブロードキャストだと、リスト行の逐次 append などで\n// 「session 数 × 変異ノード数」の O(n²) ファンアウトになるため、その正本台帳。\n// 大多数の node は関心 session が1つなので単一値で持ち、2つ目から Set に昇格する。\nconst interestedSessionsByNode = new WeakMap<Node, BindingSession | Set<BindingSession>>();\n\nfunction addInterestedSession(node: Node, session: BindingSession): void {\n const current = interestedSessionsByNode.get(node);\n if (typeof current === \"undefined\") {\n interestedSessionsByNode.set(node, session);\n return;\n }\n if (current === session) return;\n if (current instanceof Set) {\n current.add(session);\n return;\n }\n interestedSessionsByNode.set(node, new Set([current, session]));\n}\n\nfunction forEachInterestedSession(node: Node, callback: (session: BindingSession) => void): void {\n const current = interestedSessionsByNode.get(node);\n if (typeof current === \"undefined\") return;\n if (current instanceof Set) {\n for (const session of Array.from(current)) callback(session);\n return;\n }\n callback(current);\n}\n\nfunction forEachInclusive(root: Node, callback: (node: Node) => void): void {\n callback(root);\n // 葉ノード(fragment 一括挿入時のテキスト・空セル等が大多数)では\n // Array.from(childNodes) の空配列アロケーションを避ける。callback が子を\n // 追加しうるため firstChild は callback 後に判定する(従来と同一意味論)。\n if (root.firstChild === null) return;\n for (const child of Array.from(root.childNodes)) {\n forEachInclusive(child, callback);\n }\n}\n\nfunction isObservableRoot(value: unknown): value is IObservableRoot {\n if (typeof value !== \"object\" || value === null) return false;\n const node = value as Node;\n return node.nodeType === 9 || (node.nodeType === 11 && \"host\" in (node as object));\n}\n\nfunction observableRootFor(node: Node): IObservableRoot | null {\n const root = node.getRootNode();\n return isObservableRoot(root) ? root : null;\n}\n\nclass BindingOwner {\n private readonly observer: MutationObserver | null;\n\n constructor(readonly root: IObservableRoot) {\n const Observer = (globalThis as { MutationObserver?: typeof MutationObserver }).MutationObserver;\n this.observer = typeof Observer === \"function\"\n ? new Observer((mutations) => this.handleMutations(mutations))\n : null;\n this.observer?.observe(root, { childList: true, subtree: true });\n }\n\n private handleMutations(mutations: MutationRecord[]): void {\n const removed: Node[] = [];\n const added: Node[] = [];\n for (const mutation of mutations) {\n removed.push(...Array.from(mutation.removedNodes));\n added.push(...Array.from(mutation.addedNodes));\n }\n // 走査は owner が1回だけ行い、関心 session が居る node だけを配送・contains\n // 検査へ進める。contains は O(木の深さ) なので、関心の無い node で呼ばない。\n const reconnected: IBindingInfo[] = [];\n for (const subtree of removed) {\n // framework が unmount した削除サブツリーは binding を明示 dispose 済みなので\n // observer 側の冗長走査(forEachInclusive で全 node を歩き handleRemovedNode を\n // 呼ぶ)を丸ごとスキップする。clear/大量 delete のホットスポット短縮。\n if (consumeObserverSkipOnRemove(subtree)) continue;\n forEachInclusive(subtree, (node) => {\n forEachInterestedSession(node, (session) => {\n if (this.root.contains(node)) return;\n session.handleRemovedNode(node);\n });\n });\n }\n for (const subtree of added) {\n // framework がマウントしたサブツリーは record が同期 activate 済みで、追加側\n // 走査の実質の仕事は connect-snapshot 待ちへの配送だけ。待ちがグローバルに\n // 無ければ丸ごとスキップする(待ちがあればマークだけ消費して従来走査に戻す)。\n if (consumeObserverSkipOnAdd(subtree) && !hasPendingObservation()) continue;\n forEachInclusive(subtree, (node) => {\n forEachInterestedSession(node, (session) => {\n if (!this.root.contains(node)) return;\n session.handleAddedNode(node, reconnected);\n });\n });\n }\n if (reconnected.length > 0) applyChangeFromBindings(reconnected);\n }\n}\n\nconst ownerByRoot = new WeakMap<IObservableRoot, BindingOwner>();\n\nfunction getBindingOwner(root: IObservableRoot): BindingOwner {\n let owner = ownerByRoot.get(root);\n if (typeof owner === \"undefined\") {\n owner = new BindingOwner(root);\n ownerByRoot.set(root, owner);\n }\n return owner;\n}\n\nfunction bindingKey(binding: IBindingInfo): string {\n const inFilters = binding.inFilters.map((filter) => `${filter.filterName}(${filter.args.join(\",\")})`).join(\"|\");\n const outFilters = binding.outFilters.map((filter) => `${filter.filterName}(${filter.args.join(\",\")})`).join(\"|\");\n return [\n binding.bindingType,\n binding.propName,\n binding.propModifiers.join(\",\"),\n binding.stateName,\n binding.statePathName,\n inFilters,\n outFilters,\n binding.uuid ?? \"\",\n ].join(\"\\u0000\");\n}\n\nfunction addRecordTeardown(record: IInternalBindingRecord, teardown: () => void): void {\n if (record.teardowns === null) {\n record.teardowns = new Set();\n }\n record.teardowns.add(teardown);\n}\n\nexport class BindingSession {\n private readonly records = new Set<IInternalBindingRecord>();\n /**\n * initializeRow で設定される行プラン。非 null のとき activate は\n * スロット整列の高速経路(activatePlanRows)を使う。\n */\n private rowPlan: IRowPlan | null = null;\n // anchor ノードが持つ binding は大多数が 1 本なので単一値で持ち、2 本目から\n // Map(remember 経路のキー照合用)に昇格する(台帳・興味 session と同じ前例)\n private readonly knownBindingsByNode = new WeakMap<Node, IBindingInfo | Map<string, IBindingInfo>>();\n private readonly optionsByBinding = new WeakMap<IBindingInfo, IBindingOptions>();\n private readonly deferredByNode = new WeakMap<Node, Set<IDeferredDefinition>>();\n private readonly deferred = new Set<IDeferredDefinition>();\n\n constructor(root: Node | null = null) {\n if (root !== null) this.observe(root);\n }\n\n /**\n * knownRoot: 呼び出し側が root を確定済みのときの per-binding observe 省略。\n * - undefined: 従来どおり binding ごとに anchor から root を導出して observe\n * - null: detached fragment 上(createContent)の初期化。observableRootFor が\n * 必ず null を返す状況なので observe(= getRootNode)を丸ごと省略する\n * - Node: 呼び出し側で owner 保証済み(activate 経由のみ。initialize へは未使用)\n */\n initialize(\n bindings: readonly IBindingInfo[],\n options: Partial<IBindingOptions> = {},\n knownRoot?: Node | null,\n ): IBindingInfo[] {\n const registerAddress = options.registerAddress ?? true;\n const resolvedOptions: IBindingOptions = {\n registerAddress,\n registerPathInfo: options.registerPathInfo ?? registerAddress,\n applyOnReconnect: options.applyOnReconnect ?? true,\n };\n const initialized: IBindingInfo[] = [];\n for (const candidate of bindings) {\n const binding = this.remember(candidate, resolvedOptions);\n const existing = recordByBinding.get(binding);\n if (typeof existing !== \"undefined\" && existing.phase !== \"disposed\" && existing.phase !== \"failed\") {\n this.observe(existing.anchor);\n if (resolvedOptions.registerAddress && existing.address === null && existing.patternListIndex === null) {\n existing.options.registerAddress = true;\n this.registerAddress(existing);\n }\n if (existing.phase === \"active\") this.settleInitialRecord(existing);\n this.settleConnectedSnapshot(existing);\n continue;\n }\n this.start(binding, resolvedOptions, knownRoot);\n initialized.push(binding);\n }\n return initialized.filter((binding) => this.shouldApplyState(binding));\n }\n\n /**\n * activateContent 専用の再活性化パス。createContent 側の initialize で\n * remember 済みの binding 配列(bindingsByContent がそのまま保持する同一オブジェクト)\n * にだけ使える前提で、remember の再実行(キー照合・options マージ・興味登録)を省き、\n * 必要な仕事だけ行う: 初回活性化はアドレス登録+初期同期、pool 再利用(disposed)は\n * start による再構築、未知の binding は防御的に従来 initialize へ倒す。\n *\n * knownRoot は呼び出し側(applyChangeToFor / applyChangeToIf の apply context)が\n * 確定済みの root。owner(root ごとの MutationObserver)の保証を呼び出しあたり\n * 1 回に集約し、binding ごとの observe(= getRootNode)とアドレス解決の\n * getRootNode を丸ごと省略する。\n */\n activate(bindings: readonly IBindingInfo[], knownRoot: Node): void {\n if (isObservableRoot(knownRoot)) getBindingOwner(knownRoot);\n if (this.rowPlan !== null) {\n this.activatePlanRows(this.rowPlan, bindings, knownRoot);\n return;\n }\n for (const binding of bindings) {\n const record = recordByBinding.get(binding);\n if (typeof record !== \"undefined\" && record.session === this\n && record.phase !== \"disposed\" && record.phase !== \"failed\") {\n if (record.address === null && record.patternListIndex === null) {\n // 初回活性化(owner は冒頭で保証済み)\n record.options.registerAddress = true;\n this.registerAddress(record, knownRoot);\n }\n if (record.phase === \"active\") this.settleInitialRecord(record);\n this.settleConnectedSnapshot(record);\n continue;\n }\n const options = this.optionsByBinding.get(binding);\n if (typeof options === \"undefined\") {\n // この session で remember されていない binding(防御): 従来経路\n this.initialize([binding], { registerAddress: true, registerPathInfo: false, applyOnReconnect: false });\n continue;\n }\n // pool 再利用: record は disposed。活性化要件(アドレス登録)を昇格して再構築\n options.registerAddress = true;\n this.start(binding, options, knownRoot);\n }\n }\n\n shouldApplyState(binding: IBindingInfo): boolean {\n if (!config.enableDirectionalInitialSync) {\n if (hasInitialSyncModifier(binding)) resolveInitialSyncPolicy(binding);\n return true;\n }\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || record.session !== this) return true;\n if (!record.options.registerAddress || record.phase === \"waiting-definition\") return true;\n if (record.phase === \"failed\") return false;\n if (record.phase === \"active\") this.settleInitialRecord(record);\n // authority は初期同期のみを支配する(09 §3.6: init=element は「snapshot を\n // state へ入れる」、init=none は「次の変更から扱う」)。settle 後の最初の相談\n // = 初期 state sweep / 初回 render / deferred initial apply の選別なので\n // authority で答え、ここで初期適用を消費する。\n if (!record.initialApplyDone) {\n record.initialApplyDone = true;\n return record.resolvedAuthority === \"state\";\n }\n if (record.resolvedAuthority === \"state\") return true;\n // 定常: two-way / input member は authority と無関係に state→element を流す。\n // 恒久ブロックは (1) output-only member の契約(書き込み無意味・DCC/router の\n // conformance が依存)と (2) sync=connect の接続 snapshot が未解決の間\n //(初期競合が未決着のうちは state push が element 初期値を潰しうる)だけ。\n return !record.outputOnlyMember && !record.observationPending;\n }\n\n getRecord(binding: IBindingInfo): IBindingRecord | null {\n const record = recordByBinding.get(binding);\n return record?.session === this ? record : null;\n }\n\n addTeardown(binding: IBindingInfo, teardown: () => void): boolean {\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || !this.isAlive(record, record.generation)) {\n return false;\n }\n addRecordTeardown(record, teardown);\n return true;\n }\n\n deferUntilDefined(\n node: Node,\n tagName: string,\n callback: () => void,\n reject: (error: unknown) => void = () => undefined,\n ): () => void {\n const registry = getCustomElementRegistry();\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${tagName}>.`);\n }\n this.observe(node);\n addInterestedSession(node, this);\n const task: IDeferredDefinition = { node, active: true, cancel: null };\n let tasks = this.deferredByNode.get(node);\n if (typeof tasks === \"undefined\") {\n tasks = new Set();\n this.deferredByNode.set(node, tasks);\n }\n tasks.add(task);\n this.deferred.add(task);\n const finish = (): boolean => {\n if (!task.active) return false;\n task.active = false;\n tasks?.delete(task);\n this.deferred.delete(task);\n return true;\n };\n task.cancel = getDefinitionCoordinator(registry).wait(\n tagName,\n () => {\n if (!finish()) return;\n try {\n upgradeCustomElement(registry, node);\n callback();\n } catch (error) {\n reject(error);\n }\n },\n (error) => {\n if (!finish()) return;\n reject(error);\n },\n );\n return () => {\n if (!finish()) return;\n task.cancel?.();\n };\n }\n\n disposeBinding(binding: IBindingInfo): void {\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || record.session !== this) return;\n this.disposeRecord(record);\n }\n\n dispose(): void {\n for (const record of Array.from(this.records)) this.disposeRecord(record);\n for (const task of Array.from(this.deferred)) {\n task.active = false;\n task.cancel?.();\n this.deferred.delete(task);\n this.deferredByNode.get(task.node)?.delete(task);\n }\n }\n\n /**\n * wholesale destroy(全行クリアで teardown を GC に任せる高速経路)を適用して\n * よいか。定義待ち(DefinitionCoordinator の waiter / deferred spread タスク)は\n * 強参照 Map に閉包が残り、connect-snapshot 待ちは pending カウンタが戻らなく\n * なるため、1 つでもあれば従来経路(teardown 実行)に倒す。\n */\n canWholesaleDestroy(): boolean {\n if (this.deferred.size > 0) return false;\n for (const record of this.records) {\n if (record.pendingDefinitions > 0 || record.observationPending) return false;\n }\n return true;\n }\n\n /**\n * 全 record を teardown を走らせずに終端化する(canWholesaleDestroy が true の\n * content 専用)。イベント listener・loopContext・パターン台帳(listIndex キー)は\n * ノード/binding もろとも GC で崩壊する(recordByBinding 以下は全て弱参照)。\n * 例外は null-listIndex の従来台帳(record.address): キーの intern 済み\n * AbsoluteStateAddress が PathInfo キャッシュ経由で生涯生存するため GC で\n * 崩壊せず、共有エントリに残った binding が binding.node 経由で行 DOM 全体を\n * 永久リークする。ここだけ明示除去する(行イベント binding が典型で行あたり\n * 高々数件・Set.delete のみなので wholesale の速度特性は保たれる)。\n * handlerBindingRegistry のカウンタは減らないが、残るのはキー文字列と数値のみで\n * 実害はない設計(handlerBindingRegistry.ts の弱参照化コメント参照)。\n */\n destroyRecords(): void {\n for (const record of this.records) {\n if (record.address !== null) {\n removeBindingByAbsoluteStateAddress(record.address, record.info);\n record.address = null;\n }\n record.phase = \"disposed\";\n record.teardowns = null;\n }\n this.records.clear();\n }\n\n observe(node: Node): void {\n const root = observableRootFor(node);\n if (root === null) return;\n // owner(root ごとの MutationObserver)の存在だけ保証する。session の配送先\n // 登録は node 単位(interestedSessionsByNode)で行い、owner は session を\n // 直接は保持しない。\n getBindingOwner(root);\n }\n\n handleMutations(root: IObservableRoot, removed: readonly Node[], added: readonly Node[]): void {\n for (const subtree of removed) {\n forEachInclusive(subtree, (node) => {\n if (root.contains(node)) return;\n this.handleRemovedNode(node);\n });\n }\n const reconnected: IBindingInfo[] = [];\n for (const subtree of added) {\n forEachInclusive(subtree, (node) => {\n if (!root.contains(node)) return;\n this.handleAddedNode(node, reconnected);\n });\n }\n if (reconnected.length > 0) applyChangeFromBindings(reconnected);\n }\n\n handleRemovedNode(node: Node): void {\n const known = this.knownBindingsByNode.get(node);\n if (typeof known !== \"undefined\") {\n if (known instanceof Map) {\n for (const binding of known.values()) this.disposeBinding(binding);\n } else {\n this.disposeBinding(known);\n }\n }\n const tasks = this.deferredByNode.get(node);\n if (typeof tasks !== \"undefined\") {\n for (const task of Array.from(tasks)) {\n task.active = false;\n task.cancel?.();\n tasks.delete(task);\n this.deferred.delete(task);\n }\n }\n }\n\n handleAddedNode(node: Node, reconnected: IBindingInfo[]): void {\n const known = this.knownBindingsByNode.get(node);\n if (typeof known === \"undefined\") return;\n const bindings = known instanceof Map ? known.values() : [known];\n for (const binding of bindings) {\n const record = recordByBinding.get(binding);\n if (record?.phase === \"active\") {\n this.settleConnectedSnapshot(record);\n continue;\n }\n if (record?.phase !== \"disposed\") continue;\n const options = this.optionsByBinding.get(binding);\n if (typeof options === \"undefined\") continue;\n try {\n this.start(binding, options);\n if (options.applyOnReconnect && this.shouldApplyState(binding)) reconnected.push(binding);\n } catch {\n // Mutation delivery cannot surface initialization errors to a caller.\n }\n }\n }\n\n /**\n * anchor の known 台帳を Map 形へ正規化して返す(remember のキー照合用)。\n * 単一値(プラン行 or 既存単独 binding)は実キーを引いて昇格する。\n */\n private knownMapFor(anchor: Node): Map<string, IBindingInfo> {\n const current = this.knownBindingsByNode.get(anchor);\n if (current instanceof Map) {\n return current;\n }\n const map = new Map<string, IBindingInfo>();\n if (typeof current !== \"undefined\") {\n let key = bindingKeyByBinding.get(current);\n if (typeof key === \"undefined\") {\n key = bindingKey(current);\n bindingKeyByBinding.set(current, key);\n }\n map.set(key, current);\n }\n this.knownBindingsByNode.set(anchor, map);\n return map;\n }\n\n private remember(binding: IBindingInfo, options: IBindingOptions): IBindingInfo {\n const anchor = binding.replaceNode;\n // detached fragment 上でも登録しておく(node 単位の台帳なので root 非依存)。\n // fragment 一括マウントで後から接続された行にも mutation 配送が届くようにする。\n addInterestedSession(anchor, this);\n const known = this.knownMapFor(anchor);\n let key = bindingKeyByBinding.get(binding);\n if (typeof key === \"undefined\") {\n key = bindingKey(binding);\n bindingKeyByBinding.set(binding, key);\n }\n const remembered = known.get(key);\n if (typeof remembered !== \"undefined\") {\n const rememberedOptions = this.optionsByBinding.get(remembered);\n if (typeof rememberedOptions !== \"undefined\") {\n rememberedOptions.registerAddress ||= options.registerAddress;\n rememberedOptions.registerPathInfo ||= options.registerPathInfo;\n rememberedOptions.applyOnReconnect ||= options.applyOnReconnect;\n }\n return remembered;\n }\n known.set(key, binding);\n this.optionsByBinding.set(binding, { ...options });\n return binding;\n }\n\n /**\n * RowPlan 経路の一括初期化(createContent 専用・docs/state-row-instantiation-redesign.md §3-2)。\n * プラン行の binding はこの呼び出しでのみ生成されるため remember(キー照合・\n * options マージ)を丸ごと省略し、policy/authority はテンプレート時に解決済みの\n * 値を焼き込む。options は行内共有の 1 オブジェクト(activate が\n * registerAddress を昇格するとき行内全 binding が同時に昇格する — 従来も\n * activate は全 binding を同順で昇格するため観測可能な差はない)。\n */\n initializeRow(plan: IRowPlan, bindings: readonly IBindingInfo[]): void {\n this.rowPlan = plan;\n const rowOptions: IBindingOptions = { registerAddress: false, registerPathInfo: false, applyOnReconnect: false };\n const slots = plan.slots;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n const slot = slots[i];\n const anchor = binding.replaceNode;\n addInterestedSession(anchor, this);\n this.addKnownRowBinding(anchor, binding, i);\n this.optionsByBinding.set(binding, rowOptions);\n const record: IInternalBindingRecord = {\n id: ++nextRecordId,\n info: binding,\n generation: ++nextGeneration,\n phase: \"active\",\n teardowns: null,\n session: this,\n anchor,\n options: rowOptions,\n address: null,\n patternPathInfo: null,\n patternListIndex: null,\n pendingDefinitions: 0,\n initialPolicy: slot.policy,\n resolvedAuthority: slot.authority,\n initialSettled: true,\n initialApplyDone: false,\n outputOnlyMember: slot.policy.outputOnly,\n observationPending: false,\n eventSequence: 0,\n hasProducerValue: false,\n producerValue: undefined,\n eventAttached: false,\n twowayAttached: false,\n };\n recordByBinding.set(binding, record);\n this.records.add(record);\n if (slot.isEvent) {\n try {\n attachEventHandler(binding);\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n record.eventAttached = true;\n }\n // 非 event スロットはプラン適格性により双方向不能・radio/checkbox 不能・\n // token 配線不能が確定しているため attach 系を一切呼ばない\n }\n }\n\n /**\n * プラン行の活性化(activate の高速経路)。bindings は initializeRow と同一の\n * スロット整列配列(bindingsByContent がそのまま保持)である前提。\n * プラン行の record は policy/authority 解決済み・observable なし・\n * connect-snapshot なしが構造的に保証されているため、settleInitialRecord /\n * settleConnectedSnapshot の呼び出し自体を省略できる。\n * プール再利用(disposed/failed)では record オブジェクトを再利用し、\n * 世代だけ進めて listener attach とアドレス登録をやり直す(record 再割当なし)。\n */\n private activatePlanRows(plan: IRowPlan, bindings: readonly IBindingInfo[], knownRoot: Node): void {\n const slots = plan.slots;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n const record = recordByBinding.get(binding);\n if (typeof record === \"undefined\" || record.session !== this) {\n // この session の record を持たない binding(防御): 従来経路\n this.initialize([binding], { registerAddress: true, registerPathInfo: false, applyOnReconnect: false });\n continue;\n }\n record.options.registerAddress = true;\n if (record.phase === \"disposed\" || record.phase === \"failed\") {\n // pool 再利用: dispose 済み record を initializeRow と同じ内容で再充填\n const slot = slots[i];\n record.generation = ++nextGeneration;\n record.phase = \"active\";\n record.initialPolicy = slot.policy;\n record.resolvedAuthority = slot.authority;\n record.initialSettled = true;\n record.initialApplyDone = false;\n record.outputOnlyMember = slot.policy.outputOnly;\n this.records.add(record);\n if (slot.isEvent) {\n try {\n attachEventHandler(binding);\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n record.eventAttached = true;\n }\n this.registerAddress(record, knownRoot);\n continue;\n }\n if (record.address === null && record.patternListIndex === null) {\n // 初回活性化\n this.registerAddress(record, knownRoot);\n }\n }\n }\n\n private addKnownRowBinding(anchor: Node, binding: IBindingInfo, slotIndex: number): void {\n const current = this.knownBindingsByNode.get(anchor);\n if (typeof current === \"undefined\") {\n this.knownBindingsByNode.set(anchor, binding);\n return;\n }\n // 同一 anchor に複数スロット(複数エントリの data-wcs): Map へ昇格。\n // プラン行はキー照合されないため添字ベースの合成キーで一意性だけ担保する\n if (current instanceof Map) {\n current.set(\"@plan:\" + slotIndex, binding);\n return;\n }\n const map = new Map<string, IBindingInfo>();\n map.set(\"@plan:first\", current);\n map.set(\"@plan:\" + slotIndex, binding);\n this.knownBindingsByNode.set(anchor, map);\n }\n\n private start(binding: IBindingInfo, options: IBindingOptions, knownRoot?: Node | null): void {\n replaceToReplaceNode(binding);\n const recordOptions = this.optionsByBinding.get(binding) ?? { ...options };\n const record: IInternalBindingRecord = {\n id: ++nextRecordId,\n info: binding,\n generation: ++nextGeneration,\n phase: \"discovered\",\n teardowns: null,\n session: this,\n anchor: binding.replaceNode,\n options: recordOptions,\n address: null,\n patternPathInfo: null,\n patternListIndex: null,\n pendingDefinitions: 0,\n initialPolicy: null,\n resolvedAuthority: null,\n initialSettled: false,\n initialApplyDone: false,\n outputOnlyMember: false,\n observationPending: false,\n eventSequence: 0,\n hasProducerValue: false,\n producerValue: undefined,\n eventAttached: false,\n twowayAttached: false,\n };\n recordByBinding.set(binding, record);\n this.records.add(record);\n // knownRoot が渡されたときは observe を省略する(null = detached fragment 上で\n // observableRootFor が必ず null、Node = activate 冒頭で owner 保証済み)\n if (typeof knownRoot === \"undefined\") this.observe(record.anchor);\n\n try {\n record.phase = \"attaching\";\n this.attachListeners(record);\n if (record.options.registerAddress) this.registerAddress(record, knownRoot);\n if (record.pendingDefinitions === 0) record.phase = \"active\";\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n }\n\n private attachListeners(record: IInternalBindingRecord): void {\n const binding = record.info;\n if (attachEventHandler(binding)) {\n record.eventAttached = true;\n return;\n }\n\n if (binding.propSegments[0] === \"eventToken\") {\n this.attachAfterDefinition(record, () => {\n if (attachEventTokenHandler(binding)) {\n addRecordTeardown(record, () => detachEventTokenHandler(binding));\n }\n });\n return;\n }\n\n if (attachRadioEventHandler(binding)) {\n addRecordTeardown(record, () => detachRadioEventHandler(binding));\n }\n if (attachCheckboxEventHandler(binding)) {\n addRecordTeardown(record, () => detachCheckboxEventHandler(binding));\n }\n this.attachAfterDefinition(record, () => {\n // directional initial sync の producer-value observer は twowayEventHandlerFunction\n // からのみ呼ばれる(唯一の consumer)。その handler が attach されるのは\n // isPossibleTwoWay かつ非 ro の binding だけ(attachTwowayEventHandler と同条件)\n // なので、one-way / event / eventToken / radio(非value) 等では observer は決して\n // fire しない。以前は attachListeners 冒頭で全 binding に無条件登録していたが、\n // fire しえない大多数の binding に対する setup 死荷重だった。ここへ移すことで\n // 「twoway handler が付く binding のみ observer 登録」を構造的に保証する\n // (undefined custom element は attachAfterDefinition が定義後まで遅延するので\n // isPossibleTwoWay の未定義 CE raiseError も踏まない)。\n if (\n config.enableDirectionalInitialSync\n && isPossibleTwoWay(binding.node, binding.propName)\n && binding.propModifiers.indexOf(\"ro\") === -1\n ) {\n const removeObserver = addTwowayValueObserver(binding.node, binding.propName, (value) => {\n if (!this.isAlive(record, record.generation)) return;\n record.eventSequence += 1;\n record.hasProducerValue = true;\n record.producerValue = value;\n });\n addRecordTeardown(record, removeObserver);\n }\n attachTwowayEventHandler(binding);\n record.twowayAttached = true;\n });\n }\n\n private attachAfterDefinition(record: IInternalBindingRecord, attach: () => void): void {\n const tagName = getCustomElement(record.info.node);\n if (tagName === null) {\n attach();\n return;\n }\n const registry = getCustomElementRegistry();\n if (registry === null) {\n raiseError(`CustomElementRegistry is unavailable for <${tagName}>.`);\n }\n if (typeof registry.get(tagName) !== \"undefined\") {\n attach();\n return;\n }\n\n record.phase = \"waiting-definition\";\n record.pendingDefinitions += 1;\n const generation = record.generation;\n const coordinator: DefinitionCoordinator = getDefinitionCoordinator(registry);\n const cancel = coordinator.wait(tagName, () => {\n if (!this.isAlive(record, generation)) return;\n try {\n upgradeCustomElement(registry, record.info.node);\n attach();\n record.pendingDefinitions -= 1;\n if (record.pendingDefinitions === 0) {\n record.phase = \"active\";\n this.settleInitialRecord(record);\n }\n } catch {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n }\n }, () => {\n if (!this.isAlive(record, generation)) return;\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n });\n addRecordTeardown(record, cancel);\n }\n\n private settleInitialRecord(record: IInternalBindingRecord): void {\n if (!config.enableDirectionalInitialSync || record.initialSettled || !record.options.registerAddress) return;\n record.phase = \"synchronizing\";\n try {\n const policy = resolveInitialSyncPolicy(record.info);\n const authority = resolveInitialAuthority(record.info, policy.authority);\n record.initialPolicy = policy;\n record.resolvedAuthority = authority;\n record.initialSettled = true;\n record.outputOnlyMember = policy.outputOnly;\n record.phase = \"active\";\n if (!policy.observable) return;\n if (\n policy.syncOn === \"connect\"\n && record.info.node instanceof HTMLElement\n && !record.info.node.isConnected\n ) {\n record.observationPending = true;\n // 待ちが 1 件でもある間は追加側 observer スキップを無効化する\n incrementPendingObservation();\n return;\n }\n this.readProducerSnapshot(record, policy.syncOn === \"call\");\n } catch (error) {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n throw error;\n }\n }\n\n private readProducerSnapshot(record: IInternalBindingRecord, eventWins: boolean): void {\n if (!this.isAlive(record, record.generation)) return;\n const target = record.info.node as Node & Record<string, unknown>;\n const name = record.info.propName;\n if (!(name in target)) return;\n const sequence = record.eventSequence;\n const value = target[name];\n if (record.observationPending) {\n record.observationPending = false;\n decrementPendingObservation();\n }\n if (eventWins && record.eventSequence !== sequence) return;\n record.hasProducerValue = true;\n record.producerValue = value;\n if (record.resolvedAuthority === \"element\") {\n commitProducerValue(record.info, value);\n }\n }\n\n private settleConnectedSnapshot(record: IInternalBindingRecord): void {\n if (\n !config.enableDirectionalInitialSync\n || !record.observationPending\n || !(record.info.node instanceof HTMLElement)\n || !record.info.node.isConnected\n ) return;\n try {\n this.readProducerSnapshot(record, false);\n } catch {\n record.phase = \"failed\";\n this.runTeardowns(record);\n this.records.delete(record);\n }\n }\n\n private registerAddress(record: IInternalBindingRecord, knownRoot?: Node | null): void {\n if (record.address !== null || record.patternListIndex !== null) return;\n const binding = record.info;\n const listIndex = getListIndexByBindingInfo(binding);\n if (listIndex !== null) {\n // リスト行: (absolutePathInfo, listIndex) のパターン台帳に登録し、\n // AbsoluteStateAddress の intern(アドレス割当 + intern 用 WeakMap)を省略する\n const rootNode = resolveBindingRootNode(binding, knownRoot);\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n const absolutePathInfo = getAbsolutePathInfo(stateElement, binding.statePathInfo);\n addBindingByPattern(absolutePathInfo, listIndex, binding);\n record.patternPathInfo = absolutePathInfo;\n record.patternListIndex = listIndex;\n } else {\n const address = getAbsoluteStateAddressByBinding(binding, knownRoot);\n addBindingByAbsoluteStateAddress(address, binding);\n record.address = address;\n }\n // 台帳解除は runTeardowns が record.address / pattern フィールドから\n // データ駆動で行う(クロージャ不要)\n if (!record.options.registerPathInfo) return;\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n if (binding.bindingType !== \"event\") {\n stateElement.setPathInfo(binding.statePathName, binding.bindingType);\n }\n }\n\n private isAlive(record: IInternalBindingRecord, generation: number): boolean {\n return record.generation === generation\n && recordByBinding.get(record.info) === record\n && record.phase !== \"disposed\"\n && record.phase !== \"failed\";\n }\n\n private disposeRecord(record: IInternalBindingRecord): void {\n if (record.phase === \"disposed\") return;\n record.phase = \"disposed\";\n this.runTeardowns(record);\n this.records.delete(record);\n }\n\n private runTeardowns(record: IInternalBindingRecord): void {\n // runTeardowns は record の終端(disposed / failed)でのみ呼ばれる。未消化の\n // connect-snapshot 待ちが残っていれば必ずカウンタを戻す(スキップ再有効化)。\n if (record.observationPending) {\n record.observationPending = false;\n decrementPendingObservation();\n }\n const binding = record.info;\n // データ駆動の後始末(従来はクロージャで積んでいた頻出3種)。実行順は従来の\n // 逆順実行と同じ: アドレス台帳解除(最後に積まれていた)→ 双方向 detach →\n // 希少クロージャ群(逆順)→ イベント detach。各 detach は互いに独立した資源を\n // 対象とするため、この順序で意味論は変わらない。\n if (record.address !== null) {\n try {\n removeBindingByAbsoluteStateAddress(record.address, binding);\n record.address = null;\n clearStateAddressByBindingInfo(binding);\n clearAbsoluteStateAddressByBinding(binding);\n } catch {\n // Cleanup is best-effort; one faulty resource must not retain the rest.\n }\n } else if (record.patternListIndex !== null) {\n try {\n removeBindingByPattern(record.patternPathInfo!, record.patternListIndex, binding);\n record.patternPathInfo = null;\n record.patternListIndex = null;\n // 相対アドレス(getValue)と絶対アドレス(applyChangeToFor / updatedCallback 経由の\n // 遅延 intern)のメモは pattern 登録でも作られうるため対称にクリアする\n clearStateAddressByBindingInfo(binding);\n clearAbsoluteStateAddressByBinding(binding);\n } catch {\n // Cleanup is best-effort.\n }\n }\n if (record.twowayAttached) {\n record.twowayAttached = false;\n try {\n detachTwowayEventHandler(binding);\n } catch {\n // Cleanup is best-effort.\n }\n }\n if (record.teardowns !== null) {\n const teardowns = Array.from(record.teardowns).reverse();\n record.teardowns = null;\n for (const teardown of teardowns) {\n try {\n teardown();\n } catch {\n // Cleanup is best-effort; one faulty resource must not retain the rest.\n }\n }\n }\n if (record.eventAttached) {\n record.eventAttached = false;\n try {\n detachEventHandler(binding);\n } catch {\n // Cleanup is best-effort.\n }\n }\n }\n}\n\nexport function getOrCreateBindingSession(root: Node): BindingSession {\n let session = sessionByRoot.get(root);\n if (typeof session === \"undefined\") {\n session = new BindingSession(root);\n sessionByRoot.set(root, session);\n }\n return session;\n}\n\nexport function getBindingSession(binding: IBindingInfo): BindingSession | null {\n return recordByBinding.get(binding)?.session ?? null;\n}\n","import { IBindingInfo } from \"../types.js\";\n\nexport function replaceToReplaceNode(bindingInfo: IBindingInfo): void {\n const node = bindingInfo.node;\n const replaceNode = bindingInfo.replaceNode;\n if (node === replaceNode) {\n return;\n }\n if (node.parentNode === null) {\n // already replaced\n return;\n }\n node.parentNode.replaceChild(replaceNode, node);\n}\n","import { IStateElement } from \"../components/types\";\n\nconst completeByStateElementByWebComponent = new WeakMap<Element, WeakMap<IStateElement, boolean>>();\n\nexport function markWebComponentAsComplete(webComponent: Element, stateElement: IStateElement): void {\n let completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\n if (!completeByStateElement) {\n completeByStateElement = new WeakMap<IStateElement, boolean>();\n completeByStateElementByWebComponent.set(webComponent, completeByStateElement);\n }\n completeByStateElement.set(stateElement, true);\n}\n\nexport function isWebComponentComplete(webComponent: Element, stateElement: IStateElement): boolean {\n const completeByStateElement = completeByStateElementByWebComponent.get(webComponent);\n if (!completeByStateElement) {\n return false;\n }\n return completeByStateElement.get(stateElement) === true;\n}\n","import { IFilterInfo } from \"../binding/types.js\";\n\nexport function getFilteredValue(value: any, filters: IFilterInfo[]) {\n let filteredValue = value;\n for(const filter of filters) {\n filteredValue = filter.filterFn(filteredValue);\n }\n return filteredValue;\n}\n","import { createEmptyArray } from \"../createEmptyArray\";\nimport { IBindingInfo } from \"../types\";\nimport { getFilteredValue } from \"./getFilteredValue\";\nimport { IApplyContext } from \"./types\";\n\nconst EMPTY_ARRAY = createEmptyArray<unknown>();\n\nexport function applyChangeToCheckbox(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as HTMLInputElement;\n const elementValue = element.value;\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\n const normalizedNewValue = Array.isArray(newValue) ? newValue : EMPTY_ARRAY;\n element.checked = normalizedNewValue.includes(elementFilteredValue);\n}\n","\nexport function createEmptyArray<T>(): Readonly<Array<T>> {\n return Object.freeze<Array<T>>([]);\n}\n","/**\n * command.<methodName>: <commandToken-path> バインディングの適用ハンドラ。\n *\n * subscribe lifecycle:\n * - 同一 binding に同じ token が再評価された場合は no-op。\n * - 異なる token が来た場合は古い subscription を解除し、新しい token に subscribe し直す。\n * 旧解除は新しい binding 妥当性検証(methodName・wcBindable.commands チェック)を\n * 通過した後に行うため、再評価が validation で失敗しても旧購読は温存される(fail-fast)。\n * - element は WeakRef で保持し、subscriber 経由で element を強参照しないようにする。\n * これにより、element が DOM から消えた後に subscriber が token._subscribers に\n * 残っていても element 本体は GC 可能。\n * - emit 時に下記いずれかなら自動で subscription を破棄する(lazy purge):\n * - WeakRef.deref() が undefined(element が既に GC 済み)\n * - element.isConnected が false(DOM から取り外されている)\n *\n * 既知の制約:\n * - emit が来なければ stale subscriber は token に残り続ける(要素が GC されても subscriber 関数自体は残る)。\n * state インスタンスが disconnect されたタイミングで registry ごとクリアされるため、最終的には解放される。\n * element ライフサイクルに直接フックする手段が現状の binding 機構に無いため、能動的な purge は将来課題。\n */\n\nimport { isCommandToken } from \"../command/CommandToken\";\nimport { ICommandToken } from \"../command/types\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration, ReadBindableResult } from \"../protocol/wcBindableReader\";\nimport { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\ninterface ICommandSubscription {\n readonly token: ICommandToken;\n readonly unsubscribe: () => void;\n readonly elementRef: WeakRef<Element>;\n}\n\nconst subscribedBindings: WeakMap<IBindingInfo, ICommandSubscription> = new WeakMap();\n\nfunction getWcBindable(element: Element): ReadBindableResult | null {\n const customTagName = getCustomElement(element);\n if (customTagName === null) {\n return null;\n }\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n raiseError(`Custom element <${customTagName}> is not defined for command binding.`);\n }\n return readBindableDeclaration(element);\n}\n\nexport function applyChangeToCommand(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n if (!isCommandToken(newValue)) {\n raiseError(`command binding requires a CommandToken value (use $command.<tokenName> with a name declared in $commandTokens).`);\n }\n const token = newValue as ICommandToken;\n\n const existing = subscribedBindings.get(binding);\n if (existing && existing.token === token) {\n return;\n }\n\n // 新しい binding 妥当性検証は、旧 subscription を解除する前に通す(fail-fast)。\n const element = binding.node as Element;\n const methodName = binding.propSegments[1];\n if (typeof methodName !== \"string\" || methodName.length === 0) {\n raiseError(`command binding requires a method name (e.g., \"command.fetch\").`);\n }\n\n const bindable = getWcBindable(element);\n if (bindable === null) {\n raiseError(`command binding requires a wc-bindable custom element. <${element.tagName.toLowerCase()}> is not wc-bindable.`);\n }\n if (!bindable.declaredCommands.has(methodName)) {\n raiseError(`Command \"${methodName}\" is not declared in wcBindable.commands of <${element.tagName.toLowerCase()}>.`);\n }\n\n // ここまで来たら旧解除して新 subscribe に切り替える。\n if (existing) {\n existing.unsubscribe();\n subscribedBindings.delete(binding);\n }\n\n const elementRef = new WeakRef(element);\n let unsubscribe: (() => void) | null = null;\n const subscriber = (...args: unknown[]): unknown => {\n const el = elementRef.deref();\n if (!el || !el.isConnected) {\n unsubscribe?.();\n subscribedBindings.delete(binding);\n return undefined;\n }\n const method = (el as unknown as Record<string, unknown>)[methodName];\n if (typeof method !== \"function\") {\n raiseError(`Method \"${methodName}\" is not a function on <${el.tagName.toLowerCase()}>.`);\n }\n return Reflect.apply(method as (...a: unknown[]) => unknown, el, args);\n };\n unsubscribe = token.subscribe(subscriber);\n subscribedBindings.set(binding, { token, unsubscribe, elementRef });\n}\n\nexport const __private__ = {\n subscribedBindings,\n};\n","import { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\n\nconst indexBindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\n\nexport function getIndexBindingsByContent(content: IContent): IBindingInfo[] {\n return indexBindingsByContent.get(content) ?? [];\n}\n\nexport function setIndexBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\n indexBindingsByContent.set(content, bindings);\n}\n","/* v8 ignore file */\nexport {};\n\ndeclare global {\n interface Set<T> {\n difference(other: Set<T>): Set<T>;\n intersection(other: Set<T>): Set<T>;\n }\n}\n\nif (!Set.prototype.difference) {\n Set.prototype.difference = function <T>(this: Set<T>, other: Set<T>): Set<T> {\n const result = new Set(this);\n for (const elem of other) {\n result.delete(elem);\n }\n return result;\n };\n}\n\nif (!Set.prototype.intersection) {\n Set.prototype.intersection = function <T>(this: Set<T>, other: Set<T>): Set<T> {\n const result = new Set<T>();\n for (const elem of other) {\n if (this.has(elem)) {\n result.add(elem);\n }\n }\n return result;\n };\n}\n","\nlet count = 0;\nexport function getUUID(): string {\n return `u${(count++).toString(36)}`;\n}\n","import { getUUID } from \"../getUUID\";\nimport { IListIndex } from \"./types\";\n\nlet version = 0;\n\nclass ListIndex implements IListIndex {\n readonly uuid = getUUID();\n readonly parentListIndex: IListIndex | null;\n readonly position: number;\n readonly length: number;\n\n private _index: number;\n private _version: number;\n private _indexes: number[] | undefined;\n private _listIndexes: WeakRef<IListIndex>[] | undefined;\n\n /**\n * Creates a new ListIndex instance.\n * \n * @param parentListIndex - Parent list index for nested loops, or null for top-level\n * @param index - Current index value in the loop\n */\n constructor(parentListIndex: IListIndex | null, index: number) {\n this.parentListIndex = parentListIndex;\n this.position = parentListIndex ? parentListIndex.position + 1 : 0;\n this.length = this.position + 1;\n this._index = index;\n this._version = version;\n }\n\n /**\n * Gets current index value.\n * \n * @returns Current index number\n */\n get index() {\n return this._index;\n }\n \n /**\n * Sets index value and updates version.\n * \n * @param value - New index value\n */\n set index(value: number) {\n this._index = value;\n this._version = ++version;\n this.indexes[this.position] = value;\n }\n\n /**\n * Gets current version number for change detection.\n * \n * @returns Version number\n */\n get version(): number {\n return this._version;\n }\n\n /**\n * Checks if parent indexes have changed since last access.\n * \n * @returns true if parent has newer version, false otherwise\n */\n get dirty(): boolean {\n if (this.parentListIndex === null) {\n return false;\n } else {\n return this.parentListIndex.dirty || this.parentListIndex.version > this._version;\n }\n }\n\n /**\n * Gets array of all index values from root to current level.\n * Rebuilds array if parent indexes have changed (dirty).\n * \n * @returns Array of index values\n */\n get indexes(): number[] {\n if (this.parentListIndex === null) {\n if (typeof this._indexes === \"undefined\") {\n this._indexes = [this._index];\n }\n } else {\n if (typeof this._indexes === \"undefined\" || this.dirty) {\n this._indexes = [...this.parentListIndex.indexes, this._index];\n this._version = version;\n }\n }\n return this._indexes;\n }\n\n /**\n * Gets array of WeakRef to all ListIndex instances from root to current level.\n * \n * @returns Array of WeakRef<IListIndex>\n */\n get listIndexes(): WeakRef<IListIndex>[] {\n if (this.parentListIndex === null) {\n if (typeof this._listIndexes === \"undefined\") {\n this._listIndexes = [new WeakRef(this)];\n }\n } else {\n if (typeof this._listIndexes === \"undefined\") {\n this._listIndexes = [...this.parentListIndex.listIndexes, new WeakRef(this)];\n }\n }\n return this._listIndexes;\n }\n\n /**\n * Gets variable name for this loop index ($1, $2, etc.).\n * \n * @returns Variable name string\n */\n get varName(): string {\n return `$${this.position + 1}`;\n }\n\n /**\n * Gets ListIndex at specified position in hierarchy.\n * Supports negative indexing from end.\n * \n * @param pos - Position index (0-based, negative for from end)\n * @returns ListIndex at position or null if not found/garbage collected\n */\n at(pos: number): IListIndex | null {\n if (pos >= 0) {\n return this.listIndexes[pos]?.deref() || null;\n } else {\n return this.listIndexes[this.listIndexes.length + pos]?.deref() || null;\n }\n }\n}\n\n/**\n * Factory function to create ListIndex instance.\n * \n * @param parentListIndex - Parent list index for nested loops, or null for top-level\n * @param index - Current index value in the loop\n * @returns New IListIndex instance\n */\nexport function createListIndex(parentListIndex: IListIndex | null, index: number): IListIndex {\n return new ListIndex(parentListIndex, index);\n}\n","import { IListIndex } from \"./types\";\n\nconst listIndexesByList = new WeakMap<readonly unknown[], IListIndex[]>();\n\nexport function getListIndexesByList(list: readonly unknown[]): IListIndex[] | null {\n return listIndexesByList.get(list) || null;\n}\n\nexport function setListIndexesByList(list: readonly unknown[], listIndexes: IListIndex[] | null): void {\n if (listIndexes === null) {\n listIndexesByList.delete(list);\n return;\n }\n listIndexesByList.set(list, listIndexes);\n}","import \"../polyfills\";\nimport { createListIndex } from \"./createListIndex\";\nimport { getListIndexesByList, setListIndexesByList } from \"./listIndexesByList\";\nimport { IListDiff, IListIndex } from \"./types\";\n\nconst listDiffByOldListByNewList = new WeakMap<readonly unknown[], WeakMap<readonly unknown[], IListDiff>>();\n\nconst EMPTY_LIST = Object.freeze([]);\nconst EMPTY_SET = new Set<IListIndex>();\n\nfunction getListDiff(rawOldList: readonly unknown[], rawNewList: readonly unknown[]): IListDiff | null {\n const oldList = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\n const newList = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\n if (!diffByNewList) {\n return null;\n }\n return diffByNewList.get(newList) || null;\n}\n\nfunction setListDiff(oldList: readonly unknown[], newList: readonly unknown[], diff: IListDiff): void {\n let diffByNewList = listDiffByOldListByNewList.get(oldList);\n if (!diffByNewList) {\n diffByNewList = new WeakMap<readonly unknown[], IListDiff>();\n listDiffByOldListByNewList.set(oldList, diffByNewList);\n }\n diffByNewList.set(newList, diff);\n}\n/**\n * Checks if two lists are identical by comparing length and each element.\n * @param oldList - Previous list to compare\n * @param newList - New list to compare\n * @returns True if lists are identical, false otherwise\n */\nfunction isSameList(oldList: readonly unknown[], newList: readonly unknown[]): boolean {\n if (oldList.length !== newList.length) {\n return false;\n }\n\n for (let i = 0; i < oldList.length; i++) {\n if (oldList[i] !== newList[i]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Aligns each list index's .index with its position in the new list.\n * A diff only becomes the rendered state once the updater applies it: an\n * earlier diff in the same batch (two replacements in one microtask) may have\n * moved shared indexes toward a list that never got applied, and a cache hit\n * skips recomputation entirely — so every createListDiff return re-aligns.\n */\nfunction syncListIndexes(newIndexes: IListIndex[]): void {\n for (let i = 0; i < newIndexes.length; i++) {\n if (newIndexes[i].index !== i) {\n newIndexes[i].index = i;\n }\n }\n}\n\n/**\n * Creates or updates list indexes by comparing old and new lists.\n * Optimizes by reusing existing list indexes when values match.\n * @param parentListIndex - Parent list index for nested lists, or null for top-level\n * @param oldList - Previous list (will be normalized to array)\n * @param newList - New list (will be normalized to array)\n * @param oldIndexes - Array of existing list indexes to potentially reuse\n * @returns Array of list indexes for the new list\n */\nexport function createListDiff(\n parentListIndex: IListIndex | null,\n rawOldList: unknown,\n rawNewList: unknown,\n): IListDiff {\n const diff = computeListDiff(parentListIndex, rawOldList, rawNewList);\n syncListIndexes(diff.newIndexes);\n return diff;\n}\n\nfunction computeListDiff(\n parentListIndex: IListIndex | null,\n rawOldList: unknown,\n rawNewList: unknown,\n): IListDiff {\n // Normalize inputs to arrays (handles null/undefined)\n const oldList: readonly unknown[] = (Array.isArray(rawOldList) && rawOldList.length > 0) ? rawOldList : EMPTY_LIST;\n const newList: readonly unknown[] = (Array.isArray(rawNewList) && rawNewList.length > 0) ? rawNewList : EMPTY_LIST;\n const cachedDiff = getListDiff(oldList, newList);\n if (cachedDiff) {\n return cachedDiff;\n }\n const oldIndexes = getListIndexesByList(oldList) || [];\n let retValue: IListDiff | undefined;\n try {\n // Early return for empty list\n if (newList.length === 0) {\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: [] as IListIndex[],\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: new Set<IListIndex>(oldIndexes),\n addIndexSet: EMPTY_SET,\n };\n }\n // If old list was empty, create all new indexes\n let newIndexes: IListIndex[] | null = getListIndexesByList(newList);\n if (oldList.length === 0) {\n if (newIndexes === null) {\n newIndexes = [];\n for(let i = 0; i < newList.length; i++) {\n const newListIndex = createListIndex(parentListIndex, i);\n newIndexes.push(newListIndex);\n }\n }\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: EMPTY_SET,\n addIndexSet: new Set<IListIndex>(newIndexes),\n };\n }\n // If lists are identical, return existing indexes unchanged (optimization)\n if (isSameList(oldList, newList)) {\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: oldIndexes,\n changeIndexSet: EMPTY_SET,\n deleteIndexSet: EMPTY_SET,\n addIndexSet: EMPTY_SET,\n };\n }\n if (newIndexes !== null) {\n return calcDiffIndexes(oldIndexes, newIndexes);\n }\n newIndexes = [];\n\n // Use index-based map for efficiency\n // Supports duplicate values by storing array of indexes\n const indexByValue = new Map<unknown, number[]>();\n for(let i = 0; i < oldList.length; i++) {\n const val = oldList[i];\n let indexes = indexByValue.get(val);\n if (!indexes) {\n indexes = [];\n indexByValue.set(val, indexes);\n }\n indexes.push(i);\n }\n\n // Build new indexes array by matching values with old list\n const changeIndexSet: Set<IListIndex> = new Set();\n const addIndexSet: Set<IListIndex> = new Set();\n for(let i = 0; i < newList.length; i++) {\n const newValue = newList[i];\n const existingIndexes = indexByValue.get(newValue);\n const oldIndex = existingIndexes && existingIndexes.length > 0 ? existingIndexes.shift() : undefined;\n \n if (typeof oldIndex === \"undefined\") {\n // New element\n const newListIndex = createListIndex(parentListIndex, i);\n newIndexes.push(newListIndex);\n addIndexSet.add(newListIndex);\n } else {\n // Reuse existing element\n const existingListIndex = oldIndexes[oldIndex];\n // Judge position change against the old list's order (oldIndexes array\n // order), not the mutable .index — an earlier diff in the same batch\n // may have already moved .index toward a list that was never applied.\n // The .index itself is re-aligned by syncListIndexes on return.\n if (oldIndex !== i) {\n changeIndexSet.add(existingListIndex);\n }\n newIndexes.push(existingListIndex);\n }\n }\n \n const deleteIndexSet: Set<IListIndex> = (new Set(oldIndexes)).difference(new Set(newIndexes));\n return retValue = {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: changeIndexSet,\n deleteIndexSet: deleteIndexSet,\n addIndexSet: addIndexSet,\n };\n } finally {\n if (typeof retValue !== \"undefined\") {\n setListDiff(oldList, newList, retValue);\n setListIndexesByList(newList, retValue.newIndexes);\n }\n }\n}\n\n/**\n * Diff between two lists whose listIndex ledgers both already exist.\n * Rows are joined by listIndex identity — the same key applyChangeToFor and\n * walkDependency consume the result sets with. A value-based join could mark\n * oldIndexes-side objects that are absent from newIndexes (ledgers built along\n * unconnected diff chains hold different objects for the same value); such\n * orphan markers never match the consumers' has() lookups and only pollute\n * the dirty set. Rows without shared identity are represented as add+delete.\n */\nfunction calcDiffIndexes(\n oldIndexes: IListIndex[],\n newIndexes: IListIndex[],\n): IListDiff {\n const newIndexSet: Set<IListIndex> = new Set(newIndexes);\n const oldIndexSet: Set<IListIndex> = new Set(oldIndexes);\n const changeIndexSet: Set<IListIndex> = new Set();\n const addIndexSet: Set<IListIndex> = newIndexSet.difference(oldIndexSet);\n const deleteIndexSet: Set<IListIndex> = oldIndexSet.difference(newIndexSet);\n // Old positions come from the oldIndexes array order (.index may have been\n // mutated by an unapplied diff in the same batch).\n const oldPosByIndex = new Map<IListIndex, number>();\n for (let i = 0; i < oldIndexes.length; i++) {\n oldPosByIndex.set(oldIndexes[i], i);\n }\n for (let i = 0; i < newIndexes.length; i++) {\n const index = newIndexes[i];\n if (addIndexSet.has(index)) {\n continue;\n }\n if (oldPosByIndex.get(index) !== i) {\n // 位置が違うことだけを記録\n changeIndexSet.add(index);\n }\n }\n return {\n oldIndexes: oldIndexes,\n newIndexes: newIndexes,\n changeIndexSet: changeIndexSet,\n deleteIndexSet: deleteIndexSet,\n addIndexSet: addIndexSet,\n };\n}","import { IListDiff, IListIndex } from \"./types\";\n\n/**\n * Indices into `seq` whose values form a longest strictly-increasing\n * subsequence, returned in ascending order. Classic patience-sorting\n * LIS in O(n log n). `seq` values are assumed distinct (old list\n * positions are unique).\n */\nexport function longestIncreasingSubsequence(seq: number[]): number[] {\n const n = seq.length;\n // tails[k] = index into seq of the smallest tail of an increasing\n // subsequence of length k+1; prev[i] = predecessor index to rebuild the chain.\n const tails: number[] = [];\n const prev: number[] = new Array(n).fill(-1);\n for (let i = 0; i < n; i++) {\n const value = seq[i];\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (seq[tails[mid]] < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n if (lo > 0) {\n prev[i] = tails[lo - 1];\n }\n tails[lo] = i;\n }\n const result: number[] = [];\n let k = tails.length > 0 ? tails[tails.length - 1] : -1;\n while (k >= 0) {\n result.push(k);\n k = prev[k];\n }\n result.reverse();\n return result;\n}\n\n/**\n * Determines which reused list indexes can stay where they are when the DOM\n * is brought into the new list order.\n *\n * Returns null when the reused indexes already appear in their old relative\n * order (no inversions) — the caller's existing position guard then performs\n * no moves, so nothing extra is needed. When inversions exist, returns the\n * set of indexes forming a longest increasing subsequence of old positions:\n * leaving exactly those in place and moving every other content yields the\n * correct final order with the fewest content moves (the naive forward walk\n * otherwise cascades: a single swap of rows 2/999 in 1000 rows moves ~997\n * contents instead of 2).\n *\n * Note: IListIndex.index is already mutated to the NEW position by\n * createListDiff, so old positions must come from the oldIndexes array order.\n */\nexport function computeStableIndexSet(diff: IListDiff): ReadonlySet<IListIndex> | null {\n // No reused index changed position, or nothing was reused: relative order\n // is already correct and the walk performs no moves.\n if (diff.changeIndexSet.size === 0 || diff.addIndexSet.size === diff.newIndexes.length) {\n return null;\n }\n const oldPosByIndex = new Map<IListIndex, number>();\n for (let i = 0; i < diff.oldIndexes.length; i++) {\n oldPosByIndex.set(diff.oldIndexes[i], i);\n }\n const reused: IListIndex[] = [];\n const seq: number[] = [];\n let prevPos = -1;\n let sorted = true;\n for (const index of diff.newIndexes) {\n if (diff.addIndexSet.has(index)) {\n continue;\n }\n const pos = oldPosByIndex.get(index);\n if (pos === undefined) {\n // Invariant break (a reused index missing from oldIndexes): fall back\n // to the settle walk rather than compute a stable set from bad data.\n return null;\n }\n if (pos < prevPos) {\n sorted = false;\n }\n prevPos = pos;\n reused.push(index);\n seq.push(pos);\n }\n if (sorted) {\n return null;\n }\n const lis = longestIncreasingSubsequence(seq);\n const stable = new Set<IListIndex>();\n for (const seqIndex of lis) {\n stable.add(reused[seqIndex]);\n }\n return stable;\n}\n","import { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\n\nconst bindingsByContent: WeakMap<IContent, IBindingInfo[]> = new WeakMap();\n\nexport function getBindingsByContent(content: IContent): IBindingInfo[] {\n return bindingsByContent.get(content) ?? [];\n}\n\nexport function setBindingsByContent(content: IContent, bindings: IBindingInfo[]): void {\n bindingsByContent.set(content, bindings);\n}\n","import { IContent } from \"../structural/types\";\nimport type { BindingSession } from \"./BindingSession\";\n\nconst bindingSessionByContent = new WeakMap<IContent, BindingSession>();\n\nexport function getBindingSessionByContent(content: IContent): BindingSession | null {\n return bindingSessionByContent.get(content) ?? null;\n}\n\nexport function setBindingSessionByContent(content: IContent, session: BindingSession): void {\n bindingSessionByContent.set(content, session);\n}\n","import { IContent } from \"../structural/types\";\n\nconst nodesByContent: WeakMap<IContent, Node[]> = new WeakMap();\n\nexport function getNodesByContent(content: IContent): Node[] {\n return nodesByContent.get(content) ?? [];\n}\n\nexport function setNodesByContent(content: IContent, nodes: Node[]): void {\n nodesByContent.set(content, nodes);\n}\n","import { setLoopContextByNode } from \"../list/loopContextByNode\";\nimport { ILoopContext } from \"../list/types\";\nimport { IContent } from \"../structural/types\";\nimport { getNodesByContent } from \"./nodesByContent\";\n\nexport function bindLoopContextToContent(content: IContent, loopContext: ILoopContext | null): void {\n const nodes = getNodesByContent(content);\n for(const node of nodes) {\n setLoopContextByNode(node, loopContext);\n }\n}\n\nexport function unbindLoopContextToContent(content: IContent): void {\n const nodes = getNodesByContent(content);\n for(const node of nodes) {\n setLoopContextByNode(node, null);\n }\n}\n","import { applyChange } from \"../apply/applyChange\";\nimport { IApplyContext } from \"../apply/types\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { addBindingByAbsoluteStateAddress, removeBindingByAbsoluteStateAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { getBindingsByContent } from \"../bindings/bindingsByContent\";\nimport { getBindingSessionByContent } from \"../bindings/bindingSessionByContent\";\nimport { bindLoopContextToContent, unbindLoopContextToContent } from \"../bindings/bindLoopContextToContent\";\nimport { ILoopContext } from \"../list/types\";\nimport { IContent } from \"./types\";\n\nexport function activateContent(\n content: IContent,\n loopContext: ILoopContext | null,\n context: IApplyContext,\n): void {\n bindLoopContextToContent(content, loopContext);\n const bindings = getBindingsByContent(content);\n const session = getBindingSessionByContent(content);\n if (session !== null) {\n // createContent 側の initialize で remember 済みの同一 binding 配列なので、\n // remember を再実行しない専用パスで活性化する(リスト行生成のホットパス)。\n // context.rootNode は applyChangeFromBindings が確定済みの root(fragment\n // バッファ中は setRootNodeByFragment の対応先と同一)で、binding ごとの\n // getRootNode を省略できる\n session.activate(bindings, context.rootNode);\n }\n for (const binding of bindings) {\n if (session === null) {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n addBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n }\n if (session !== null && !session.shouldApplyState(binding)) {\n continue;\n }\n applyChange(binding, context);\n }\n}\n\nexport function deactivateContent(\n content: IContent,\n): void {\n if (!content.mounted) {\n return;\n }\n const bindings = getBindingsByContent(content);\n const session = getBindingSessionByContent(content);\n for (const binding of bindings) {\n if (session !== null) {\n session.disposeBinding(binding);\n } else {\n const absoluteStateAddress = getAbsoluteStateAddressByBinding(binding);\n removeBindingByAbsoluteStateAddress(absoluteStateAddress, binding);\n }\n }\n unbindLoopContextToContent(content);\n}\n","import { createEmptySet } from \"../createEmptySet\";\nimport { IContent } from \"./types\";\n\nconst contentSetByNode = new WeakMap<Node, Set<IContent>>();\n\nconst EMPTY_SET = createEmptySet<IContent>();\n\nexport function setContentByNode(node: Node, content: IContent): void {\n const contents = contentSetByNode.get(node);\n if (contents) {\n contents.add(content);\n } else {\n contentSetByNode.set(node, new Set([content]));\n }\n}\n\nexport function getContentSetByNode(node: Node): Readonly<Set<IContent>> {\n const contents = contentSetByNode.get(node);\n if (typeof contents !== \"undefined\") {\n return contents;\n }\n return EMPTY_SET;\n}\n\nexport function deleteContentByNode(node: Node, content: IContent): void {\n const contents = contentSetByNode.get(node);\n if (contents) {\n contents.delete(content);\n if (contents.size === 0) {\n contentSetByNode.delete(node);\n }\n }\n}","\nexport function createEmptySet<T>(): Readonly<Set<T>> {\n return Object.freeze(new Set<T>());\n}\n","import { clearAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\nimport { clearStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo.js\";\nimport { getBindingsByContent, setBindingsByContent } from \"../bindings/bindingsByContent.js\";\nimport { getBindingSessionByContent, setBindingSessionByContent } from \"../bindings/bindingSessionByContent.js\";\nimport { markNodeRegistered } from \"../bindings/collectNodesAndBindingInfos.js\";\nimport { setIndexBindingsByContent } from \"../bindings/indexBindingsByContent.js\";\nimport { initializeBindingsByFragment, initializeRowBindings } from \"../bindings/initializeBindings.js\";\nimport { resolveInitializedBinding } from \"../bindings/initializeBindingPromiseByNode.js\";\nimport { setNodesByContent } from \"../bindings/nodesByContent.js\";\nimport { markObserverSkipOnAdd, markObserverSkipOnRemove } from \"../bindings/observerSkip.js\";\nimport { config, inSsr } from \"../config.js\";\nimport { INDEX_BY_INDEX_NAME } from \"../define.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { getContentSetByNode, setContentByNode } from \"./contentsByNode.js\";\nimport { getFragmentInfoByUUID } from \"./fragmentInfoByUUID.js\";\nimport { resolveNodePath } from \"./resolveNodePath.js\";\nimport { compileRowPlan } from \"./rowPlan.js\";\nimport { IContent, IFragmentInfo, IRowPlan } from \"./types.js\";\n\nconst recursiveBindingTypes = new Set(['if', 'elseif', 'else', 'for']);\n\nclass Content implements IContent {\n private _content: DocumentFragment;\n private _childNodeArray: Node[] = [];\n private _firstNode: Node | null = null;\n private _lastNode: Node | null = null;\n private _mounted: boolean = false;\n /**\n * 範囲モード。トップレベルに構造ディレクティブを持つ content でのみ true。\n * この content の実レンジは自分の childNodeArray より広い(ネストした\n * if/for が自分のアンカー直後に実ノードを挿すため)ので、移動は\n * firstNode..lastNode の DOM レンジで行う。\n */\n private _ranged: boolean = false;\n constructor(content: DocumentFragment, ranged: boolean = false) {\n this._content = content;\n this._ranged = ranged;\n this._childNodeArray = Array.from(this._content.childNodes);\n this._firstNode = this._childNodeArray.length > 0 ? this._childNodeArray[0] : null;\n this._lastNode = this._childNodeArray.length > 0 ? this._childNodeArray[this._childNodeArray.length - 1] : null;\n }\n\n get firstNode(): Node | null {\n return this._firstNode;\n }\n\n get lastNode(): Node | null {\n return this._lastNode;\n }\n\n get mounted(): boolean {\n return this._mounted;\n }\n\n appendTo(targetNode: Node): void {\n for(const node of this._childNodeArray) {\n // framework 起点のマウントを observer に伝える。中間 fragment へ append する\n // 経路でも、後続の一括 insertBefore(fragment) の mutation record には\n // この top-level node が addedNodes として現れるため、ここでのマークが届く。\n markObserverSkipOnAdd(node);\n targetNode.appendChild(node);\n }\n this._mounted = true;\n }\n\n /**\n * 移動対象ノード列。通常は自分のトップレベルノードそのもの(同一参照を返すので\n * 追加アロケーション無し)。範囲モードでマウント中のときだけ、ネストした構造\n * ディレクティブが挿した実ノードを含む DOM レンジを収集する。\n */\n private _movableNodes(): Node[] {\n if (!this._ranged || !this._mounted) {\n return this._childNodeArray;\n }\n const first = this._firstNode;\n const last = this._lastNode;\n if (first === null || last === null || first.parentNode === null) {\n return this._childNodeArray;\n }\n // 移動でsiblingが変わるため、先に列を確定させてから動かす\n const nodes: Node[] = [];\n for (let node: Node | null = first; node !== null; node = node.nextSibling) {\n nodes.push(node);\n if (node === last) {\n return nodes;\n }\n }\n // last へ到達しない(想定外の不連続)→ 従来どおり自分のノードだけ動かす\n return this._childNodeArray;\n }\n\n mountAfter(targetNode: Node): void {\n const parentNode = targetNode.parentNode;\n if (parentNode) {\n // マウント済み content にも再突入する(if の true→true 再適用・SSR\n // ハイドレーション産 content 等)。固定の nextSibling へ一括 insertBefore\n // すると、マウント済みでは nextSibling が自分の先頭ノードを指すため\n // 先頭ノードが末尾へ回転する。anchor を進めながら位置一致ノードを\n // スキップすることで冪等にする(mutation record も発生させない)。\n let anchor: Node = targetNode;\n for(const node of this._movableNodes()) {\n if (anchor.nextSibling !== node) {\n markObserverSkipOnAdd(node);\n parentNode.insertBefore(node, anchor.nextSibling);\n }\n anchor = node;\n }\n }\n this._mounted = true;\n }\n\n tryDestroy(): boolean {\n const session = getBindingSessionByContent(this);\n // session 無し(SSR ハイドレーション産)や、定義待ち・connect-snapshot 待ちを\n // 抱える content は teardown 省略でリークするため従来経路に倒す。\n if (session === null || !session.canWholesaleDestroy()) {\n return false;\n }\n session.destroyRecords();\n for (const node of this._childNodeArray) {\n // unmount と同じ理由の observer 向け削除マーク(clear の一括削除でも\n // top-level node が mutation record の root に現れる)\n markObserverSkipOnRemove(node);\n if (node.parentNode !== null) {\n node.parentNode.removeChild(node);\n }\n }\n const bindings = getBindingsByContent(this);\n for (const binding of bindings) {\n if (recursiveBindingTypes.has(binding.bindingType)) {\n const contents = getContentSetByNode(binding.node);\n for (const content of contents) {\n if (!content.tryDestroy()) {\n content.unmount();\n }\n }\n }\n }\n this._mounted = false;\n return true;\n }\n\n unmount(): void {\n getBindingSessionByContent(this)?.dispose();\n for(const node of this._childNodeArray) {\n // framework 起点の削除であることを observer に伝える。clear の\n // parentNode.textContent='' 一括削除でも、この top-level node が\n // 削除サブツリーの root として mutation record に現れるため、ここで\n // マークしておけば observer の冗長走査をスキップできる。マークは\n // 同期実行中に立ち、observer は次 microtask で読むので順序は保証される。\n markObserverSkipOnRemove(node);\n if (node.parentNode !== null) {\n node.parentNode.removeChild(node);\n }\n }\n const bindings = getBindingsByContent(this);\n for(const binding of bindings) {\n if (recursiveBindingTypes.has(binding.bindingType)) {\n const contents = getContentSetByNode(binding.node);\n for (const content of contents) {\n content.unmount();\n }\n }\n clearStateAddressByBindingInfo(binding);\n clearAbsoluteStateAddressByBinding(binding);\n }\n this._mounted = false;\n }\n}\n\n/**\n * トップレベルに構造ディレクティブのプレースホルダを持つか。\n *\n * これを持つ content は、ネストした if/for が「自分のアンカー直後」に実ノードを\n * 挿すため、自分の childNodeArray が実レンジより狭くなる。その状態だと\n * (1) 呼び出し側の位置追跡(applyChangeToFor の lastNode)が実ノードの手前で\n * 止まり後続行が割り込む、(2) 移動時にネスト分を置き去りにする、の 2 つが起きる。\n * 該当テンプレートにだけ終端マーカーを持たせて実レンジを閉じる。\n */\nfunction hasTopLevelStructural(fragment: DocumentFragment): boolean {\n // config は setConfig で差し替わりうるので都度組む。テンプレート単位に一度しか\n // 走らない判定なので、この生成コストが行あたりに乗ることはない。\n const structural = new RegExp(\n `^@@(?:${config.commentForPrefix}|${config.commentIfPrefix}`\n + `|${config.commentElseIfPrefix}|${config.commentElsePrefix}):`,\n );\n for (let node = fragment.firstChild; node !== null; node = node.nextSibling) {\n if (node.nodeType !== Node.COMMENT_NODE) {\n continue;\n }\n // Comment の data は常に文字列(textContent の null 分岐を持ち込まない)\n if (structural.test((node as Comment).data)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * 範囲モードの要否をテンプレート単位で一度だけ判定してキャッシュする。\n * 大多数のテンプレート(トップレベルが素の要素)は false を引くだけで、\n * 行ごとの追加コストはゼロ。\n */\nfunction resolveRanged(fragmentInfo: IFragmentInfo): boolean {\n let ranged = fragmentInfo.topLevelStructural;\n if (typeof ranged === 'undefined') {\n ranged = fragmentInfo.topLevelStructural = hasTopLevelStructural(fragmentInfo.fragment);\n }\n return ranged;\n}\n\nconst ROW_END_PREFIX = 'wcs-row-end';\n\n/**\n * 終端マーカーの付与。バインディング初期化の後に足すので nodePath 解決には影響しない\n * (末尾追加なので既存 index もずれない)。SSR 描画中は付けない — SSR は行ごとに\n * `@@wcs-for-start/end` を出力しており、そちらがレンジの正本かつハイドレーション\n * が読む対象なので、余計なコメントを混ぜない。\n */\nfunction appendRowEndMarker(cloneFragment: DocumentFragment, uuid: string): void {\n cloneFragment.appendChild(document.createComment(`${ROW_END_PREFIX}:${uuid}`));\n}\n\n/**\n * SSR ハイドレーション用: 既存の DOM ノード配列から Content を生成する。\n * テンプレートからの clone ではなく、SSR で描画済みのノードをそのまま使う。\n */\nexport function createContentFromNodes(\n nodes: Node[],\n): IContent {\n const fragment = document.createDocumentFragment();\n // ノードを fragment に移動せず、参照だけ持つ Content を作る\n const content = new Content(fragment);\n // Content の内部状態を直接設定\n (content as any)._childNodeArray = nodes;\n (content as any)._firstNode = nodes.length > 0 ? nodes[0] : null;\n (content as any)._lastNode = nodes.length > 0 ? nodes[nodes.length - 1] : null;\n (content as any)._mounted = true; // SSR で既にマウント済み\n return content;\n}\n\n/**\n * RowPlan 経路の実体化: clone → nodePath 解決 → スロットから薄い binding を複製 →\n * initializeRowBindings。パース再生(spread 展開・remember・キー文字列・options\n * オブジェクト・policy 再解決)を行ごとに繰り返さない\n * (docs/state-row-instantiation-redesign.md §3-1/§3-2)。\n */\nfunction createPlanContent(\n bindingInfo: IBindingInfo,\n fragmentInfo: IFragmentInfo,\n plan: IRowPlan,\n): IContent {\n const cloneFragment = document.importNode(fragmentInfo.fragment, true);\n const nodeInfos = fragmentInfo.nodeInfos;\n const nodes: Node[] = new Array(nodeInfos.length);\n for (let i = 0; i < nodeInfos.length; i++) {\n const node = resolveNodePath(cloneFragment, nodeInfos[i].nodePath);\n if (node === null) {\n raiseError(`Node not found by path [${nodeInfos[i].nodePath.join(', ')}] in fragment.`);\n }\n // 再スキャン防止と初期化完了マークは従来経路と同じ台帳に載せる\n markNodeRegistered(node);\n resolveInitializedBinding(node);\n nodes[i] = node;\n }\n const slots = plan.slots;\n const bindings: IBindingInfo[] = new Array(slots.length);\n const indexBindings: IBindingInfo[] = [];\n for (let k = 0; k < slots.length; k++) {\n const slot = slots[k];\n const node = nodes[slot.nodeIndex];\n // text スロットは事前正規化済みの Text がそのまま replaceNode(従来経路の\n // getBindingInfos と同じ帰結)。prop/event は node === replaceNode\n const binding: IBindingInfo = { ...slot.template, node, replaceNode: node };\n bindings[k] = binding;\n if (slot.isIndexBinding) {\n indexBindings.push(binding);\n }\n }\n const session = initializeRowBindings(plan, bindings);\n // プラン経路の content は範囲モードにならない: compileRowPlan は bindingType が\n // text / prop / event のもの以外(= for / if / elseif / else)を含む時点で不適格に\n // するため、プラン適格なフラグメントはトップレベル構造アンカーを持ち得ない。\n const content = new Content(cloneFragment);\n setBindingSessionByContent(content, session);\n setBindingsByContent(content, bindings);\n setIndexBindingsByContent(content, indexBindings);\n setNodesByContent(content, nodes);\n setContentByNode(bindingInfo.node, content);\n return content;\n}\n\nexport function createContent(\n bindingInfo: IBindingInfo,\n): IContent {\n if (typeof bindingInfo.uuid === 'undefined' || bindingInfo.uuid === null) {\n raiseError(`BindingInfo.uuid is null.`);\n }\n const fragmentInfo = getFragmentInfoByUUID(bindingInfo.uuid);\n if (!fragmentInfo) {\n raiseError(`Fragment with UUID \"${bindingInfo.uuid}\" not found.`);\n }\n // SSR 描画中は行ごとの @@wcs-for-start/end がレンジの正本なので終端マーカーは付けない\n const ranged = !inSsr() && resolveRanged(fragmentInfo);\n let plan = fragmentInfo.rowPlan;\n if (typeof plan === 'undefined' || (plan !== null && plan.directional !== config.enableDirectionalInitialSync)) {\n // 初回 or config(directional)が変わったときだけコンパイル。不適格は null を\n // キャッシュして以後は従来経路へ直行する\n plan = fragmentInfo.rowPlan = compileRowPlan(fragmentInfo);\n }\n if (plan !== null) {\n return createPlanContent(bindingInfo, fragmentInfo, plan);\n }\n const cloneFragment = document.importNode(fragmentInfo.fragment, true);\n const initialInfo = initializeBindingsByFragment(cloneFragment, fragmentInfo.nodeInfos);\n if (ranged) {\n // uuid は冒頭のガードで非 null が確定している(raiseError は never を返す)\n appendRowEndMarker(cloneFragment, bindingInfo.uuid);\n }\n const content = new Content(cloneFragment, ranged);\n setBindingSessionByContent(content, initialInfo.bindingSession);\n setBindingsByContent(content, initialInfo.bindingInfos);\n const indexBindings: IBindingInfo[] = [];\n for(const binding of initialInfo.bindingInfos) {\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\n indexBindings.push(binding);\n }\n }\n setIndexBindingsByContent(content, indexBindings);\n setNodesByContent(content, initialInfo.nodes);\n setContentByNode(bindingInfo.node, content);\n return content;\n}\n","import { ILoopContext } from \"../list/types\";\nimport { IBindingInfo } from \"../types\";\nimport {\n collectNodesAndBindingInfos,\n collectNodesAndBindingInfosByFragment,\n IDeferredSpreadEntry,\n processDeferredNode,\n} from \"./collectNodesAndBindingInfos\";\nimport { IFragmentNodeInfo, IRowPlan } from \"../structural/types\";\nimport { setLoopContextByNode } from \"../list/loopContextByNode\";\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { IInitialBindingInfo } from \"./types\";\nimport { BindingSession, getOrCreateBindingSession } from \"./BindingSession\";\n\nfunction scheduleDeferredSpreads(\n deferredSpreads: IDeferredSpreadEntry[],\n parentLoopContext: ILoopContext | null,\n session: BindingSession,\n): void {\n for (const entry of deferredSpreads) {\n session.deferUntilDefined(entry.node, entry.tagName, () => {\n const bindings = processDeferredNode(entry);\n if (bindings.length === 0) return;\n setLoopContextByNode(entry.node, parentLoopContext);\n const initialized = session.initialize(bindings);\n applyChangeFromBindings(initialized);\n }, (error: unknown) => {\n console.error(`[@wcstack/state] deferred spread failed for <${entry.tagName}>.`, error);\n });\n }\n}\n\nexport function initializeBindings(\n root: Document | DocumentFragment | Element,\n parentLoopContext: ILoopContext | null,\n): void {\n const [subscriberNodes, allBindings, deferredSpreads] = collectNodesAndBindingInfos(root);\n const session = getOrCreateBindingSession(root);\n for (const node of subscriberNodes) {\n setLoopContextByNode(node, parentLoopContext);\n }\n const initialized = session.initialize(allBindings);\n applyChangeFromBindings(initialized);\n scheduleDeferredSpreads(deferredSpreads, parentLoopContext, session);\n}\n\nexport function initializeBindingsByFragment(\n root: DocumentFragment,\n nodeInfos: IFragmentNodeInfo[],\n): IInitialBindingInfo {\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfosByFragment(root, nodeInfos);\n const session = new BindingSession();\n // knownRoot=null: detached fragment 上の初期化。observableRootFor が必ず null を\n // 返す(observe は no-op)ため、binding ごとの getRootNode を省略する\n const initialized = session.initialize(allBindings, {\n registerAddress: false,\n applyOnReconnect: false,\n }, null);\n return {\n nodes: subscriberNodes,\n bindingInfos: initialized,\n bindingSession: session,\n };\n}\n\n/**\n * RowPlan 経路の行初期化(createContent 専用)。remember / spread 展開 /\n * shouldApplyState フィルタを経ず、プランのスロットから直接 record を構築する。\n * 返す session は従来経路と同じ活性化(activate)・破棄(dispose/wholesale)\n * インターフェースを持つ。\n */\nexport function initializeRowBindings(plan: IRowPlan, bindings: IBindingInfo[]): BindingSession {\n const session = new BindingSession();\n session.initializeRow(plan, bindings);\n return session;\n}\n","import { IInitialSyncPolicy, resolveInitialSyncPolicy } from \"../bindings/initialSync\";\nimport { config } from \"../config\";\nimport { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { isPossibleTwoWay } from \"../event/isPossibleTwoWay\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { IBindingInfo } from \"../types\";\nimport { resolveNodePath } from \"./resolveNodePath\";\nimport { IFragmentInfo, IRowPlan, IRowPlanSlot } from \"./types\";\n\n/**\n * rowPlan.ts — 行実体化プランのコンパイル(docs/state-row-instantiation-redesign.md §3-1)。\n *\n * テンプレート(fragmentInfo)を初回行生成時に一度だけ検査し、全スロットが\n * 「行不変の判定をテンプレート時に確定できる」種別のときだけプランを返す。\n * 1 スロットでも確定できなければ null(テンプレート丸ごと従来経路 = 部分適用しない。\n * 経路混在のデバッグ困難を避ける設計判断・同 §5)。\n *\n * プラン適格の条件(すべて満たすこと):\n * - bindingType が text / prop / event のみ(構造 for/if・radio/checkbox・spread は不適格)\n * - バインディング先ノードがカスタム要素でない(定義待ち・wcBindable 検証が不要)\n * - prop が command / eventToken 名前空間でない(token 配線 teardown が要るため)\n * - prop が双方向可能(isPossibleTwoWay)でない(connect-snapshot / observer 配線が要るため)\n * - initial-sync policy が観測不要(observable=false)かつ authority が \"auto\" でない\n * - text スロットは事前正規化済みの Text ノードである\n */\nexport function compileRowPlan(fragmentInfo: IFragmentInfo): IRowPlan | null {\n const directional = config.enableDirectionalInitialSync;\n const slots: IRowPlanSlot[] = [];\n const nodeInfos = fragmentInfo.nodeInfos;\n for (let nodeIndex = 0; nodeIndex < nodeInfos.length; nodeIndex++) {\n const nodeInfo = nodeInfos[nodeIndex];\n const node = resolveNodePath(fragmentInfo.fragment, nodeInfo.nodePath);\n if (node === null) {\n return null;\n }\n for (const template of nodeInfo.parseBindTextResults) {\n const bindingType = template.bindingType;\n if (bindingType !== \"text\" && bindingType !== \"prop\" && bindingType !== \"event\") {\n return null;\n }\n // command.<name>(prop 扱い)と eventToken.<prop>(event 扱い)は token 配線の\n // teardown / attach 分岐が要るため不適格\n const namespace = template.propSegments[0];\n if (namespace === \"command\" || namespace === \"eventToken\") {\n return null;\n }\n if (bindingType === \"text\") {\n if (node.nodeType !== Node.TEXT_NODE) {\n return null;\n }\n } else if (getCustomElement(node) !== null) {\n return null;\n }\n if (bindingType === \"prop\" && isPossibleTwoWay(node, template.propName)) {\n return null;\n }\n let policy: IInitialSyncPolicy;\n try {\n // 判定はテンプレートのノードで行う(policy は node の宣言と行不変フィールドの\n // 純関数)。修飾子エラー等の throw は不適格として従来経路に倒し、従来経路が\n // 同じエラーを同じタイミング(初回行生成)で報告する。\n const probe: IBindingInfo = { ...template, node, replaceNode: node };\n policy = resolveInitialSyncPolicy(probe);\n } catch {\n return null;\n }\n if (policy.observable || policy.authority === \"auto\") {\n return null;\n }\n slots.push({\n nodeIndex,\n template,\n isEvent: bindingType === \"event\",\n isIndexBinding: template.statePathName in INDEX_BY_INDEX_NAME,\n policy,\n authority: policy.authority,\n });\n }\n }\n return { directional, slots };\n}\n","import { getPathInfo } from \"../address/PathInfo\";\nimport { createStateAddress } from \"../address/StateAddress\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { getIndexBindingsByContent } from \"../bindings/indexBindingsByContent\";\nimport { inSsr } from \"../config\";\nimport { WILDCARD } from \"../define\";\nimport { createListDiff } from \"../list/createListDiff\";\nimport { getListIndexByBindingInfo } from \"../list/getListIndexByBindingInfo\";\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { computeStableIndexSet } from \"../list/stableListOrder\";\nimport { IListIndex } from \"../list/types\";\nimport { raiseError } from \"../raiseError\";\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\nimport { deleteContentByNode } from \"../structural/contentsByNode\";\nimport { createContent } from \"../structural/createContent\";\nimport { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { applyChange } from \"./applyChange\";\nimport { setRootNodeByFragment } from \"./rootNodeByFragment\";\nimport { IApplyContext } from \"./types\";\n\nconst lastNodeByNode: WeakMap<Node, Node> = new WeakMap();\nconst contentByListIndexByNode: WeakMap<Node, WeakMap<IListIndex, IContent>> = new WeakMap();\nconst pooledContentsByNode: WeakMap<Node, IContent[]> = new WeakMap();\nconst isOnlyNodeInParentContentByNode: WeakMap<Node, boolean> = new WeakMap();\n\n// テスト用ヘルパー(内部状態の操作)\nexport function __test_setContentByListIndex(node: Node, index: IListIndex, content: IContent | null): void {\n setContent(node, index, content);\n}\n\nexport function __test_deleteLastNodeByNode(node: Node): void {\n lastNodeByNode.delete(node);\n}\n\n// SSR ハイドレーション用: Content を ListIndex に登録する\nexport function hydrateSetContent(node: Node, index: IListIndex, content: IContent): void {\n setContent(node, index, content);\n}\n\nexport function hydrateSetLastNode(node: Node, lastNode: Node): void {\n lastNodeByNode.set(node, lastNode);\n}\n\nexport function __test_deleteContentByNode(node: Node): void {\n contentByListIndexByNode.delete(node);\n}\n\nfunction getPooledContents(bindingInfo: IBindingInfo): IContent[] {\n return pooledContentsByNode.get(bindingInfo.node) || [];\n}\n\n// プールの上限(アンカーごと)。プールはアンカー(文書に永続するコメントノード)\n// から content とその DOM サブツリー・バインディング群を強参照するため、無制限だと\n// 大きなリストのクリア後もメモリが解放されない(10k 行で 10MB 級)。上限超過分は\n// contentSetByNode の台帳からも外して GC 可能にする。再追加時は createContent で\n// 作り直すコストと引き換えになる。\nconst MAX_POOLED_CONTENTS = 1000;\nlet maxPooledContents = MAX_POOLED_CONTENTS;\n\n// テスト用: プール上限の変更と現在のプールサイズ取得\nexport function __test_setMaxPooledContents(limit: number): number {\n const prev = maxPooledContents;\n maxPooledContents = limit;\n return prev;\n}\n\nexport function __test_getPooledContentsCount(node: Node): number {\n return (pooledContentsByNode.get(node) || []).length;\n}\n\nfunction setPooledContent(bindingInfo: IBindingInfo, content: IContent): void {\n let contents = pooledContentsByNode.get(bindingInfo.node);\n if (typeof contents === 'undefined') {\n contents = [];\n pooledContentsByNode.set(bindingInfo.node, contents);\n }\n if (contents.length < maxPooledContents) {\n contents.push(content);\n } else {\n // 上限超過: content を完全に手放す。contentSetByNode は createContent 時に\n // 追加されたきり解放経路が無いため、ここで外さないと GC できない。\n deleteContentByNode(bindingInfo.node, content);\n }\n}\n\nfunction isOnlyNodeInParentContent(firstNode: Node, lastNode: Node): boolean {\n let prevCheckNode = firstNode.previousSibling;\n let nextCheckNode = lastNode.nextSibling;\n let onlyNode = true;\n while(prevCheckNode !== null) {\n if (prevCheckNode.nodeType === Node.ELEMENT_NODE \n || (prevCheckNode.nodeType === Node.TEXT_NODE && (prevCheckNode.textContent?.trim() ?? '') !== '')) {\n onlyNode = false;\n break;\n }\n prevCheckNode = prevCheckNode.previousSibling;\n }\n while(nextCheckNode !== null) {\n if (nextCheckNode.nodeType === Node.ELEMENT_NODE \n || (nextCheckNode.nodeType === Node.TEXT_NODE && (nextCheckNode.textContent?.trim() ?? '') !== '')) {\n onlyNode = false;\n break;\n }\n nextCheckNode = nextCheckNode.nextSibling;\n }\n return onlyNode;\n}\n\n// A stable content may be left in place only when its first node verifiably\n// follows the settled walk position in the same tree: the listIndexes ledger\n// can lag the physical DOM (element-write swaps reorder listIndexes without\n// moving nodes; hidden regions unmount contents that stay registered). Empty\n// contents (null firstNode) always take the settle walk so their mount\n// bookkeeping matches the pre-LIS behavior.\nfunction isPhysicallyAfter(lastNode: Node, firstNode: Node | null): boolean {\n if (firstNode === null) {\n return false;\n }\n if (lastNode.nextSibling === firstNode) {\n return true;\n }\n const position = lastNode.compareDocumentPosition(firstNode);\n return (position & Node.DOCUMENT_POSITION_FOLLOWING) !== 0\n && (position & Node.DOCUMENT_POSITION_DISCONNECTED) === 0;\n}\n\nfunction setContent(node: Node, listIndex: IListIndex, content: IContent | null): void {\n let contentByListIndex = contentByListIndexByNode.get(node);\n if (typeof contentByListIndex === 'undefined') {\n if (content === null) {\n return;\n }\n contentByListIndex = new WeakMap<IListIndex, IContent>();\n contentByListIndexByNode.set(node, contentByListIndex);\n }\n if (content === null) {\n contentByListIndex.delete(listIndex);\n } else {\n contentByListIndex.set(listIndex, content);\n }\n}\n\nexport function applyChangeToFor(\n bindingInfo: IBindingInfo, \n context: IApplyContext,\n newValue: unknown, \n): void {\n const listPathInfo = bindingInfo.statePathInfo;\n const listIndex = getListIndexByBindingInfo(bindingInfo);\n const absAddress = getAbsoluteStateAddressByBinding(bindingInfo);\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\n const diff = createListDiff(listIndex, lastValue, newValue);\n context.newListValueByAbsAddress.set(absAddress, Array.isArray(newValue) ? newValue : []);\n\n const fullDelete = Array.isArray(lastValue)\n && lastValue.length === diff.deleteIndexSet.size\n && diff.deleteIndexSet.size > 0;\n if (fullDelete && bindingInfo.node.parentNode !== null) {\n let isOnlyNode = isOnlyNodeInParentContentByNode.get(bindingInfo.node);\n if (typeof isOnlyNode === 'undefined') {\n const lastNode = lastNodeByNode.get(bindingInfo.node) || bindingInfo.node;\n isOnlyNode = isOnlyNodeInParentContent(bindingInfo.node, lastNode);\n isOnlyNodeInParentContentByNode.set(bindingInfo.node, isOnlyNode);\n }\n if (isOnlyNode) {\n const parentNode = bindingInfo.node.parentNode;\n parentNode.textContent = '';\n parentNode.appendChild(bindingInfo.node);\n }\n }\n // 全削除時、プールに収まらない content は再利用されないため、per-binding の\n // teardown(listener 解除・アドレス台帳・loopContext 掃除)を丸ごと省略して\n // ノードごと GC に任せる(tryDestroy)。プール行きの分だけ従来どおり解体する\n // (プール行は binding が生存し続けるため address キャッシュのクリアが必須)。\n // content 台帳の WeakMap ビルトインは V8 プロファイルで本関数の self に計上される\n // ホットスポット: 外側の node→map 解決はループ外に持ち上げ、fullDelete(旧全行が\n // deleteIndexSet に載る=台帳の全エントリが消える)では per-index delete を廃して\n // 台帳ごと 1 回で手放す。\n let contentMap = contentByListIndexByNode.get(bindingInfo.node);\n let poolBudget = fullDelete\n ? maxPooledContents - getPooledContents(bindingInfo).length\n : Number.POSITIVE_INFINITY;\n if (typeof contentMap !== 'undefined') {\n for(const deleteIndex of diff.deleteIndexSet) {\n const content = contentMap.get(deleteIndex);\n if (typeof content !== 'undefined') {\n if (poolBudget <= 0 && content.tryDestroy()) {\n deleteContentByNode(bindingInfo.node, content);\n } else {\n deactivateContent(content);\n content.unmount();\n setPooledContent(bindingInfo, content);\n poolBudget -= 1;\n }\n if (!fullDelete) {\n contentMap.delete(deleteIndex);\n }\n }\n }\n if (fullDelete) {\n contentByListIndexByNode.delete(bindingInfo.node);\n contentMap = undefined;\n }\n }\n\n let lastNode = bindingInfo.node;\n const elementPathInfo = getPathInfo(listPathInfo.path + '.' + WILDCARD);\n const loopContextStack = context.stateElement.loopContextStack;\n // When the new order contains inversions, contents in the stable set (an LIS\n // of old positions) keep their relative order and must not be moved; moving\n // only the rest avoids the cascade where one swap relocates every row in\n // between. null = no inversions; the position guard below then does no moves.\n const stableIndexSet = computeStableIndexSet(diff);\n let fragment: DocumentFragment | null = null;\n if (diff.newIndexes.length == diff.addIndexSet.size \n && diff.newIndexes.length > 0\n && lastNode.isConnected\n ) {\n // 全部追加の場合はまとめて処理\n fragment = document.createDocumentFragment();\n setRootNodeByFragment(fragment, context.rootNode);\n }\n const ssrMode = inSsr();\n const uuid = bindingInfo.uuid ?? '';\n // 追加行ごとの WeakMap 解決を避けるためプール配列も 1 回だけ引く(プールの配列\n // 実体は setPooledContent が一度作ったら不変なので、delete ループ後の参照で安定)\n const pooledContents = pooledContentsByNode.get(bindingInfo.node);\n for(const index of diff.newIndexes) {\n let content: IContent | undefined;\n // add\n if (diff.addIndexSet.has(index)) {\n const stateAddress = createStateAddress(elementPathInfo, index);\n loopContextStack.createLoopContext(stateAddress, (loopContext) => {\n content = typeof pooledContents !== 'undefined' ? pooledContents.pop() : undefined;\n if (typeof content === 'undefined') {\n content = createContent(bindingInfo);\n }\n // コンテント活性化の前にDOMツリーに追加しておく必要がある\n if (fragment !== null) {\n if (ssrMode) {\n fragment.appendChild(document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`));\n }\n content.appendTo(fragment);\n if (ssrMode) {\n fragment.appendChild(document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`));\n }\n } else {\n // Update lastNode for next iteration to ensure correct order\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\n if (lastNode.nextSibling !== content.firstNode) {\n if (ssrMode) {\n const startComment = document.createComment(`@@wcs-for-start:${uuid}:${listPathInfo.path}:${index.index}`);\n lastNode.parentNode!.insertBefore(startComment, lastNode.nextSibling);\n lastNode = startComment;\n }\n content.mountAfter(lastNode);\n }\n if (ssrMode) {\n const endComment = document.createComment(`@@wcs-for-end:${uuid}:${listPathInfo.path}:${index.index}`);\n const afterNode = content.lastNode ?? lastNode;\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\n }\n }\n // コンテントを活性化\n activateContent(content, loopContext, context);\n });\n if (typeof content === 'undefined') {\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\n }\n } else {\n // getContent 相当(undefined→null 正規化は後段の raiseError 判定が null 比較のため維持)\n content = (typeof contentMap !== 'undefined' ? contentMap.get(index) ?? null : null)!;\n if (diff.changeIndexSet.has(index)) {\n // change\n const indexBindings = getIndexBindingsByContent(content);\n for(const indexBinding of indexBindings) {\n applyChange(indexBinding, context);\n }\n }\n // Update lastNode for next iteration to ensure correct order\n // Ensure content is in correct position (e.g. if previous siblings were deleted/moved)\n if (content === null) {\n raiseError(`Content not found for ListIndex: ${index.index} at path \"${listPathInfo.path}\"`);\n }\n // Stable contents are already in correct relative order — but only\n // trust that after physical verification (see isPhysicallyAfter).\n // Contents out of order (and everything unverifiable) settle via the\n // self-healing mountAfter walk below.\n const stable = stableIndexSet !== null && stableIndexSet.has(index)\n && isPhysicallyAfter(lastNode, content.firstNode);\n if (!stable && lastNode.nextSibling !== content.firstNode) {\n content.mountAfter(lastNode);\n }\n }\n lastNode = content.lastNode || lastNode;\n if (typeof contentMap === 'undefined') {\n contentMap = new WeakMap<IListIndex, IContent>();\n contentByListIndexByNode.set(bindingInfo.node, contentMap);\n }\n contentMap.set(index, content);\n }\n lastNodeByNode.set(bindingInfo.node, lastNode);\n if (fragment !== null) {\n // Mount all at once\n bindingInfo.node.parentNode!.insertBefore(fragment, bindingInfo.node.nextSibling);\n setRootNodeByFragment(fragment, null);\n }\n}\n","import { config, inSsr } from \"../config\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { activateContent, deactivateContent } from \"../structural/activateContent\";\nimport { getContentSetByNode } from \"../structural/contentsByNode\";\nimport { createContent } from \"../structural/createContent\";\nimport { IContent } from \"../structural/types\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nfunction bindingInfoText(bindingInfo: IBindingInfo): string {\n return `${bindingInfo.bindingType} ${bindingInfo.statePathName} ${bindingInfo.outFilters.map(f => f.filterName).join('|')} ${bindingInfo.node.isConnected ? '(connected)' : '(disconnected)'}`;\n}\n\nexport function applyChangeToIf(\n bindingInfo: IBindingInfo,\n context: IApplyContext,\n rawNewValue: unknown,\n): void {\n const newValue = Boolean(rawNewValue);\n let content: IContent | undefined;\n const contents = getContentSetByNode(bindingInfo.node);\n if (contents.size === 0) {\n content = createContent(bindingInfo);\n } else {\n content = contents.values().next().value!;\n }\n const ssrMode = inSsr();\n const uuid = bindingInfo.uuid ?? '';\n const keyword = bindingInfo.bindingType; // if, elseif, else\n if (!newValue) {\n if (config.debug) {\n console.log(`unmount if content : ${bindingInfoText(bindingInfo)}`);\n }\n deactivateContent(content);\n content.unmount();\n }\n if (newValue) {\n if (config.debug) {\n console.log(`mount if content : ${bindingInfoText(bindingInfo)}`);\n }\n if (ssrMode) {\n const startComment = document.createComment(`@@wcs-${keyword}-start:${uuid}:${bindingInfo.statePathName}`);\n bindingInfo.node.parentNode!.insertBefore(startComment, bindingInfo.node.nextSibling);\n content.mountAfter(startComment);\n const endComment = document.createComment(`@@wcs-${keyword}-end:${uuid}:${bindingInfo.statePathName}`);\n const afterNode = content.lastNode ?? startComment;\n afterNode.parentNode!.insertBefore(endComment, afterNode.nextSibling);\n } else {\n content.mountAfter(bindingInfo.node);\n }\n const loopContext = getLoopContextByNode(bindingInfo.node);\n activateContent(content, loopContext, context);\n }\n}\n\n","/**\n * SSR 時に HTML 属性で表現できないプロパティバインディングを蓄積するストア。\n * ハイドレーション時にクライアント側で復元する。\n */\n\nexport interface ISsrPropertyEntry {\n propName: string;\n value: unknown;\n}\n\n// node → プロパティエントリのリスト\nconst store: WeakMap<Node, ISsrPropertyEntry[]> = new WeakMap();\n\nexport function addSsrProperty(node: Node, propName: string, value: unknown): void {\n let entries = store.get(node);\n if (!entries) {\n entries = [];\n store.set(node, entries);\n }\n // 同じプロパティの既存エントリは上書き\n const existing = entries.find(e => e.propName === propName);\n if (existing) {\n existing.value = value;\n } else {\n entries.push({ propName, value });\n }\n}\n\nexport function getSsrProperties(node: Node): ISsrPropertyEntry[] {\n return store.get(node) ?? [];\n}\n\nexport function getAllSsrPropertyNodes(): Node[] {\n // WeakMap は列挙不可なので、別途トラッキングが必要\n return Array.from(trackedNodes);\n}\n\nconst trackedNodes: Set<Node> = new Set();\n\nexport function trackSsrPropertyNode(node: Node): void {\n trackedNodes.add(node);\n}\n\nexport function clearSsrPropertyStore(): void {\n trackedNodes.clear();\n}\n","import { config, inSsr } from \"../config\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { applyMirrorAttribute, getInputAttributeMirror } from \"../event/getInputAttributeMirror\";\nimport { beginPropagationTransaction, extendPropagationContext, getCurrentPropagationContext, getEdgeId, getWireId, runWithPropagationContext, runWithWriteReceipt } from \"../propagation/propagation\";\nimport { isPossibleTwoWay } from \"../event/isPossibleTwoWay\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\nimport { addSsrProperty, trackSsrPropertyNode } from \"./ssrPropertyStore\";\n\n// SSR 時に HTML 属性で代替可能なプロパティ\n// これら以外のプロパティは ssrPropertyStore に蓄積してハイドレーション時に復元\nconst SSR_ATTR_PROPS: Record<string, (element: Element, value: unknown) => void> = {\n value(element, value) {\n if (element.tagName === 'TEXTAREA') {\n element.textContent = String(value ?? '');\n } else {\n element.setAttribute('value', String(value ?? ''));\n }\n },\n checked(element, value) {\n if (value) element.setAttribute('checked', '');\n else element.removeAttribute('checked');\n },\n selected(element, value) {\n if (value) element.setAttribute('selected', '');\n else element.removeAttribute('selected');\n },\n disabled(element, value) {\n if (value) element.setAttribute('disabled', '');\n else element.removeAttribute('disabled');\n },\n selectedIndex(element, value) {\n const options = element.querySelectorAll('option');\n const idx = Number(value);\n for (let i = 0; i < options.length; i++) {\n if (i === idx) options[i].setAttribute('selected', '');\n else options[i].removeAttribute('selected');\n }\n },\n};\n\nexport function applyChangeToProperty(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n // undefined は「状態が値を持たない=無意見」であり、書き込み自体をスキップして\n // 要素側の既定値を生かす。書き込んでしまうと setter の文字列化で\n // \"undefined\" 属性や removeAttribute が走り要素が壊れる (spread で未初期化\n // slot を配線したときに顕在化)。明示的なクリアは null で表現する。\n // mirror 属性 (applyMirrorAttribute) の「undefined → 属性削除」と同じ語彙。\n if (typeof newValue === \"undefined\") {\n if (config.debug) {\n console.debug(`Skipped property write: state value is undefined.`, {\n element: binding.node,\n propSegments: binding.propSegments,\n statePathName: binding.statePathName,\n });\n }\n return;\n }\n const element = binding.node as Element;\n const propSegments = binding.propSegments;\n if (propSegments.length === 1) {\n const firstSegment = propSegments[0];\n if ((element as any)[firstSegment] !== newValue) {\n const performWrite = (): void => {\n let propertyWriteSucceeded = false;\n try {\n (element as any)[firstSegment] = newValue;\n propertyWriteSucceeded = true;\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to set property '${firstSegment}' on element.`, {\n element,\n newValue,\n error\n });\n }\n }\n // wc-bindable inputs[].attribute ミラー。プロパティ書き込みが成功したときだけ\n // 属性へ反映する。setter が値を拒否した場合に属性だけ進んでしまうと\n // property と attribute が乖離し、attributeChangedCallback や CSS セレクタが\n // 実際のプロパティ値と矛盾した状態で発火するため、ここでガードする。\n if (propertyWriteSucceeded) {\n const mirrorAttr = getInputAttributeMirror(element, firstSegment);\n if (mirrorAttr !== null) {\n try {\n applyMirrorAttribute(element, mirrorAttr, newValue);\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to mirror attribute '${mirrorAttr}' on element.`, {\n element,\n newValue,\n error\n });\n }\n }\n }\n }\n };\n // Zero-cost fast path (§4 最適化): the propagation edge / WriteReceipt\n // machinery only matters when the element write can *echo* — i.e. the setter\n // may synchronously dispatch an event a two-way wire feeds back to state.\n // `isPossibleTwoWay` is the same conservative check the two-way listener\n // registration uses, and it is cheap for the common one-way case (textContent\n // / class / style on plain elements return false fast). One-way bindings can\n // never re-traverse an edge, so skipping the context/receipt is safe and\n // avoids a per-apply Set copy + receipt allocation. Diamond / coalescing are\n // unaffected — those ride the write-transaction context threaded through the\n // updater, not the element edge.\n if (config.enablePropagationContext && isPossibleTwoWay(element, firstSegment)) {\n // Phase 3: state → element edge の通過を記録し、同じ transaction が\n // 同じ edge を再度通ろうとした場合だけ抑止する(設計書 §4 規則 2)。\n // 書き込みは WriteReceipt scope で包み、setter が同期 dispatch する\n // event が confirmation / 正規化を判定できるようにする(規則 3)。\n const wireId = getWireId(element, firstSegment, binding.stateName, binding.statePathName);\n const edgeId = getEdgeId(wireId, \"to-element\");\n const baseContext = _context?.propagationContextByBinding?.get(binding)\n ?? getCurrentPropagationContext()\n ?? beginPropagationTransaction(wireId);\n if (baseContext.visitedEdges.has(edgeId)) {\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:suppressed\",\n reason: \"visited-edge\",\n transactionId: baseContext.transactionId,\n edgeId,\n node: element,\n member: firstSegment,\n });\n }\n } else {\n const extendedContext = extendPropagationContext(baseContext, edgeId);\n runWithPropagationContext(extendedContext, () =>\n runWithWriteReceipt(element, firstSegment, newValue, wireId, extendedContext.transactionId, performWrite));\n }\n } else {\n performWrite();\n }\n }\n if (inSsr()) {\n const attrHandler = SSR_ATTR_PROPS[firstSegment];\n if (attrHandler) {\n // 属性で代替可能 → HTML 属性に反映\n attrHandler(element, newValue);\n } else {\n // 属性で代替不可 → ハイドレーション用ストアに蓄積\n addSsrProperty(element, firstSegment, newValue);\n trackSsrPropertyNode(element);\n }\n }\n return;\n }\n const firstSegment = propSegments[0];\n let subObject = (element as any)[firstSegment];\n for (let i = 1; i < propSegments.length - 1; i++) {\n const segment = propSegments[i];\n if (subObject == null) {\n return;\n }\n subObject = subObject[segment];\n }\n const oldValue = subObject[propSegments[propSegments.length - 1]];\n if (oldValue !== newValue) {\n if (Object.isFrozen(subObject)) {\n if (config.debug) {\n console.warn(`Attempting to set property on frozen object.`, {\n element,\n propSegments,\n oldValue,\n newValue\n });\n }\n return;\n }\n try {\n subObject[propSegments[propSegments.length - 1]] = newValue;\n } catch (error) {\n if (config.debug) {\n console.warn(`Failed to set property on sub-object.`, {\n element,\n propSegments,\n oldValue,\n newValue,\n error\n });\n }\n }\n }\n // サブオブジェクトプロパティ (e.g. style.xxx) は属性に反映済みなのでストア不要\n}\n","import { getCustomElement } from \"../getCustomElement\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry\";\nimport { readBindableDeclaration } from \"../protocol/wcBindableReader\";\n\n/**\n * 要素 `element` の `propName` プロパティ書き込みに対して、\n * wc-bindable inputs の `attribute` ミラー先属性名を返す。\n *\n * - wc-bindable でないネイティブ要素や、inputs 未宣言、attribute フィールド無しは null\n * - inputs に同名宣言があっても `attribute` を持たないものはミラー対象外\n *\n * 戻り値の string がそのまま `setAttribute(name, value)` の name となる。\n */\nexport function getInputAttributeMirror(element: Element, propName: string): string | null {\n const customTagName = getCustomElement(element);\n if (customTagName === null) {\n return null;\n }\n const customClass = getCustomElementRegistry()?.get(customTagName);\n if (typeof customClass === \"undefined\") {\n return null;\n }\n const input = readBindableDeclaration(element)?.declaredInputs.get(propName);\n if (typeof input?.attribute === \"string\" && input.attribute.length > 0) {\n return input.attribute;\n }\n return null;\n}\n\n/**\n * mirror 属性値の表現を決める。\n * - null / undefined → 属性削除\n * - object / array → JSON.stringify (失敗時は String(value))\n * - その他 (string / number / boolean / bigint) → String(value)\n */\nexport function applyMirrorAttribute(element: Element, attributeName: string, value: unknown): void {\n if (value === null || typeof value === \"undefined\") {\n element.removeAttribute(attributeName);\n return;\n }\n let formatted: string;\n if (typeof value === \"object\") {\n try {\n formatted = JSON.stringify(value);\n } catch {\n formatted = String(value);\n }\n } else {\n formatted = String(value);\n }\n element.setAttribute(attributeName, formatted);\n}\n","import { inSsr } from \"../config\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { IApplyContext } from \"./types\";\n\nconst ssrWrappedNodes: WeakSet<Node> = new WeakSet();\n\nexport function applyChangeToText(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n // nodeValue は nullable DOMString(実ブラウザでは null / undefined とも空文字に\n // 正規化される)ため、比較前に同じ規則で文字列化する。生値のまま比較すると\n // 数値など非文字列値は常に不一致になり、同値でも毎回 DOM 書き込みが走る。\n // 注: happy-dom は undefined を \"undefined\" にする非準拠実装なので String() に\n // 頼らず明示的に \"\" へ正規化する。\n const text = newValue === null || newValue === undefined ? \"\" : String(newValue);\n if (binding.replaceNode.nodeValue !== text) {\n binding.replaceNode.nodeValue = text;\n }\n // SSR モード時: テキストノードの前後にコメントを挿入して境界を明示\n if (inSsr() && !ssrWrappedNodes.has(binding.replaceNode)) {\n ssrWrappedNodes.add(binding.replaceNode);\n const parentNode = binding.replaceNode.parentNode;\n if (parentNode) {\n const path = binding.statePathName;\n const startComment = document.createComment(`@@wcs-text-start:${path}`);\n const endComment = document.createComment(`@@wcs-text-end:${path}`);\n parentNode.insertBefore(startComment, binding.replaceNode);\n parentNode.insertBefore(endComment, binding.replaceNode.nextSibling);\n }\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToWebComponent(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const propSegments = binding.propSegments;\n if (propSegments.length <= 1) {\n raiseError(`Invalid propSegments for web component binding: ${propSegments.join(\".\")}`);\n }\n const [ firstSegment, ...restSegments ] = propSegments;\n const subObject = (element as any)[firstSegment] as Record<string, unknown> | undefined;\n if (typeof subObject === \"undefined\") {\n raiseError(`Property \"${firstSegment}\" not found on web component.`);\n }\n subObject[restSegments.join(\".\")] = newValue;\n}\n","import { getStateAddressByBindingInfo } from \"../binding/getStateAddressByBindingInfo\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { getIndexValueByLoopContext } from \"../list/getIndexValueByLoopContext\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { getByAddressSymbol } from \"../proxy/symbols\";\nimport { IStateProxy } from \"../proxy/types\";\nimport { raiseError } from \"../raiseError\";\n\nexport function getValue(state: IStateProxy, binding: IBindingInfo): any {\n const stateAddress = getStateAddressByBindingInfo(binding);\n if (stateAddress.pathInfo.path in INDEX_BY_INDEX_NAME) {\n const loopContext = getLoopContextByNode(binding.node);\n if (loopContext === null) {\n raiseError(`ListIndex not found for binding: ${binding.statePathName}`);\n }\n return getIndexValueByLoopContext(loopContext, stateAddress.pathInfo.path);\n } else {\n return state[getByAddressSymbol](stateAddress);\n }\n}\n","import { INDEX_BY_INDEX_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { ILoopContext } from \"./types\";\n\n// indexName ... $1, $2, ...\nexport function getIndexValueByLoopContext(loopContext: ILoopContext, indexName: string): number | null {\n if (loopContext.listIndex === null) {\n raiseError(`ListIndex not found for loopContext:`);\n }\n const indexPos = INDEX_BY_INDEX_NAME[indexName];\n if (typeof indexPos === \"undefined\") {\n raiseError(`Invalid index name: ${indexName}`);\n }\n const listIndex = loopContext.listIndex.at(indexPos);\n if (listIndex === null) {\n raiseError(`Index not found at position ${indexPos} for loopContext:`);\n }\n return listIndex.index;\n}","import { getBindingSession } from \"../bindings/BindingSession.js\";\nimport { getDefinitionCoordinator } from \"../bindings/DefinitionCoordinator.js\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { applyChangeFromBindings } from \"./applyChangeFromBindings.js\";\n\nconst scheduledBindings = new WeakSet<IBindingInfo>();\n\nfunction reportFailure(tagName: string, error: unknown): void {\n console.error(`[@wcstack/state] deferred apply failed for <${tagName}>.`, error);\n}\n\nexport function scheduleDeferredApply(binding: IBindingInfo, tagName: string): void {\n if (scheduledBindings.has(binding)) return;\n scheduledBindings.add(binding);\n\n const applyLatest = (): void => {\n scheduledBindings.delete(binding);\n const currentSession = getBindingSession(binding);\n if (currentSession !== null && !currentSession.shouldApplyState(binding)) {\n return;\n }\n applyChangeFromBindings([binding]);\n };\n const reject = (error: unknown): void => {\n scheduledBindings.delete(binding);\n reportFailure(tagName, error);\n };\n\n const session = getBindingSession(binding);\n if (session !== null) {\n const cancel = session.deferUntilDefined(binding.replaceNode, tagName, applyLatest, reject);\n if (!session.addTeardown(binding, () => {\n scheduledBindings.delete(binding);\n cancel();\n })) {\n scheduledBindings.delete(binding);\n cancel();\n }\n return;\n }\n\n // Compatibility fallback for direct applyChange() callers outside a session.\n const registry = getCustomElementRegistry();\n if (registry === null) {\n scheduledBindings.delete(binding);\n reportFailure(tagName, new Error(\"CustomElementRegistry is unavailable.\"));\n return;\n }\n getDefinitionCoordinator(registry).wait(tagName, () => {\n if (!binding.replaceNode.isConnected) {\n scheduledBindings.delete(binding);\n return;\n }\n applyLatest();\n }, reject);\n}\n","import { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding.js\";\nimport { getBindingSession } from \"../bindings/BindingSession.js\";\nimport { getCustomElement } from \"../getCustomElement.js\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry.js\";\nimport { raiseError } from \"../raiseError.js\";\nimport { getStateElementByName } from \"../stateElementByName.js\";\nimport { IBindingInfo } from \"../types.js\";\nimport { isWebComponentComplete } from \"../webComponent/completeWebComponent.js\";\nimport { applyChangeToAttribute } from \"./applyChangeToAttribute.js\";\nimport { applyChangeToCheckbox } from \"./applyChangeToCheckbox.js\";\nimport { applyChangeToClass } from \"./applyChangeToClass.js\";\nimport { applyChangeToCommand } from \"./applyChangeToCommand.js\";\nimport { applyChangeToFor } from \"./applyChangeToFor.js\";\nimport { applyChangeToIf } from \"./applyChangeToIf.js\";\nimport { applyChangeToProperty } from \"./applyChangeToProperty.js\";\nimport { applyChangeToRadio } from \"./applyChangeToRadio.js\";\nimport { applyChangeToStyle } from \"./applyChangeToStyle.js\";\nimport { applyChangeToText } from \"./applyChangeToText.js\";\nimport { applyChangeToWebComponent } from \"./applyChangeToWebComponent.js\";\nimport { getFilteredValue } from \"./getFilteredValue.js\";\nimport { getValue } from \"./getValue.js\";\nimport { getRootNodeByFragment } from \"./rootNodeByFragment.js\";\nimport { scheduleDeferredApply } from \"./scheduleDeferredApply.js\";\nimport { ApplyChangeFn, IApplyContext } from \"./types.js\";\n\nconst applyChangeByFirstSegment: { [key: string]: ApplyChangeFn } = {\n \"class\": applyChangeToClass,\n \"attr\": applyChangeToAttribute,\n \"style\": applyChangeToStyle,\n \"command\": applyChangeToCommand,\n};\n\nconst applyChangeByBindingType: { [key: string]: ApplyChangeFn } = {\n \"text\": applyChangeToText,\n \"for\": applyChangeToFor,\n \"if\": applyChangeToIf,\n \"else\": applyChangeToIf,\n \"elseif\": applyChangeToIf,\n \"radio\": applyChangeToRadio,\n \"checkbox\": applyChangeToCheckbox,\n};\n\nconst fnByBinding: WeakMap<IBindingInfo, ApplyChangeFn> = new WeakMap();\nconst deferredSelectBindingByBinding: WeakMap<IBindingInfo, boolean> = new WeakMap();\n\n// 未 define カスタム要素チェックの確定メモ。customTag が無い、または define 済みを\n// 一度確認したら以後は不変(define は不可逆)なので apply 毎の getCustomElement /\n// registry 照会を省略できる。scoped registry を導入する場合はこの不可逆前提を再検討。\nconst definedApplyVerifiedByBinding: WeakMap<IBindingInfo, boolean> = new WeakMap();\n\nfunction _applyChange(binding: IBindingInfo, context: IApplyContext): void {\n const value = getValue(context.state, binding);\n const filteredValue = getFilteredValue(value, binding.outFilters);\n\n if (deferredSelectBindingByBinding.get(binding) === true) {\n context.deferredSelectBindings.push({ binding, value: filteredValue });\n return;\n }\n let fn = fnByBinding.get(binding);\n if (typeof fn !== 'undefined') {\n fn(binding, context, filteredValue);\n return;\n }\n if (fnByBinding.has(binding)) {\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\n fn = applyChangeToWebComponent;\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\n } else {\n fn = applyChangeToProperty;\n }\n fn(binding, context, filteredValue);\n return;\n }\n\n fn = applyChangeByBindingType[binding.bindingType];\n if (typeof fn === 'undefined') {\n const firstSegment = binding.propSegments[0];\n fn = applyChangeByFirstSegment[firstSegment];\n fnByBinding.set(binding, fn);\n if (typeof fn === 'undefined') {\n const customTag = getCustomElement(binding.replaceNode);\n if (customTag) {\n if (isWebComponentComplete(binding.replaceNode as Element, context.stateElement)) {\n fn = applyChangeToWebComponent;\n fnByBinding.set(binding, fn); // 確定したのでキャッシュ\n } else {\n fn = applyChangeToProperty;\n }\n } else {\n fn = applyChangeToProperty;\n fnByBinding.set(binding, fn);\n }\n }\n }\n if (fn === applyChangeToProperty) {\n const element = binding.node as Element;\n if (element.tagName === 'SELECT') {\n const propName = binding.propSegments[0];\n if (propName === 'value' || propName === 'selectedIndex') {\n context.deferredSelectBindings.push({ binding, value: filteredValue });\n deferredSelectBindingByBinding.set(binding, true);\n return;\n }\n }\n }\n fn(binding, context, filteredValue);\n}\n\nexport function applyChange(binding: IBindingInfo, context: IApplyContext): void {\n if (context.appliedBindingSet.has(binding)) {\n return;\n }\n context.appliedBindingSet.add(binding);\n // $updatedCallback が定義されていない state では、更新アドレスの集計自体が\n // 不要(drain 終端の呼び出しごと省略される)。大量バインディング適用時の\n // Set 蓄積を避ける。undefined(テスト用モック等)は従来通り集計する。\n if (context.stateElement.hasUpdatedCallback !== false) {\n const absAddress = getAbsoluteStateAddressByBinding(binding);\n if (context.updatedAbsAddressSetByStateElement.has(context.stateElement)) {\n const addressSet = context.updatedAbsAddressSetByStateElement.get(context.stateElement)!;\n addressSet.add(absAddress);\n } else {\n context.updatedAbsAddressSetByStateElement.set(context.stateElement, new Set([\n absAddress\n ]));\n }\n }\n const bindingSession = getBindingSession(binding);\n if (bindingSession !== null && !bindingSession.shouldApplyState(binding)) {\n return;\n }\n if (binding.bindingType === \"event\") {\n return;\n }\n if (definedApplyVerifiedByBinding.get(binding) !== true) {\n const customTag = getCustomElement(binding.replaceNode);\n if (customTag) {\n if (getCustomElementRegistry()?.get(customTag) === undefined) {\n // 未 define のカスタム要素へは今は適用できない(accessor 未確立の要素に\n // 素の own property を書くと upgrade 後に class accessor を隠してしまう)。\n // whenDefined 後に最新 state 値で再適用する(two-way attach / deferred\n // spread と対称。docs/state-binding-init-races.md §2)。\n scheduleDeferredApply(binding, customTag);\n return;\n }\n }\n // customTag 無し or define 済み確定 → 以後この検査を省略(不可逆)\n definedApplyVerifiedByBinding.set(binding, true);\n }\n // applyChangeFromBindings のグループ化ループが解決済みルートの一致を検証済みの\n // 場合、stateName さえ一致すれば getRootNode の再解決(native 呼び出し)を省略\n // できる。activateContent 経由(フラグメント内の新規 content)も、フラグメントは\n // setRootNodeByFragment で context.rootNode に解決されるため同じ不変条件が成り立つ。\n if (context.sameRootVerified === true && binding.stateName === context.stateName) {\n _applyChange(binding, context);\n return;\n }\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\n rootNode = getRootNodeByFragment(rootNode);\n if (rootNode === null) {\n raiseError(`Root node for fragment not found for binding.`);\n }\n }\n if (binding.stateName !== context.stateName || rootNode !== context.rootNode) {\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${binding.stateName}\" not found for binding.`);\n }\n stateElement.createState(\"readonly\", (targetState) => {\n const newContext = {\n stateName: binding.stateName,\n rootNode: rootNode,\n stateElement: stateElement,\n state: targetState,\n appliedBindingSet: context.appliedBindingSet,\n newListValueByAbsAddress: context.newListValueByAbsAddress,\n updatedAbsAddressSetByStateElement: context.updatedAbsAddressSetByStateElement,\n deferredSelectBindings: context.deferredSelectBindings,\n }\n _applyChange(binding, newContext);\n });\n } else {\n _applyChange(binding, context);\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToClass(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const className = binding.propSegments[1];\n if (typeof newValue !== 'boolean') {\n raiseError(`Invalid value for class application: expected boolean, got ${typeof newValue}`);\n }\n element.classList.toggle(className, newValue as boolean);\n}","import { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToAttribute(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as Element;\n const attrName = binding.propSegments[1];\n if (element.getAttribute(attrName) !== newValue) {\n element.setAttribute(attrName, newValue as string);\n }\n}\n","import { IBindingInfo } from \"../types\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToStyle(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const styleName = binding.propSegments[1];\n const style = (binding.node as HTMLElement).style;\n const currentValue = (style as any)[styleName];\n if (currentValue !== newValue) {\n (style as any)[styleName] = newValue;\n }\n}\n","import { IBindingInfo } from \"../types\";\nimport { getFilteredValue } from \"./getFilteredValue\";\nimport { IApplyContext } from \"./types\";\n\nexport function applyChangeToRadio(binding: IBindingInfo, _context: IApplyContext, newValue: unknown): void {\n const element = binding.node as HTMLInputElement;\n const elementValue = element.value;\n const elementFilteredValue = getFilteredValue(elementValue, binding.inFilters);\n element.checked = newValue === elementFilteredValue;\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { setLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { updatedCallbackSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IPropagationContext } from \"../propagation/types\";\nimport { IBindingInfo } from \"../types\";\nimport { applyChange } from \"./applyChange\";\nimport { applyChangeToProperty } from \"./applyChangeToProperty\";\nimport { getRootNodeByFragment } from \"./rootNodeByFragment\";\nimport { IApplyContext, IDeferredSelectBinding } from \"./types\";\n\n/**\n * バインディング情報の配列を処理し、各バインディングに対して状態の変更を適用する。\n *\n * 2フェーズで処理:\n * Phase 1: 構造的更新(for/if) + 値更新(select以外) — select.value/selectedIndex は遅延収集\n * Phase 2: 遅延されたselect.value/selectedIndex を適用(option要素の生成後)\n *\n * 最適化のため、以下のグループ化を行う:\n * 同じ stateNameとrootNode を持つバインディングをグループ化 → createState の呼び出しを削減\n */\nexport function applyChangeFromBindings(\n bindings: IBindingInfo[],\n propagationContextByBinding?: ReadonlyMap<IBindingInfo, IPropagationContext | null>,\n): void {\n let bindingIndex = 0;\n const appliedBindingSet: Set<IBindingInfo> = new Set();\n const newListValueByAbsAddress: Map<IAbsoluteStateAddress, readonly unknown[]> = new Map();\n const updatedAbsAddressSetByStateElement: Map<IStateElement, Set<IAbsoluteStateAddress>> = new Map();\n const deferredSelectBindings: IDeferredSelectBinding[] = [];\n\n // Phase 1: 構造的更新 + 値更新(select.value/selectedIndex は遅延)\n while(bindingIndex < bindings.length) {\n let binding = bindings[bindingIndex];\n const stateName = binding.stateName;\n if (binding.replaceNode.isConnected === false) {\n // 切断されているバインディングは無視、本来は事前に除去されているはず\n if (config.debug) {\n console.log(`applyChangeFromBindings: skip disconnected binding: ${binding.bindingType} ${binding.statePathName} on ${binding.node.nodeName}`, binding);\n }\n bindingIndex++;\n continue;\n }\n let rootNode: Node | null = binding.replaceNode.getRootNode() as Node;\n if (rootNode instanceof DocumentFragment && !(rootNode instanceof ShadowRoot)) {\n rootNode = getRootNodeByFragment(rootNode);\n if (rootNode === null) {\n raiseError(`Root node for fragment not found for binding.`);\n }\n }\n const stateElement = getStateElementByName(rootNode, stateName);\n if (stateElement === null) {\n raiseError(`State element with name \"${stateName}\" not found for binding.`);\n }\n\n stateElement.createState(\"readonly\", (state) => {\n const context: IApplyContext = {\n rootNode: rootNode,\n stateName: stateName,\n stateElement: stateElement,\n state: state,\n appliedBindingSet: appliedBindingSet,\n newListValueByAbsAddress: newListValueByAbsAddress,\n updatedAbsAddressSetByStateElement: updatedAbsAddressSetByStateElement,\n deferredSelectBindings: deferredSelectBindings,\n // グループ内の binding は下の do/while が「解決済みルート === rootNode」を\n // 検証してから applyChange に渡す(applyChange 側の getRootNode 省略の根拠)\n sameRootVerified: true,\n propagationContextByBinding: propagationContextByBinding,\n };\n\n do {\n applyChange(binding, context);\n bindingIndex++;\n\n const nextBindingInfo: IBindingInfo | undefined = bindings[bindingIndex];\n if (!nextBindingInfo) break; // 終端に到達\n const nextRootNode = nextBindingInfo.replaceNode.getRootNode() as Node;\n if (nextBindingInfo.stateName !== stateName || nextRootNode !== context.rootNode) break; // stateName が変わった\n binding = nextBindingInfo;\n } while(true); // eslint-disable-line no-constant-condition\n });\n }\n // Phase 2: 遅延されたselect.value/selectedIndex を適用\n // applyChangeToProperty は propagationContextByBinding 以外の context を\n // 参照しないため、遅延分は最小 context を渡す\n for (const { binding, value } of deferredSelectBindings) {\n applyChangeToProperty(binding, { propagationContextByBinding } as unknown as IApplyContext, value);\n }\n\n for(const [ absAddress, newListValue ] of newListValueByAbsAddress.entries()) {\n setLastListValueByAbsoluteStateAddress(absAddress, newListValue);\n }\n for(const [ stateElement, absAddressSet ] of updatedAbsAddressSetByStateElement.entries()) {\n stateElement.createState(\"writable\", (state) => {\n state[updatedCallbackSymbol](Array.from(absAddressSet));\n });\n }\n}\n","import { config } from \"../config.js\";\nimport { SVG_NAMESPACE } from \"../define.js\";\n\nconst MUSTACHE_REGEX = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\nconst SKIP_TAGS = new Set([\"SCRIPT\", \"STYLE\"]);\n\nexport function convertMustacheToComments(root: Document | Element | DocumentFragment): void {\n if (!config.enableMustache) {\n return;\n }\n\n convertTextNodes(root);\n\n const templates = Array.from(root.querySelectorAll(\"template\"));\n\n for (const template of templates) {\n if (template.namespaceURI === SVG_NAMESPACE) {\n const newTemplate = document.createElement(\"template\");\n const childNodes = Array.from(template.childNodes);\n for(let i = 0; i < childNodes.length; i++) {\n const childNode = childNodes[i];\n newTemplate.content.appendChild(childNode);\n }\n for(const attr of template.attributes) {\n newTemplate.setAttribute(attr.name, attr.value);\n }\n template.replaceWith(newTemplate);\n convertMustacheToComments(newTemplate.content);\n } else {\n convertMustacheToComments(template.content);\n }\n }\n}\n\nfunction convertTextNodes(root: Document | Element | DocumentFragment): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n const textNodes: Text[] = [];\n\n while (walker.nextNode()) {\n textNodes.push(walker.currentNode as Text);\n }\n\n for (const textNode of textNodes) {\n if (textNode.parentElement && SKIP_TAGS.has(textNode.parentElement.tagName)) {\n continue;\n }\n replaceTextNode(textNode);\n }\n}\n\nfunction replaceTextNode(textNode: Text): void {\n const text = textNode.data;\n MUSTACHE_REGEX.lastIndex = 0;\n\n if (!MUSTACHE_REGEX.test(text)) {\n return;\n }\n\n MUSTACHE_REGEX.lastIndex = 0;\n const fragment = document.createDocumentFragment();\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = MUSTACHE_REGEX.exec(text)) !== null) {\n if (match.index > lastIndex) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\n }\n\n const bindText = match[1];\n fragment.appendChild(document.createComment(`@@: ${bindText}`));\n\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\n }\n\n textNode.parentNode!.replaceChild(fragment, textNode);\n}\n","import { builtinFilterFn, outputBuiltinFilters } from \"../filters/builtinFilters\";\nimport { IFilterInfo } from \"../types\";\n\nlet _notFilterInfo: IFilterInfo | undefined = undefined;\n\nexport function createNotFilter(): IFilterInfo {\n if (_notFilterInfo) {\n return _notFilterInfo;\n }\n const filterName = \"not\"\n const args: string[] = [];\n const filterFn = builtinFilterFn(filterName, args)(outputBuiltinFilters);\n _notFilterInfo = {\n filterName,\n args,\n filterFn,\n }\n return _notFilterInfo;\n}\n","import { config } from \"../config.js\";\nimport { DELIMITER, WILDCARD } from \"../define.js\";\n\nconst COMMENT_REGEX = /^(\\s*@@\\s*(?:.*?)\\s*:\\s*)(.+?)(\\s*)$/;\n\nfunction expandShorthandInStatePart(statePart: string, forPath: string): string {\n const prefix = forPath + DELIMITER + WILDCARD;\n const pipeIndex = statePart.indexOf('|');\n const atIndex = statePart.indexOf('@');\n let pathPart: string;\n let suffix: string;\n if (pipeIndex !== -1) {\n pathPart = statePart.slice(0, pipeIndex).trim();\n suffix = statePart.slice(pipeIndex);\n } else if (atIndex !== -1) {\n pathPart = statePart.slice(0, atIndex).trim();\n suffix = statePart.slice(atIndex);\n } else {\n pathPart = statePart.trim();\n suffix = '';\n }\n if (pathPart === '.') {\n pathPart = prefix;\n } else if (pathPart.startsWith('.')) {\n pathPart = prefix + DELIMITER + pathPart.slice(1);\n } else {\n return statePart;\n }\n if (suffix.length > 0) {\n return pathPart + suffix;\n }\n return pathPart;\n}\n\nfunction expandCommentData(data: string, forPath: string): string {\n const match = COMMENT_REGEX.exec(data);\n if (match === null) {\n return data;\n }\n const commentPrefix = match[1];\n const bindText = match[2];\n const commentSuffix = match[3];\n const expanded = expandShorthandInStatePart(bindText, forPath);\n return commentPrefix + expanded + commentSuffix;\n}\n\nfunction expandBindAttribute(attrValue: string, forPath: string): string {\n const parts = attrValue.split(';');\n let changed = false;\n const result = parts.map(part => {\n const trimmed = part.trim();\n if (trimmed.length === 0) return part;\n const colonIndex = trimmed.indexOf(':');\n if (colonIndex === -1) return part;\n const propPart = trimmed.slice(0, colonIndex).trim();\n const statePart = trimmed.slice(colonIndex + 1).trim();\n const expanded = expandShorthandInStatePart(statePart, forPath);\n if (expanded !== statePart) {\n changed = true;\n return `${propPart}: ${expanded}`;\n }\n return part;\n });\n if (!changed) return attrValue;\n return result.join(';');\n}\n\nexport function expandShorthandInBindAttribute(attrValue: string, forPath: string): string {\n return expandBindAttribute(attrValue, forPath);\n}\n\nexport function expandShorthandPaths(root: DocumentFragment, forPath: string): void {\n const bindAttr = config.bindAttributeName;\n const walker = document.createTreeWalker(\n root,\n NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT,\n );\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n if (node.nodeType === Node.COMMENT_NODE) {\n const comment = node as Comment;\n comment.data = expandCommentData(comment.data, forPath);\n continue;\n }\n const element = node as Element;\n if (element instanceof HTMLTemplateElement) {\n continue;\n }\n const attr = element.getAttribute(bindAttr);\n if (attr !== null) {\n const expanded = expandBindAttribute(attr, forPath);\n if (expanded !== attr) {\n element.setAttribute(bindAttr, expanded);\n }\n }\n }\n}\n","\nexport function getNodePath(node: Node): number[] {\n let currentNode: Node | null = node;\n const path: number[] = [];\n while(currentNode.parentNode !== null) {\n const nodes: Node[] = Array.from(currentNode.parentNode.childNodes);\n const index = nodes.indexOf(currentNode);\n path.unshift(index);\n currentNode = currentNode.parentNode;\n }\n return path;\n}\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\nimport { getSubscriberNodes } from \"../bindings/getSubscriberNodes\";\nimport { getNodePath } from \"./getNodePath\";\nimport { IFragmentNodeInfo } from \"./types\";\n\nexport function getFragmentNodeInfos(fragment: DocumentFragment): IFragmentNodeInfo[] {\n const fragmnentNodeInfos: IFragmentNodeInfo[] = [];\n const subscriberNodes = getSubscriberNodes(fragment);\n for(const subscriberNode of subscriberNodes) {\n const parseBindingTextResults = getParseBindTextResults(subscriberNode);\n let node = subscriberNode;\n // テンプレート登録時の事前正規化: text 専用の wcs-text コメントは、この時点で\n // 空 Text に置き換えておく。行 clone は最初から Text を持ち、getBindingInfos が\n // その Text を replaceNode に使うため、行ごとの createTextNode と start() 時の\n // replaceChild(コメント→Text 差し替え)が丸ごと不要になる。\n // 置換は同じ位置なので nodePath は不変。wcs-for/if 等の構造コメントは\n // アンカーとしてコメントのまま維持する(bindingType で判別)。\n // 非フラグメント経路(実 DOM 上のコメント)は従来どおり実行時に差し替える。\n if (\n subscriberNode.nodeType === Node.COMMENT_NODE\n && parseBindingTextResults.length === 1\n && parseBindingTextResults[0].bindingType === \"text\"\n && subscriberNode.parentNode !== null\n ) {\n const textNode = document.createTextNode(\"\");\n subscriberNode.parentNode.replaceChild(textNode, subscriberNode);\n node = textNode;\n }\n fragmnentNodeInfos.push({\n nodePath: getNodePath(node),\n parseBindTextResults: parseBindingTextResults,\n });\n }\n return fragmnentNodeInfos;\n}","\nexport function optimizeFragment(fragment: DocumentFragment): void {\n const childNodes = Array.from(fragment.childNodes);\n for(const childNode of childNodes) {\n if (childNode.nodeType === Node.TEXT_NODE) {\n const textContent = childNode.textContent || '';\n if (textContent.trim() === '') {\n // Remove empty text nodes\n fragment.removeChild(childNode);\n }\n }\n }\n}\n","import { getParseBindTextResults } from \"../bindings/getParseBindTextResults\";\nimport { parseBindTextsForElement } from \"../bindTextParser/parseBindTextsForElement\";\nimport { ParseBindTextResult } from \"../bindTextParser/types\";\nimport { config } from \"../config\";\nimport { getUUID } from \"../getUUID\";\nimport { raiseError } from \"../raiseError\";\nimport { BindingType } from \"../types\";\nimport { createNotFilter } from \"./createNotFilter\";\nimport { expandShorthandInBindAttribute, expandShorthandPaths } from \"./expandShorthandPaths\";\nimport { setFragmentInfoByUUID } from \"./fragmentInfoByUUID\";\nimport { getFragmentNodeInfos } from \"./getFragmentNodeInfos\";\nimport { getNodePath } from \"./getNodePath\";\nimport { optimizeFragment } from \"./optimizeFragment\";\nimport { IFragmentInfo } from \"./types\";\n\nconst keywordByBindingType: Map<BindingType, string> = new Map<BindingType, string>([\n [\"for\", config.commentForPrefix],\n [\"if\", config.commentIfPrefix],\n [\"elseif\", config.commentElseIfPrefix],\n [\"else\", config.commentElsePrefix],\n]);\n\nconst notFilter = createNotFilter();\n\nfunction cloneNotParseBindTextResult(\n bindingType: BindingType,\n parseBindTextResult: ParseBindTextResult\n): ParseBindTextResult {\n const filters = parseBindTextResult.outFilters;\n return {\n ...parseBindTextResult,\n outFilters: [...filters, notFilter],\n bindingType: bindingType,\n };\n}\n\nfunction _getFragmentInfo(\n rootNode: Node,\n fragment: DocumentFragment,\n parseBindingTextResult: ParseBindTextResult,\n forPath?: string\n): IFragmentInfo {\n optimizeFragment(fragment);\n if (typeof forPath === \"string\") {\n expandShorthandPaths(fragment, forPath);\n }\n collectStructuralFragments(rootNode, fragment, forPath);\n // after replacing and collect node infos on child fragment\n const fragmentInfo = {\n fragment: fragment,\n parseBindTextResult: parseBindingTextResult,\n nodeInfos: getFragmentNodeInfos(fragment),\n }\n return fragmentInfo;\n}\n\n\nexport function collectStructuralFragments(rootNode: Node, walkRoot: Document | Element | DocumentFragment, forPath?: string): void {\n const elseKeyword = config.commentElsePrefix;\n const walker = document.createTreeWalker(\n walkRoot, \n NodeFilter.SHOW_ELEMENT, \n {\n acceptNode(node: Node) {\n const element = node as Element;\n if (element.tagName.toLowerCase() === 'template') {\n const bindText = element.getAttribute(config.bindAttributeName) || '';\n if (bindText.length > 0) {\n return NodeFilter.FILTER_ACCEPT;\n }\n }\n return NodeFilter.FILTER_SKIP;\n }\n }\n );\n let lastIfFragmentInfo: IFragmentInfo | null = null; // for elseif chaining\n const elseFragmentInfos: IFragmentInfo[] = []; // for elseif chaining\n const templates: HTMLTemplateElement[] = [];\n while (walker.nextNode()) {\n const template = walker.currentNode as HTMLTemplateElement;\n templates.push(template);\n }\n\n for(const template of templates) {\n let bindText = template.getAttribute(config.bindAttributeName) || '';\n if (typeof forPath === \"string\") {\n bindText = expandShorthandInBindAttribute(bindText, forPath);\n }\n const parseBindTextResults = parseBindTextsForElement(bindText);\n let parseBindTextResult = parseBindTextResults[0];\n const keyword = keywordByBindingType.get(parseBindTextResult.bindingType);\n if (typeof keyword === 'undefined') {\n continue;\n }\n\n const bindingType = parseBindTextResult.bindingType;\n const fragment = template.content;\n const uuid = getUUID();\n let fragmentInfo: IFragmentInfo | null = null;\n\n // Determine childForPath for shorthand expansion\n const childForPath = bindingType === \"for\"\n ? parseBindTextResult.statePathName\n : forPath;\n\n if (bindingType === \"else\") {\n // check last 'if' or 'elseif' fragment info\n if (lastIfFragmentInfo === null) {\n raiseError(`'else' binding found without preceding 'if' or 'elseif' binding.`);\n }\n // else condition\n parseBindTextResult = cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult);\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n if (typeof lastElseFragmentInfo !== \"undefined\") {\n template.remove();\n lastElseFragmentInfo.fragment.appendChild(placeHolder);\n lastElseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(placeHolder),\n parseBindTextResults: getParseBindTextResults(placeHolder),\n });\n } else {\n template.replaceWith(placeHolder);\n }\n } else if (bindingType === \"elseif\") {\n // check last 'if' or 'elseif' fragment info\n if (lastIfFragmentInfo === null) {\n raiseError(`'elseif' binding found without preceding 'if' or 'elseif' binding.`);\n }\n\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n\n // create else fragment\n const elseUUID = getUUID();\n const elseFragmentInfo: IFragmentInfo = {\n fragment: document.createDocumentFragment(),\n parseBindTextResult: cloneNotParseBindTextResult(\"else\", lastIfFragmentInfo.parseBindTextResult),\n nodeInfos: [],\n };\n elseFragmentInfo.fragment.appendChild(placeHolder);\n elseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(placeHolder),\n parseBindTextResults: getParseBindTextResults(placeHolder),\n });\n setFragmentInfoByUUID(elseUUID, rootNode, elseFragmentInfo);\n const lastElseFragmentInfo = elseFragmentInfos.at(-1);\n elseFragmentInfos.push(elseFragmentInfo);\n const elsePlaceHolder = document.createComment(`@@${elseKeyword}:${elseUUID}`);\n\n if (typeof lastElseFragmentInfo !== \"undefined\") {\n template.remove();\n lastElseFragmentInfo.fragment.appendChild(elsePlaceHolder);\n lastElseFragmentInfo.nodeInfos.push({\n nodePath: getNodePath(elsePlaceHolder),\n parseBindTextResults: getParseBindTextResults(elsePlaceHolder),\n });\n } else {\n template.replaceWith(elsePlaceHolder);\n }\n\n } else {\n fragmentInfo = _getFragmentInfo(rootNode, fragment, parseBindTextResult, childForPath);\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n const placeHolder = document.createComment(`@@${keyword}:${uuid}`);\n template.replaceWith(placeHolder);\n }\n\n // Update lastIfFragmentInfo for if/elseif/else chaining\n if (bindingType === \"if\") {\n elseFragmentInfos.length = 0; // start new if chain\n lastIfFragmentInfo = fragmentInfo;\n } else if (bindingType === \"elseif\") {\n lastIfFragmentInfo = fragmentInfo;\n } else if (bindingType === \"else\") {\n lastIfFragmentInfo = null;\n elseFragmentInfos.length = 0; // end if chain\n }\n }\n}\n","import { State } from \"./components/State\";\nimport { IStateElement } from \"./components/types\";\nimport { config } from \"./config\";\n\nexport async function waitForStateInitialize(root: Document | Element | DocumentFragment): Promise<void> {\n const elements = root.querySelectorAll(config.tagNames.state);\n const promises: Promise<void>[] = [];\n await customElements.whenDefined(config.tagNames.state);\n for(const element of elements) {\n const stateElement = element as State as IStateElement;\n promises.push(stateElement.initializePromise);\n }\n await Promise.all(promises);\n}\n","import { waitInitializeBinding } from \"./bindings/initializeBindingPromiseByNode\";\nimport { initializeBindings } from \"./bindings/initializeBindings\";\nimport { config } from \"./config\";\nimport { convertMustacheToComments } from \"./mustache/convertMustacheToComments\";\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\n\nexport async function buildBindings(root: Document | ShadowRoot): Promise<void> {\n if (root === document) {\n // document配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\n await waitForStateInitialize(document);\n // baindingを取得して、初期値をセットする\n convertMustacheToComments(document);\n collectStructuralFragments(document, document);\n initializeBindings(document.body, null);\n } else {\n const shadowRoot = root as ShadowRoot;\n if (shadowRoot.host.hasAttribute(config.bindAttributeName)) {\n // data-wcsを持つWebComponentは、WebComponentのbindingが完了するまで待機する。\n await waitInitializeBinding(shadowRoot.host);\n }\n // shadowRoot配下のwcs-stateの初期化(connectedCallbackの完了)を待機する\n await waitForStateInitialize(shadowRoot);\n // baindingを取得して、初期値をセットする\n convertMustacheToComments(shadowRoot);\n collectStructuralFragments(shadowRoot, shadowRoot);\n initializeBindings(shadowRoot, null);\n }\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nexport const VERSION = pkg.version;\n","/**\n * Browser builds use the native HTMLElement. Headless runtimes receive an\n * inert base so the public module can be imported without installing DOM\n * globals; constructing components remains a browser-only operation.\n */\nexport const HTMLElementBase = (\n typeof HTMLElement === \"undefined\" ? class {} : HTMLElement\n) as typeof HTMLElement;\n","import { config } from \"../config\";\nimport { IState } from \"../types\";\nimport { VERSION } from \"../version\";\nimport { getAllFragmentUUIDs, getFragmentInfoByUUID } from \"../structural/fragmentInfoByUUID\";\nimport { getAllSsrPropertyNodes, getSsrProperties, clearSsrPropertyStore } from \"../apply/ssrPropertyStore\";\nimport { HTMLElementBase } from \"../platform/HTMLElementBase\";\n\nexport interface ISsrElement {\n readonly name: string;\n readonly version: string;\n readonly stateData: IState;\n readonly templates: Map<string, HTMLTemplateElement>;\n readonly hydrateProps: Record<string, Record<string, unknown>>;\n getTemplate(uuid: string): HTMLTemplateElement | null;\n verifyVersion(): boolean;\n}\n\n// SSR コメントパターン\nconst SSR_PLACEHOLDER_COMMENT = /^@@wcs-(?:for|if|elseif|else):[^-]/;\nconst SSR_BLOCK_START = /^@@wcs-(for|if|elseif|else)-start:(.+)$/;\nconst SSR_BLOCK_END = /^@@wcs-(for|if|elseif|else)-end:(.+)$/;\nconst SSR_TEXT_START = /^@@wcs-text-start:(.+)$/;\n\nexport {\n SSR_PLACEHOLDER_COMMENT,\n SSR_BLOCK_START,\n SSR_BLOCK_END,\n SSR_TEXT_START,\n};\n\n/**\n * script 要素へ埋め込む JSON を HTML パーサから保護する。\n * HTML 直列化時、script の中身は生のまま出力されるため、state 値に\n * \"</script>\" や \"<!--\" を含む文字列があると script を脱出できてしまう。\n * \"<\" \">\" \"&\" と U+2028/U+2029 を JSON の \\uXXXX エスケープへ置換する\n * (JSON.parse では元の文字列と等価に復元される)。\n */\nfunction escapeJsonForScript(json: string): string {\n return json\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nexport class Ssr extends HTMLElementBase implements ISsrElement {\n private _stateData: IState | null = null;\n private _templates: Map<string, HTMLTemplateElement> | null = null;\n private _hydrateProps: Record<string, Record<string, unknown>> | null = null;\n\n get name(): string {\n return this.getAttribute('name') || 'default';\n }\n\n get version(): string {\n return this.getAttribute('version') || '';\n }\n\n get stateData(): IState {\n if (this._stateData === null) {\n this._stateData = this._loadStateData();\n }\n return this._stateData;\n }\n\n get templates(): Map<string, HTMLTemplateElement> {\n if (this._templates === null) {\n this._templates = this._loadTemplates();\n }\n return this._templates;\n }\n\n get hydrateProps(): Record<string, Record<string, unknown>> {\n if (this._hydrateProps === null) {\n this._hydrateProps = this._loadHydrateProps();\n }\n return this._hydrateProps;\n }\n\n getTemplate(uuid: string): HTMLTemplateElement | null {\n return this.templates.get(uuid) ?? null;\n }\n\n /**\n * サーバーの SSR バージョンとクライアントの state バージョンを検証する。\n * メジャー・マイナーバージョンが一致すればtrue。\n * version 属性がない場合は検証スキップ(true)。\n */\n verifyVersion(): boolean {\n const serverVersion = this.version;\n if (!serverVersion) return true;\n const serverParts = serverVersion.split('.');\n const clientParts = VERSION.split('.');\n // メジャー・マイナーが一致すれば互換\n return serverParts[0] === clientParts[0] && serverParts[1] === clientParts[1];\n }\n\n setStateData(data: IState): void {\n this._stateData = data;\n }\n\n setHydrateProps(props: Record<string, Record<string, unknown>>): void {\n this._hydrateProps = props;\n }\n\n private _loadStateData(): IState {\n const script = this.querySelector(\n `script[type=\"application/json\"]:not([data-wcs-ssr-props])`\n );\n if (!script) return {};\n try {\n return JSON.parse(script.textContent || '{}');\n } catch {\n return {};\n }\n }\n\n private _loadTemplates(): Map<string, HTMLTemplateElement> {\n const map = new Map<string, HTMLTemplateElement>();\n const templates = this.querySelectorAll<HTMLTemplateElement>('template[id]');\n for (const tpl of templates) {\n const id = tpl.getAttribute('id');\n if (id) {\n map.set(id, tpl);\n }\n }\n return map;\n }\n\n private _loadHydrateProps(): Record<string, Record<string, unknown>> {\n const script = this.querySelector('script[data-wcs-ssr-props]');\n if (!script) return {};\n try {\n return JSON.parse(script.textContent || '{}');\n } catch {\n return {};\n }\n }\n\n static findByName(root: Node, name: string): ISsrElement | null {\n const tagName = config.tagNames.ssr;\n const parentEl = root instanceof Element\n ? root\n : root instanceof Document\n ? root.documentElement\n : null;\n if (!parentEl) return null;\n const el = parentEl.querySelector(`${tagName}[name=\"${name}\"]`);\n return el as ISsrElement | null;\n }\n\n /**\n * stateData と構造テンプレート・プロパティから <wcs-ssr> の中身を構築する。\n * server パッケージの renderToString から呼ばれる。\n */\n /**\n * wcs-state 要素から $ プレフィックスや関数を除いたデータを抽出する。\n */\n static extractStateData(stateEl: Element): Record<string, any> {\n const raw = (stateEl as any).__state;\n if (!raw || typeof raw !== 'object') return {};\n const data: Record<string, any> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (!key.startsWith('$') && typeof value !== 'function') {\n data[key] = value;\n }\n }\n return data;\n }\n\n static buildContent(ssrEl: Element, stateData: Record<string, any>): void {\n // 初期データ JSON\n const jsonScript = document.createElement('script');\n jsonScript.setAttribute('type', 'application/json');\n jsonScript.textContent = escapeJsonForScript(JSON.stringify(stateData));\n ssrEl.appendChild(jsonScript);\n\n // UUID で管理されているテンプレートを復元して格納\n const uuids = getAllFragmentUUIDs();\n for (const uuid of uuids) {\n const fragmentInfo = getFragmentInfoByUUID(uuid);\n if (!fragmentInfo) continue;\n\n const tpl = document.createElement('template');\n tpl.setAttribute('id', uuid);\n\n const bindResult = fragmentInfo.parseBindTextResult;\n const bindText = bindResult.bindingType === 'else'\n ? 'else:'\n : `${bindResult.bindingType}: ${bindResult.statePathName}`;\n tpl.setAttribute(config.bindAttributeName, bindText);\n\n const content = fragmentInfo.fragment.cloneNode(true) as DocumentFragment;\n tpl.content.appendChild(content);\n\n ssrEl.appendChild(tpl);\n }\n\n // 属性で代替不可なプロパティをハイドレーション用に格納\n const ssrNodes = getAllSsrPropertyNodes();\n if (ssrNodes.length > 0) {\n const propsData: Record<string, Record<string, unknown>> = {};\n for (let i = 0; i < ssrNodes.length; i++) {\n const node = ssrNodes[i];\n const entries = getSsrProperties(node);\n if (entries.length === 0) continue;\n const id = `wcs-ssr-${i}`;\n (node as Element).setAttribute('data-wcs-ssr-id', id);\n const props: Record<string, unknown> = {};\n for (const entry of entries) {\n props[entry.propName] = entry.value;\n }\n propsData[id] = props;\n }\n if (Object.keys(propsData).length > 0) {\n const propsScript = document.createElement('script');\n propsScript.setAttribute('type', 'application/json');\n propsScript.setAttribute('data-wcs-ssr-props', '');\n propsScript.textContent = escapeJsonForScript(JSON.stringify(propsData));\n ssrEl.appendChild(propsScript);\n }\n }\n\n clearSsrPropertyStore();\n }\n\n /**\n * SSR ブロック境界コメント (@@wcs-*-start/end) を除去する\n */\n static removeBlockBoundaryComments(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const toRemove: Comment[] = [];\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (SSR_BLOCK_START.test(comment.data) || SSR_BLOCK_END.test(comment.data)) {\n toRemove.push(comment);\n }\n }\n for (const comment of toRemove) {\n comment.remove();\n }\n }\n\n /**\n * SSR の構造プレースホルダーコメント (@@wcs-for:uuid 等) を除去する\n */\n static removeStructuralComments(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const toRemove: Comment[] = [];\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\n toRemove.push(comment);\n }\n }\n for (const comment of toRemove) {\n comment.remove();\n }\n }\n\n /**\n * SSR テキストバインディングコメントを復元する。\n * <!--@@wcs-text-start:path-->text<!--@@wcs-text-end:path-->\n * → <!--@@: path--> (バインディングシステムが認識する形式)\n */\n static restoreTextBindings(root: Node): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const startComments: { comment: Comment, path: string }[] = [];\n\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n const match = SSR_TEXT_START.exec(comment.data);\n if (match) {\n startComments.push({ comment, path: match[1] });\n }\n }\n\n for (const { comment, path } of startComments) {\n const bindComment = document.createComment(`@@: ${path}`);\n comment.parentNode!.insertBefore(bindComment, comment);\n\n let sibling: Node | null = comment.nextSibling;\n comment.remove();\n\n const endPattern = `@@wcs-text-end:${path}`;\n while (sibling) {\n const next: Node | null = sibling.nextSibling;\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n sibling.parentNode!.removeChild(sibling);\n break;\n }\n sibling.parentNode!.removeChild(sibling);\n sibling = next;\n }\n }\n }\n\n /**\n * SSR DOM をクリーンアップし、buildBindings が動作できる状態に戻す。\n * バージョン不一致時のフォールバック用。\n *\n * 1. SSR ブロック境界コメント間のレンダリング済みノードを除去\n * 2. SSR テキストバインディングを @@: 形式に復元\n * 3. プレースホルダーコメントを <wcs-ssr> 内のテンプレートで差し替え\n * 4. data-wcs-ssr-id 属性を除去\n * 5. <wcs-ssr> を除去\n */\n static cleanupDom(root: Document): void {\n const body = document.body;\n\n // <wcs-ssr> からテンプレート UUID マップを構築(カスタム要素未定義でも動作するよう DOM 直接走査)\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\n const templateByUuid = new Map<string, HTMLTemplateElement>();\n for (const ssrNode of ssrElements) {\n const templates = ssrNode.querySelectorAll<HTMLTemplateElement>('template[id]');\n for (const tpl of templates) {\n const id = tpl.getAttribute('id');\n if (id) {\n templateByUuid.set(id, tpl);\n }\n }\n }\n\n // SSR ブロック境界コメント間のレンダリング済みノードと境界コメントを除去\n const walker1 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\n const startComments: Comment[] = [];\n while (walker1.nextNode()) {\n const comment = walker1.currentNode as Comment;\n if (SSR_BLOCK_START.test(comment.data)) {\n startComments.push(comment);\n }\n }\n for (const startComment of startComments) {\n const match = SSR_BLOCK_START.exec(startComment.data)!;\n const type = match[1];\n const info = match[2];\n const endPattern = `@@wcs-${type}-end:${info}`;\n let sibling = startComment.nextSibling;\n while (sibling) {\n const next = sibling.nextSibling;\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n sibling.remove();\n break;\n }\n sibling.remove();\n sibling = next;\n }\n startComment.remove();\n }\n\n // SSR テキストバインディングを @@: 形式に復元\n Ssr.restoreTextBindings(body);\n\n // プレースホルダーコメント (@@wcs-for:uuid 等) をテンプレートに差し替え\n const walker2 = document.createTreeWalker(body, NodeFilter.SHOW_COMMENT);\n const placeholders: { comment: Comment, uuid: string }[] = [];\n while (walker2.nextNode()) {\n const comment = walker2.currentNode as Comment;\n if (SSR_PLACEHOLDER_COMMENT.test(comment.data)) {\n const uuid = comment.data.split(':')[1];\n placeholders.push({ comment, uuid });\n }\n }\n for (const { comment, uuid } of placeholders) {\n const tpl = templateByUuid.get(uuid);\n if (tpl) {\n const restored = document.createElement('template') as HTMLTemplateElement;\n const bindAttr = tpl.getAttribute(config.bindAttributeName);\n if (bindAttr) restored.setAttribute(config.bindAttributeName, bindAttr);\n const imported = document.importNode(tpl.content, true);\n if (imported.childNodes.length > 0) {\n restored.content.appendChild(imported);\n } else {\n for (const child of Array.from(tpl.childNodes)) {\n restored.content.appendChild(document.importNode(child, true));\n }\n }\n comment.parentNode!.replaceChild(restored, comment);\n }\n }\n\n // data-wcs-ssr-id 属性を除去\n const ssrIdElements = root.querySelectorAll('[data-wcs-ssr-id]');\n for (const el of ssrIdElements) {\n el.removeAttribute('data-wcs-ssr-id');\n }\n\n // <wcs-ssr> を除去\n for (const el of ssrElements) {\n el.remove();\n }\n }\n}\n","import { getAbsoluteStateAddressByBinding } from \"./binding/getAbsoluteStateAddressByBinding\";\nimport { setLastListValueByAbsoluteStateAddress } from \"./list/lastListValueByAbsoluteStateAddress\";\nimport { parseBindTextsForElement } from \"./bindTextParser/parseBindTextsForElement\";\nimport { ParseBindTextResult } from \"./bindTextParser/types\";\nimport { BindingSession, getOrCreateBindingSession } from \"./bindings/BindingSession\";\nimport { collectNodesAndBindingInfos } from \"./bindings/collectNodesAndBindingInfos\";\nimport { setBindingsByContent } from \"./bindings/bindingsByContent\";\nimport { setBindingSessionByContent } from \"./bindings/bindingSessionByContent\";\nimport { setIndexBindingsByContent } from \"./bindings/indexBindingsByContent\";\nimport { setNodesByContent } from \"./bindings/nodesByContent\";\nimport { bindLoopContextToContent } from \"./bindings/bindLoopContextToContent\";\nimport { config } from \"./config\";\nimport { WILDCARD, INDEX_BY_INDEX_NAME } from \"./define\";\nimport { Ssr, SSR_BLOCK_START } from \"./components/Ssr\";\nimport { getStateElementByName } from \"./stateElementByName\";\nimport { setLoopContextByNode } from \"./list/loopContextByNode\";\nimport { applyChangeFromBindings } from \"./apply/applyChangeFromBindings\";\nimport { hydrateSetContent, hydrateSetLastNode } from \"./apply/applyChangeToFor\";\nimport { waitForStateInitialize } from \"./waitForStateInitialize\";\nimport { setFragmentInfoByUUID, getFragmentInfoByUUID } from \"./structural/fragmentInfoByUUID\";\nimport { setContentByNode } from \"./structural/contentsByNode\";\nimport { createContentFromNodes } from \"./structural/createContent\";\nimport { collectStructuralFragments } from \"./structural/collectStructuralFragments\";\nimport { createNotFilter } from \"./structural/createNotFilter\";\nimport { getFragmentNodeInfos } from \"./structural/getFragmentNodeInfos\";\nimport { optimizeFragment } from \"./structural/optimizeFragment\";\nimport { expandShorthandPaths } from \"./structural/expandShorthandPaths\";\nimport { createListIndex } from \"./list/createListIndex\";\nimport { IListIndex } from \"./list/types\";\nimport { setListIndexesByList } from \"./list/listIndexesByList\";\nimport { getPathInfo } from \"./address/PathInfo\";\nimport { createStateAddress } from \"./address/StateAddress\";\nimport { IBindingInfo } from \"./types\";\nimport { VERSION } from \"./version\";\n\n// ハイドレーション時にスキップするバインディングタイプ\nconst STRUCTURAL_TYPES = new Set(['for', 'if', 'elseif', 'else']);\n\n\ninterface ISsrBlock {\n type: string; // for, if, elseif, else\n uuid: string;\n path: string;\n index: number | null; // for のみ\n nodes: Node[]; // start〜end 間のノード\n}\n\n/**\n * SSR ブロック境界コメントを走査して、start〜end 間のノードを収集する\n */\nfunction collectSsrBlocks(root: Node): ISsrBlock[] {\n const blocks: ISsrBlock[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n const startComments: Comment[] = [];\n\n // まず全コメントを収集\n while (walker.nextNode()) {\n startComments.push(walker.currentNode as Comment);\n }\n\n for (const comment of startComments) {\n const startMatch = SSR_BLOCK_START.exec(comment.data);\n if (!startMatch) continue;\n\n const type = startMatch[1];\n const info = startMatch[2]; // \"uuid:path:index\" or \"uuid:path\"\n const parts = info.split(':');\n\n let uuid: string;\n let path: string;\n let index: number | null = null;\n\n if (type === 'for') {\n // uuid:path:index\n uuid = parts[0];\n path = parts[1];\n index = parseInt(parts[2], 10);\n } else {\n // uuid:path\n uuid = parts[0];\n path = parts.slice(1).join(':');\n }\n\n // start と end の間のノードを収集\n const nodes: Node[] = [];\n let sibling = comment.nextSibling;\n const endPattern = `@@wcs-${type}-end:${info}`;\n while (sibling) {\n if (sibling.nodeType === Node.COMMENT_NODE && (sibling as Comment).data === endPattern) {\n break;\n }\n nodes.push(sibling);\n sibling = sibling.nextSibling;\n }\n\n blocks.push({ type, uuid, path, index, nodes });\n }\n\n return blocks;\n}\n\n/**\n * live DOM ノード群からバインディングを収集する。\n * ノードを一時的に DocumentFragment に移動して collectNodesAndBindingInfos を実行し、\n * 元の位置に戻す。\n */\nfunction collectBindingsFromLiveNodes(\n nodes: Node[],\n): { bindingInfos: IBindingInfo[], subscriberNodes: Node[], bindingSession: BindingSession } {\n const bindingSession = new BindingSession();\n if (nodes.length === 0) {\n return { bindingInfos: [], subscriberNodes: [], bindingSession };\n }\n\n // ノードの元の位置を記録\n const parent = nodes[0].parentNode;\n const nextSibling = nodes[nodes.length - 1].nextSibling;\n\n // 一時的に wrapper 要素に移動(collectNodesAndBindingInfos は Element を受け付ける)\n const wrapper = document.createElement('div');\n for (const node of nodes) {\n wrapper.appendChild(node);\n }\n\n // バインディング収集\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(wrapper);\n\n const bindingInfos = bindingSession.initialize(allBindings, {\n registerAddress: false,\n applyOnReconnect: false,\n });\n\n // 元の位置に戻す\n if (parent) {\n while (wrapper.firstChild) {\n parent.insertBefore(wrapper.firstChild, nextSibling);\n }\n }\n\n return {\n bindingInfos,\n subscriberNodes,\n bindingSession,\n };\n}\n\n/**\n * SSR ブロックの DOM ノードを Content 化し、バインディングを登録する。\n */\nfunction hydrateBlocks(root: Node, blocks: ISsrBlock[]): void {\n // for ブロックの listIndex を UUID ごとに収集\n const listIndexesByUuid: Map<string, IListIndex[]> = new Map();\n\n for (const block of blocks) {\n if (block.nodes.length === 0) continue;\n\n const content = createContentFromNodes(block.nodes);\n\n // Content のバインディングを収集\n const { bindingInfos, subscriberNodes, bindingSession } = collectBindingsFromLiveNodes(block.nodes);\n setBindingSessionByContent(content, bindingSession);\n\n // Content 内のノードに data-wcs-completed を付与\n // (メインの collectNodesAndBindingInfos で重複登録されないようにする)\n for (const node of subscriberNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n (node as Element).setAttribute('data-wcs-completed', '');\n }\n }\n setBindingsByContent(content, bindingInfos);\n setNodesByContent(content, subscriberNodes);\n\n const indexBindings: IBindingInfo[] = [];\n for (const binding of bindingInfos) {\n if (binding.statePathName in INDEX_BY_INDEX_NAME) {\n indexBindings.push(binding);\n }\n }\n setIndexBindingsByContent(content, indexBindings);\n\n if (block.type === 'for' && block.index !== null) {\n const placeholderComment = findPlaceholderComment(root, 'for', block.uuid);\n if (placeholderComment) {\n const listIndex = createListIndex(null, block.index);\n hydrateSetContent(placeholderComment, listIndex, content);\n const lastNode = block.nodes[block.nodes.length - 1];\n hydrateSetLastNode(placeholderComment, lastNode);\n setContentByNode(placeholderComment, content);\n\n // ループコンテキストをバインドし、バインディングをアドレスに登録\n const pathInfo = getPathInfo(block.path + '.' + WILDCARD);\n const stateAddress = createStateAddress(pathInfo, listIndex);\n // ILoopContext は IStateAddress + listIndex なので、stateAddress をそのまま使う\n bindLoopContextToContent(content, stateAddress as any);\n\n bindingSession.initialize(bindingInfos, {\n registerAddress: true,\n registerPathInfo: false,\n applyOnReconnect: false,\n });\n\n // listIndex を UUID ごとに収集(後で setListIndexesByList に渡す)\n let indexes = listIndexesByUuid.get(block.uuid);\n if (!indexes) {\n indexes = [];\n listIndexesByUuid.set(block.uuid, indexes);\n }\n indexes.push(listIndex);\n }\n } else {\n const placeholderComment = findPlaceholderComment(root, block.type, block.uuid);\n if (placeholderComment) {\n setContentByNode(placeholderComment, content);\n\n bindingSession.initialize(bindingInfos, {\n registerAddress: true,\n registerPathInfo: false,\n applyOnReconnect: false,\n });\n }\n }\n }\n\n // for ブロックの listIndex を state のリスト値に紐づける\n for (const [uuid, indexes] of listIndexesByUuid) {\n const placeholderComment = findPlaceholderComment(root, 'for', uuid);\n if (!placeholderComment) continue;\n // state から現在のリスト値を取得して listIndexes を設定\n const rootNode = placeholderComment.getRootNode() as Node;\n // structuralBindings はまだ登録前なので、getParseBindTextResults を直接使う\n const fragmentInfo = getFragmentInfoByUUID(uuid);\n if (!fragmentInfo) continue;\n const stateName = fragmentInfo.parseBindTextResult.stateName;\n const statePathName = fragmentInfo.parseBindTextResult.statePathName;\n const stateElement = getStateElementByName(rootNode, stateName);\n if (!stateElement) continue;\n stateElement.createState(\"readonly\", (state) => {\n const list = state[statePathName];\n if (Array.isArray(list)) {\n setListIndexesByList(list, indexes);\n }\n });\n }\n}\n\nfunction findPlaceholderComment(root: Node, type: string, uuid: string): Comment | null {\n const keywordMap: Record<string, string> = {\n 'for': config.commentForPrefix,\n 'if': config.commentIfPrefix,\n 'elseif': config.commentElseIfPrefix,\n 'else': config.commentElsePrefix,\n };\n const keyword = keywordMap[type];\n if (!keyword) return null;\n\n const pattern = `@@${keyword}:${uuid}`;\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n if (comment.data === pattern) {\n return comment;\n }\n }\n return null;\n}\n\n/**\n * <wcs-ssr> 内のテンプレートを fragmentInfoByUUID に復帰させる。\n */\nfunction restoreFragments(root: Document, ssrEl: Ssr): void {\n const rootNode = root as Node;\n let lastIfParseResult: ParseBindTextResult | null = null;\n\n for (const [uuid, tpl] of ssrEl.templates) {\n const bindText = tpl.getAttribute(config.bindAttributeName) || '';\n const parseBindTextResults = parseBindTextsForElement(bindText);\n let parseBindTextResult = parseBindTextResults[0];\n const bindingType = parseBindTextResult.bindingType;\n\n // else: 直前の if 条件の not → 条件反転\n // elseif: 独自条件を持つが stateName は if から引き継ぐ\n if (bindingType === 'else' && lastIfParseResult) {\n parseBindTextResult = {\n ...lastIfParseResult,\n outFilters: [...lastIfParseResult.outFilters, createNotFilter()],\n bindingType: 'else',\n };\n } else if (bindingType === 'elseif' && lastIfParseResult) {\n parseBindTextResult = {\n ...parseBindTextResult,\n stateName: lastIfParseResult.stateName,\n };\n }\n\n // if chain の追跡\n if (bindingType === 'if') {\n lastIfParseResult = parseBindTextResult;\n } else if (bindingType === 'elseif') {\n lastIfParseResult = parseBindTextResult;\n } else if (bindingType === 'else') {\n lastIfParseResult = null;\n }\n\n const fragment = document.importNode(tpl.content, true);\n const forPath = bindingType === \"for\" ? parseBindTextResult.statePathName : undefined;\n optimizeFragment(fragment);\n if (typeof forPath === \"string\") {\n expandShorthandPaths(fragment, forPath);\n }\n collectStructuralFragments(rootNode, fragment, forPath);\n\n const fragmentInfo = {\n fragment,\n parseBindTextResult,\n nodeInfos: getFragmentNodeInfos(fragment),\n };\n setFragmentInfoByUUID(uuid, rootNode, fragmentInfo);\n }\n}\n\n/**\n * SSR ハイドレーション用バインディング初期化。\n * バージョン不一致時は DOM をクリーンアップして false を返す\n * (呼び出し元で buildBindings にフォールバック)。\n */\nexport async function hydrateBindings(root: Document): Promise<boolean> {\n await waitForStateInitialize(root);\n\n // バージョン検証\n const ssrElements = root.querySelectorAll(config.tagNames.ssr);\n for (const ssrNode of ssrElements) {\n const ssrEl = ssrNode as Ssr;\n if (!ssrEl.verifyVersion()) {\n console.warn(\n `[@wcstack/state] SSR version mismatch: server=\"${ssrEl.version}\", client=\"${VERSION}\". Falling back to full render.`\n );\n Ssr.cleanupDom(root);\n return false;\n }\n }\n\n // <wcs-ssr> からテンプレートを fragmentInfoByUUID に復帰\n for (const ssrNode of ssrElements) {\n restoreFragments(root, ssrNode as Ssr);\n }\n\n // SSR ブロック境界コメントから既存 DOM を Content 化\n const blocks = collectSsrBlocks(document.body);\n hydrateBlocks(document.body, blocks);\n\n // ブロック境界コメント (start/end) を除去\n Ssr.removeBlockBoundaryComments(document.body);\n\n // <wcs-ssr> を一時除去(バインディング走査に含めない)\n const ssrParents: { el: Element, parent: Node, next: Node | null }[] = [];\n for (const el of ssrElements) {\n if (el.parentNode) {\n ssrParents.push({ el, parent: el.parentNode, next: el.nextSibling });\n el.remove();\n }\n }\n\n // 構造プレースホルダーコメント (@@wcs-for:uuid 等) は残す\n // → バインディング走査で拾われ、状態変化時の再レンダリングに使われる\n\n // SSR テキストバインディングを @@: 形式に復元\n Ssr.restoreTextBindings(document.body);\n\n // ノードとバインディングを収集\n const [subscriberNodes, allBindings] = collectNodesAndBindingInfos(document.body);\n\n // 収集完了したノードに data-wcs-completed 属性を付与\n // for ブロック内ノード(hydrateBlocks で登録済み)にはループコンテキストをリセットしない\n for (const node of subscriberNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n if (!el.hasAttribute('data-wcs-completed')) {\n setLoopContextByNode(node, null);\n el.setAttribute('data-wcs-completed', '');\n }\n } else {\n // コメントノード等\n setLoopContextByNode(node, null);\n }\n }\n\n // バインディングを構造系とそれ以外に分離\n const normalBindings: IBindingInfo[] = [];\n const structuralBindings: IBindingInfo[] = [];\n const bindingSession = getOrCreateBindingSession(document.body);\n const initializedBindings = bindingSession.initialize(allBindings);\n\n for (const binding of initializedBindings) {\n if (binding.bindingType === \"event\") continue;\n if (STRUCTURAL_TYPES.has(binding.bindingType)) {\n structuralBindings.push(binding);\n } else if (binding.statePathName.includes(WILDCARD)) {\n // for ブロック内のバインディング → Content のバインディングとして登録済み\n continue;\n } else {\n normalBindings.push(binding);\n }\n }\n\n // for バインディングの lastListValue を初期値として設定\n // (次回の状態変化時に差分計算の基準になる)\n for (const binding of structuralBindings) {\n if (binding.bindingType === 'for') {\n const absAddr = getAbsoluteStateAddressByBinding(binding);\n const rootNode = binding.replaceNode.getRootNode() as Node;\n const stateElement = getStateElementByName(rootNode, binding.stateName);\n if (stateElement) {\n stateElement.createState(\"readonly\", (state) => {\n const value = state[binding.statePathName];\n if (Array.isArray(value)) {\n setLastListValueByAbsoluteStateAddress(absAddr, value);\n }\n });\n }\n }\n }\n\n // 通常バインディングのみ初回値適用(構造バインディングはSSR描画済み)\n applyChangeFromBindings(normalBindings);\n\n // <wcs-ssr> を元に戻す\n for (const { el, parent, next } of ssrParents) {\n parent.insertBefore(el, next);\n }\n\n // hydrateProps 復元\n const restoredSsrElements = root.querySelectorAll(config.tagNames.ssr);\n for (const ssrNode of restoredSsrElements) {\n const ssrEl = ssrNode as Ssr;\n const props = ssrEl.hydrateProps;\n for (const [id, propMap] of Object.entries(props)) {\n const target = root.querySelector(`[data-wcs-ssr-id=\"${id}\"]`);\n if (!target) continue;\n for (const [propName, value] of Object.entries(propMap)) {\n (target as any)[propName] = value;\n }\n }\n }\n\n // ハイドレーション中の重複登録防止用属性を除去\n const completedEls = root.querySelectorAll('[data-wcs-completed]');\n for (const el of completedEls) {\n el.removeAttribute('data-wcs-completed');\n }\n\n return true;\n}\n\n/** @internal テスト用 */\nexport const __test = {\n collectSsrBlocks,\n collectBindingsFromLiveNodes,\n hydrateBlocks,\n findPlaceholderComment,\n restoreFragments,\n};\n","import { buildBindings } from \"./buildBindings\";\nimport { hydrateBindings } from \"./hydrateBindings\";\nimport { IStateElement } from \"./components/types\";\nimport { config, inSsr } from \"./config\";\nimport { raiseError } from \"./raiseError\";\nimport { devtoolsSink } from \"./devtools/sink\";\n\nconst stateElementByNameByNode: WeakMap<Node, Map<string, IStateElement>> = new WeakMap();\nconst bindingsReadyByNode: WeakMap<Node, Promise<void>> = new WeakMap();\n\n// devtools 用の列挙可能な登録簿(protocol §4.1 — 唯一の常時 ON 台帳)。\n// サイズは <wcs-state> 要素数に拘束され、unregister(disconnectedCallback)で\n// 必ず削除されるためリークしない。\nconst liveStateElements: Set<IStateElement> = new Set();\n\nexport function getLiveStateElements(): ReadonlySet<IStateElement> {\n return liveStateElements;\n}\n\nexport function getStateElementByName(rootNode:Node, name: string): IStateElement | null {\n let stateElementByName = stateElementByNameByNode.get(rootNode);\n if (!stateElementByName) {\n return null;\n }\n return stateElementByName.get(name) || null;\n}\n\n/**\n * 指定された rootNode のバインディング初期化が完了するまで待機する Promise を返す。\n */\nexport function getBindingsReady(rootNode: Node): Promise<void> {\n return bindingsReadyByNode.get(rootNode) ?? Promise.resolve();\n}\n\nexport function setStateElementByName(rootNode:Node, name: string, element: IStateElement | null): void {\n\n let stateElementByName = stateElementByNameByNode.get(rootNode);\n\n if (element === null) {\n // 削除の場合、Mapが存在しない場合は何もしない\n if (!stateElementByName) {\n return;\n }\n const removed = stateElementByName.get(name);\n stateElementByName.delete(name);\n if (stateElementByName.size === 0) {\n stateElementByNameByNode.delete(rootNode);\n }\n if (removed !== undefined) {\n liveStateElements.delete(removed);\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:element-unregistered\", name, rootNode, element: removed });\n }\n }\n if (config.debug) {\n console.debug(`State element unregistered: name=\"${name}\"`);\n }\n } else {\n // 登録の場合\n if (!stateElementByName) {\n stateElementByName = new Map<string, IStateElement>();\n stateElementByNameByNode.set(rootNode, stateElementByName);\n // 初めてルートノードに登録する場合\n // enable-ssr 属性があり、サーバーサイドでない場合はハイドレーション\n const enableSsr = !inSsr() && (element as unknown as Element).hasAttribute?.('enable-ssr');\n if (rootNode.constructor.name === 'HTMLDocument' || rootNode.constructor.name === 'Document') {\n const ready = new Promise<void>((resolve) => {\n queueMicrotask(async () => {\n if (enableSsr) {\n const success = await hydrateBindings(rootNode as Document);\n if (!success) {\n await buildBindings(rootNode as Document);\n }\n } else {\n await buildBindings(rootNode as Document);\n }\n resolve();\n });\n });\n bindingsReadyByNode.set(rootNode, ready);\n } else if (rootNode.constructor.name === 'ShadowRoot') {\n const ready = new Promise<void>((resolve) => {\n queueMicrotask(async () => {\n await buildBindings(rootNode as ShadowRoot);\n resolve();\n });\n });\n bindingsReadyByNode.set(rootNode, ready);\n }\n }\n if (stateElementByName.has(name)) {\n raiseError(`State element with name \"${name}\" is already registered.`);\n }\n stateElementByName.set(name, element);\n liveStateElements.add(element);\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:element-registered\", name, rootNode, element });\n }\n if (config.debug) {\n console.debug(`State element registered: name=\"${name}\"`, element);\n }\n }\n}\n","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { applyChangeFromBindings } from \"../apply/applyChangeFromBindings\";\nimport { peekBindingsForAddress } from \"../binding/getBindingSetByAbsoluteStateAddress\";\nimport { MAX_PROPAGATION_HOPS } from \"../define\";\nimport { devtoolsSink } from \"../devtools/sink\";\nimport { IPropagationContext } from \"../propagation/types\";\nimport { IBindingInfo } from \"../types\";\n\n/**\n * drain(_applyChange)終了通知のリスナー(docs/state-streams-design.md §3-2)。\n * バッチ内の更新アドレス(AbsoluteStateAddress のインスタンス同一性で\n * dedup 済みの Set)を受け取る。stream runtime の依存駆動 restart が\n * この通知を交差判定の入力にする。\n */\nexport type UpdateBatchListener = (batch: ReadonlySet<IAbsoluteStateAddress>) => void;\n\nconst updateBatchListeners: Set<UpdateBatchListener> = new Set();\n\n/**\n * drain 終了リスナーを登録する。\n */\nexport function registerUpdateBatchListener(listener: UpdateBatchListener): void {\n updateBatchListeners.add(listener);\n}\n\n/**\n * drain 終了リスナーを解除する(テスト間の分離用)。\n */\nexport function unregisterUpdateBatchListener(listener: UpdateBatchListener): void {\n updateBatchListeners.delete(listener);\n}\n\n/**\n * 全リスナーに drain のバッチを通知する。\n * リスナーの throw は握りつぶさない(内部バグの隠蔽防止)。\n * stream 側リスナーが entry ごとに自前で try/catch する契約(設計書 §3-2)。\n */\nfunction notifyUpdateBatchListeners(batch: ReadonlySet<IAbsoluteStateAddress>): void {\n for (const listener of updateBatchListeners) {\n listener(batch);\n }\n}\n\n/** queue に積まれる update record(address + 書き込み時点の因果 context) */\ninterface IQueuedUpdateRecord {\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly context: IPropagationContext | null;\n}\n\nclass Updater {\n private _queueUpdateRecords: IQueuedUpdateRecord[] = [];\n constructor() {\n }\n\n enqueueAbsoluteAddress(\n absoluteAddress: IAbsoluteStateAddress,\n context: IPropagationContext | null = null,\n ): void {\n const requireStartProcess = this._queueUpdateRecords.length === 0;\n this._queueUpdateRecords.push({ absoluteAddress, context });\n if (requireStartProcess) {\n queueMicrotask(() => {\n const updateRecords = this._queueUpdateRecords;\n this._queueUpdateRecords = [];\n this._applyChange(updateRecords);\n });\n }\n }\n\n // テスト用に公開\n testApplyChange(\n absoluteAddresses: IAbsoluteStateAddress[],\n contexts?: readonly (IPropagationContext | null)[],\n ): void {\n this._applyChange(absoluteAddresses.map((absoluteAddress, index) => ({\n absoluteAddress,\n context: contexts?.[index] ?? null,\n })));\n }\n\n private _applyChange(updateRecords: IQueuedUpdateRecord[]): void {\n // Note: AbsoluteStateAddress はキャッシュされているため、\n // 同一の (stateName, address) は同じインスタンスとなり、\n // Map / Set による重複排除が正しく機能する。\n // coalescing は last-write-wins: 同じ address は最後の update の\n // (値は state 側が既に保持) context をそのまま採用する(設計書 §4.1)。\n // visitedEdges の合成や synthetic transaction への置換は行わない。\n const contextByAbsoluteAddress = new Map<IAbsoluteStateAddress, IPropagationContext | null>();\n for (const record of updateRecords) {\n const previous = contextByAbsoluteAddress.get(record.absoluteAddress);\n if (\n devtoolsSink !== null\n && typeof previous !== \"undefined\" && previous !== null\n && record.context !== null\n && previous.transactionId !== record.context.transactionId\n ) {\n devtoolsSink({\n type: \"propagation:coalesced\",\n absoluteAddress: record.absoluteAddress,\n droppedTransactionId: previous.transactionId,\n winnerTransactionId: record.context.transactionId,\n });\n }\n contextByAbsoluteAddress.set(record.absoluteAddress, record.context);\n }\n const processBindings: IBindingInfo[] = [];\n const propagationContextByBinding = new Map<IBindingInfo, IPropagationContext | null>();\n for (const [absoluteAddress, context] of contextByAbsoluteAddress) {\n if (context !== null && context.hop >= MAX_PROPAGATION_HOPS) {\n // hop 上限超過: この transaction の未処理 record だけを quarantine する。\n // 既に適用した値は戻さず、updater から例外は投げない(設計書 §4 規則 6)。\n console.error(`[@wcstack/state] propagation hop limit exceeded; update record quarantined.`, {\n path: absoluteAddress.absolutePathInfo.pathInfo.path,\n stateName: absoluteAddress.absolutePathInfo.stateName,\n transactionId: context.transactionId,\n hop: context.hop,\n maxHops: MAX_PROPAGATION_HOPS,\n });\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"propagation:hop-limit\",\n absoluteAddress,\n transactionId: context.transactionId,\n hop: context.hop,\n });\n }\n continue;\n }\n // peek: バインディングの無いアドレス(リスト置換で enqueue される中間\n // アドレス等)に空エントリを生成・蓄積しない。エントリは単一 binding\n // (通常ケース)か Set(同一アドレスに 2 本以上)のどちらか。\n // 従来台帳 → パターン台帳(リスト行)の順で引く。\n const entry = peekBindingsForAddress(absoluteAddress);\n if (entry === undefined) {\n continue;\n }\n if (entry instanceof Set) {\n for(const binding of entry) {\n if (binding.replaceNode.isConnected === false) {\n // 切断されているバインディングは無視\n continue;\n }\n processBindings.push(binding);\n if (context !== null) {\n propagationContextByBinding.set(binding, context);\n }\n }\n } else if (entry.replaceNode.isConnected !== false) {\n processBindings.push(entry);\n if (context !== null) {\n propagationContextByBinding.set(entry, context);\n }\n }\n }\n // context が無い場合は従来どおり 1 引数で呼ぶ(呼び出し契約の互換維持)\n if (propagationContextByBinding.size > 0) {\n applyChangeFromBindings(processBindings, propagationContextByBinding);\n } else {\n applyChangeFromBindings(processBindings);\n }\n // drain 終了フック: binding 適用後に dedup 済みバッチを通知する(設計書 §3-2)。\n // testApplyChange も同じ _applyChange を通るため、テストから同期に駆動できる。\n // quarantine された address も state 値は適用済みのため通知対象に含める。\n notifyUpdateBatchListeners(new Set(contextByAbsoluteAddress.keys()));\n }\n\n}\n\nconst updater = new Updater();\n\nexport function getUpdater(): Updater {\n return updater;\n}\n\n// テスト用にprivateメソッドを公開\nexport const __private__ = {\n Updater,\n};\n","/**\n * devtools/types.ts\n *\n * DevTools Hook Protocol (docs/devtools-hook-protocol.md) の型定義。\n *\n * イベント payload はランタイム内部オブジェクト(IAbsoluteStateAddress /\n * IBindingInfo 等)への生参照を含む(同一 realm・オーバーレイ前提、protocol 原則 4)。\n * 消費者はこれらを変異してはならない。\n */\n\nimport type { IAbsoluteStateAddress } from \"../address/types\";\nimport type { IBindingInfo } from \"../binding/types\";\nimport type { IStateElement } from \"../components/types\";\n\n/** グローバル registry のプロパティ名 */\nexport const DEVTOOLS_HOOK_GLOBAL = \"__WCSTACK_DEVTOOLS_HOOK__\";\n\n/** プロトコル版。additive change では上げない(protocol §2) */\nexport const DEVTOOLS_PROTOCOL_VERSION = 1;\n\nexport type DevtoolsEvent =\n | {\n readonly type: \"state:element-registered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: IStateElement;\n }\n | {\n readonly type: \"state:element-unregistered\";\n readonly name: string;\n readonly rootNode: Node;\n readonly element: IStateElement;\n }\n | {\n readonly type: \"state:write\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly value: unknown;\n /** same-value guard が既に取得していた場合のみ意味を持つ(protocol §4.2) */\n readonly oldValue: unknown;\n readonly hasOldValue: boolean;\n }\n | {\n readonly type: \"state:update-batch\";\n readonly addresses: ReadonlySet<IAbsoluteStateAddress>;\n }\n | {\n readonly type: \"state:binding-added\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly binding: IBindingInfo;\n }\n | {\n readonly type: \"state:binding-removed\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly binding: IBindingInfo;\n }\n | {\n readonly type: \"state:binding-cleared\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n }\n | {\n readonly type: \"state:token-emit\";\n readonly kind: \"command\" | \"event\";\n readonly stateName: string | null;\n readonly tokenName: string;\n readonly args: readonly unknown[];\n readonly subscriberCount: number;\n }\n | {\n readonly type: \"propagation:suppressed\";\n readonly reason: \"confirmation\" | \"visited-edge\";\n readonly transactionId: number;\n readonly edgeId: number;\n readonly node: Node;\n readonly member: string;\n }\n | {\n readonly type: \"propagation:coalesced\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly droppedTransactionId: number;\n readonly winnerTransactionId: number;\n }\n | {\n readonly type: \"propagation:hop-limit\";\n readonly absoluteAddress: IAbsoluteStateAddress;\n readonly transactionId: number;\n readonly hop: number;\n }\n // --- contract analyzer (Phase 5b, §6 contract category) ---\n | {\n // sidecar manifest から 1 コンポーネント契約を読んだ(dev-time analyzer)。\n readonly type: \"contract:manifest-read\";\n readonly tag: string;\n /** 実行時に該当タグが登録済みか(未登録なら drift の起点)。 */\n readonly loaded: boolean;\n }\n | {\n // manifest の未知 namespace / extension(runtime analyzer が解釈しない)。\n readonly type: \"contract:unsupported-extension\";\n readonly namespace: string;\n }\n | {\n // sidecar と live wcBindable 宣言の drift。live 宣言が正本。\n readonly type: \"contract:drift\";\n readonly reason: \"component-not-loaded\" | \"missing-member\" | \"event-mismatch\";\n readonly tag: string;\n readonly member?: string;\n /** event-mismatch のとき: sidecar 宣言 event / live event。 */\n readonly sidecarEvent?: string;\n readonly liveEvent?: string;\n };\n\nexport type DevtoolsSink = (event: DevtoolsEvent) => void;\n\n/** contract analyzer(Phase 5b)が生成しうる event だけの狭い union(公開 API の戻り型)。 */\nexport type ContractEvent = Extract<\n DevtoolsEvent,\n { readonly type: \"contract:manifest-read\" | \"contract:unsupported-extension\" | \"contract:drift\" }\n>;\n\nexport interface IStateElementSummary {\n readonly name: string;\n readonly rootNode: Node;\n readonly element: IStateElement;\n readonly paths: {\n readonly list: ReadonlySet<string>;\n readonly element: ReadonlySet<string>;\n readonly getter: ReadonlySet<string>;\n readonly setter: ReadonlySet<string>;\n };\n readonly commandTokenNames: ReadonlySet<string>;\n readonly eventTokenNames: ReadonlySet<string>;\n readonly staticDependency: ReadonlyMap<string, readonly string[]>;\n readonly dynamicDependency: ReadonlyMap<string, readonly string[]>;\n}\n\nexport interface IDevtoolsSource {\n readonly id: string;\n readonly kind: \"state\";\n readonly packageVersion: string;\n getStateElements(): IStateElementSummary[];\n /**\n * state のトップレベルキー(データプロパティ + 実行可能な getter)を列挙する。\n * メソッド・`$` 始まり・ワイルドカードを含むキーは除外。\n * 状態ツリー UI の描画起点(protocol §3)。\n */\n keys(name: string, rootNode: Node): string[];\n read(name: string, rootNode: Node, path: string, indexes?: number[]): unknown;\n write(name: string, rootNode: Node, path: string, value: unknown, indexes?: number[]): void;\n /** registry 専用。listener の有無に応じて registry が差し替える */\n _setSink(sink: DevtoolsSink | null): void;\n}\n\nexport interface IDevtoolsListener {\n onSourceRegistered?(source: IDevtoolsSource): void;\n onSourceUnregistered?(sourceId: string): void;\n onEvent?(sourceId: string, event: DevtoolsEvent): void;\n}\n\nexport interface IDevtoolsHookRegistry {\n readonly version: number;\n readonly sources: Map<string, IDevtoolsSource>;\n register(source: IDevtoolsSource): void;\n unregister(sourceId: string): void;\n /** 戻り値は解除関数。既登録 source は onSourceRegistered で即時リプレイされる */\n addListener(listener: IDevtoolsListener): () => void;\n}\n","/**\n * devtools/bridge.ts\n *\n * DevTools Hook Protocol (docs/devtools-hook-protocol.md) の state 側実装。\n *\n * - registry 最小実装: `globalThis.__WCSTACK_DEVTOOLS_HOOK__` を create-if-missing で\n * 確保する(ロード順非依存・先勝ち。devtools 側 client も同一仕様の実装を持つ)。\n * - source: この state モジュールコピーを 1 source として登録する。同一ページに\n * コピーが複数あれば複数 source になる(正常系、protocol §5)。\n * - sink 切替: listener の有無に応じて registry が `_setSink` を呼び、ここで\n * updater の drain リスナー登録/解除も連動させる(protocol §4.3)。\n */\n\nimport { inSsr } from \"../config\";\nimport { getStateElementByName, getLiveStateElements } from \"../stateElementByName\";\nimport { registerUpdateBatchListener, unregisterUpdateBatchListener, UpdateBatchListener } from \"../updater/updater\";\nimport { raiseError } from \"../raiseError\";\nimport { VERSION } from \"../version\";\nimport { IStateElement } from \"../components/types\";\nimport { devtoolsSink, setDevtoolsSink } from \"./sink\";\nimport {\n DEVTOOLS_HOOK_GLOBAL,\n DEVTOOLS_PROTOCOL_VERSION,\n DevtoolsSink,\n IDevtoolsHookRegistry,\n IDevtoolsListener,\n IDevtoolsSource,\n IStateElementSummary,\n} from \"./types\";\n\n/**\n * registry の最小実装(protocol §2)。30 行程度に抑え、振る舞いは\n * 「source/listener の管理と sink の配線」のみ。台帳・整形は devtools 側の責務。\n */\nfunction createMinimalRegistry(): IDevtoolsHookRegistry {\n const sources = new Map<string, IDevtoolsSource>();\n const listeners = new Set<IDevtoolsListener>();\n const applySink = (source: IDevtoolsSource): void => {\n if (listeners.size === 0) {\n source._setSink(null);\n return;\n }\n const sourceId = source.id;\n source._setSink((event) => {\n for (const listener of listeners) {\n listener.onEvent?.(sourceId, event);\n }\n });\n };\n return {\n version: DEVTOOLS_PROTOCOL_VERSION,\n sources,\n register(source: IDevtoolsSource): void {\n if (sources.has(source.id)) {\n return;\n }\n sources.set(source.id, source);\n applySink(source);\n for (const listener of listeners) {\n listener.onSourceRegistered?.(source);\n }\n },\n unregister(sourceId: string): void {\n const source = sources.get(sourceId);\n if (source === undefined) {\n return;\n }\n source._setSink(null);\n sources.delete(sourceId);\n for (const listener of listeners) {\n listener.onSourceUnregistered?.(sourceId);\n }\n },\n addListener(listener: IDevtoolsListener): () => void {\n listeners.add(listener);\n // 既登録 source をリプレイ(遅延アタッチの起点、protocol §6)\n for (const source of sources.values()) {\n applySink(source);\n listener.onSourceRegistered?.(source);\n }\n return () => {\n if (!listeners.delete(listener)) {\n return;\n }\n for (const source of sources.values()) {\n applySink(source);\n }\n };\n },\n };\n}\n\nexport function getOrCreateHookRegistry(): IDevtoolsHookRegistry {\n const globals = globalThis as unknown as Record<string, unknown>;\n const existing = globals[DEVTOOLS_HOOK_GLOBAL] as IDevtoolsHookRegistry | undefined;\n if (existing !== undefined) {\n if (existing.version !== DEVTOOLS_PROTOCOL_VERSION) {\n // 先勝ち固定。振る舞いは差し替えない(protocol §2)\n console.warn(\n `[wcstack/state] devtools hook registry version mismatch: found ${existing.version}, expected ${DEVTOOLS_PROTOCOL_VERSION}. Keeping the existing registry (first-wins).`\n );\n }\n return existing;\n }\n const registry = createMinimalRegistry();\n globals[DEVTOOLS_HOOK_GLOBAL] = registry;\n return registry;\n}\n\n/**\n * drain 終了バッチの転送リスナー。sink 接続中のみ updater に登録される。\n */\nconst onUpdateBatch: UpdateBatchListener = (batch) => {\n if (devtoolsSink !== null) {\n devtoolsSink({ type: \"state:update-batch\", addresses: batch });\n }\n};\n\n/**\n * registry からの sink 差し替え。updater の drain リスナー登録/解除を連動させる。\n * detach 時に登録が残らないこと(protocol §7-2)。\n */\nfunction setSink(sink: DevtoolsSink | null): void {\n const wasActive = devtoolsSink !== null;\n setDevtoolsSink(sink);\n const isActive = sink !== null;\n if (isActive && !wasActive) {\n registerUpdateBatchListener(onUpdateBatch);\n } else if (!isActive && wasActive) {\n unregisterUpdateBatchListener(onUpdateBatch);\n }\n}\n\nfunction createStateElementSummary(element: IStateElement): IStateElementSummary {\n return {\n name: element.name,\n rootNode: element.rootNode,\n element,\n paths: {\n list: element.listPaths,\n element: element.elementPaths,\n getter: element.getterPaths,\n setter: element.setterPaths,\n },\n commandTokenNames: element.commandTokenNames,\n eventTokenNames: element.eventTokenNames,\n staticDependency: element.staticDependency,\n dynamicDependency: element.dynamicDependency,\n };\n}\n\nfunction requireStateElement(name: string, rootNode: Node): IStateElement {\n return getStateElementByName(rootNode, name) ??\n raiseError(`devtools: state element not found: name=\"${name}\"`);\n}\n\nfunction createSourceId(): string {\n // getUUID() はモジュールローカル連番のため、state コピーが複数ある\n // ページで source id が衝突する。ランダム採番で回避する。\n return \"state:\" + Math.random().toString(36).slice(2, 10);\n}\n\nlet registeredSource: IDevtoolsSource | null = null;\n\n/**\n * この state ランタイムを 1 source として registry に登録する。\n * bootstrapState() から呼ばれる。冪等・SSR では何もしない(protocol 原則 6)。\n */\nexport function registerDevtoolsSource(): void {\n if (inSsr()) {\n return;\n }\n if (registeredSource !== null) {\n return;\n }\n const source: IDevtoolsSource = {\n id: createSourceId(),\n kind: \"state\",\n packageVersion: VERSION,\n getStateElements(): IStateElementSummary[] {\n const summaries: IStateElementSummary[] = [];\n for (const element of getLiveStateElements()) {\n summaries.push(createStateElementSummary(element));\n }\n return summaries;\n },\n keys(name: string, rootNode: Node): string[] {\n const element = requireStateElement(name, rootNode);\n const result: string[] = [];\n element.createState(\"readonly\", (state) => {\n // Object.keys は Proxy の ownKeys 経由で target の own key を返す。\n // メソッド判別の typeof アクセスは getter を 1 回実行する副作用があるため、\n // ループ文脈依存で throw する getter は catch して「キーとしては存在する」\n // 側に倒す(値の表示可否は UI 側の責務)。\n for (const key of Object.keys(state)) {\n if (key.includes(\"*\") || key.startsWith(\"$\")) {\n continue;\n }\n try {\n if (typeof (state as unknown as Record<string, unknown>)[key] === \"function\") {\n continue;\n }\n } catch {\n // 読めない getter もキーとしては列挙する\n }\n result.push(key);\n }\n });\n return result;\n },\n read(name: string, rootNode: Node, path: string, indexes?: number[]): unknown {\n const element = requireStateElement(name, rootNode);\n let result: unknown;\n element.createState(\"readonly\", (state) => {\n result = (state as unknown as Record<string, (p: string, i: number[]) => unknown>)[\"$resolve\"](path, indexes ?? []);\n });\n return result;\n },\n write(name: string, rootNode: Node, path: string, value: unknown, indexes?: number[]): void {\n const element = requireStateElement(name, rootNode);\n element.createState(\"writable\", (state) => {\n if (indexes !== undefined && indexes.length > 0) {\n // Note: $resolve は value===undefined を「取得」と解釈するため、\n // ワイルドカードパスへの undefined 書き込みは非サポート\n // (spread undefined 規範と同じ側に倒す)\n (state as unknown as Record<string, (p: string, i: number[], v: unknown) => void>)[\"$resolve\"](path, indexes, value);\n } else {\n (state as unknown as Record<string, unknown>)[path] = value;\n }\n });\n },\n _setSink: setSink,\n };\n registeredSource = source;\n getOrCreateHookRegistry().register(source);\n}\n\n/**\n * テスト専用: sink を解除し source 登録状態をリセットする。\n * グローバル registry 自体の掃除(delete globalThis[DEVTOOLS_HOOK_GLOBAL])は\n * テスト側の責務。アプリケーションからの利用は想定しない。\n */\nexport function __resetDevtoolsBridgeForTest(): void {\n setSink(null);\n registeredSource = null;\n}\n\n/** テスト専用: 現在登録済みの source を返す */\nexport function __getRegisteredSourceForTest(): IDevtoolsSource | null {\n return registeredSource;\n}\n","import { IState } from \"../types\";\n\ntype ScriptModule = { default?: unknown };\n\nexport async function loadFromInnerScript(script: HTMLScriptElement, name: string): Promise<IState> {\n let scriptModule: ScriptModule | null = null;\n const uniq_comment = `\\n//# sourceURL=${name}\\n`;\n if (typeof URL.createObjectURL === 'function') {\n // Create a blob URL for the script and dynamically import it\n const blob = new Blob([script.text + uniq_comment], { type: \"application/javascript\" });\n const url = URL.createObjectURL(blob);\n try {\n scriptModule = await import(url) as ScriptModule;\n } finally {\n // Clean up blob URL to prevent memory leak\n URL.revokeObjectURL(url);\n }\n } else {\n // Fallback: Base64 encoding method (for test environment)\n // Convert script to Base64 and import via data: URL\n const b64 = btoa(String.fromCodePoint(...new TextEncoder().encode(script.text + uniq_comment)));\n scriptModule = await import(`data:application/javascript;base64,${b64}`) as ScriptModule;\n }\n return (scriptModule && typeof scriptModule.default === 'object') ? scriptModule.default as IState : {};\n}\n","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport async function loadFromScriptFile(url: string): Promise<IState> {\n try {\n const module = await import(/* @vite-ignore */ url);\n return module.default || {};\n } catch (e) {\n raiseError(`Failed to load script file: ${e}`);\n }\n}\n","import { IStateAddress } from \"../address/types\";\nimport { MAX_LOOP_DEPTH } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { ILoopContext, ILoopContextStack } from \"./types\";\n\ntype LoopContextCallback<T> = (loopContext: ILoopContext) => T | Promise<T>;\n\nclass LoopContextStack {\n private _loopContextStack: (ILoopContext | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\n private _length: number = 0;\n\n createLoopContext(\n elementStateAddress: IStateAddress,\n callback: LoopContextCallback<void>\n ): void | Promise<void> {\n if (elementStateAddress.listIndex === null) {\n raiseError(`Cannot create loop context for a state address that does not have a list index.`);\n }\n const loopContext = elementStateAddress as ILoopContext;\n if (this._length >= MAX_LOOP_DEPTH) {\n raiseError(`Exceeded maximum loop context stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\n }\n const lastLoopContext = this._loopContextStack[this._length - 1];\n if (typeof lastLoopContext !== \"undefined\" ) {\n if (lastLoopContext.pathInfo.wildcardCount + 1 !== loopContext.pathInfo.wildcardCount) {\n raiseError(`Cannot push loop context for a list whose wildcard count is not exactly one more than the current active loop context.`);\n }\n // \n const prevWildcardPathInfo = loopContext.pathInfo.wildcardPathInfos[loopContext.pathInfo.wildcardPathInfos.length - 2];\n if (lastLoopContext.pathInfo !== prevWildcardPathInfo) {\n raiseError(`Cannot push loop context for a list whose parent wildcard path info does not match the current active loop context.`);\n }\n } else {\n // With no active loop context the address must be self-contained: the\n // listIndex chain supplies one index per wildcard. Top-level lists\n // (wildcardCount 1) always satisfy this. A nested list re-rendered\n // directly (e.g. replaced via $resolve from outside the loop) also\n // satisfies it — the for binding's listIndex carries the full ancestor\n // chain.\n if (loopContext.listIndex.length !== loopContext.pathInfo.wildcardCount) {\n raiseError(`Cannot push loop context when there is no active loop context: the list index chain (length ${loopContext.listIndex.length}) does not cover the wildcard path (wildcard count ${loopContext.pathInfo.wildcardCount}).`);\n }\n }\n this._loopContextStack[this._length] = loopContext;\n this._length++;\n let retValue : void | Promise<void> = void 0;\n try {\n retValue = callback(loopContext);\n } finally {\n if (retValue instanceof Promise) {\n retValue.finally(() => {\n this._length--;\n this._loopContextStack[this._length] = undefined;\n });\n } else {\n this._length--;\n this._loopContextStack[this._length] = undefined;\n }\n }\n return retValue;\n } \n}\n\nexport function createLoopContextStack(): ILoopContextStack {\n return new LoopContextStack();\n}\n\n","import { IStateElement } from \"../components/types\";\nimport { CommandToken } from \"./CommandToken\";\nimport { ICommandToken } from \"./types\";\n\nconst registryByStateElement: WeakMap<IStateElement, Map<string, ICommandToken>> = new WeakMap();\n\nexport function getOrCreateCommandToken(stateElement: IStateElement, name: string): ICommandToken {\n let registry = registryByStateElement.get(stateElement);\n if (typeof registry === \"undefined\") {\n registry = new Map<string, ICommandToken>();\n registryByStateElement.set(stateElement, registry);\n }\n let token = registry.get(name);\n if (typeof token === \"undefined\") {\n token = new CommandToken(name, stateElement.name);\n registry.set(name, token);\n }\n return token;\n}\n\nexport function clearCommandTokenRegistry(stateElement: IStateElement): void {\n registryByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n registryByStateElement,\n};\n","/**\n * `state.$command` でアクセスされる command token の namespace proxy を提供する。\n *\n * - state element 単位で memo 化し、同一 stateElement なら同じ proxy が返る。\n * - 宣言された名前 (`$commandTokens` に列挙されたもの) のみ token を返す。\n * 宣言外の名前にアクセスした場合は undefined を返す。\n * (`constructor` / `Symbol.toPrimitive` / `then` など内部システムが触るキーで\n * 例外を投げないため。typo は subsequent な `.emit()` 呼び出しで TypeError として\n * 間接的に表面化する。)\n * - token そのものの memo は `getOrCreateCommandToken` 側に集約されており、\n * namespace proxy は薄いゲートウェイとして振る舞う。\n */\n\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getOrCreateCommandToken } from \"./commandTokenRegistry\";\nimport { ICommandToken } from \"./types\";\n\nconst namespaceProxyByStateElement: WeakMap<IStateElement, object> = new WeakMap();\n\nexport function getCommandNamespace(stateElement: IStateElement): object {\n const cached = namespaceProxyByStateElement.get(stateElement);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n const proxy = new Proxy(Object.create(null), {\n get(_target: object, prop: PropertyKey): ICommandToken | undefined {\n if (typeof prop !== \"string\") {\n return undefined;\n }\n if (!stateElement.commandTokenNames.has(prop)) {\n return undefined;\n }\n return getOrCreateCommandToken(stateElement, prop);\n },\n has(_target: object, prop: PropertyKey): boolean {\n return typeof prop === \"string\" && stateElement.commandTokenNames.has(prop);\n },\n ownKeys(): string[] {\n return Array.from(stateElement.commandTokenNames);\n },\n getOwnPropertyDescriptor(_target: object, prop: PropertyKey): PropertyDescriptor | undefined {\n if (typeof prop === \"string\" && stateElement.commandTokenNames.has(prop)) {\n return {\n configurable: true,\n enumerable: true,\n value: getOrCreateCommandToken(stateElement, prop),\n };\n }\n return undefined;\n },\n set(): boolean {\n raiseError(`$command namespace is read-only; assigning to it is not allowed.`);\n },\n deleteProperty(): boolean {\n raiseError(`$command namespace is read-only; deleting from it is not allowed.`);\n },\n });\n namespaceProxyByStateElement.set(stateElement, proxy);\n return proxy;\n}\n\nexport function clearCommandNamespace(stateElement: IStateElement): void {\n namespaceProxyByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n namespaceProxyByStateElement,\n};\n","/**\n * stream/lastNotified.ts\n *\n * 「最後に通知した観測値」台帳 — DOM binding / $updatedCallback(観測層)が\n * 最後に見た status・error(docs/state-streams-design.md §4-3)。\n *\n * 通知の same-value 判定を entry フィールドとの比較で行うと、再 set\n * (clearStreamRegistry → 新 entry 生成)を跨いだ陳腐化を検出できない\n * (error 表示中に再 set すると新 entry は error=null で生まれるため\n * null → null と誤判定して $postUpdate が落ち、DOM に旧 error が残る)。\n * そのため通知 dedup は entry の寿命ではなく stateElement の寿命で持つ\n * (ただし再 set で新宣言から消えた名前のエントリは pruneLastNotified で削除する —\n * 同名にしか dedup は要らず、放置すると台帳が単調増加するため)。\n * 未通知(初回)の基準値は宣言直後の観測初期値と同じ { idle, null }。\n *\n * さらに abortAllStreams(§5-1)は registry entry を通知なしで idle / null に\n * 直接ミューテーションするため、観測層が「台帳の値」と「idle / null」の\n * どちらを見たか確定できなくなる(binding / computed の fresh 読みは通知が\n * なくても他パスの drain で走る)。その乖離フィールドは invalidateLastNotified\n * で UNCERTAIN に無効化し、次回 updateStreamStatus の同値判定が必ず\n * 「変化あり」になるようにする(再接続ウィンドウ内の idle 描画が恒久陳腐化\n * しないための不変条件、§4-3)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport type { StreamStatus } from \"./types\";\n\n/**\n * 無通知ミューテーション後の「観測値が確定できない」印。\n * どの実値とも一致しないため、次回の通知 dedup(`!==` / `Object.is`)を強制的に解除する。\n */\nconst UNCERTAIN: unique symbol = Symbol(\"wcs-stream-last-notified-uncertain\");\n\nexport interface ILastNotified {\n status: StreamStatus | typeof UNCERTAIN;\n error: unknown;\n}\n\nconst lastNotifiedByStateElement = new WeakMap<IStateElement, Map<string, ILastNotified>>();\n\n/**\n * 最後に通知した観測値を返す。未通知なら基準値 { idle, null }。\n */\nexport function getLastNotified(stateElement: IStateElement, name: string): ILastNotified {\n return (\n lastNotifiedByStateElement.get(stateElement)?.get(name) ?? { status: \"idle\", error: null }\n );\n}\n\n/**\n * 通知した観測値を記録する(updateStreamStatus が $postUpdate 発行と同時に呼ぶ)。\n */\nexport function setLastNotified(\n stateElement: IStateElement,\n name: string,\n status: StreamStatus,\n error: unknown,\n): void {\n let lastMap = lastNotifiedByStateElement.get(stateElement);\n if (typeof lastMap === \"undefined\") {\n lastMap = new Map();\n lastNotifiedByStateElement.set(stateElement, lastMap);\n }\n lastMap.set(name, { status, error });\n}\n\n/**\n * 再 set(clearStreamRegistry → processStreamsDeclaration)後に呼び、新宣言に\n * 存在しない名前の台帳エントリを削除する。台帳は stateElement の寿命で生存するが\n * (§4-3 の再 set・再接続跨ぎ dedup)、それが必要なのは同名エントリのみで、\n * 旧宣言にしか無い名前は以後どの通知経路(updateStreamStatus)からも参照されない。\n * prune しないと、再 set のたびに異なる stream 名を使うステートで台帳が\n * stateElement の寿命の間単調増加する。\n * 既知の許容: prune 後に同名を再宣言した場合、dedup は基準値 { idle, null } から\n * やり直しになる(宣言削除時の binding 陳腐化が §4-4 の既知エッジである以上、\n * 再宣言は新規宣言と同じ扱いでよい)。\n */\nexport function pruneLastNotified(stateElement: IStateElement, liveNames: ReadonlySet<string>): void {\n const lastMap = lastNotifiedByStateElement.get(stateElement);\n if (typeof lastMap === \"undefined\") {\n return;\n }\n for (const name of lastMap.keys()) {\n if (!liveNames.has(name)) {\n lastMap.delete(name);\n }\n }\n}\n\n/**\n * 無通知ミューテーション(abortAllStreams の idle / null 直接書き換え)の直後に呼び、\n * 台帳のうちミューテーション後の値と一致しないフィールドを UNCERTAIN に無効化する。\n * 一致しているフィールド(観測層がどちらを見ても同じ値)は dedup を維持する\n * (例: error が null のままなら再接続時に $streamError.<name> の余計な通知は出ない)。\n */\nexport function invalidateLastNotified(stateElement: IStateElement, name: string): void {\n const lastMap = lastNotifiedByStateElement.get(stateElement);\n if (typeof lastMap === \"undefined\") {\n return;\n }\n const last = lastMap.get(name);\n if (typeof last === \"undefined\") {\n // 未通知: 基準値 { idle, null } はミューテーション後の値と一致するため乖離しない\n return;\n }\n lastMap.set(name, {\n status: last.status === \"idle\" ? last.status : UNCERTAIN,\n error: Object.is(last.error, null) ? null : UNCERTAIN,\n });\n}\n\nexport const __private__ = {\n lastNotifiedByStateElement,\n UNCERTAIN,\n};\n","/**\n * stream/activeStateElements.ts\n *\n * 起動中(startStreams 済み・未切断)の stateElement の列挙用 Set\n * (docs/state-streams-design.md §3-2)。\n *\n * streamRegistry の WeakMap は列挙不能のため、updater の drain リスナーが\n * 「どの stateElement の entry と batch を交差させるか」を知るには\n * 列挙可能な strong Set が別途必要になる。lastNotified.ts と同じ\n * 「import 循環回避の小モジュール」パターン\n * (streamRegistry → activeStateElements ← streamRuntime の一方向依存に保つ)。\n *\n * リーク防止の不変条件(strong Set が切断済み要素の GC を妨げないための連動):\n * - add は startStreams(streamRuntime.ts)だけが行う\n * (eager 起動=connect 時、および接続中の `_state` 再 set 時の再起動)。\n * - delete は abortAllStreams / clearStreamRegistry(streamRegistry.ts)が行う。\n * disconnect(disconnectedCallback → abortAllStreams)と `_state` 再 set\n * (clearStreamRegistry → processStreamsDeclaration → 接続中なら startStreams で\n * 再 add)の両経路が必ずここを通るため、「Set に居る = 接続中かつ起動済み」が\n * 常に保たれ、切断済み stateElement への強参照は残らない。\n * 設計書 §3-2 の「未接続(disconnect 済み)の stateElement の entry は restart\n * しない」はこの不変条件で担保される。\n */\n\nimport type { IStateElement } from \"../components/types\";\n\nconst activeStateElements = new Set<IStateElement>();\n\n/**\n * 起動中 stateElement として登録する(startStreams 専用。不変条件はモジュールヘッダ参照)。\n */\nexport function addActiveStateElement(stateElement: IStateElement): void {\n activeStateElements.add(stateElement);\n}\n\n/**\n * 起動中 stateElement から外す(abortAllStreams / clearStreamRegistry 専用)。\n */\nexport function deleteActiveStateElement(stateElement: IStateElement): void {\n activeStateElements.delete(stateElement);\n}\n\n/**\n * 起動中 stateElement を列挙する(drain リスナーの交差判定用)。\n */\nexport function getActiveStateElements(): ReadonlySet<IStateElement> {\n return activeStateElements;\n}\n\nexport const __private__ = {\n activeStateElements,\n};\n","/**\n * stream/streamRegistry.ts\n *\n * `$streams` の registry(docs/state-streams-design.md §2-1 / §5)。\n * eventTokenRegistry と対称の WeakMap registry。\n *\n * - status / error の正本は registry entry(state オブジェクト上に実プロパティは持たない)。\n * - disconnect 時は abortAllStreams(abort のみ・registry 保持)、\n * `_state` 再 set 時のみ clearStreamRegistry(abort + 全削除)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport { deleteActiveStateElement } from \"./activeStateElements\";\nimport { invalidateLastNotified } from \"./lastNotified\";\nimport type { IStreamEntry } from \"./types\";\n\nconst registryByStateElement: WeakMap<IStateElement, Map<string, IStreamEntry>> = new WeakMap();\n\n/**\n * stream entry 群を置換登録する(`_state` セッターからの再構築で丸ごと差し替える)。\n */\nexport function setStreamEntries(stateElement: IStateElement, entries: Map<string, IStreamEntry>): void {\n registryByStateElement.set(stateElement, entries);\n}\n\n/**\n * 登録済みの stream entry 群を返す。未登録なら空 Map を返す(registry への登録はしない)。\n */\nexport function getStreamEntries(stateElement: IStateElement): Map<string, IStreamEntry> {\n return registryByStateElement.get(stateElement) ?? new Map<string, IStreamEntry>();\n}\n\n/**\n * 全 stream を abort して idle に戻す(設計書 §5-1)。registry は保持する。\n *\n * disconnectedCallback(切断時)に呼ばれるため、status / error の反映は\n * proxy / $postUpdate を使わず entry への直接ミューテーションで行う\n * (切断済みで binding 更新は不要かつ rootNode が無い)。\n *\n * 無通知ミューテーションは「最後に通知した観測値」台帳(stream/lastNotified.ts)\n * と registry を乖離させるため、同時に台帳側を invalidate する。これを怠ると\n * 再接続ウィンドウ内の fresh 読み(他パスの drain での getter 再計算など)が\n * 描画した idle に対し、restart の updateStreamStatus(\"active\") が切断前の\n * 通知値と同値判定されて skip され、DOM が恒久的に陳腐化する(設計書 §4-3)。\n */\nexport function abortAllStreams(stateElement: IStateElement): void {\n // 依存駆動 restart の対象から外す(切断済み stateElement は restart しない、\n // 設計書 §3-2。add 側は startStreams — stream/activeStateElements.ts の\n // リーク防止不変条件を参照)。registry の有無に関わらず必ず外す。\n deleteActiveStateElement(stateElement);\n const entries = registryByStateElement.get(stateElement);\n if (typeof entries === \"undefined\") {\n return;\n }\n for (const entry of entries.values()) {\n entry.controller?.abort();\n entry.controller = null;\n entry.status = \"idle\";\n entry.error = null;\n invalidateLastNotified(stateElement, entry.name);\n }\n}\n\n/**\n * 全 stream を abort したうえで registry から削除する(`_state` 再 set 時の再配線用、設計書 §5-2)。\n */\nexport function clearStreamRegistry(stateElement: IStateElement): void {\n abortAllStreams(stateElement);\n // abortAllStreams が既に delete 済みだが、「clear = 全削除でも必ず restart 対象から\n // 外れる」不変条件を将来の abortAllStreams の変更から独立に保証するため明示的に呼ぶ。\n deleteActiveStateElement(stateElement);\n registryByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n registryByStateElement,\n};\n","/**\n * stream/processStreamsDeclaration.ts\n *\n * `$streams: { <name>: { args?, source, fold?, initial? } }` 宣言マップを解析し、\n * IStreamEntry を構築して streamRegistry に一括登録する\n * (docs/state-streams-design.md §1-1 / §1-2 / §1-3)。\n *\n * - バリデーション(§1-2): 違反は raiseError。\n * - 名前はフラットなプロパティ名のみ(空文字 / `.`(DELIMITER)/ `*`(WILDCARD)/ 先頭 `$` を禁止)。\n * - Object.prototype の継承名(`__proto__` / `constructor` / `toString` 等)を禁止\n * (own key でなくても `in` 判定が真になり、実体化 skip + 起動時 Reflect.set の\n * 継承 setter 化 — `__proto__` は prototype 差し替え — を引き起こすため)。\n * - getter / setter として宣言済みのパスとの衝突を禁止(getterPaths / setterPaths を検査)。\n * - `source` は関数必須。`fold` は(あれば)関数。`fold` があるのに `initial` が無ければエラー\n * (reduce は initial 必須。`initial` の有無は in 演算子で判定)。`args` は(あれば)関数。\n * - fold 省略時は latest(`(_acc, chunk) => chunk`)を注入する(§0 決定レコード)。\n * - 値プロパティ実体化(§1-3): `state[name]` が未定義なら `initial`\n * (fold 無しなら undefined)でデータプロパティとして初期化する。\n * ユーザーが同名プロパティを先に宣言していた場合は上書きしない\n * (起動時の initial リセットは streamRuntime 側の責務)。\n * - 通知 dedup 台帳の prune(§4-3): 新宣言に存在しない名前の lastNotified エントリを\n * 削除する(台帳は stateElement 寿命 — 再 set 跨ぎ dedup が必要なのは同名のみ)。\n *\n * 呼び出しは stateElement.getterPaths / setterPaths の確定後であること\n * (State の `_state` セッターが getStateInfo の反映より後に呼ぶことで保証する)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport { DELIMITER, STATE_STREAMS_NAME, WILDCARD } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport type { IState } from \"../types\";\nimport { pruneLastNotified } from \"./lastNotified\";\nimport { setStreamEntries } from \"./streamRegistry\";\nimport type { IStreamDefinition, IStreamEntry, StreamFold, StreamSource } from \"./types\";\n\n/** fold 省略時に注入される既定 fold(latest = 最新チャンクで置換) */\nconst latestFold: StreamFold = (_acc, chunk) => chunk;\n\n/** `$streams` 無し宣言の prune 用(旧宣言の全名前が残骸になる) */\nconst NO_STREAM_NAMES: ReadonlySet<string> = new Set<string>();\n\nexport function processStreamsDeclaration(stateElement: IStateElement, state: IState): void {\n const declared = (state as Record<string, unknown>)[STATE_STREAMS_NAME];\n if (typeof declared === \"undefined\") {\n // $streams 無しの再 set でも旧宣言の名前は通知 dedup 台帳の残骸になるため prune する\n pruneLastNotified(stateElement, NO_STREAM_NAMES);\n return;\n }\n if (typeof declared !== \"object\" || declared === null) {\n raiseError(`${STATE_STREAMS_NAME} must be an object mapping stream names to stream definitions.`);\n }\n const entries = new Map<string, IStreamEntry>();\n for (const [name, def] of Object.entries(declared as Record<string, unknown>)) {\n if (name.length === 0) {\n raiseError(`${STATE_STREAMS_NAME} entry name must be a non-empty string.`);\n }\n if (name.includes(DELIMITER)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must be a flat property name (\"${DELIMITER}\" is not allowed).`);\n }\n if (name.includes(WILDCARD)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must be a flat property name (\"${WILDCARD}\" is not allowed).`);\n }\n if (name.startsWith(\"$\")) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must not start with \"$\" (reserved namespace).`);\n }\n // Object.prototype の継承名(__proto__ / constructor / toString 等)は一律拒否する。\n // own key でないのに `name in state` が真になるため実体化(§1-3)が skip され、\n // 起動時の initial リセット(Reflect.set)が継承 setter に化ける\n // (特に __proto__ は state の prototype を差し替える)ため、名前検査の防衛線で落とす(§1-2)。\n if (name in Object.prototype) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must not be a property name inherited from Object.prototype (e.g. \"__proto__\", \"constructor\").`);\n }\n if (stateElement.getterPaths.has(name)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" conflicts with a getter declared on the state.`);\n }\n if (stateElement.setterPaths.has(name)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" conflicts with a setter declared on the state.`);\n }\n if (typeof def !== \"object\" || def === null) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" must be an object ({ args?, source, fold?, initial? }).`);\n }\n const definition = def as Record<string, unknown>;\n if (typeof definition.source !== \"function\") {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" source must be a function.`);\n }\n const hasFold = typeof definition.fold !== \"undefined\";\n if (hasFold && typeof definition.fold !== \"function\") {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" fold must be a function.`);\n }\n if (hasFold && !(\"initial\" in definition)) {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" requires \"initial\" when fold is specified (reduce needs a seed value).`);\n }\n const hasArgs = typeof definition.args !== \"undefined\";\n if (hasArgs && typeof definition.args !== \"function\") {\n raiseError(`${STATE_STREAMS_NAME} entry \"${name}\" args must be a function.`);\n }\n const entry: IStreamEntry = {\n name,\n definition: {\n args: (definition.args as IStreamDefinition[\"args\"] | undefined) ?? null,\n source: definition.source as StreamSource,\n fold: (definition.fold as StreamFold | undefined) ?? latestFold,\n initial: definition.initial,\n },\n status: \"idle\",\n error: null,\n controller: null,\n depAddresses: new Set(),\n };\n // 値プロパティ実体化(§1-3): ユーザーが同名プロパティを先に宣言していたら上書きしない\n if (!(name in state)) {\n state[name] = entry.definition.initial;\n }\n entries.set(name, entry);\n }\n setStreamEntries(stateElement, entries);\n // 新宣言に存在しない名前の通知 dedup 台帳エントリを prune する\n // (同名は保持 = §4-3 の再 set 跨ぎ dedup 契約を維持。stream/lastNotified.ts 参照)\n pruneLastNotified(stateElement, new Set(entries.keys()));\n}\n","/**\n * stream/streamNamespace.ts\n *\n * `$streamStatus` / `$streamError` の read-only namespace proxy\n * (docs/state-streams-design.md §4-1 / §4-2)。commandNamespace と対称。\n *\n * - state element 単位で memo 化し、同一 stateElement なら同じ proxy が返る。\n * - 宣言された stream 名(`$streams` に列挙されたもの)のみ registry entry の\n * status / error を返す。宣言外の名前・Symbol キーは undefined\n * (`then` / `constructor` 等を内部機構が触っても throw しない寛容規約、\n * $command と同じ)。\n * - 値は memo しない: proxy は getStreamEntries を毎回読む thin gateway\n * (status / error は runtime が随時書き換えるため。registry entry が正本、§2-1)。\n * - set / deleteProperty は raiseError。setByAddress の親走査が namespace proxy に\n * 到達したときの Reflect.set もここで落ちる(書き込み防御 S11 の終端)。\n */\n\nimport type { IStateElement } from \"../components/types\";\nimport {\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n} from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { getStreamEntries } from \"./streamRegistry\";\nimport type { IStreamEntry } from \"./types\";\n\nconst statusNamespaceByStateElement: WeakMap<IStateElement, object> = new WeakMap();\nconst errorNamespaceByStateElement: WeakMap<IStateElement, object> = new WeakMap();\n\nfunction createStreamNamespaceProxy(\n stateElement: IStateElement,\n namespaceName: string,\n pick: (entry: IStreamEntry) => unknown,\n): object {\n return new Proxy(Object.create(null), {\n get(_target: object, prop: PropertyKey): unknown {\n if (typeof prop !== \"string\") {\n return undefined;\n }\n const entry = getStreamEntries(stateElement).get(prop);\n if (typeof entry === \"undefined\") {\n return undefined;\n }\n return pick(entry);\n },\n has(_target: object, prop: PropertyKey): boolean {\n return typeof prop === \"string\" && getStreamEntries(stateElement).has(prop);\n },\n ownKeys(): string[] {\n return Array.from(getStreamEntries(stateElement).keys());\n },\n getOwnPropertyDescriptor(_target: object, prop: PropertyKey): PropertyDescriptor | undefined {\n if (typeof prop !== \"string\") {\n return undefined;\n }\n const entry = getStreamEntries(stateElement).get(prop);\n if (typeof entry === \"undefined\") {\n return undefined;\n }\n return {\n configurable: true,\n enumerable: true,\n value: pick(entry),\n };\n },\n set(): boolean {\n raiseError(`${namespaceName} namespace is read-only; assigning to it is not allowed.`);\n },\n deleteProperty(): boolean {\n raiseError(`${namespaceName} namespace is read-only; deleting from it is not allowed.`);\n },\n });\n}\n\nexport function getStreamStatusNamespace(stateElement: IStateElement): object {\n const cached = statusNamespaceByStateElement.get(stateElement);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n const proxy = createStreamNamespaceProxy(\n stateElement,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n (entry) => entry.status,\n );\n statusNamespaceByStateElement.set(stateElement, proxy);\n return proxy;\n}\n\nexport function getStreamErrorNamespace(stateElement: IStateElement): object {\n const cached = errorNamespaceByStateElement.get(stateElement);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n const proxy = createStreamNamespaceProxy(\n stateElement,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n (entry) => entry.error,\n );\n errorNamespaceByStateElement.set(stateElement, proxy);\n return proxy;\n}\n\n/**\n * 両 namespace proxy の memo を破棄する(clearCommandNamespace と対称)。\n * disconnectedCallback と `_state` 再 set 時に呼ばれる。\n */\nexport function clearStreamNamespace(stateElement: IStateElement): void {\n statusNamespaceByStateElement.delete(stateElement);\n errorNamespaceByStateElement.delete(stateElement);\n}\n\nexport const __private__ = {\n statusNamespaceByStateElement,\n errorNamespaceByStateElement,\n};\n","/**\n * stream/argsTrace.ts\n *\n * `$streams` の args トレース(依存捕捉、docs/state-streams-design.md §3-1)。\n *\n * - モジュールスコープの collector を立てて readonly proxy 上で args を評価し、\n * getByAddress を通った読みを絶対アドレス(IAbsoluteStateAddress)として捕捉する。\n * AbsolutePathInfo / AbsoluteStateAddress は両方キャッシュ済みのため、捕捉した\n * アドレスは drain バッチと Set.has のインスタンス同一性で O(1) 照合できる(§2-1)。\n * - collectStreamDependency は getByAddress のホットパスから毎読み呼ばれるため、\n * collector === null なら即 return し、それ以外の計算を一切しない。\n * - 起動・restart のたびに traceArgs が呼ばれ、成功時は entry.depAddresses を\n * 丸ごと置換する(per-run の動的再捕捉)。失敗時は前回成功 run の検証済み\n * 捕捉を保持する(§2-2 の「error からも依存変化で restart」を保つ)。\n * - lastNotified.ts と同じく import 循環回避のための小モジュール\n * (getByAddress → argsTrace ← streamRuntime の一方向依存に保つ)。\n */\n\nimport { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport type { IAbsoluteStateAddress, IStateAddress } from \"../address/types\";\nimport type { IStateElement } from \"../components/types\";\nimport {\n DELIMITER,\n STATE_STREAMS_NAME,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n} from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport type { IStreamEntry } from \"./types\";\n\n/** トレース中のみ非 null。getByAddress を通った読みの絶対アドレスが溜まる。 */\nlet collector: Set<IAbsoluteStateAddress> | null = null;\n\n/**\n * getByAddress の入口(checkDependency 直後)から毎読み呼ばれるフック。\n * トレース外(collector === null)では何もしない。\n */\nexport function collectStreamDependency(stateElement: IStateElement, address: IStateAddress): void {\n if (collector === null) {\n return;\n }\n const absolutePathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n collector.add(createAbsoluteStateAddress(absolutePathInfo, address.listIndex));\n}\n\n/**\n * args を readonly proxy で同期評価し、読まれたパスを entry.depAddresses に\n * 丸ごと置換で再捕捉する(§3-1)。評価値(source の第 1 引数になる)を返す。\n *\n * - args === null(宣言で省略)なら depAddresses を clear して undefined\n * (依存なし = 起動後 restart しない)。\n * - 検査(違反は raiseError):\n * (a) 評価値が Promise(同期契約違反)\n * (b) 自己依存 — `<name>` / `$streamStatus.<name>` / `$streamError.<name>` の読み\n * (restart の自己書き込みで再発火する無限ループ、S8)\n * (c) wildcard を含むパスの読み(`$getAll` 等も同様。第 1 段スコープ外)\n * - 失敗時(args のユーザー例外・検査違反)は今回の捕捉(captured)を採用せず\n * 伝播し、entry.depAddresses には**前回成功 run の検証済み捕捉を保持する**。\n * これにより drain リスナーが throw を error 経路に正規化したあとも、依存の\n * 書き込みで再試行できる(§2-2「done / error からも依存変化で restart」——\n * 一時的な args throw で stream が恒久固着しない)。ループ安全性:\n * 保持されるのは前回**成功** run の捕捉のみ(自己依存・wildcard 検査済み)で\n * 自分の `<name>` / `$streamStatus.<name>` / `$streamError.<name>` を含み得ず、\n * traceArgs throw 時の startStream は initial リセットに到達しないため、\n * error 正規化の書き込みが保持 deps に再 hit することはない。再試行は依存\n * 書き込み 1 回につき高々 1 回で有界。未検査の captured を採用しないことが\n * ループ防止の要件であり、前回検証済み捕捉の保持はそれを侵さない。\n * - collector は finally で必ず復元する(例外・再入安全。ネスト評価は想定しないが\n * 防御的に「前の collector を復元」の形にしておく — コストは同等)。\n */\nexport function traceArgs(stateElement: IStateElement, entry: IStreamEntry): unknown {\n const argsFn = entry.definition.args;\n if (argsFn === null) {\n entry.depAddresses.clear();\n return undefined;\n }\n const previousCollector = collector;\n const captured = new Set<IAbsoluteStateAddress>();\n collector = captured;\n let argsValue: unknown = undefined;\n try {\n stateElement.createState(\"readonly\", (state) => {\n argsValue = argsFn(state);\n });\n } finally {\n // args のユーザー例外時は captured を採用せずそのまま伝播する\n // (entry.depAddresses は前回成功 run の検証済み捕捉を保持)\n collector = previousCollector;\n }\n if (argsValue instanceof Promise) {\n raiseError(\n `${STATE_STREAMS_NAME} entry \"${entry.name}\" args must be synchronous (it returned a Promise).`,\n );\n }\n const selfStatusPath = `${STATE_STREAM_STATUS_NAMESPACE_NAME}${DELIMITER}${entry.name}`;\n const selfErrorPath = `${STATE_STREAM_ERROR_NAMESPACE_NAME}${DELIMITER}${entry.name}`;\n for (const dep of captured) {\n const pathInfo = dep.absolutePathInfo.pathInfo;\n if (\n dep.absolutePathInfo.stateElement === stateElement &&\n (pathInfo.path === entry.name || pathInfo.path === selfStatusPath || pathInfo.path === selfErrorPath)\n ) {\n raiseError(\n `${STATE_STREAMS_NAME} entry \"${entry.name}\" args must not read the stream itself (\"${pathInfo.path}\"): a self-dependency would restart the stream on its own writes (infinite loop).`,\n );\n }\n if (pathInfo.wildcardCount > 0) {\n raiseError(\n `${STATE_STREAMS_NAME} entry \"${entry.name}\" args must not read wildcard paths (\"${pathInfo.path}\"): wildcard dependencies are out of scope.`,\n );\n }\n }\n entry.depAddresses = captured;\n return argsValue;\n}\n","/**\n * stream/consumeSource.ts\n *\n * `$streams` のチャンク消費ループ(docs/state-streams-design.md §3-3)。\n * packages/signals/src/streamResource.ts の consume / iterate /\n * readableToAsyncIterable の移植(パッケージ間依存は持たない自己完結原則)。\n *\n * 唯一の構造差分は状態書き込みの IConsumeSink への委譲:\n * value.set(fold(value.peek(), chunk)) → sink.fold(chunk)\n * status.set(\"done\") → sink.done()\n * error.set(e) + status.set(\"error\") → sink.fail(e)\n *\n * sink.fold() が throw した場合(fold throw)もループ内の throw として\n * 既存の catch に流れ、signal.aborted なら return、でなければ sink.fail(e)。\n * consumeSource 自体は fold throw と source throw を区別しない\n * (producer の掃除 = controller.abort() は呼び出し側 runtime が fail 内で行う)。\n * consumeSource は reject しない(全経路 catch 済み)。\n *\n * ---------------------------------------------------------------------------\n * 以下、移植元モジュールヘッダの契約(原文英語のまま維持):\n *\n * CONTRACT (cooperative cancellation — STRONG REQUIREMENT): the `source` MUST honor\n * the `AbortSignal` it is given. Honoring it is what drives switchMap restart/dispose;\n * a source that ignores it cannot be reliably cancelled.\n *\n * Rescue levels on abort:\n * - ReadableStream: FULLY rescued. A parked read() is force-unwound via\n * reader.cancel(), which both releases the underlying source and settles the\n * pending read() so the loop unwinds. Anything getReader-bearing is routed\n * through this path even when it is ALSO natively async-iterable (Node 18+ /\n * Chrome 124+ / Firefox): the spec serializes asyncIterator.return() behind\n * the pending next() ([[ongoingPromise]]), so the AsyncIterable rescue below\n * cannot force-unwind a parked read on a native ReadableStream.\n * - AsyncIterable / async generator: PARTIALLY rescued. On abort we call\n * iterator.return() to trigger the generator's finally/cleanup. But a parked\n * `await` (the producer stalling before its next yield while IGNORING `signal`)\n * cannot be force-unwound from outside — return() only takes effect when the\n * generator next resumes. So a source that parks forever and never observes\n * `signal` still leaks its consume task. Honor `signal` to bound this.\n * The `if (signal.aborted) return` check only runs after a chunk arrives, not while\n * parked — it drops stale chunks but is not, by itself, a cancellation mechanism.\n */\n\nimport type { IConsumeSink, StreamProducer, StreamSource } from \"./types\";\n\nexport async function consumeSource(\n source: StreamSource,\n args: unknown,\n signal: AbortSignal,\n sink: IConsumeSink,\n): Promise<void> {\n // Obtain the iterator EXPLICITLY (not via `for await`'s implicit one) so abort can\n // call `iterator.return()` to trigger an AsyncIterable / async generator's\n // `finally`/cleanup. A `for await` only calls `.return()` when the loop itself exits;\n // if the producer is PARKED (awaiting before the next yield while ignoring `signal`),\n // the loop never advances, so the implicit `.return()` never runs and the task leaks\n // past restart/dispose. Calling `.return()` on abort is the PARTIAL rescue: the\n // parked `await` cannot be force-unwound from outside, but once the generator resumes\n // (its next tick), `.return()` makes it run its `finally` and stop — recovering the\n // common \"generator wakes up after abort\" case. The ReadableStream path is fully\n // rescued via `reader.cancel()` (see `readableToAsyncIterable`).\n let iterator: AsyncIterator<unknown> | null = null;\n // Guard against returning the SAME iterator twice. `onAbort` is reachable two ways:\n // the abort listener, and the explicit call below when abort raced the\n // `await source(...)`. The guard keys on the iterator instance (not a plain \"ran\"\n // flag): the listener firing with iterator still null must NOT consume the single\n // real cleanup that the explicit call performs once the iterator exists. So we only\n // mark an iterator returned once we have actually called `.return()` on it.\n let returned: AsyncIterator<unknown> | null = null;\n const onAbort = (): void => {\n if (!iterator || iterator === returned) {\n return; // nothing to release yet, or already released this iterator\n }\n returned = iterator;\n // Fire the iterator's cleanup. Swallow any throw/rejection from `.return()` — we\n // are tearing down; a producer that rejects on return must not surface here.\n try {\n void iterator.return?.()?.then?.(undefined, () => {});\n } catch {\n // `.return()` threw synchronously while tearing down — ignore.\n }\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const produced = await source(args, signal);\n iterator = iterate(produced, signal)[Symbol.asyncIterator]();\n if (signal.aborted) {\n // Aborted while awaiting the source: the abort listener already ran (iterator\n // was still null then), so explicitly release the just-produced iterator now —\n // this fires a generator's finally / a ReadableStream's cancel for the\n // resource we created but will never iterate.\n onAbort();\n return;\n }\n for (;;) {\n const result = await iterator.next();\n if (result.done) {\n break;\n }\n if (signal.aborted) {\n return; // stale chunk from a superseded/disposed run — drop it\n }\n sink.fold(result.value);\n }\n if (signal.aborted) {\n return; // stream ended but this run was aborted — don't mark done\n }\n sink.done();\n } catch (e) {\n if (signal.aborted) {\n return; // an abort that surfaced as a throw is not an error\n }\n sink.fail(e); // keep the last folded value (do not reset)\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\nfunction iterate(produced: StreamProducer, signal: AbortSignal): AsyncIterable<unknown> {\n // Anything ReadableStream-shaped (has getReader) takes the reader path FIRST —\n // even when it is also async-iterable. On runtimes where ReadableStream\n // implements native async iteration (Node 18+ / Chrome 124+ / Firefox), the\n // spec serializes `iterator.return()` behind the pending `next()`\n // ([[ongoingPromise]]), so the AsyncIterable rescue cannot force-unwind a\n // parked read: abort would hang the consume task until the producer's next\n // chunk (or forever on a silent stream), leaking the underlying source.\n // `reader.cancel()` has no such ordering — routing every getReader-bearing\n // source through it keeps the FULL rescue promised for ReadableStream.\n // Optional chaining: a null/undefined source return value must fall through to\n // the explicit TypeError below, not throw an opaque property access error.\n if (typeof (produced as ReadableStream<unknown>)?.getReader === \"function\") {\n return readableToAsyncIterable(produced as ReadableStream<unknown>, signal);\n }\n if (typeof (produced as AsyncIterable<unknown>)?.[Symbol.asyncIterator] === \"function\") {\n return produced as AsyncIterable<unknown>;\n }\n throw new TypeError(\n \"[@wcstack/state] $streams: source must return an AsyncIterable or a ReadableStream (got neither).\",\n );\n}\n\nasync function* readableToAsyncIterable(\n stream: ReadableStream<unknown>,\n signal: AbortSignal,\n): AsyncGenerator<unknown> {\n const reader = stream.getReader();\n // A ReadableStream read() does NOT observe an AbortSignal on its own. Without\n // this, a switchMap restart / dispose leaves the previous reader parked in a\n // pending read() forever, leaking the underlying source. Cancelling on abort\n // both releases the source AND settles the pending read() so the for-await\n // unwinds and the finally below can release the lock. Abort is the only\n // early-exit path for this generator (the consumer never calls .return()\n // without aborting), so this is the sole place a non-drained stream is cancelled.\n const onAbort = (): void => {\n void reader.cancel().catch(() => {}); // tearing down; swallow a rejected cancel\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n yield value;\n }\n } finally {\n signal.removeEventListener(\"abort\", onAbort);\n reader.releaseLock();\n }\n}\n","/**\n * stream/streamRuntime.ts\n *\n * `$streams` の起動・チャンク反映・status 遷移(docs/state-streams-design.md\n * §2-2 / §3-3 / §4-3)。\n *\n * スコープ:\n * - eager 起動(startStreams)と start = restart の共通手順(startStream)。\n * - args は traceArgs(stream/argsTrace.ts)で readonly proxy 評価と同時に依存を\n * per-run 再捕捉する(§3-1)。\n * - 依存駆動 restart(§3-2): モジュール初期化時に updater の drain 終了リスナーを\n * 1 つ登録し(restartStreamsOnUpdateBatch)、起動中 stateElement\n * (stream/activeStateElements.ts — startStreams で add・abortAllStreams /\n * clearStreamRegistry で delete)の各 entry について depAddresses と batch を\n * 交差させ、hit した entry を restart する。\n *\n * 切断後の後始末について(不変条件):\n * - disconnect(abortAllStreams)は registry entry を直接ミューテーションして\n * idle に戻す($postUpdate は呼ばない — 切断済みで binding 更新は不要かつ\n * rootNode が無い)。\n * - abort 済み run の sink コールバック(fold / done / fail)は consumeSource の\n * stale-drop(全経路の signal.aborted チェック)が createState 到達前に\n * 落とすため、runtime 側に切断後ガードは不要。\n * 「runtime が createState を呼ぶのは自分の controller が生きている間だけ」が\n * この 2 つの組み合わせで常に保たれる。\n */\n\nimport type { IAbsoluteStateAddress } from \"../address/types\";\nimport type { IStateElement } from \"../components/types\";\nimport {\n DELIMITER,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n} from \"../define\";\nimport { registerUpdateBatchListener } from \"../updater/updater\";\nimport { addActiveStateElement, getActiveStateElements } from \"./activeStateElements\";\nimport { traceArgs } from \"./argsTrace\";\nimport { consumeSource } from \"./consumeSource\";\nimport { getLastNotified, setLastNotified } from \"./lastNotified\";\nimport { getStreamEntries } from \"./streamRegistry\";\nimport type { IConsumeSink, IStreamEntry, StreamStatus } from \"./types\";\n\n/**\n * 登録済みの全 stream を起動する(eager 起動、設計書 §2-3)。\n * State.connectedCallback($connectedCallback 完了後)と接続中の `_state` 再 set\n * から呼ばれる想定。\n *\n * 同時に依存駆動 restart(§3-2)の対象として activeStateElements に登録する\n * (delete 側は abortAllStreams / clearStreamRegistry —\n * stream/activeStateElements.ts のリーク防止不変条件を参照)。\n * eager 起動の throw(args のユーザー例外等)はここでは正規化せず loud fail のまま\n * (既存の $connectedCallback と同じ扱い。正規化は drain リスナー側の restart のみ)。\n */\nexport function startStreams(stateElement: IStateElement): void {\n const entries = getStreamEntries(stateElement);\n if (entries.size === 0) {\n return;\n }\n addActiveStateElement(stateElement);\n for (const entry of entries.values()) {\n startStream(stateElement, entry);\n }\n}\n\n/**\n * stream を起動する。start = restart の共通手順(設計書 §2-2):\n *\n * 1. 旧 run を abort(restart 時)→ 新 AbortController\n * 2. traceArgs で args を readonly proxy 評価し依存を丸ごと再捕捉\n * (Promise / 自己依存 / wildcard 読みは raiseError、§3-1)\n * 3. 値を initial にリセット(起動 = 最初の run も restart と同一セマンティクス、§1-3)\n * 4. status=\"active\"・error=null を反映\n * 5. consumeSource で消費開始\n */\nexport function startStream(stateElement: IStateElement, entry: IStreamEntry): void {\n entry.controller?.abort();\n const controller = new AbortController();\n entry.controller = controller;\n\n // args 評価 + 依存の per-run 再捕捉(args === null なら depAddresses を clear して\n // undefined。Promise / 自己依存 / wildcard 読みは raiseError、§3-1)\n const argsValue = traceArgs(stateElement, entry);\n\n // 値リセット: setByAddress を通すことで updater coalesce・sameValueGuard・\n // walkDependency(stream 値に依存する computed の dirty 化)がすべて乗る(§3-3)\n stateElement.createState(\"writable\", (state) => {\n state[entry.name] = entry.definition.initial;\n });\n\n updateStreamStatus(stateElement, entry, \"active\", null);\n\n const definition = entry.definition;\n const sink: IConsumeSink = {\n fold(chunk: unknown): void {\n // fold の throw はそのまま伝播させる(consumeSource が fail 経路に回す)\n stateElement.createState(\"writable\", (state) => {\n state[entry.name] = definition.fold(state[entry.name], chunk);\n });\n },\n done(): void {\n updateStreamStatus(stateElement, entry, \"done\", null);\n },\n fail(error: unknown): void {\n // 値は直前の fold 結果を保持(リセットしない)\n updateStreamStatus(stateElement, entry, \"error\", error);\n // fold-throw 時の producer 掃除(iterator.return() / reader.cancel() を発火)。\n // source-throw 時は producer が既に終了しているので abort は無害(§3-3)。\n controller.abort();\n },\n };\n void consumeSource(definition.source, argsValue, controller.signal, sink);\n}\n\n/**\n * status / error の反映ヘルパ(設計書 §4-3)。\n *\n * - registry entry が正本。常に最新値へ書き換える。\n * - 「最後に通知した観測値」(stream/lastNotified.ts — 再 set・再接続を跨いで\n * stateElement の寿命で生存する台帳)から変化した項目に対応する名前空間パス\n * (`$streamStatus.<name>` / `$streamError.<name>`)だけを writable proxy の\n * $postUpdate で通知する(updater enqueue + walkDependency)。\n * - 両方不変なら通知しない(名前空間パスは setByAddress を通らないため\n * sameValueGuard が効かず、同等の same-value 判定を runtime 側が持つ)。\n * abortAllStreams の無通知ミューテーションで台帳が invalidate されている場合は\n * 同値扱いにならず必ず通知される(再接続ウィンドウ内の fresh 読みが描画した\n * idle の恒久陳腐化を防ぐ、§4-3)。\n */\nexport function updateStreamStatus(\n stateElement: IStateElement,\n entry: IStreamEntry,\n status: StreamStatus,\n error: unknown,\n): void {\n entry.status = status;\n entry.error = error;\n const last = getLastNotified(stateElement, entry.name);\n const statusChanged = last.status !== status;\n const errorChanged = !Object.is(last.error, error);\n if (!statusChanged && !errorChanged) {\n return;\n }\n setLastNotified(stateElement, entry.name, status, error);\n stateElement.createState(\"writable\", (state) => {\n if (statusChanged) {\n state.$postUpdate(`${STATE_STREAM_STATUS_NAMESPACE_NAME}${DELIMITER}${entry.name}`);\n }\n if (errorChanged) {\n state.$postUpdate(`${STATE_STREAM_ERROR_NAMESPACE_NAME}${DELIMITER}${entry.name}`);\n }\n });\n}\n\n/**\n * 依存駆動 restart の drain リスナー(設計書 §3-2)。\n * モジュール初期化時に registerUpdateBatchListener で 1 つだけ登録される。\n *\n * - 起動中の各 stateElement の各 entry について、depAddresses と batch の交差を\n * Set.has のインスタンス同一性で判定する(小さい方 = depAddresses を回して\n * batch.has(dep)。AbsoluteStateAddress はキャッシュにより同一 (stateName, path,\n * listIndex) が同一インスタンス、§2-1)。args なし(depAddresses 空)の entry は\n * 自然にスキップされる。\n * - status は問わず restart する(done / error からも依存の叩き直しで再試行、§2-2)。\n * - hit は収集してから一括で restart する(イテレーション中の registry 変更を避ける。\n * entry ごとに最初の hit で break するため「1 drain につき 1 entry 最大 1 restart」\n * もここで自然に成立する — 同一 tick 内の複数依存書き込みは 1 restart に畳まれる)。\n * - hits の実行時にも active + entry identity を再チェックする: 先行 restart の\n * source / args は consumeSource / traceArgs の同期プレフィックスで同期実行される\n * ため、そこで (a) 他の stateElement(や自分自身のホスト)の同期切断、(b) 同一要素の\n * _state 同期再 set(clearStreamRegistry → startStreams で Set に再 add される)が\n * 起こり得る。(a) は切断済み要素への startStream が rootNode 不在で throw する経路、\n * (b) は registry から置換済みの旧 entry を restart して到達不能な孤児 consume run を\n * リークする経路(§3-2「未接続の stateElement の entry は restart しない」・\n * §5-1「切断後は idle」に違反)で、いずれも「entry が現行 registry の live entry で\n * あること」の再検証で skip する。startStream **実行中**の自己切断・再 set は事前\n * チェックではガードできないため、catch 側でも同じ再検証を行ってから error に\n * 正規化する(切断済みでの正規化は createState が再 throw して drain リスナー外へ\n * 漏れ、後続 hits の restart を巻き添えにするため)。\n * - restart(startStream)は entry ごとに try/catch し、throw(args のユーザー例外・\n * Promise 同期契約違反等)は controller.abort() → status=\"error\"・$streamError 格納\n * に正規化する(§3-2 規範 3)。updater の drain を壊さず、他 entry の restart も\n * 継続する。eager 起動(connect 時の startStreams)の throw は従来どおり loud fail。\n * - restart 内の書き込み(initial リセット・status 通知)は updater への enqueue のみで\n * 新しい microtask バッチを作る(drain 再入ではない)。自己依存は traceArgs が\n * 宣言時に raiseError で検出するため、restart 書き込みが自分の依存に再 hit する\n * ループは起きない(§3-1)。\n */\nfunction restartStreamsOnUpdateBatch(batch: ReadonlySet<IAbsoluteStateAddress>): void {\n const activeStateElements = getActiveStateElements();\n if (activeStateElements.size === 0) {\n // stream 未使用アプリの drain に配列・イテレータ割り当てのコストを載せない\n return;\n }\n const hits: { stateElement: IStateElement; entry: IStreamEntry }[] = [];\n for (const stateElement of activeStateElements) {\n for (const entry of getStreamEntries(stateElement).values()) {\n for (const dep of entry.depAddresses) {\n if (batch.has(dep)) {\n hits.push({ stateElement, entry });\n break;\n }\n }\n }\n }\n for (const { stateElement, entry } of hits) {\n // 先行 restart の source / args 同期実行は他要素の切断や同一要素の _state 同期再 set を\n // 行い得るため、実行時に再チェックする(live な Set / registry ビューで即時反映):\n // - 切断済み要素は skip(§3-2「未接続の stateElement の entry は restart しない」)\n // - entry が現行 registry のものでなければ skip — 同期再 set で置換された旧 entry を\n // restart すると、registry から到達不能なため abortAllStreams でも止められない\n // 孤児 consume run がリークする\n if (\n !activeStateElements.has(stateElement) ||\n getStreamEntries(stateElement).get(entry.name) !== entry\n ) {\n continue;\n }\n try {\n startStream(stateElement, entry);\n } catch (e) {\n entry.controller?.abort();\n // startStream 実行中(args / source の同期プレフィックス)の自己切断・同期再 set は\n // 上の再チェックではガードできない。切断済みだと updateStreamStatus の createState が\n // rootNode 不在で再 throw して drain リスナー外へ漏れる(後続 hits の restart を\n // 巻き添えにする)ため、entry がまだ現行の live entry である場合のみ error に\n // 正規化する(切断済みなら abortAllStreams が idle に戻し済み。§3-2 規範 3 / §5-1)。\n if (\n activeStateElements.has(stateElement) &&\n getStreamEntries(stateElement).get(entry.name) === entry\n ) {\n updateStreamStatus(stateElement, entry, \"error\", e);\n }\n }\n }\n}\n\nregisterUpdateBatchListener(restartStreamsOnUpdateBatch);\n","import { IStateElement } from \"../components/types\";\n\ninterface IDCCElement extends HTMLElement {\n readonly stateElement: IStateElement | null;\n}\n\nexport function getterFn(name: string) {\n return function (this: IDCCElement) {\n const stateEl = this.stateElement;\n if (!stateEl) return undefined;\n let value: any;\n try {\n stateEl.createState(\"readonly\", (state) => {\n value = state[name];\n });\n } catch (e) {\n console.warn(`[@wcstack/state] DCC getter \"${name}\" failed:`, e);\n return undefined;\n }\n return value;\n };\n}\n\nexport function setterFn(name: string) {\n return function (this: IDCCElement, value: any) {\n const stateEl = this.stateElement;\n if (!stateEl) return;\n stateEl.initializePromise.then(() => {\n stateEl.createState(\"writable\", (state) => {\n state[name] = value;\n });\n });\n };\n}\n\nexport function callFn(name: string, isAsync: boolean) {\n if (isAsync) {\n return function (this: IDCCElement, ...args: any[]) {\n const stateEl = this.stateElement;\n if (!stateEl) return undefined;\n return stateEl.initializePromise.then(() => {\n let result: any;\n return stateEl.createStateAsync(\"writable\", async (state) => {\n result = await state[name](...args);\n }).then(() => result);\n });\n };\n }\n return function (this: IDCCElement, ...args: any[]) {\n const stateEl = this.stateElement;\n if (!stateEl) return undefined;\n return stateEl.initializePromise.then(() => {\n let result: any;\n stateEl.createState(\"writable\", (state) => {\n result = state[name](...args);\n });\n return result;\n });\n };\n}\n\nexport function isInternalProperty(name: string): boolean {\n return name.startsWith(\"$\");\n}\n","/**\n * getResolvedPathInfo.ts\n *\n * Utility for parsing and generating detailed path information (IResolvedPathInfo)\n * from State property names (path strings), including wildcard and index information.\n *\n * Main responsibilities:\n * - Breaks down property names to determine presence and type of wildcards and indexes\n * - Automatically determines wildcard type: context/all/partial/none\n * - Caches by path for reusability and performance\n * - Retrieves structured path information via getStructuredPathInfo\n *\n * Design points:\n * - Caches using Map to handle reserved words like \"constructor\" and \"toString\"\n * - Flexibly determines wildcards (*) and numeric indexes, storing them in wildcardIndexes\n * - context type indicates unresolved indexes, all type indicates all resolved indexes, partial type indicates mixed\n * - ResolvedPathInfo class centralizes path parsing and information management\n */\nimport { IResolvedAddress, WildcardType } from './types';\nimport { getPathInfo } from './PathInfo';\n\n/**\n * Cache for resolved path information.\n * Uses Map to safely handle property names including reserved words like \"constructor\" and \"toString\".\n */\nconst _cache: Map<string, IResolvedAddress> = new Map();\n\n/**\n * Class that parses and stores resolved path information.\n * \n * Analyzes property path strings to extract:\n * - Path segments and their hierarchy\n * - Wildcard locations and types\n * - Numeric indexes vs unresolved wildcards\n * - Wildcard type classification (none/context/all/partial)\n */\nclass ResolvedAddress implements IResolvedAddress {\n readonly path;\n readonly segments;\n readonly wildcardCount;\n readonly wildcardType;\n readonly wildcardIndexes;\n readonly pathInfo;\n \n /**\n * Constructs resolved path information from a property path string.\n * \n * Parses the path to identify wildcards (*) and numeric indexes,\n * classifies the wildcard type, and generates structured path information.\n * \n * @param name - Property path string (e.g., \"items.*.name\" or \"data.0.value\")\n */\n constructor(path: string) {\n // Split path into individual segments\n const segments = path.split(\".\");\n const tmpPatternSegments = segments.slice();\n let incompleteCount = 0; // Count of unresolved wildcards (*)\n let completeCount = 0; // Count of resolved wildcards (numeric indexes)\n let wildcardCount = 0;\n let wildcardType: WildcardType = \"none\";\n const wildcardIndexes: (number | null)[] = [];\n\n // Process each segment to identify wildcards and indexes\n for(let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n if (segment === \"*\") {\n // Unresolved wildcard\n tmpPatternSegments[i] = \"*\";\n wildcardIndexes.push(null);\n incompleteCount++;\n wildcardCount++;\n } else {\n const number = Number(segment);\n if (!Number.isNaN(number)) {\n // Numeric index - treat as resolved wildcard\n tmpPatternSegments[i] = \"*\";\n wildcardIndexes.push(number);\n completeCount++;\n wildcardCount++;\n }\n }\n }\n // Generate pattern string with wildcards normalized\n const structuredPath = tmpPatternSegments.join(\".\");\n const pathInfo = getPathInfo(structuredPath);\n \n // Classify wildcard type based on resolved vs unresolved counts\n if (incompleteCount > 0 || completeCount > 0) {\n if (incompleteCount === wildcardCount) {\n // All wildcards are unresolved - need context to resolve\n wildcardType = \"context\";\n } else if (completeCount === wildcardCount) {\n // All wildcards are resolved with numeric indexes\n wildcardType = \"all\";\n } else {\n // Mix of resolved and unresolved wildcards\n wildcardType = \"partial\";\n }\n }\n this.path = path;\n this.segments = segments;\n this.wildcardCount = wildcardCount;\n this.wildcardType = wildcardType;\n this.wildcardIndexes = wildcardIndexes;\n this.pathInfo = pathInfo;\n }\n}\n\n/**\n * Retrieves or creates resolved path information for a property path.\n * \n * This function caches resolved path information for performance.\n * On first access, it parses the path and creates a ResolvedPathInfo instance.\n * Subsequent accesses return the cached result.\n * \n * @param name - Property path string (e.g., \"items.*.name\", \"data.0.value\")\n * @returns Resolved path information containing segments, wildcards, and type classification\n */\nexport function getResolvedAddress(name:string):IResolvedAddress {\n let nameInfo: IResolvedAddress | undefined;\n // Return cached value or create, cache, and return new instance\n return _cache.get(name) ?? (_cache.set(name, nameInfo = new ResolvedAddress(name)), nameInfo);\n}","import { IAbsoluteStateAddress } from \"../address/types\";\nimport { ICacheEntry } from \"./types\";\n\nconst cacheEntryByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, ICacheEntry> = new WeakMap();\n\nexport function getCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress\n): ICacheEntry | null {\n return cacheEntryByAbsoluteStateAddress.get(address) ?? null;\n}\n\nexport function setCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress,\n cacheEntry: ICacheEntry | null\n): void {\n if (cacheEntry === null) {\n cacheEntryByAbsoluteStateAddress.delete(address);\n } else {\n cacheEntryByAbsoluteStateAddress.set(address, cacheEntry);\n }\n}\n\nexport function dirtyCacheEntryByAbsoluteStateAddress(\n address: IAbsoluteStateAddress\n): void {\n const cacheEntry = cacheEntryByAbsoluteStateAddress.get(address);\n if (cacheEntry) {\n cacheEntry.dirty = true;\n }\n}","/**\n * getByAddress.ts\n *\n * StateClassの内部APIとして、構造化パス情報(IStructuredPathInfo)とリストインデックス(IListIndex)を指定して\n * 状態オブジェクト(target)から値を取得するための関数(getByAddress)の実装です。\n *\n * 主な役割:\n * - 指定されたパス・インデックスに対応するState値を取得(多重ループやワイルドカードにも対応)\n * - 依存関係の自動登録(checkDependencyで登録)\n * - キャッシュ機構(リストもキャッシュ対象)\n * - getter経由で値取得時はpushAddressでスコープを一時設定\n * - 存在しない場合は親pathAddressやlistIndexを辿って再帰的に値を取得\n *\n * 設計ポイント:\n * - checkDependencyで依存追跡を実行 \n * - キャッシュ有効時はstateAddressで値をキャッシュし、取得・再利用を最適化\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値取得を実現\n * - finallyでキャッシュへの格納を保証\n */\n\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { IStateAddress } from \"../../address/types\";\nimport { getCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { getCommandNamespace } from \"../../command/commandNamespace\";\nimport { IStateElement } from \"../../components/types\";\nimport { STATE_COMMAND_NAMESPACE_NAME, STATE_STREAM_ERROR_NAMESPACE_NAME, STATE_STREAM_STATUS_NAMESPACE_NAME, WILDCARD } from \"../../define\";\nimport { raiseError } from \"../../raiseError\";\nimport { collectStreamDependency } from \"../../stream/argsTrace\";\nimport { getStreamErrorNamespace, getStreamStatusNamespace } from \"../../stream/streamNamespace\";\nimport { IStateHandler } from \"../types\";\nimport { checkDependency } from \"./checkDependency\";\n\n/**\n * namespace 配下のパスは raw state を持たないため、proxy の get トラップと同じ\n * namespace オブジェクトを辿る。1セグメント目は namespace 本体、2セグメント目以降は\n * namespace 上のキーを順に走査する。走査値が object / function 以外(null /\n * undefined / primitive の葉)になったら undefined を返す — 葉より深い読み\n * (例: `$streamStatus.<name>.<key>`、error が primitive throw のときの\n * `$streamError.<name>.message`)は宣言外アクセスと同じ undefined 解決とし、\n * Reflect.get の non-object TypeError を updater の drain に漏らさない\n * (§4-1 の throw しない寛容規約)。\n */\nfunction walkNamespace(namespace: object, segments: string[]): any {\n let value: any = namespace;\n for (let i = 1; i < segments.length; i++) {\n // Object(v) !== v は「v が object / function でない」(= primitive / null / undefined)判定\n if (Object(value) !== value) {\n return undefined;\n }\n value = Reflect.get(value, segments[i]);\n }\n return value;\n}\n\nfunction _getByAddress(\n target : object,\n address : IStateAddress,\n receiver : any,\n handler : IStateHandler,\n stateElement: IStateElement,\n): any {\n const firstSegment = address.pathInfo.segments[0];\n if (firstSegment === STATE_COMMAND_NAMESPACE_NAME) {\n // $command 名前空間: キーは宣言済み command token 名\n return walkNamespace(getCommandNamespace(stateElement), address.pathInfo.segments);\n }\n if (firstSegment === STATE_STREAM_STATUS_NAMESPACE_NAME) {\n // $streamStatus / $streamError 名前空間: キーは宣言済み stream 名\n // (registry entry が正本の thin gateway、docs/state-streams-design.md §4-2)。\n // setByAddress の親走査もここを通るため、子への Reflect.set が namespace proxy の\n // raiseError に到達する = 書き込み防御(S11)もこの分岐で成立する。\n return walkNamespace(getStreamStatusNamespace(stateElement), address.pathInfo.segments);\n }\n if (firstSegment === STATE_STREAM_ERROR_NAMESPACE_NAME) {\n return walkNamespace(getStreamErrorNamespace(stateElement), address.pathInfo.segments);\n }\n if (address.pathInfo.path in target) {\n // getterの中で参照の可能性があるので、addressをプッシュする\n if (stateElement.getterPaths.has(address.pathInfo.path)) {\n handler.pushAddress(address);\n try {\n return Reflect.get(target, address.pathInfo.path, receiver);\n } finally {\n handler.popAddress();\n }\n } else {\n return Reflect.get(target, address.pathInfo.path);\n }\n } else {\n const parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\n return Reflect.get(parentValue, index);\n } else {\n return Reflect.get(parentValue, lastSegment);\n }\n }\n}\n\nfunction _getByAddressWithCache(\n target : object, \n address : IStateAddress,\n receiver : any,\n handler : IStateHandler,\n stateElement: IStateElement\n): any {\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const cacheEntry = getCacheEntryByAbsoluteStateAddress(absAddress);\n if (cacheEntry !== null && cacheEntry.dirty === false) {\n return cacheEntry.value;\n }\n const value = _getByAddress(target, address, receiver, handler, stateElement);\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n return value;\n}\n\nexport function getByAddress(\n target : object,\n address : IStateAddress,\n receiver : any,\n handler : IStateHandler\n): any {\n checkDependency(handler, address);\n // $streams の args トレース中のみ絶対アドレスを捕捉(collector 非活性なら即 return)\n collectStreamDependency(handler.stateElement, address);\n const stateElement = handler.stateElement;\n const cacheable = address.pathInfo.wildcardCount > 0 || \n stateElement.getterPaths.has(address.pathInfo.path);\n if (cacheable) {\n return _getByAddressWithCache(target, address, receiver, handler, stateElement);\n } else {\n return _getByAddress(target, address, receiver, handler, stateElement);\n }\n}\n","import { calcWildcardLen } from \"../../address/calcWildcardLen\";\nimport { IStateAddress } from \"../../address/types\";\nimport { IStateHandler } from \"../types\";\n\nexport function checkDependency(\n handler: IStateHandler,\n address: IStateAddress,\n): void {\n // $untrackDependency スコープ中/setter 実行中は依存を張らない\n if (handler.untracking) {\n return;\n }\n // 動的依存関係の登録\n if (handler.addressStackLength > 0) {\n const lastAddress = handler.lastAddressStack;\n const lastInfo = lastAddress?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null) {\n if (stateElement.getterPaths.has(lastInfo.path) &&\n lastInfo.path !== address.pathInfo.path) {\n // lastInfo.pathはgetterの名前であり、address.pathInfo.pathは\n // そのgetterが参照している値のパスである\n stateElement.addDynamicDependency(address.pathInfo.path, lastInfo.path);\n // 他行読み取りの検出: 評価中の getter と読み取り先が同じワイルドカード親\n // (リスト)を共有し、その階層の listIndex が異なる場合、この getter は\n // 自行の外に依存する(隣接項目参照など)。該当リストを crossRowListPaths に\n // 記録し、walkDependency の diff-filter 展開を全行展開へフォールバックさせる。\n if (address.pathInfo.wildcardCount > 0 && lastInfo.wildcardCount > 0) {\n const sharedLen = calcWildcardLen(address.pathInfo, lastInfo);\n if (sharedLen > 0) {\n let crossRow = false;\n for (let level = 0; level < sharedLen; level++) {\n if (address.listIndex?.at(level) !== lastAddress!.listIndex?.at(level)) {\n crossRow = true;\n break;\n }\n }\n if (crossRow) {\n for (let level = 0; level < sharedLen; level++) {\n stateElement.addCrossRowListPath?.(address.pathInfo.wildcardParentPaths[level]);\n }\n }\n }\n }\n }\n }\n }\n}","/**\n * getContextListIndex.ts\n *\n * Stateの内部APIとして、現在のプロパティ参照スコープにおける\n * 指定したstructuredPath(ワイルドカード付きプロパティパス)に対応する\n * リストインデックス(IListIndex)を取得する関数です。\n *\n * 主な役割:\n * - handlerの最後にアクセスされたAddressから、指定パスに対応するリストインデックスを取得\n * - ワイルドカード階層に対応し、多重ループやネストした配列バインディングにも利用可能\n *\n * 設計ポイント:\n * - 直近のプロパティ参照情報を取得\n * - info.indexByWildcardPathからstructuredPathのインデックスを特定\n * - listIndex.at(index)で該当階層のリストインデックスを取得\n * - パスが一致しない場合や参照が存在しない場合はnullを返す\n */\n\nimport { IListIndex } from \"../../list/types\";\nimport { IStateHandler } from \"../types\";\n\nexport function getContextListIndex(\n handler: IStateHandler,\n structuredPath: string\n): IListIndex | null {\n if (handler.addressStackLength === 0) {\n return null;\n }\n const address = handler.lastAddressStack;\n if (address === null) {\n return null;\n }\n const index: number | undefined = address.pathInfo.indexByWildcardPath[structuredPath];\n if (typeof index === \"undefined\") {\n return null;\n }\n return address.listIndex?.at(index) ?? null;\n}\n","import { IStateAddress } from \"../../address/types\";\nimport { WILDCARD } from \"../../define\";\nimport { IStateHandler } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\n\n/**\n * Reports whether an address has been initialized, independently of its value.\n * In particular, an own slot containing `undefined` is initialized while a\n * missing slot is not.\n */\nexport function hasByAddress(\n target: object,\n address: IStateAddress,\n receiver: unknown,\n handler: IStateHandler,\n): boolean {\n if (address.pathInfo.path in target) return true;\n const parentAddress = address.parentAddress;\n if (parentAddress === null) return false;\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n if (parentValue === null || (typeof parentValue !== \"object\" && typeof parentValue !== \"function\")) {\n return false;\n }\n const lastSegment = address.pathInfo.lastSegment;\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index;\n return typeof index === \"number\" && index in parentValue;\n }\n return lastSegment in parentValue;\n}\n","import { IStateAddress } from \"../../address/types\";\nimport { ISwapInfo } from \"./types\";\n\nconst swapInfoByStateAddress: WeakMap<IStateAddress, ISwapInfo> = new WeakMap();\n\nexport function getSwapInfoByAddress(address: IStateAddress): ISwapInfo | null {\n return swapInfoByStateAddress.get(address) ?? null;\n}\n\nexport function setSwapInfoByAddress(address: IStateAddress, swapInfo: ISwapInfo | null): void {\n if (swapInfo === null) {\n swapInfoByStateAddress.delete(address);\n } else {\n swapInfoByStateAddress.set(address, swapInfo);\n }\n}\n","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { calcWildcardLen } from \"../address/calcWildcardLen\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { createStateAddress } from \"../address/StateAddress\";\nimport { IPathInfo, IStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { WILDCARD } from \"../define\";\nimport { createListDiff } from \"../list/createListDiff\";\nimport { getLastListValueByAbsoluteStateAddress } from \"../list/lastListValueByAbsoluteStateAddress\";\nimport { IListDiff, IListIndex } from \"../list/types\";\nimport { getByAddressSymbol } from \"../proxy/symbols\";\nimport { IStateProxy } from \"../proxy/types\";\nimport { raiseError } from \"../raiseError\";\nimport { SearchType } from \"./types\";\n\nconst MAX_DEPENDENCY_DEPTH = 1000;\n\nfunction getIndexes(listDiff: IListDiff, searchType: SearchType): Iterable<IListIndex> {\n switch (searchType) {\n case \"old\":\n return listDiff.oldIndexes;\n case \"new\":\n return listDiff.newIndexes;\n case \"add\":\n return listDiff.addIndexSet;\n case \"change\":\n return listDiff.changeIndexSet;\n case \"delete\":\n return listDiff.deleteIndexSet;\n default: \n if (config.debug) {\n console.log(`Invalid search type: ${searchType}`);\n }\n return [];\n }\n}\n\ntype ExpandContext = {\n readonly stateName: string,\n readonly stateElement: IStateElement,\n readonly targetPathInfo: IPathInfo,\n readonly targetListIndexes: IListIndex[],\n readonly wildcardPaths: string[],\n readonly wildcardParentPaths: string[],\n readonly stateProxy: IStateProxy,\n readonly searchType: SearchType\n}\n\nfunction _walkExpandWildcard(\n context: ExpandContext, \n currentWildcardIndex: number,\n parentListIndex: IListIndex | null\n): void {\n const parentPath = context.wildcardParentPaths[currentWildcardIndex];\n const parentPathInfo = getPathInfo(parentPath);\n const parentAbsPathInfo = getAbsolutePathInfo(context.stateElement, parentPathInfo);\n const parentAddress = createStateAddress(parentPathInfo, parentListIndex);\n const parentAbsAddress = createAbsoluteStateAddress(parentAbsPathInfo, parentListIndex);\n const lastValue = getLastListValueByAbsoluteStateAddress(parentAbsAddress);\n const newValue = context.stateProxy[getByAddressSymbol](parentAddress);\n const listDiff = createListDiff(parentAddress.listIndex, lastValue, newValue);\n\n const loopIndexes = getIndexes(listDiff, context.searchType);\n if (currentWildcardIndex === context.wildcardPaths.length - 1) {\n context.targetListIndexes.push(...loopIndexes);\n } else {\n for(const listIndex of loopIndexes) {\n _walkExpandWildcard(\n context,\n currentWildcardIndex + 1,\n listIndex\n );\n }\n }\n}\n\n/**\n * 静的子展開(list → list.*)の展開範囲。\n * - \"full\": 新リストの全行を展開する(従来挙動)。\n * - \"diff\": 追加行(addIndexSet)と位置が変わった行(changeIndexSet)のみ展開する。\n * 未変更行は値が変わらないため dirty 化・再適用が不要(リスト置換のコストが\n * 既存行数に比例するスケーリング欠陥の解消。docs/list-replacement-dependency-scaling.md)。\n * 削除時の集計 getter は $getAll / $resolve がリスト本体(コンテナ)を読むことで\n * 登録される動的エッジ(list → 集計 getter)が担う。\n */\nexport type ListExpansion = \"full\" | \"diff\";\n\ntype Context = {\n readonly stateName: string,\n readonly stateElement: IStateElement,\n readonly staticMap: Map<string, string[]>,\n readonly dynamicMap: Map<string, string[]>,\n readonly result: Set<IStateAddress>,\n readonly listPathSet: Set<string>,\n readonly visited: Set<IStateAddress>,\n readonly stateProxy: IStateProxy,\n readonly searchType: SearchType,\n readonly listExpansion: ListExpansion,\n}\n\n/**\n * 静的子展開の対象 listIndex 群。fullRows は行全体(list.* とその subtree)を展開する。\n * movedRows は「位置だけが変わった行」で、index 以外の入力が不変なため展開を\n * index 依存 getter の subtree(getMovedRowExpansionPaths)に限定できる。\n */\ntype ExpansionSelection = {\n readonly fullRows: Iterable<IListIndex>,\n readonly movedRows: Iterable<IListIndex> | null,\n}\n\nconst EMPTY_INDEXES: IListIndex[] = [];\n\n/**\n * 静的子展開で訪問する listIndex 群を選ぶ。\"diff\" でも次の場合は全行に倒す:\n * - diff に変化が一切見えない再代入(同一参照および内容同一コピーの再代入。\n * `arr[0].v = 5; s.items = [...arr]` のような in-place 変異後のリフレッシュ\n * イディオムは diff に映らないため、全行展開で従来挙動を保つ。\n * 削除だけの置換は除く — 残存行に変化は無く、集計はコンテナ動的エッジが担う)\n * - 他行を読む getter が検出されたリスト(隣接項目参照など。未変更行の派生値も変わりうる)\n */\nfunction selectExpansionIndexes(\n context: Context,\n sourcePath: string,\n _lastValue: unknown,\n _newValue: unknown,\n listDiff: IListDiff,\n): ExpansionSelection {\n if (context.listExpansion === \"full\") {\n return { fullRows: listDiff.newIndexes, movedRows: null };\n }\n if (context.stateElement.crossRowListPaths?.has(sourcePath)) {\n return { fullRows: listDiff.newIndexes, movedRows: null };\n }\n if (listDiff.addIndexSet.size === 0 && listDiff.changeIndexSet.size === 0) {\n // 追加も移動も無い。削除も無ければ「変化が見えない再代入」= リフレッシュ意図\n if (listDiff.deleteIndexSet.size === 0) {\n return { fullRows: listDiff.newIndexes, movedRows: null };\n }\n // 削除のみ: 残存行は位置も値も不変なので展開しない\n return { fullRows: EMPTY_INDEXES, movedRows: null };\n }\n return { fullRows: listDiff.addIndexSet, movedRows: listDiff.changeIndexSet };\n}\n\nconst EMPTY_PATH_INFOS: IPathInfo[] = [];\n\n/**\n * 位置だけが変わった行(movedRows)で展開すべきパス群を求める。\n * `${listPath}.*` の静的 subtree を辿り、$1 等を読んだ実績のある getter\n * (indexDependentGetterPaths)だけを返す。行の同一性・listIndex は保たれ\n * index 以外の入力が不変なので、index を読まない getter / 値パスは再評価不要。\n * 戻り値:\n * - IPathInfo[](空可): この各パスだけを行の listIndex で展開する\n * - null: ネストしたワイルドカード配下に index 依存 getter がある\n * (listIndex の階数が合わず個別展開できない)→ 呼び出し側で行全体展開に倒す\n */\nfunction getMovedRowExpansionPaths(\n context: Context,\n wildcardPath: string,\n depPathInfo: IPathInfo,\n): IPathInfo[] | null {\n const indexGetters = context.stateElement.indexDependentGetterPaths;\n if (!indexGetters || indexGetters.size === 0) {\n return EMPTY_PATH_INFOS;\n }\n let result: IPathInfo[] | null = null;\n const queue: string[] = [wildcardPath];\n const seen = new Set<string>(queue);\n for (let i = 0; i < queue.length; i++) {\n const path = queue[i];\n if (indexGetters.has(path)) {\n const pathInfo = getPathInfo(path);\n if (pathInfo.wildcardCount !== depPathInfo.wildcardCount) {\n return null;\n }\n (result ??= []).push(pathInfo);\n }\n const children = context.staticMap.get(path);\n if (children) {\n for (const child of children) {\n if (!seen.has(child)) {\n seen.add(child);\n queue.push(child);\n }\n }\n }\n }\n return result ?? EMPTY_PATH_INFOS;\n}\n\ntype StackEntry = { address: IStateAddress, depth: number };\n\nfunction _walkDependency(\n context: Context,\n startAddress: IStateAddress,\n callback: (address: IStateAddress) => void\n): void {\n const stack: StackEntry[] = [{ address: startAddress, depth: 0 }];\n\n while (stack.length > 0) {\n const { address, depth } = stack.pop()!;\n if (depth > MAX_DEPENDENCY_DEPTH) {\n raiseError(`Maximum dependency depth of ${MAX_DEPENDENCY_DEPTH} exceeded. Possible circular dependency detected at path: ${address.pathInfo.path}`);\n }\n if (context.visited.has(address)) {\n continue;\n }\n context.visited.add(address);\n callback(address);\n const sourcePath = address.pathInfo.path;\n const nextDepth = depth + 1;\n\n // 依存アドレスを逆順でpushするための一時バッファ\n const nextEntries: StackEntry[] = [];\n\n /**\n * パスから依存関係をたどる\n * users.*.name <= users.* <= users\n * ただし、users がリストであれば users.* の依存関係は展開する\n */\n const staticDeps = context.staticMap.get(sourcePath);\n if (staticDeps) {\n for(const dep of staticDeps) {\n const depPathInfo = getPathInfo(dep);\n if (context.listPathSet.has(sourcePath) && depPathInfo.lastSegment === WILDCARD) {\n //expand indexes\n const newValue = context.stateProxy[getByAddressSymbol](address);\n const absPathInfo = getAbsolutePathInfo(context.stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const lastValue = getLastListValueByAbsoluteStateAddress(absAddress);\n const listDiff = createListDiff(address.listIndex, lastValue, newValue);\n const selection = selectExpansionIndexes(context, sourcePath, lastValue, newValue, listDiff);\n for(const listIndex of selection.fullRows) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n if (selection.movedRows !== null) {\n const movedPathInfos = getMovedRowExpansionPaths(context, dep, depPathInfo);\n if (movedPathInfos === null) {\n // ネスト配下に index 依存 getter: 安全側で行全体を展開(従来挙動)\n for(const listIndex of selection.movedRows) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n } else if (movedPathInfos.length > 0) {\n // 位置のみ変わった行は index 依存 getter のパスだけを展開する\n for(const listIndex of selection.movedRows) {\n for(const pathInfo of movedPathInfos) {\n const depAddress = createStateAddress(pathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n // movedPathInfos が空: index を読む getter が subtree に無い =\n // 位置のみ変わった行の値は不変。展開・dirty 化とも不要。\n }\n } else {\n const depAddress = createStateAddress(depPathInfo, address.listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n /**\n * 動的依存関係をたどる\n * 動的依存関係は、getterの実行時に決定される\n *\n * source, target\n *\n * products.*.price => products.*.tax\n * get \"products.*.tax\"() { return this[\"products.*.price\"] * 0.1; }\n *\n * products.*.price => products.summary\n * get \"products.summary\"() { return this.$getAll(\"products.*.price\", []).reduce(sum); }\n *\n * categories.*.name => categories.*.products.*.categoryName\n * get \"categories.*.products.*.categoryName\"() { return this[\"categories.*.name\"]; }\n */\n const dynamicDeps = context.dynamicMap.get(sourcePath);\n if (dynamicDeps) {\n for(const dep of dynamicDeps) {\n const depPathInfo = getPathInfo(dep);\n const listIndexes: (IListIndex | null)[] = [];\n if (depPathInfo.wildcardCount > 0) {\n // ワイルドカードを含む依存関係の処理\n // 同じ親を持つかをパスの集合積で判定する\n // polyfills.tsにてSetのintersectionメソッドを定義している\n const wildcardLen = calcWildcardLen(address.pathInfo, depPathInfo);\n const expandable = (depPathInfo.wildcardCount - wildcardLen) >= 1;\n if (expandable) {\n let listIndex: IListIndex | null;\n if (wildcardLen > 0) {\n // categories.*.name => categories.*.products.*.categoryName\n // ワイルドカードを含む同じ親(products.*)を持つのが、\n // さらに下位にワイルドカードがあるので展開する\n if (address.listIndex === null) {\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\n }\n listIndex = address.listIndex!.at(wildcardLen - 1);\n } else {\n // selectedIndex => items.*.selected\n // 同じ親を持たない場合はnullから開始\n listIndex = null;\n }\n const expandContext: ExpandContext = {\n stateName: context.stateName,\n stateElement: context.stateElement,\n targetPathInfo: depPathInfo,\n targetListIndexes: [],\n wildcardPaths: depPathInfo.wildcardPaths,\n wildcardParentPaths: depPathInfo.wildcardParentPaths,\n stateProxy: context.stateProxy,\n searchType: context.searchType,\n };\n _walkExpandWildcard(expandContext, wildcardLen, listIndex);\n listIndexes.push(...expandContext.targetListIndexes);\n } else {\n // products.*.price => products.*.tax\n // ワイルドカードを含む同じ親(products.*)を持つので、リストインデックスは引き継ぐ\n if (address.listIndex === null) {\n raiseError(`Cannot expand dynamic dependency with wildcard for non-list address: ${address.pathInfo.path}`);\n }\n const listIndex = address.listIndex.at(wildcardLen - 1);\n listIndexes.push(listIndex);\n }\n } else {\n // products.*.tax => currentTaxRate\n // 同じ親を持たないので、リストインデックスはnull\n listIndexes.push(null);\n }\n for(const listIndex of listIndexes) {\n const depAddress = createStateAddress(depPathInfo, listIndex);\n context.result.add(depAddress);\n nextEntries.push({ address: depAddress, depth: nextDepth });\n }\n }\n }\n\n // 逆順でpushして、元の再帰と同じ探索順序を保つ\n for(let i = nextEntries.length - 1; i >= 0; i--) {\n stack.push(nextEntries[i]);\n }\n }\n}\n\nexport function walkDependency(\n stateName: string,\n stateElement: IStateElement,\n startAddress: IStateAddress,\n staticDependency: Map<string, string[]>,\n dynamicDependency: Map<string, string[]>,\n listPathSet: Set<string>,\n stateProxy: IStateProxy,\n searchType: SearchType,\n callback: (address: IStateAddress) => void,\n options?: { listExpansion?: ListExpansion }\n): IStateAddress[] {\n // 依存ゼロの葉パス(staticMap / dynamicMap にエントリ無し)は context や Set を\n // 割り当てず、開始アドレスの callback だけで完結する。リスト行の値書き込み\n // (update ホットパス)は set 毎にここを通る。開始アドレスへの callback は\n // 従来の walk 先頭と同一で、戻り値(依存アドレス群)も従来どおり空。\n const startPath = startAddress.pathInfo.path;\n if (!staticDependency.has(startPath) && !dynamicDependency.has(startPath)) {\n callback(startAddress);\n return [];\n }\n const context: Context = {\n stateName: stateName,\n stateElement: stateElement,\n staticMap: staticDependency,\n dynamicMap: dynamicDependency,\n result: new Set<IStateAddress>(),\n listPathSet: listPathSet,\n visited: new Set<IStateAddress>(),\n stateProxy: stateProxy,\n searchType: searchType,\n listExpansion: options?.listExpansion ?? \"full\",\n };\n _walkDependency(context, startAddress, callback);\n return Array.from(context.result);\n}\n","/**\n * setByAddress.ts\n *\n * Stateの内部APIとして、アドレス情報(IStateAddress)を指定して\n * 状態オブジェクト(target)に値を設定するための関数(setByAddress)の実装です。\n *\n * 主な役割:\n * - 指定されたパス・インデックスに対応するState値を設定(多重ループやワイルドカードにも対応)\n * - getter/setter経由で値設定時はpushAddressでスコープを一時設定\n * - 存在しない場合は親pathInfoやlistIndexを辿って再帰的に値を設定\n * - 設定後はupdater.enqueueUpdateAddressで更新情報を登録\n *\n * 設計ポイント:\n * - ワイルドカードや多重ループにも柔軟に対応し、再帰的な値設定を実現\n * - finallyで必ず更新情報を登録し、再描画や依存解決に利用\n * - getter/setter経由のスコープ切り替えも考慮した設計\n */\n\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\nimport { WILDCARD } from \"../../define\";\nimport { createListIndex } from \"../../list/createListIndex\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { raiseError } from \"../../raiseError\";\nimport { getUpdater } from \"../../updater/updater\";\nimport { IStateHandler, IStateProxy } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\nimport { hasByAddress } from \"./hasByAddress\";\nimport { getSwapInfoByAddress, setSwapInfoByAddress } from \"./swapInfo\";\nimport { walkDependency } from \"../../dependency/walkDependency\";\nimport { dirtyCacheEntryByAbsoluteStateAddress, setCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { config } from \"../../config\";\nimport { devtoolsSink } from \"../../devtools/sink\";\nimport { beginPropagationTransaction, getCurrentPropagationContext } from \"../../propagation/propagation\";\n\n// Phase 3: 書き込み時点の因果 context を update record に付与する。\n// binding 経由の書き込みは呼び出し元の dynamic scope から context を引き継ぎ、\n// binding 外からの API update は新しい transaction を開始する(設計書 §4 規則 1)。\n// 依存 walk で enqueue される派生アドレスも同じ書き込みの因果に属する。\nfunction notifyWrite(\n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n receiver : any,\n handler : IStateHandler\n): void {\n const propagationContext = config.enablePropagationContext\n ? (getCurrentPropagationContext() ?? beginPropagationTransaction(-1))\n : null;\n const updater = getUpdater();\n updater.enqueueAbsoluteAddress(absAddress, propagationContext);\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\n walkDependency(\n handler.stateName,\n handler.stateElement,\n address,\n handler.stateElement.staticDependency,\n handler.stateElement.dynamicDependency,\n handler.stateElement.listPaths,\n receiver as IStateProxy,\n \"new\",\n (depAddress: IStateAddress) => {\n // キャッシュを無効化(ダーティ)\n if (depAddress === address) return;\n const absDepPathInfo = getAbsolutePathInfo(handler.stateElement, depAddress.pathInfo);\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\n // 更新対象として登録\n updater.enqueueAbsoluteAddress(absDepAddress, propagationContext);\n },\n // リスト置換時は追加行・位置変更行のみ展開する(未変更行の再訪を省く。\n // $postUpdate の手動リフレッシュは従来通り全行展開のまま)\n { listExpansion: \"diff\" }\n )\n}\n\nfunction _setByAddress(\n target : object,\n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n value : any,\n receiver : any,\n handler : IStateHandler\n): any {\n try {\n if (address.pathInfo.path in target) {\n if (handler.stateElement.setterPaths.has(address.pathInfo.path)) {\n // setterの中で参照の可能性があるので、addressをプッシュする。\n // setter は命令的な代入であって派生(getter)ではないため、実行中の\n // 読み取り(同値ガードの旧値読み・$1 参照等)で依存を張らない。\n // アクセサペア(get/set 同名パス)では、抑止しないと setter 内の内部\n // 書き込みの同値ガード読みが「getter の依存」として誤登録される。\n handler.pushAddress(address);\n handler.beginUntrack();\n try {\n return Reflect.set(target, address.pathInfo.path, value, receiver);\n } finally {\n handler.endUntrack();\n handler.popAddress();\n }\n } else {\n return Reflect.set(target, address.pathInfo.path, value);\n }\n } else {\n const parentAddress = address.parentAddress;\n if (parentAddress === null) {\n return Reflect.set(target, address.pathInfo.path, value);\n }\n const parentValue = getByAddress(target, parentAddress, receiver, handler);\n const lastSegment = address.pathInfo.segments[address.pathInfo.segments.length - 1];\n if (lastSegment === WILDCARD) {\n const index = address.listIndex?.index ?? raiseError(`address.listIndex?.index is undefined path: ${address.pathInfo.path}`);\n return Reflect.set(parentValue, index, value);\n } else {\n return Reflect.set(parentValue, lastSegment, value);\n }\n }\n } finally {\n notifyWrite(address, absAddress, receiver, handler);\n }\n}\n\nfunction _setByAddressWithSwap(\n target : object, \n address : IStateAddress,\n absAddress: IAbsoluteStateAddress,\n value : any, \n receiver : any,\n handler : IStateHandler\n) {\n // elementsの場合はswapInfoを準備\n let parentAddress = address.parentAddress ?? raiseError(`address.parentAddress is undefined path: ${address.pathInfo.path}`);\n let swapInfo = getSwapInfoByAddress(parentAddress);\n if (swapInfo === null) {\n const parentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\n const listIndexes = getListIndexesByList(parentValue) ?? [];\n swapInfo = {\n value: [...parentValue], listIndexes: [...listIndexes]\n }\n setSwapInfoByAddress(parentAddress, swapInfo);\n }\n try {\n return _setByAddress(target, address, absAddress, value, receiver, handler);\n } finally {\n const index = swapInfo.value.indexOf(value);\n const currentParentValue = getByAddress(target, parentAddress, receiver, handler) ?? [];\n const currentListIndexes = Array.isArray(currentParentValue) ? (getListIndexesByList(currentParentValue) ?? []) : [];\n const curIndex = address.listIndex!.index;\n const listIndex = (index !== -1) ? \n swapInfo!.listIndexes[index] : \n createListIndex(parentAddress.listIndex, -1);\n currentListIndexes[curIndex] = listIndex;\n // 重複チェック\n // 重複していない場合、swapが完了したとみなし、インデックスを更新\n const listValueSet = new Set(currentParentValue);\n if (listValueSet.size === swapInfo!.value.length) {\n for(let i = 0; i < currentListIndexes.length; i++) {\n currentListIndexes[i].index = i;\n }\n // 完了したのでswapInfoを削除\n setSwapInfoByAddress(parentAddress, null);\n }\n }\n}\n\nexport function setByAddress(\n target : object,\n address : IStateAddress,\n value : any,\n receiver : any,\n handler : IStateHandler\n): any {\n const stateElement = handler.stateElement;\n const path = address.pathInfo.path;\n\n // --- fast path: 宣言済み getter/setter でも swap 対象でもない、親を持つ葉パス ---\n // 従来は same-value guard の値読み・hasByAddress・実書き込みがそれぞれ親チェーンを\n // 解決していた(キャッシュヒットでも getByAddress 呼び出しの固定費 ×3)。\n // 親を 1 回だけ解決し、同じ親オブジェクトに対して guard 判定と Reflect.set を行う。\n // 非オブジェクト親などの例外形は従来経路へ倒し、挙動差を作らない。\n if (!(path in target) && address.parentAddress !== null && !stateElement.elementPaths.has(path)) {\n const parentValue = getByAddress(target, address.parentAddress, receiver, handler);\n if (typeof parentValue === \"object\" && parentValue !== null) {\n // ワイルドカード末尾で listIndex が無い不正アドレスは、従来どおり\n // 書き込み時(enqueue 済みの try 内)に raiseError する → key は undefined のまま持ち回す\n const lastSegment = address.pathInfo.lastSegment;\n const key: PropertyKey | undefined = lastSegment === WILDCARD\n ? address.listIndex?.index\n : lastSegment;\n let devOldValue: unknown;\n let devHasOldValue = false;\n if (config.sameValueGuard && (value === null || typeof value !== \"object\")) {\n // hasByAddress と同じ「初期化済みスロットか」判定(undefined 格納と未初期化を区別)\n const has = key !== undefined && key in parentValue;\n const oldValue = key !== undefined ? (parentValue as Record<PropertyKey, unknown>)[key] : undefined;\n if (has && Object.is(oldValue, value)) {\n return true;\n }\n devOldValue = oldValue;\n devHasOldValue = true;\n }\n const cacheable = address.pathInfo.wildcardCount > 0 ||\n stateElement.getterPaths.has(path);\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"state:write\",\n absoluteAddress: absAddress,\n value,\n oldValue: devOldValue,\n hasOldValue: devHasOldValue,\n });\n }\n try {\n if (key === undefined) {\n raiseError(`address.listIndex?.index is undefined path: ${path}`);\n }\n return Reflect.set(parentValue, key, value);\n } finally {\n notifyWrite(address, absAddress, receiver, handler);\n if (cacheable) {\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n }\n // DCC bindable イベントディスパッチ\n const eventName = stateElement.bindableEventMap[path];\n if (eventName) {\n const rootNode = stateElement.rootNode;\n if (rootNode instanceof ShadowRoot) {\n rootNode.host.dispatchEvent(new CustomEvent(eventName, {\n detail: value,\n bubbles: true,\n }));\n }\n }\n }\n }\n }\n // --- end fast path ---\n\n // --- same-value guard (config.sameValueGuard・既定 ON) ---\n // primitive 値かつ Object.is 同値なら、set / enqueue / walkDependency / DOM 適用 /\n // $updatedCallback / DCC イベントを丸ごとスキップ(標準的なリアクティブ no-op)。\n // 参照型(object/array)は in-place mutation 取りこぼし防止のため素通し(ガードしない)。\n // devtools write イベント用: guard が既に取得した旧値のみ流用する\n // (参照型のために追加の get はしない — protocol §4.2)\n let devOldValue: unknown;\n let devHasOldValue = false;\n if (config.sameValueGuard && (value === null || typeof value !== \"object\")) {\n const oldValue = getByAddress(target, address, receiver, handler);\n if (hasByAddress(target, address, receiver, handler) && Object.is(oldValue, value)) {\n return true;\n }\n devOldValue = oldValue;\n devHasOldValue = true;\n }\n // --- end same-value guard ---\n const isSwappable = stateElement.elementPaths.has(address.pathInfo.path);\n const cacheable = address.pathInfo.wildcardCount > 0 ||\n stateElement.getterPaths.has(address.pathInfo.path);\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n if (devtoolsSink !== null) {\n devtoolsSink({\n type: \"state:write\",\n absoluteAddress: absAddress,\n value,\n oldValue: devOldValue,\n hasOldValue: devHasOldValue,\n });\n }\n try {\n if (isSwappable) {\n return _setByAddressWithSwap(target, address, absAddress, value, receiver, handler);\n } else {\n return _setByAddress(target, address, absAddress, value, receiver, handler);\n }\n } finally {\n if (cacheable) {\n setCacheEntryByAbsoluteStateAddress(absAddress, {\n value: value,\n dirty: false\n });\n }\n // DCC bindable イベントディスパッチ\n const eventName = stateElement.bindableEventMap[address.pathInfo.path];\n if (eventName) {\n const rootNode = stateElement.rootNode;\n if (rootNode instanceof ShadowRoot) {\n rootNode.host.dispatchEvent(new CustomEvent(eventName, {\n detail: value,\n bubbles: true,\n }));\n }\n }\n }\n}\n\n","/**\n * resolve.ts\n *\n * StateClassのAPIとして、パス(path)とインデックス(indexes)を指定して\n * Stateの値を取得・設定するための関数(resolve)の実装です。\n *\n * 主な役割:\n * - 文字列パス(path)とインデックス配列(indexes)から、該当するState値の取得・設定を行う\n * - ワイルドカードや多重ループを含むパスにも対応\n * - value未指定時は取得(getByRef)、指定時は設定(setByRef)を実行\n *\n * 設計ポイント:\n * - getStructuredPathInfoでパスを解析し、ワイルドカード階層ごとにリストインデックスを解決\n * - handler.engine.getListIndexesSetで各階層のリストインデックス集合を取得\n * - getByRef/setByRefで値の取得・設定を一元的に処理\n * - 柔軟なバインディングやAPI経由での利用が可能\n */\n\nimport { getPathInfo } from \"../../address/PathInfo\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { setByAddress } from \"../methods/setByAddress\";\nimport { IStateHandler } from \"../types\";\n\ntype ResolveFunction = (path: string, indexes: number[], value?: any) => any;\n\nexport function resolve(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): ResolveFunction {\n return (path: string, indexes: number[], value?: any): any => {\n const pathInfo = getPathInfo(path);\n if (handler.addressStackLength > 0) {\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\n // gettersに含まれる場合は依存関係を登録\n if (stateElement.getterPaths.has(lastInfo.path)) {\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\n }\n }\n }\n\n if (pathInfo.wildcardParentPathInfos.length > indexes.length) {\n raiseError(`indexes length is insufficient: ${path}`);\n }\n // ワイルドカード階層ごとにListIndexを解決していく\n let listIndex: IListIndex | null = null;\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\n const wildcardParentPathInfo = pathInfo.wildcardParentPathInfos[i];\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\n const tmpValue = getByAddress(target, wildcardAddress, receiver, handler);\n const listIndexes = getListIndexesByList(tmpValue);\n if (listIndexes == null) {\n raiseError(`ListIndexes not found: ${wildcardParentPathInfo.path}`);\n }\n const index = indexes[i];\n listIndex = listIndexes[index] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n }\n\n // ToDo:WritableかReadonlyかを判定して適切なメソッドを呼び出す\n const address = createStateAddress(pathInfo, listIndex);\n const hasSetValue = typeof value !== \"undefined\";\n if (!hasSetValue) {\n return getByAddress(target, address, receiver, handler);\n } else {\n setByAddress(target, address, value, receiver, handler);\n }\n };\n} ","/**\n * getAllReadonly\n *\n * ワイルドカードを含む State パスから、対象となる全要素を配列で取得する。\n * Throws: LIST-201(インデックス未解決)、BIND-201(ワイルドカード情報不整合)\n */\n\nimport { getPathInfo } from \"../../address/PathInfo\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IPathInfo, IStateAddress } from \"../../address/types\";\nimport { createListDiff } from \"../../list/createListDiff\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { getContextListIndex } from \"../methods/getContextListIndex\";\nimport { IStateHandler } from \"../types\";\nimport { resolve } from \"./resolve\";\n\n// ToDo: IAbsoluteStateAddressに変更する\nconst lastValueByListAddress = new WeakMap<IStateAddress, unknown[]>();\n\ntype GetAllFunction = (path: string, indexes?: number[]) => any[];\n\nexport function getAll(\n target: object, \n prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): GetAllFunction {\n const resolveFn = resolve(target, prop, receiver, handler);\n return (path: string, indexes?: number[]): any[] => {\n const newValueByAddress: Map<IStateAddress, any> = new Map();\n const pathInfo = getPathInfo(path);\n if (handler.addressStackLength > 0) {\n const lastInfo = handler.lastAddressStack?.pathInfo ?? null;\n const stateElement = handler.stateElement;\n if (lastInfo !== null && lastInfo.path !== pathInfo.path) {\n // gettersに含まれる場合は依存関係を登録\n if (stateElement.getterPaths.has(lastInfo.path)) {\n stateElement.addDynamicDependency(pathInfo.path, lastInfo.path);\n }\n }\n }\n \n if (typeof indexes === \"undefined\") {\n for(let i = 0; i < pathInfo.wildcardParentPathInfos.length; i++) {\n const wildcardPattern = pathInfo.wildcardParentPathInfos[i];\n const listIndex = getContextListIndex(handler, wildcardPattern.path);\n if (listIndex) {\n indexes = listIndex.indexes;\n break;\n }\n }\n if (typeof indexes === \"undefined\") {\n indexes = [];\n }\n }\n const walkWildcardPattern = (\n wildcardParentPathInfos: IPathInfo[],\n wildcardIndexPos: number,\n listIndex: IListIndex | null,\n indexes: number[],\n indexPos: number,\n parentIndexes: number[],\n results: number[][]\n ) => {\n const wildcardParentPathInfo = wildcardParentPathInfos[wildcardIndexPos] ?? null;\n if (wildcardParentPathInfo === null) {\n results.push(parentIndexes);\n return;\n }\n const wildcardAddress = createStateAddress(wildcardParentPathInfo, listIndex);\n const oldValue = lastValueByListAddress.get(wildcardAddress);\n const newValue = getByAddress(target, wildcardAddress, receiver, handler);\n const listDiff = createListDiff(listIndex, oldValue, newValue);\n const listIndexes = listDiff.newIndexes;\n const index = indexes[indexPos] ?? null;\n newValueByAddress.set(wildcardAddress, newValue);\n if (index === null) {\n for(let i = 0; i < listIndexes.length; i++) {\n const listIndex = listIndexes[i];\n walkWildcardPattern(\n wildcardParentPathInfos, \n wildcardIndexPos + 1, \n listIndex, \n indexes, \n indexPos + 1, \n parentIndexes.concat(listIndex.index),\n results);\n }\n } else {\n const listIndex = listIndexes[index] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n if ((wildcardIndexPos + 1) < wildcardParentPathInfos.length) {\n walkWildcardPattern(\n wildcardParentPathInfos, \n wildcardIndexPos + 1, \n listIndex, \n indexes, \n indexPos + 1, \n parentIndexes.concat(listIndex.index),\n results\n );\n } else {\n // 最終ワイルドカード層まで到達しているので、結果を確定\n results.push(parentIndexes.concat(listIndex.index));\n }\n }\n }\n const resultIndexes: number[][] = [];\n walkWildcardPattern(\n pathInfo.wildcardParentPathInfos, \n 0, \n null, \n indexes, \n 0, \n [], \n resultIndexes\n );\n const resultValues: any[] = [];\n for(let i = 0; i < resultIndexes.length; i++) {\n resultValues.push(resolveFn(\n pathInfo.path,\n resultIndexes[i]\n ));\n }\n for(const [address, newValue] of newValueByAddress.entries()) {\n lastValueByListAddress.set(address, newValue);\n }\n return resultValues;\n }\n }\n","/**\n * getListIndex.ts\n *\n * StateClassの内部APIとして、パス情報(IResolvedAddress)から\n * 対応するリストインデックス(IListIndex)を取得する関数です。\n *\n * 主な役割:\n * - パスのワイルドカード種別(context/all/partial/none)に応じてリストインデックスを解決\n * - context型は現在のループコンテキストからリストインデックスを取得\n * - all型は各階層のリストインデックス集合からインデックスを辿って取得\n * - partial型やnone型は未実装またはnullを返す\n *\n * 設計ポイント:\n * - ワイルドカードや多重ループ、ネストした配列バインディングに柔軟に対応\n * - getListIndexesByListで各階層のリストインデックス集合を取得\n * - エラー時はraiseErrorで例外を投げる\n */\n\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IResolvedAddress } from \"../../address/types\";\nimport { getListIndexesByList } from \"../../list/listIndexesByList\";\nimport { IListIndex } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\nimport { getByAddress } from \"./getByAddress\";\nimport { getContextListIndex } from \"./getContextListIndex\";\n\nexport function getListIndex(\n target : object, \n resolvedAddress: IResolvedAddress, \n receiver: any,\n handler: IStateHandler\n): IListIndex | null {\n const pathInfo = resolvedAddress.pathInfo;\n switch (resolvedAddress.wildcardType) {\n case \"none\":\n return null;\n case \"context\": {\n const lastWildcardPath = pathInfo.wildcardPaths.at(-1) ?? \n raiseError(`lastWildcardPath is null: ${resolvedAddress.pathInfo.path}`);\n return getContextListIndex(handler, lastWildcardPath) ?? \n raiseError(`ListIndex not found: ${resolvedAddress.pathInfo.path}`);\n }\n case \"all\": {\n let parentListIndex: IListIndex | null = null;\n for(let i = 0; i < resolvedAddress.pathInfo.wildcardCount; i++) {\n const wildcardParentPathInfo = resolvedAddress.pathInfo.wildcardParentPathInfos[i] ?? \n raiseError(`wildcardParentPathInfo is null: ${resolvedAddress.pathInfo.path}`);\n const wildcardParentAddress = createStateAddress(wildcardParentPathInfo, parentListIndex);\n const wildcardParentValue = getByAddress(target, wildcardParentAddress, receiver, handler);\n const wildcardParentListIndexes: IListIndex[] = getListIndexesByList(wildcardParentValue) ?? \n raiseError( `ListIndex not found: ${wildcardParentPathInfo.path}`);\n const wildcardIndex = resolvedAddress.wildcardIndexes[i] ?? \n raiseError(`wildcardIndex is null: ${resolvedAddress.pathInfo.path}`);\n parentListIndex = wildcardParentListIndexes[wildcardIndex] ?? \n raiseError(`ListIndex not found: ${wildcardParentPathInfo.path}`);\n }\n return parentListIndex;\n }\n case \"partial\": {\n raiseError(`Partial wildcard type is not supported yet: ${resolvedAddress.pathInfo.path}`);\n }\n }\n}\n","/**\n * setLoopContext.ts\n *\n * StateClassの内部APIとして、ループコンテキスト(ILoopContext)を一時的に設定し、\n * 指定した同期/非同期コールバックをそのスコープ内で実行するための関数です。\n *\n * 主な役割:\n * - handler.loopContextにループコンテキストを一時的に設定\n * - 既にループコンテキストが設定されている場合はエラーを投げる\n * - 常にスコープを設定しコールバックを実行\n * - finallyで必ずloopContextをnullに戻し、スコープ外への影響を防止\n *\n * 設計ポイント:\n * - ループバインディングや多重ループ時のスコープ管理を安全に行う\n * - finallyで状態復元を保証し、例外発生時も安全\n * - 非同期処理にも対応\n */\n\nimport { ILoopContext } from \"../../list/types\";\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\n\nfunction _setLoopContext<T>(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => T\n): T {\n if (typeof handler.loopContext !== \"undefined\") {\n raiseError('already in loop context');\n }\n handler.setLoopContext(loopContext);\n try {\n handler.pushAddress(loopContext);\n try {\n return callback();\n } finally {\n handler.popAddress();\n }\n } finally {\n handler.clearLoopContext();\n }\n}\n\nexport function setLoopContext(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => any\n): any {\n return _setLoopContext(handler, loopContext, callback);\n}\n\nexport async function setLoopContextAsync(\n handler: IStateHandler,\n loopContext: ILoopContext | null,\n callback: () => Promise<any>\n): Promise<any> {\n return await _setLoopContext(handler, loopContext, callback);\n}\n","/**\n * get.ts\n *\n * StateClassのProxyトラップとして、プロパティアクセス時の値取得処理を担う関数(get)の実装です。\n *\n * 主な役割:\n * - 文字列プロパティの場合、特殊プロパティ($1〜、$stateElement, $getAll, $postUpdate,\n * $resolve, $trackDependency, $command, $streamStatus, $streamError)に応じた値やAPIを返却\n * - 通常のプロパティはgetResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\n * - getByRefで構造化パス・リストインデックスに対応した値を取得\n * - シンボルプロパティの場合はhandler.callableApi経由でAPIを呼び出し\n * - それ以外はReflect.getで通常のプロパティアクセスを実行\n *\n * 設計ポイント:\n * - $1〜$128(MAX_WILDCARD_DEPTH)は直近のStatePropertyRefのリストインデックス値を返す特殊プロパティ\n * - $getAll, $resolve 等はAPI関数を、$command / $streamStatus / $streamError は名前空間を返す\n * - 通常のプロパティアクセスもバインディングや多重ループに対応\n * - シンボルAPIやReflect.getで拡張性・互換性も確保\n */\n\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IAbsoluteStateAddress, IStateAddress } from \"../../address/types\";\nimport { getCommandNamespace } from \"../../command/commandNamespace\";\nimport { DELIMITER, INDEX_BY_INDEX_NAME, STATE_COMMAND_NAMESPACE_NAME, STATE_STREAM_ERROR_NAMESPACE_NAME, STATE_STREAM_STATUS_NAMESPACE_NAME } from \"../../define\";\nimport { raiseError } from \"../../raiseError\";\nimport { getStreamErrorNamespace, getStreamStatusNamespace } from \"../../stream/streamNamespace\";\nimport { connectedCallback } from \"../apis/connectedCallback\";\nimport { disconnectedCallback } from \"../apis/disconnectedCallback\";\nimport { getAll } from \"../apis/getAll\";\nimport { postUpdate } from \"../apis/postUpdate\";\nimport { resolve } from \"../apis/resolve\";\nimport { trackDependency } from \"../apis/trackDependency\";\nimport { untrackDependency } from \"../apis/untrackDependency\";\nimport { updatedCallback } from \"../apis/updatedCallback\";\nimport { getByAddress } from \"../methods/getByAddress\";\nimport { hasByAddress } from \"../methods/hasByAddress\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { setByAddress } from \"../methods/setByAddress\";\nimport { setLoopContext, setLoopContextAsync } from \"../methods/setLoopContext\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol, getByAddressSymbol, hasByAddressSymbol, setByAddressSymbol, setLoopContextAsyncSymbol, setLoopContextSymbol, updatedCallbackSymbol } from \"../symbols\";\nimport { IStateHandler } from \"../types\";\n\n// `$streamStatus.<name>` / `$streamError.<name>` の dotted パス判定用プレフィックス\nconst STREAM_STATUS_PATH_PREFIX = `${STATE_STREAM_STATUS_NAMESPACE_NAME}${DELIMITER}`;\nconst STREAM_ERROR_PATH_PREFIX = `${STATE_STREAM_ERROR_NAMESPACE_NAME}${DELIMITER}`;\n\n// symbol API のクロージャは handler(= proxy と 1:1、target/receiver 不変)ごとに\n// 使い回す。drain の getValue が binding ごとに getByAddressSymbol を引くため、\n// 毎回の新規クロージャ生成が GC 圧・固定費になっていた。\nconst symbolApiCacheByHandler = new WeakMap<IStateHandler, Map<symbol, unknown>>();\n\nfunction getSymbolApiCache(handler: IStateHandler): Map<symbol, unknown> {\n let cache = symbolApiCacheByHandler.get(handler);\n if (typeof cache === \"undefined\") {\n cache = new Map<symbol, unknown>();\n symbolApiCacheByHandler.set(handler, cache);\n }\n return cache;\n}\n\nexport function get(\n target : object, \n prop : PropertyKey, \n receiver: any,\n handler : IStateHandler\n): any {\n const index = INDEX_BY_INDEX_NAME[prop];\n if (typeof index !== \"undefined\") {\n if (handler.addressStackLength === 0) {\n raiseError(`No active state reference to get list index for \"${prop.toString()}\".`);\n }\n const lastAddress = handler.lastAddressStack;\n // getter 評価中のインデックス読み取りを記録する。位置だけが変わった行\n // (listDiff.changeIndexSet)は index 以外の入力が不変なので、walkDependency の\n // 静的子展開を「インデックスを読んだ getter の subtree」に限定できる。\n // $untrackDependency スコープ中/setter 実行中は記録しない。\n const lastInfo = lastAddress?.pathInfo;\n if (lastInfo && !handler.untracking && handler.stateElement?.getterPaths.has(lastInfo.path)) {\n handler.stateElement.addIndexDependentGetterPath?.(lastInfo.path);\n }\n const listIndex = lastAddress?.listIndex;\n return listIndex?.indexes[index] ?? raiseError(`ListIndex not found: ${prop.toString()}`);\n }\n if (typeof prop === \"string\") {\n if (prop[0] === '$') {\n switch (prop) {\n case \"$stateElement\": {\n return handler.stateElement;\n }\n case \"$getAll\": {\n return (path: string, indexes?: number[]): any[] => {\n return getAll(\n target, \n prop, \n receiver,\n handler\n )(path, indexes);\n }\n }\n case \"$postUpdate\": {\n return (path: string): void => {\n return postUpdate(\n target, \n prop, \n receiver,\n handler\n )(path);\n }\n }\n case \"$resolve\": {\n return (path: string, indexes: number[], value?: any): any => {\n return resolve(\n target, \n prop, \n receiver,\n handler\n )(path, indexes, value);\n }\n }\n case \"$trackDependency\": {\n return (path: string): void => {\n return trackDependency(\n target,\n prop,\n receiver,\n handler\n )(path);\n }\n }\n case \"$untrackDependency\": {\n return <T>(fn: () => T): T => {\n return untrackDependency(\n target,\n prop,\n receiver,\n handler\n )(fn);\n }\n }\n case STATE_COMMAND_NAMESPACE_NAME: {\n return getCommandNamespace(handler.stateElement);\n }\n case STATE_STREAM_STATUS_NAMESPACE_NAME: {\n return getStreamStatusNamespace(handler.stateElement);\n }\n case STATE_STREAM_ERROR_NAMESPACE_NAME: {\n return getStreamErrorNamespace(handler.stateElement);\n }\n }\n // switch 不一致の $ プロパティのうち、`$streamStatus.<name>` / `$streamError.<name>`\n // の dotted パスだけは通常のパス解決(getByAddress)へフォールスルーさせる。\n // これが computed(getter)内での依存追跡付き読み取りの正規形\n // (checkDependency が getter スコープで動的依存を登録し、$postUpdate の\n // walkDependency で computed が無効化される、docs/state-streams-design.md §4-3)。\n // それ以外の未知 $ プロパティは従来どおり undefined を返す。\n if (!prop.startsWith(STREAM_STATUS_PATH_PREFIX) && !prop.startsWith(STREAM_ERROR_PATH_PREFIX)) {\n return undefined;\n }\n }\n const resolvedAddress = getResolvedAddress(prop);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\n return getByAddress(\n target,\n stateAddress,\n receiver,\n handler\n );\n } else if (typeof prop === \"symbol\") {\n const cache = getSymbolApiCache(handler);\n const cached = cache.get(prop);\n if (typeof cached !== \"undefined\") {\n return cached;\n }\n let api: unknown;\n switch (prop) {\n case setLoopContextAsyncSymbol: {\n api = (loopContext: any, callback = async (): Promise<any> => {}): Promise<any> => {\n return setLoopContextAsync(handler, loopContext, callback);\n };\n break;\n }\n case setLoopContextSymbol: {\n api = (loopContext: any, callback = (): any => {}): any => {\n return setLoopContext(handler, loopContext, callback);\n };\n break;\n }\n case getByAddressSymbol: {\n api = (address: IStateAddress): any => {\n return getByAddress(\n target,\n address,\n receiver,\n handler\n );\n }\n break;\n }\n case hasByAddressSymbol: {\n api = (address: IStateAddress): boolean => {\n return hasByAddress(\n target,\n address,\n receiver,\n handler\n );\n }\n break;\n }\n case setByAddressSymbol: {\n api = (address: IStateAddress, value: any): void => {\n return setByAddress(\n target,\n address,\n value,\n receiver,\n handler\n );\n }\n break;\n }\n case connectedCallbackSymbol: {\n api = (): Promise<void> => {\n return connectedCallback(\n target,\n connectedCallbackSymbol,\n receiver,\n handler\n );\n }\n break;\n }\n case disconnectedCallbackSymbol: {\n api = (): void => {\n return disconnectedCallback(\n target,\n disconnectedCallbackSymbol,\n receiver,\n handler\n );\n }\n break;\n }\n case updatedCallbackSymbol: {\n api = (\n refs: IAbsoluteStateAddress[]\n ): unknown => {\n return updatedCallback(\n target,\n refs,\n receiver,\n handler\n );\n }\n break;\n }\n default: {\n return Reflect.get(\n target,\n prop,\n receiver\n );\n }\n }\n cache.set(prop, api);\n return api;\n }\n}\n","import { getAbsolutePathInfo } from \"../../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../../address/AbsoluteStateAddress\";\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { IStateAddress } from \"../../address/types\";\nimport { dirtyCacheEntryByAbsoluteStateAddress } from \"../../cache/cacheEntryByAbsoluteStateAddress\";\nimport { walkDependency } from \"../../dependency/walkDependency\";\nimport { getUpdater } from \"../../updater/updater\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { IStateHandler, IStateProxy } from \"../types\";\n\n\ntype PostFunction = (path: string) => void;\n\nexport function postUpdate(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n handler: IStateHandler\n): PostFunction {\n const stateElement = handler.stateElement;\n return (path: string): void => {\n const resolvedAddress = getResolvedAddress(path);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const address = createStateAddress(resolvedAddress.pathInfo, listIndex);\n const absPathInfo = getAbsolutePathInfo(stateElement, address.pathInfo);\n const absAddress = createAbsoluteStateAddress(absPathInfo, address.listIndex);\n const updater = getUpdater();\n updater.enqueueAbsoluteAddress(absAddress);\n // 依存関係のあるキャッシュを無効化(ダーティ)、更新対象として登録\n walkDependency(\n handler.stateName,\n handler.stateElement,\n address,\n handler.stateElement.staticDependency,\n handler.stateElement.dynamicDependency,\n handler.stateElement.listPaths,\n receiver as IStateProxy,\n \"new\",\n (depAddress: IStateAddress) => {\n // キャッシュを無効化(ダーティ)\n const absDepPathInfo = getAbsolutePathInfo(stateElement, depAddress.pathInfo);\n const absDepAddress = createAbsoluteStateAddress(absDepPathInfo, depAddress.listIndex);\n dirtyCacheEntryByAbsoluteStateAddress(absDepAddress);\n // 更新対象として登録\n updater.enqueueAbsoluteAddress(absDepAddress);\n }\n );\n }\n}","/**\n * trackDependency.ts\n *\n * StateClassのAPIとして、getterチェーン中に参照されたパス間の\n * 依存関係を動的に登録するための関数(trackDependency)の実装です。\n *\n * 主な役割:\n * - 現在解決中のStatePropertyRef(lastRefStack)を取得\n * - pathManager.gettersに登録されているgetterの場合のみ依存を追跡\n * - 自身と同一パターンでない参照に対してaddDynamicDependencyを呼び出す\n *\n * 設計ポイント:\n * - lastRefStackが存在しない場合はSTATE-202エラーを発生させる\n * - getter同士の再帰(自己依存)は登録しない\n * - 動的依存はpathManagerに集約し、キャッシュの無効化に利用する\n */\n\nimport { raiseError } from \"../../raiseError\";\nimport { IStateHandler } from \"../types\";\n\n/**\n * 現在解決中のgetterから、指定されたパスへの動的依存を登録する関数を返します。\n *\n * - pathManager.gettersに登録されているgetterのみ依存追跡を行う\n * - 自己参照は除外し、異なるパターン間の依存だけを記録\n * - 動的依存はpathManager.addDynamicDependencyで集中管理される\n *\n * @param target プロキシ対象オブジェクト\n * @param prop アクセスされたプロパティキー\n * @param receiver プロキシレシーバ\n * @param handler StateClassハンドラ\n * @returns 引数pathで指定されたパターンへの依存を登録する無名関数\n */\n\ntype TrackDependencyFunction = (path: string) => void;\n\nexport function trackDependency(\n _target: object, \n _prop: PropertyKey, \n _receiver: any,\n handler: IStateHandler\n): TrackDependencyFunction {\n return (path: string): void => {\n if (handler.addressStackLength === 0) {\n raiseError(`No active state reference to track dependency for path \"${path}\".`);\n }\n const lastInfo = handler.lastAddressStack?.pathInfo ?? \n raiseError('Internal error: lastAddressStack is null');\n const stateElement = handler.stateElement;\n if (handler.stateElement.getterPaths.has(lastInfo.path) &&\n lastInfo.path !== path) {\n stateElement.addDynamicDependency(path, lastInfo.path);\n }\n };\n}\n","/**\n * untrackDependency.ts\n *\n * StateClass の API として、コールバック実行中の依存追跡を抑止する関数\n * ($untrackDependency)の実装です。$trackDependency(明示的な依存登録)と\n * 対称の「明示的な依存抑止」API。\n *\n * 主な役割:\n * - fn 実行中、checkDependency の動的依存登録と $1 インデックス依存の記録を抑止\n * - fn の戻り値をそのまま返す(値の読み取り自体は通常どおり行われる)\n *\n * 設計ポイント:\n * - スコープはハンドラ単位のカウンタ(ネスト可)で管理し、finally で必ず復元する\n * - 典型例: リスト行 getter が「行の外の単一値」を読みたいが、その値の変更で\n * 全行を再評価させたくない場合(選択インデックス等)。書き手側が該当行へ\n * 直接書き込むことで、必要な行だけが更新される\n */\n\nimport { IStateHandler } from \"../types\";\n\ntype UntrackDependencyFunction = <T>(fn: () => T) => T;\n\nexport function untrackDependency(\n _target: object,\n _prop: PropertyKey,\n _receiver: any,\n handler: IStateHandler\n): UntrackDependencyFunction {\n return <T>(fn: () => T): T => {\n handler.beginUntrack();\n try {\n return fn();\n } finally {\n handler.endUntrack();\n }\n };\n}\n","/**\n * connectedCallback.ts\n *\n * StateClassのライフサイクルフック「$connectedCallback」を呼び出すユーティリティ関数です。\n *\n * 主な役割:\n * - オブジェクト(target)に$connectedCallbackメソッドが定義されていれば呼び出す\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\n * - 非同期関数として実行可能(await対応)\n *\n * 設計ポイント:\n * - Reflect.getで$connectedCallbackプロパティを安全に取得\n * - 存在しない場合は何もしない\n * - ライフサイクル管理やカスタム初期化処理に利用\n */\n\nimport { STATE_CONNECTED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\nexport async function connectedCallback(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n _handler: IStateHandler\n):Promise<void> {\n const callback = Reflect.get(target, STATE_CONNECTED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n await callback.call(receiver);\n }\n}","/**\n * disconnectedCallback.ts\n *\n * StateClassのライフサイクルフック「$disconnectedCallback」を呼び出すユーティリティ関数です。\n *\n * 主な役割:\n * - オブジェクト(target)に$disconnectedCallbackメソッドが定義されていれば呼び出す\n * - コールバックはtargetのthisコンテキストで呼び出し、IReadonlyStateProxy(receiver)を引数として渡す\n *\n * 設計ポイント:\n * - Reflect.getで$disconnectedCallbackプロパティを安全に取得\n * - 存在しない場合は何もしない\n * - ライフサイクル管理やクリーンアップ処理に利用\n */\n\nimport { STATE_DISCONNECTED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\nexport function disconnectedCallback(\n target: object, \n _prop: PropertyKey, \n receiver: any,\n _handler: IStateHandler\n): void {\n const callback = Reflect.get(target, STATE_DISCONNECTED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n callback.call(receiver);\n }\n}\n","/**\n * updatedCallback.ts\n *\n * Utility function to invoke the StateClass lifecycle hook \"$updatedCallback\".\n *\n * Main responsibilities:\n * - Invokes $updatedCallback method if defined on the object (target)\n * - Callback is invoked with target's this context, passing IReadonlyStateProxy (receiver) as argument\n * - Executable as async function (await compatible)\n *\n * Design points:\n * - Safely retrieves $updatedCallback property using Reflect.get\n * - Does nothing if the callback doesn't exist\n * - Used for lifecycle management and update handling logic\n */\n\nimport { IAbsoluteStateAddress } from \"../../address/types\";\nimport { STATE_UPDATED_CALLBACK_NAME } from \"../../define\";\nimport { IStateHandler } from \"../types\";\n\n/**\n * Invokes the $updatedCallback lifecycle hook if defined on the target.\n * Aggregates updated paths and their indexes before passing to the callback.\n * @param target - Target object to check for callback\n * @param refs - Array of state property references that were updated\n * @param receiver - State proxy to pass as this context\n * @param handler - State handler (unused but part of signature)\n * @returns Promise or void depending on callback implementation\n */\nexport function updatedCallback(\n target: object, \n refs: IAbsoluteStateAddress[], \n receiver: any,\n handler: IStateHandler\n): unknown {\n const callback: unknown = Reflect.get(target, STATE_UPDATED_CALLBACK_NAME);\n if (typeof callback === \"function\") {\n const paths: Set<string> = new Set();\n // ToDo:現状では1階層のみのワイルドカードに対応。多階層対応は後回し\n const indexesListByPath: Record<string, Array<number[]>> = {};\n for (const ref of refs) {\n const pathInfo = ref.absolutePathInfo.pathInfo;\n let pathName;\n if (ref.absolutePathInfo.stateName === handler.stateName) {\n pathName = pathInfo.path;\n } else {\n pathName = pathInfo.path + \"@\" + ref.absolutePathInfo.stateName;\n }\n paths.add(pathName);\n if (pathInfo.wildcardCount > 0) {\n const indexes = ref.listIndex!.indexes ?? [];\n const indexesList = indexesListByPath[pathName];\n if (typeof indexesList === \"undefined\") {\n indexesListByPath[pathName] = [indexes];\n } else {\n indexesList.push(indexes);\n }\n }\n }\n return callback.call(receiver, Array.from(paths), indexesListByPath);\n }\n}","import { IStateAddress } from \"../address/types\";\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { IStateHandler, IStateProxy, Mutability } from \"./types\";\nimport { get as trapGet } from \"./traps/get\";\nimport { set as trapSet } from \"./traps/set\";\nimport { ILoopContext } from \"../list/types\";\nimport { IState } from \"../types\";\nimport { MAX_LOOP_DEPTH } from \"../define\";\n\nclass StateHandler implements IStateHandler {\n private _stateElement: IStateElement;\n private _stateName: string;\n private _addressStack: (IStateAddress | null | undefined)[] = Array(MAX_LOOP_DEPTH).fill(undefined);\n private _addressStackIndex: number = -1;\n private _loopContext: ILoopContext | null | undefined;\n private _mutability: Mutability;\n private _untrackDepth: number = 0;\n \n constructor(\n rootNode: Node,\n stateName: string,\n mutability: Mutability\n ) {\n this._stateName = stateName;\n const stateElement = getStateElementByName(rootNode, this._stateName);\n if (stateElement === null) {\n raiseError(`StateHandler: State element with name \"${this._stateName}\" not found.`);\n }\n this._stateElement = stateElement;\n this._mutability = mutability;\n }\n\n get stateName(): string {\n return this._stateName;\n }\n\n get stateElement(): IStateElement {\n return this._stateElement;\n }\n\n get lastAddressStack(): IStateAddress | null {\n let address: IStateAddress | null | undefined = undefined;\n if (this._addressStackIndex >= 0) {\n address = this._addressStack[this._addressStackIndex];\n }\n if (typeof address === \"undefined\") {\n raiseError(`Last address stack is undefined.`);\n }\n return address;\n }\n\n get addressStackLength(): number {\n return this._addressStackIndex + 1;\n }\n\n get loopContext(): ILoopContext | null | undefined {\n return this._loopContext;\n }\n\n pushAddress(address: IStateAddress | null): void {\n this._addressStackIndex++;\n if (this._addressStackIndex >= MAX_LOOP_DEPTH) {\n raiseError(`Exceeded maximum address stack depth of ${MAX_LOOP_DEPTH}. Possible infinite loop.`);\n }\n this._addressStack[this._addressStackIndex] = address;\n }\n\n popAddress(): IStateAddress | null {\n if (this._addressStackIndex < 0) {\n return null;\n }\n const address = this._addressStack[this._addressStackIndex];\n if (typeof address === \"undefined\") {\n raiseError(`Address stack at index ${this._addressStackIndex} is undefined.`);\n }\n this._addressStack[this._addressStackIndex] = undefined;\n this._addressStackIndex--;\n return address;\n }\n\n setLoopContext(loopContext: ILoopContext | null): void {\n this._loopContext = loopContext;\n }\n\n clearLoopContext(): void {\n this._loopContext = undefined;\n }\n\n get untracking(): boolean {\n return this._untrackDepth > 0;\n }\n\n beginUntrack(): void {\n this._untrackDepth++;\n }\n\n endUntrack(): void {\n this._untrackDepth--;\n }\n\n get(\n target : object, \n prop : PropertyKey, \n receiver: any\n ): any {\n return trapGet(target, prop, receiver, this);\n }\n\n set(\n target : object, \n prop : PropertyKey, \n value : any, \n receiver: any\n ): boolean {\n if (this._mutability === \"readonly\") {\n raiseError(`State \"${this._stateName}\" is readonly.`);\n }\n return trapSet(target, prop, value, receiver, this);\n }\n\n has(\n target: object, \n prop : PropertyKey\n ): boolean {\n return Reflect.has(target, prop);\n// return Reflect.has(target, prop) || this.symbols.has(prop) || this.apis.has(prop);\n }\n\n}\n\nexport function createStateProxy(\n rootNode: Node,\n state: IState,\n stateName: string,\n mutability: Mutability\n): IStateProxy {\n const handler = new StateHandler(rootNode, stateName, mutability);\n const stateProxy = new Proxy<IStateProxy>(state as IStateProxy, handler);\n return stateProxy;\n}\n\nexport const __private__ = {\n StateHandler,\n};","/**\n * set.ts\n *\n * StateClassのProxyトラップとして、プロパティ設定時の値セット処理を担う関数(set)の実装です。\n *\n * 主な役割:\n * - 文字列プロパティの場合、getResolvedPathInfoでパス情報を解決し、getListIndexでリストインデックスを取得\n * - setByRefで構造化パス・リストインデックスに対応した値設定を実行\n * - それ以外(シンボル等)の場合はReflect.setで通常のプロパティ設定を実行\n *\n * 設計ポイント:\n * - バインディングや多重ループ、ワイルドカードを含むパスにも柔軟に対応\n * - setByRefを利用することで、依存解決や再描画などの副作用も一元管理\n * - Reflect.setで標準的なプロパティ設定の互換性も確保\n */\n\nimport { getResolvedAddress } from \"../../address/ResolvedAddress\";\nimport { IStateHandler } from \"../types\";\nimport { getListIndex } from \"../methods/getListIndex\";\nimport { createStateAddress } from \"../../address/StateAddress\";\nimport { setByAddress } from \"../methods/setByAddress\";\n\nexport function set(\n target : object, \n prop : PropertyKey, \n value : any, \n receiver: any,\n handler : IStateHandler\n): boolean {\n if (typeof prop === \"string\") {\n const resolvedAddress = getResolvedAddress(prop);\n const listIndex = getListIndex(target, resolvedAddress, receiver, handler);\n const stateAddress = createStateAddress(resolvedAddress.pathInfo, listIndex);\n return setByAddress(\n target, \n stateAddress,\n value, \n receiver,\n handler\n );\n } else {\n return Reflect.set(\n target, \n prop, \n value, \n receiver\n );\n }\n}\n","\n// WebComponent専用のキャッシュ\n// outerState.tsからのアクセスで、これを返す\n\nimport { IAbsoluteStateAddress } from \"../address/types\";\n\nconst lastValueByAbsoluteStateAddress: WeakMap<IAbsoluteStateAddress, any> = new WeakMap();\n\nexport function setLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress, value: any): void {\n lastValueByAbsoluteStateAddress.set(absoluteStateAddress, value);\n}\n\nexport function getLastValueByAbsoluteStateAddress(absoluteStateAddress: IAbsoluteStateAddress): any {\n return lastValueByAbsoluteStateAddress.get(absoluteStateAddress);\n}\n","import { IStateElement } from \"../components/types\";\n\nconst stateElementByWebComponent: WeakMap<Element, Map<string, IStateElement>> = new WeakMap();\n\nexport function setStateElementByWebComponent(webComponent: Element, stateName: string, stateElement: IStateElement): void {\n let stateMap = stateElementByWebComponent.get(webComponent);\n if (!stateMap) {\n stateMap = new Map();\n stateElementByWebComponent.set(webComponent, stateMap);\n }\n stateMap.set(stateName, stateElement);\n}\n\nexport function getStateElementByWebComponent(webComponent: Element, stateName: string): IStateElement | null {\n const stateMap = stateElementByWebComponent.get(webComponent);\n if (!stateMap) {\n return null;\n }\n return stateMap.get(stateName) ?? null;\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IAbsolutePathInfo } from \"../address/types\";\nimport { getAbsoluteStateAddressByBinding } from \"../binding/getAbsoluteStateAddressByBinding\";\nimport { IBindingInfo } from \"../binding/types\";\nimport { addBindingByNode } from \"../bindings/getBindingsByNode\";\nimport { IStateElement } from \"../components/types\";\nimport { DELIMITER } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByName } from \"../stateElementByName\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\n\nexport interface IMappingRule {\n innerAbsPathInfo: IAbsolutePathInfo;\n outerAbsPathInfo: IAbsolutePathInfo;\n}\n\nconst innerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\nconst outerMappingByElement: WeakMap<Element, Map<IAbsolutePathInfo, IAbsolutePathInfo>> = new WeakMap();\nconst primaryMappingRuleSetByElement: WeakMap<Element, Set<IMappingRule>> = new WeakMap();\nconst primaryBindingByMappingRule: WeakMap<IMappingRule, IBindingInfo> = new WeakMap();\n\nfunction createMappingRuleByBinding(innerState: IStateElement, binding: IBindingInfo): IMappingRule {\n const innerPathInfo = getPathInfo(binding.propSegments.slice(1).join(DELIMITER));\n const innerAbsPathInfo = getAbsolutePathInfo(innerState, innerPathInfo);\n const outerAbsStateAddress = getAbsoluteStateAddressByBinding(binding);\n const outerAbsPathInfo = outerAbsStateAddress.absolutePathInfo;\n return { innerAbsPathInfo, outerAbsPathInfo };\n}\n\nexport function buildPrimaryMappingRule(webComponent: Element, stateName: string, bindings: IBindingInfo[]): void {\n if (bindings.length === 0) {\n return;\n }\n const innerState = getStateElementByWebComponent(webComponent, stateName);\n if (innerState === null) {\n raiseError('State element not found for web component.');\n }\n const innerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n const outerMappingRule = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n for (const binding of bindings) {\n const mappingRule = createMappingRuleByBinding(innerState, binding);\n let primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\n if (typeof primaryMappingRuleSet === 'undefined') {\n primaryMappingRuleSetByElement.set(webComponent, new Set([mappingRule]));\n } else {\n primaryMappingRuleSet.add(mappingRule);\n }\n const innerAbsPathInfo = mappingRule.innerAbsPathInfo;\n const outerAbsPathInfo = mappingRule.outerAbsPathInfo;\n primaryBindingByMappingRule.set(mappingRule, binding);\n innerMappingRule.set(innerAbsPathInfo, outerAbsPathInfo);\n outerMappingRule.set(outerAbsPathInfo, innerAbsPathInfo);\n }\n innerMappingByElement.set(webComponent, innerMappingRule);\n outerMappingByElement.set(webComponent, outerMappingRule);\n}\n\nexport function getInnerAbsolutePathInfo(webComponent: Element, outerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\n const mapping = outerMappingByElement.get(webComponent);\n if (typeof mapping === 'undefined') {\n return null;\n }\n return mapping.get(outerAbsPathInfo) ?? null;\n}\n\nexport function getOuterAbsolutePathInfo(webComponent: Element, innerAbsPathInfo: IAbsolutePathInfo): IAbsolutePathInfo | null {\n let innerMapping = innerMappingByElement.get(webComponent);\n if (typeof innerMapping === 'undefined') {\n innerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n innerMappingByElement.set(webComponent, innerMapping);\n }\n if (innerMapping.has(innerAbsPathInfo)) {\n return innerMapping.get(innerAbsPathInfo)!\n }\n let outerMapping = outerMappingByElement.get(webComponent);\n if (typeof outerMapping === 'undefined') {\n outerMapping = new Map<IAbsolutePathInfo, IAbsolutePathInfo>();\n outerMappingByElement.set(webComponent, outerMapping);\n }\n // 内側からのアクセスの場合、ルールがなければプライマリルールから新たにルールとバインディングを生成する\n const primaryMappingRuleSet = primaryMappingRuleSetByElement.get(webComponent);\n if (typeof primaryMappingRuleSet === 'undefined') {\n // マッピングルールが存在しない場合はnullを返し、ローカル状態へのフォールバックを許可する\n return null;\n }\n let primaryMappingRule: IMappingRule | null = null;\n for(const currentPrimaryMappingRule of primaryMappingRuleSet) {\n // innerPathInfoがprimaryMappingRuleのinnerPathInfoを包含しているか\n if (!innerAbsPathInfo.pathInfo.cumulativePathInfoSet.has(currentPrimaryMappingRule.innerAbsPathInfo.pathInfo)) {\n continue;\n }\n if (currentPrimaryMappingRule.innerAbsPathInfo.pathInfo.segments.length === innerAbsPathInfo.pathInfo.segments.length) {\n raiseError('Duplicate mapping rule for web component.');\n }\n primaryMappingRule = currentPrimaryMappingRule;\n break;\n }\n if (primaryMappingRule === null) {\n // マッピングルールに一致しない場合はnullを返し、ローカル状態へのフォールバックを許可する\n return null;\n }\n // マッチした残りのパスをouterPathInfoに付与して新たなルールを生成\n const primaryBinding = primaryBindingByMappingRule.get(primaryMappingRule);\n /* c8 ignore start */\n if (typeof primaryBinding === 'undefined') {\n raiseError('Binding not found for primary mapping rule on web component.');\n }\n /* c8 ignore stop */\n const outerRemainingSegments = innerAbsPathInfo.pathInfo.segments.slice(primaryMappingRule.innerAbsPathInfo.pathInfo.segments.length);\n const outerSegments = primaryMappingRule.outerAbsPathInfo.pathInfo.segments.concat(outerRemainingSegments);\n const outerPathInfo = getPathInfo(outerSegments.join(DELIMITER));\n const rootNode = webComponent.getRootNode() as Node;\n const outerStateElement = getStateElementByName(rootNode, primaryBinding.stateName);\n if (outerStateElement === null) {\n raiseError(`State element with name \"${primaryBinding.stateName}\" not found for web component.`);\n }\n const outerAbsPathInfo = getAbsolutePathInfo(outerStateElement, outerPathInfo);\n innerMapping.set(innerAbsPathInfo, outerAbsPathInfo);\n outerMapping.set(outerAbsPathInfo, innerAbsPathInfo);\n\n // ルールに対応するバインディングを生成\n const newBinding: IBindingInfo = {\n ...primaryBinding,\n propName: innerAbsPathInfo.pathInfo.path,\n propSegments: innerAbsPathInfo.pathInfo.segments,\n statePathName: outerAbsPathInfo.pathInfo.path,\n statePathInfo: outerAbsPathInfo.pathInfo,\n }\n addBindingByNode(webComponent, newBinding);\n\n return outerAbsPathInfo;\n}","\nfunction cloneWithDescriptors(obj: object) {\n const proto = Object.getPrototypeOf(obj);\n const clone = Object.create(proto);\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n for(const key in descriptors) {\n const descriptor = descriptors[key];\n if (descriptor.writable === false) {\n descriptor.writable = true;\n }\n }\n Object.defineProperties(clone, descriptors);\n return clone;\n}\n\nexport function meltFrozenObject(frozenObj: object) {\n return cloneWithDescriptors(frozenObj);\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateElement } from \"../components/types\";\nimport { getLoopContextByNode } from \"../list/loopContextByNode\";\nimport { IListIndex } from \"../list/types\";\nimport { setLoopContextSymbol } from \"../proxy/symbols\";\nimport { raiseError } from \"../raiseError\";\nimport { setLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\nimport { getOuterAbsolutePathInfo } from \"./MappingRule\";\nimport { meltFrozenObject } from \"./meltFrozenObject\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IInnerState } from \"./types\";\n\nclass InnerStateProxyHandler implements ProxyHandler<IInnerState> {\n private _webComponent: Element;\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._webComponent = webComponent;\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IInnerState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n if (prop === \"then\") {\n // Promiseのthenと誤認識されるのを防ぐため、Promiseに存在するプロパティはProxyのgetで処理しない\n return undefined;\n }\n if (prop[0] === '$') {\n return undefined;\n }\n // 1. getter完全一致 → ローカル計算(this = receiverで依存自動追跡)\n if (this._innerStateElement.getterPaths.has(prop) && prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n // 2 & 3. マッピング完全一致 / サブパス → 親の状態\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n const loopContext = getLoopContextByNode(this._webComponent);\n let value = undefined;\n outerAbsPathInfo.stateElement.createState(\"readonly\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n value = state[outerAbsPathInfo.pathInfo.path];\n let listIndex: IListIndex | null = null;\n if (loopContext !== null && loopContext.listIndex !== null) {\n if (outerAbsPathInfo.pathInfo.wildcardCount > 0) {\n // wildcardPathSetとloopContextのpathInfoSetのintersectionのうち、segment数が最も多いものをouterAbsPathInfoにする\n // 例: outerPathInfoが \"todos.*.name\"で、loopContextのpathInfoSetに \"todos.0.name\", \"todos.1.name\"がある場合、\"todos.0.name\"や\"todos.1.name\"をouterAbsPathInfoにする\n listIndex = loopContext.listIndex.at(outerAbsPathInfo.pathInfo.wildcardCount - 1);\n }\n }\n const absStateAddress = createAbsoluteStateAddress(outerAbsPathInfo, listIndex);\n setLastValueByAbsoluteStateAddress(absStateAddress, value);\n });\n });\n return value;\n }\n // 4. ローカルデータプロパティ → ローカル値\n if (prop in target) {\n return Reflect.get(target, prop, receiver);\n }\n // 5. エラー\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IInnerState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n // 1. setter完全一致 → ローカル処理(this = receiverで親への書き込み可能)\n if (this._innerStateElement.setterPaths.has(prop) && prop in target) {\n return Reflect.set(target, prop, value, receiver);\n }\n // 2 & 3. マッピング完全一致 / サブパス → 親に書く\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n const loopContext = getLoopContextByNode(this._webComponent);\n outerAbsPathInfo.stateElement.createState(\"writable\", (state) => {\n state[setLoopContextSymbol](loopContext, () => {\n state[outerAbsPathInfo.pathInfo.path] = value;\n });\n });\n return true;\n }\n // 4. ローカルデータプロパティ → ローカルに書く\n if (prop in target) {\n return Reflect.set(target, prop, value, receiver);\n }\n // 5. エラー\n raiseError(`Property \"${prop}\" not found in inner state: no mapping rule and no local state property.`);\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n\n has(target: IInnerState, prop: string | symbol): boolean {\n if (typeof prop === 'string') {\n if (prop[0] === '$') {\n return false;\n }\n // 1. getter/setter完全一致\n if ((this._innerStateElement.getterPaths.has(prop) || this._innerStateElement.setterPaths.has(prop)) && prop in target) {\n return true;\n }\n // 2 & 3. マッピング\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const outerAbsPathInfo = getOuterAbsolutePathInfo(this._webComponent, innerAbsPathInfo);\n if (outerAbsPathInfo !== null) {\n return true;\n }\n // 4. ローカルデータ\n if (prop in target) {\n return true;\n }\n // 5. 存在しない\n return false;\n } else {\n return Reflect.has(target, prop);\n }\n }\n\n}\n\nexport function createInnerState(webComponent: Element, stateName: string): IInnerState {\n const handler = new InnerStateProxyHandler(webComponent, stateName);\n const innerState = getStateElementByWebComponent(webComponent, stateName);\n /* c8 ignore start */\n if (innerState === null) {\n raiseError('State element not found for web component.');\n }\n /* c8 ignore stop */\n if (innerState.boundComponentStateProp === null) {\n raiseError('State element is not bound to any component state prop.');\n }\n if (!(innerState.boundComponentStateProp in webComponent)) {\n raiseError(`State element is not bound to a valid component state prop: ${innerState.boundComponentStateProp}`);\n }\n const state = (webComponent as any)[innerState.boundComponentStateProp];\n if (typeof state !== 'object' || state === null) {\n raiseError(`Invalid state object for component state prop: ${innerState.boundComponentStateProp}`);\n }\n return new Proxy(meltFrozenObject(state), handler);\n}","import { getAbsolutePathInfo } from \"../address/AbsolutePathInfo\";\nimport { createAbsoluteStateAddress } from \"../address/AbsoluteStateAddress\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getLastValueByAbsoluteStateAddress } from \"./lastValueByAbsoluteStateAddress\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nclass OuterStateProxyHandler implements ProxyHandler<IOuterState> {\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n const absStateAddress = createAbsoluteStateAddress(innerAbsPathInfo, null);\n return getLastValueByAbsoluteStateAddress(absStateAddress);\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n const innerPathInfo = getPathInfo(prop);\n const innerAbsPathInfo = getAbsolutePathInfo(this._innerStateElement, innerPathInfo);\n this._innerStateElement.createState(\"readonly\", (state) => {\n state.$postUpdate(innerAbsPathInfo.pathInfo.path);\n });\n return true;\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n}\n\nexport function createOuterState(webComponent: Element, stateName: string): IOuterState {\n const handler = new OuterStateProxyHandler(webComponent, stateName);\n return new Proxy({}, handler);\n}\n","import { IStateElement } from \"../components/types\";\nimport { raiseError } from \"../raiseError\";\nimport { getStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nclass PlainOuterStateProxyHandler implements ProxyHandler<IOuterState> {\n private _innerStateElement: IStateElement;\n constructor(webComponent: Element, stateName: string) {\n this._innerStateElement = getStateElementByWebComponent(webComponent, stateName) ?? raiseError('State element not found for web component.');\n }\n\n get(target: IOuterState, prop: string | symbol, receiver: any): any {\n if (typeof prop === 'string') {\n let value;\n this._innerStateElement.createState(\"readonly\", (state) => {\n value = state[prop];\n });\n return value;\n } else {\n return Reflect.get(target, prop, receiver);\n }\n }\n\n set(target: IOuterState, prop: string | symbol, value: any, receiver: any): boolean {\n if (typeof prop === 'string') {\n this._innerStateElement.createState(\"writable\", (state) => {\n state[prop] = value;\n });\n return true;\n } else {\n return Reflect.set(target, prop, value, receiver);\n }\n }\n}\n\nexport function createPlainOuterState(webComponent: Element, stateName: string): IOuterState {\n const handler = new PlainOuterStateProxyHandler(webComponent, stateName);\n return new Proxy({}, handler);\n}\n","import { getBindingsByNode } from \"../bindings/getBindingsByNode\";\nimport { IStateElement } from \"../components/types\";\nimport { config } from \"../config\";\nimport { WEBCOMPONENT_STATE_READY_CALLBACK_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { markWebComponentAsComplete } from \"./completeWebComponent\";\nimport { createInnerState } from \"./innerState\";\nimport { buildPrimaryMappingRule } from \"./MappingRule\";\nimport { meltFrozenObject } from \"./meltFrozenObject\";\nimport { createOuterState } from \"./outerState\";\nimport { createPlainOuterState } from \"./plainOuterState\";\nimport { setStateElementByWebComponent } from \"./stateElementByWebComponent\";\nimport { IOuterState } from \"./types\";\n\nconst getOuter = (outerState: IOuterState) => (): IOuterState => outerState;\n\nexport function bindWebComponent(\n innerStateElement: IStateElement,\n component: Element,\n stateProp: string,\n state: Record<string, any>\n): void {\n setStateElementByWebComponent(component, stateProp, innerStateElement);\n if (component.hasAttribute(config.bindAttributeName)) {\n const bindings = (getBindingsByNode(component) ?? []).filter(\n binding => binding.propSegments[0] === stateProp\n );\n buildPrimaryMappingRule(component, stateProp, bindings);\n const outerState = createOuterState(component, stateProp);\n const innerState = createInnerState(component, stateProp);\n innerStateElement.setInitialState(innerState);\n Object.defineProperty(component, stateProp, {\n get: getOuter(outerState),\n enumerable: true,\n configurable: true,\n });\n } else {\n innerStateElement.setInitialState(meltFrozenObject(state));\n const outerState = createPlainOuterState(component, stateProp);\n Object.defineProperty(component, stateProp, {\n get: getOuter(outerState),\n enumerable: true,\n configurable: true,\n });\n }\n markWebComponentAsComplete(component, innerStateElement);\n if (WEBCOMPONENT_STATE_READY_CALLBACK_NAME in component) {\n const func = (component as any)[WEBCOMPONENT_STATE_READY_CALLBACK_NAME];\n if (typeof func === 'function') {\n func.call(component, stateProp).catch((error: any) => {\n raiseError(`Error in ${WEBCOMPONENT_STATE_READY_CALLBACK_NAME}: ${error instanceof Error ? error.message : String(error)}`);\n });\n } else {\n raiseError(`${WEBCOMPONENT_STATE_READY_CALLBACK_NAME} is not a function.`);\n }\n }\n}\n","import { config, inSsr } from \"../config\";\nimport { loadFromInnerScript } from \"../stateLoader/loadFromInnerScript\";\nimport { loadFromJsonFile } from \"../stateLoader/loadFromJsonFile\";\nimport { loadFromScriptFile } from \"../stateLoader/loadFromScriptFile\";\nimport { loadFromScriptJson } from \"../stateLoader/loadFromScriptJson\";\nimport { raiseError } from \"../raiseError\";\nimport { BindingType, IState } from \"../types\";\nimport { IStateElement } from \"./types\";\nimport { setStateElementByName, getStateElementByName, getBindingsReady } from \"../stateElementByName\";\nimport { ILoopContextStack } from \"../list/types\";\nimport { createLoopContextStack } from \"../list/loopContext\";\nimport { DCC_DEFINITION_ATTRIBUTE, NO_SET_TIMEOUT, STATE_CONNECTED_CALLBACK_NAME, STATE_DISCONNECTED_CALLBACK_NAME, STATE_UPDATED_CALLBACK_NAME, WILDCARD } from \"../define\";\nimport { processCommandTokensDeclaration } from \"../command/processCommandTokensDeclaration\";\nimport { clearCommandTokenRegistry } from \"../command/commandTokenRegistry\";\nimport { clearCommandNamespace } from \"../command/commandNamespace\";\nimport { processEventTokensDeclaration } from \"../event/processEventTokensDeclaration\";\nimport { clearEventTokenRegistry } from \"../event/eventTokenRegistry\";\nimport { processOnDeclaration } from \"../event/processOnDeclaration\";\nimport { processStreamsDeclaration } from \"../stream/processStreamsDeclaration\";\nimport { clearStreamNamespace } from \"../stream/streamNamespace\";\nimport { abortAllStreams, clearStreamRegistry } from \"../stream/streamRegistry\";\nimport { startStreams } from \"../stream/streamRuntime\";\nimport { defineDCC } from \"../dcc/defineDCC\";\nimport { getPathInfo } from \"../address/PathInfo\";\nimport { IStateProxy, Mutability } from \"../proxy/types\";\nimport { createStateProxy } from \"../proxy/StateHandler\";\nimport { bindWebComponent } from \"../webComponent/bindWebComponent\";\nimport { connectedCallbackSymbol, disconnectedCallbackSymbol } from \"../proxy/symbols\";\nimport { waitInitializeBinding } from \"../bindings/initializeBindingPromiseByNode\";\nimport { getCustomElement } from \"../getCustomElement\";\nimport { Ssr } from \"./Ssr\";\nimport { VERSION } from \"../version\";\nimport { HTMLElementBase } from \"../platform/HTMLElementBase\";\n\ntype Descriptors = Record<string, PropertyDescriptor>;\n\nfunction getAllPropertyDescriptors(obj: object): Descriptors {\n let descriptors: Descriptors = {};\n let proto = obj;\n while (proto && proto !== Object.prototype) {\n Object.assign(descriptors, Object.getOwnPropertyDescriptors(proto));\n proto = Object.getPrototypeOf(proto);\n }\n return descriptors;\n}\n\nfunction getStateInfo(\n state: IState\n): {\n getterPaths: Set<string>,\n setterPaths: Set<string>,\n} {\n const getterPaths: Set<string> = new Set<string>();\n const setterPaths: Set<string> = new Set<string>();\n const descriptors = getAllPropertyDescriptors(state);\n for(const [ key, descriptor ] of Object.entries(descriptors)) {\n if (typeof descriptor.get === \"function\") {\n getterPaths.add(key);\n }\n if (typeof descriptor.set === \"function\") {\n setterPaths.add(key);\n }\n }\n return {\n getterPaths, setterPaths\n };\n}\n\nexport class State extends HTMLElementBase implements IStateElement {\n static hasConnectedCallbackPromise = true;\n\n static getBindingsReady(rootNode: Node): Promise<void> {\n return getBindingsReady(rootNode);\n }\n\n private __state: IState | undefined;\n private _hasUpdatedCallback: boolean = false;\n // 他行を読む getter が検出されたリストパス(diff-filter 展開の全行フォールバック対象)。\n // 依存マップ(static/dynamic)と同様に追加のみ・クリアしない(安全側に固定される)。\n private _crossRowListPaths: Set<string> = new Set<string>();\n // $1 等のインデックスを読んだ getter パス(実行時検出)。位置のみ変わった行の\n // 静的子展開はこの集合の subtree に限定される。追加のみ・クリアしない(安全側)。\n private _indexDependentGetterPaths: Set<string> = new Set<string>();\n private _name: string = 'default';\n private _initialized: boolean = false;\n private _initializePromise: Promise<void>;\n private _resolveInitialize: (() => void) | null = null;\n private _connectedCallbackPromise: Promise<void>;\n private _resolveConnectedCallback: (() => void) | null = null;\n private _loadingPromise: Promise<void>;\n private _resolveLoading: (() => void) | null = null;\n private _setStatePromise: Promise<Record<string, any>> | null = null;\n private _resolveSetState: ((value: Record<string, any>) => void) | null = null;\n private _listPaths: Set<string> = new Set<string>();\n private _elementPaths: Set<string> = new Set<string>();\n private _getterPaths: Set<string> = new Set<string>();\n private _setterPaths: Set<string> = new Set<string>();\n private _loopContextStack: ILoopContextStack = createLoopContextStack();\n private _dynamicDependency: Map<string, string[]> = new Map<string, string[]>();\n private _staticDependency: Map<string, string[]> = new Map<string, string[]>();\n private _pathSet: Set<string> = new Set<string>();\n private _version = 0;\n private _rootNode: Node | null = null;\n private _boundComponent: Element | null = null;\n private _boundComponentStateProp: string | null = null;\n private _bindableEventMap: Record<string, string> = {};\n private _commandTokenNames: Set<string> = new Set<string>();\n private _eventTokenNames: Set<string> = new Set<string>();\n private _dcc: boolean = false;\n // connect サイクルの世代カウンタ(connectedCallback 冒頭でインクリメント)。\n // $connectedCallback の await 中の「切断 → 即再接続」では、新 connect が\n // _rootNode を再設定済みのため陳腐化した旧 connect の再開が _rootNode ガードを\n // 素通りして startStreams に到達し、同一の再接続に対して source が二重起動する。\n // 末尾で冒頭に捕捉した世代と照合し、陳腐 connect からの起動を skip する(設計書 §2-3)。\n private _connectGeneration: number = 0;\n // _state セッター側の startStreams が走った connect 世代\n // (connectedCallback 末尾の startStreams との二重起動防止、設計書 §2-3。\n // 世代が進めば不一致となり自然に無効化される — サイクル単位のフラグリセット相当)\n private _streamsStartedGeneration: number = 0;\n\n constructor() {\n super();\n this._initializePromise = new Promise<void>((resolve) => {\n this._resolveInitialize = resolve;\n });\n this._connectedCallbackPromise = new Promise<void>((resolve) => {\n this._resolveConnectedCallback = resolve;\n });\n this._loadingPromise = new Promise<void>((resolve) => {\n this._resolveLoading = resolve;\n });\n this._setStatePromise = new Promise<Record<string, any>>((resolve) => {\n this._resolveSetState = resolve;\n });\n }\n\n private get _state(): IState {\n if (typeof this.__state === \"undefined\") {\n raiseError(`${config.tagNames.state} _state is not initialized yet.`);\n }\n return this.__state;\n }\n\n private set _state(value: IState) {\n this._commandTokenNames = processCommandTokensDeclaration(value);\n this._eventTokenNames = processEventTokensDeclaration(value);\n this.__state = value;\n // $updatedCallback の有無を state セット時に確定しておく(in はプロトタイプ\n // チェーンも見る・getter を評価しない)。drain 側はこのフラグで更新アドレスの\n // 集計と writable createState をスキップできる。\n // 注: state セット後に生オブジェクトへ直接 $updatedCallback を後付けする\n // パターンは検知できない(bindProperty / _state 再セットは検知する)。\n // ライフサイクルフックは宣言時に定義するのが規約。\n this._hasUpdatedCallback = STATE_UPDATED_CALLBACK_NAME in value;\n // 再 set 時に二重 subscribe しないよう registry をクリアしてから $on を配線し直す。\n clearEventTokenRegistry(this);\n processOnDeclaration(this, value, this._eventTokenNames);\n this._listPaths.clear();\n this._elementPaths.clear();\n this._getterPaths.clear();\n // 再 set 時の残骸が $streams の衝突検査(processStreamsDeclaration)に\n // 偽陽性で命中しないよう getterPaths と対称にクリアする。\n this._setterPaths.clear();\n this._pathSet.clear();\n const stateInfo = getStateInfo(value);\n for(const path of stateInfo.getterPaths) {\n this._getterPaths.add(path);\n }\n for(const path of stateInfo.setterPaths) {\n this._setterPaths.add(path);\n }\n // $streams: 再 set 時の二重起動防止のため旧 stream を abort + registry 全削除してから\n // 新宣言をパースする(clearEventTokenRegistry → processOnDeclaration と同じ再配線パターン)。\n // getterPaths / setterPaths の収集後であること(宣言バリデーションが衝突検査で参照する)。\n // namespace proxy の memo も破棄して古い proxy を捨てる(clearCommandNamespace と対称)。\n clearStreamNamespace(this);\n clearStreamRegistry(this);\n processStreamsDeclaration(this, value);\n // 接続中の再 set(S13)は新宣言で即再起動する。\n // 初回(_initialize 中)は _initialized が false なのでここでは起動されず、\n // connectedCallback 側の startStreams($connectedCallback 完了後)が担う。\n if (this._initialized && this._rootNode !== null && !inSsr()) {\n startStreams(this);\n // $connectedCallback 実行中の再 set(setInitialState)では、ここで新宣言が\n // 起動済みのため connectedCallback 末尾の startStreams を skip させる。\n // skip しないと同一 connect サイクルで新宣言の source が 2 回起動する\n // (1 回目は即 abort — switchMap 意味論で状態は壊れないが、副作用を持つ\n // source が 2 回発火してしまう)。\n this._streamsStartedGeneration = this._connectGeneration;\n }\n this._resolveLoading?.();\n }\n\n get name(): string {\n return this._name;\n }\n\n private _loadFromSsrElement(): IState | null {\n if (!this.hasAttribute('enable-ssr')) return null;\n const name = this.getAttribute('name') || 'default';\n const root = this.parentNode;\n if (!root) return null;\n const ssrEl = Ssr.findByName(root, name);\n if (!ssrEl) return null;\n const data = ssrEl.stateData;\n return Object.keys(data).length > 0 ? data : null;\n }\n\n private async _initialize() {\n // enable-ssr (クライアント側のみ): <wcs-ssr> から初期データを取得\n const ssrState = !inSsr() ? this._loadFromSsrElement() : null;\n try {\n if (this.hasAttribute('state')) {\n const state = this.getAttribute('state');\n this._state = loadFromScriptJson(state!);\n } else if (this.hasAttribute('src')) {\n const src = this.getAttribute('src');\n if (src && src.endsWith('.json')) {\n this._state = await loadFromJsonFile(src);\n } else if (src && src.endsWith('.js')) {\n this._state = await loadFromScriptFile(src);\n } else {\n raiseError(`Unsupported src file type: ${src}`);\n }\n } else if (this.hasAttribute('json')) {\n const json = this.getAttribute('json');\n this._state = JSON.parse(json!);\n } else {\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\n if (script) {\n this._state = await loadFromInnerScript(script, `${this._name}`);\n } else {\n const timerId = setTimeout(() => {\n console.warn(`[@wcstack/state] Warning: No state source found for <${config.tagNames.state}> element with name=\"${this._name}\".`);\n }, NO_SET_TIMEOUT);\n // 要注意!!!APIでセットする場合はここで待機する必要がある --(1)\n this._state = await this._setStatePromise!;\n clearTimeout(timerId);\n }\n }\n } catch(e) {\n raiseError(`Failed to initialize state: ${e}`);\n }\n // SSR データがある場合、state 定義(メソッド/getter)を維持しつつデータ値を上書き\n if (ssrState !== null && this.__state) {\n for (const [key, value] of Object.entries(ssrState)) {\n if (key in this.__state) {\n const desc = Object.getOwnPropertyDescriptor(this.__state, key);\n // getter/setter はスキップ(定義側を優先)\n if (desc && (desc.get || desc.set)) continue;\n // 関数はスキップ\n if (typeof this.__state[key] === 'function') continue;\n }\n this.__state[key] = value;\n }\n }\n await this._loadingPromise;\n this._name = this.getAttribute('name') || 'default';\n setStateElementByName(this.rootNode!, this._name, this);\n }\n\n private async _initializeBindWebComponent() {\n if (this.hasAttribute(\"bind-component\")) {\n // wcs-stateはコンポーネントのトップレベル要素であること\n // ShadowDOM直下: parentNodeがShadowRoot → hostが親コンポーネント\n // LightDOM/ShadowDOM内のLightDOM: parentNodeがElement → それが親コンポーネント\n const parentNode = this.parentNode;\n const boundComponent = parentNode instanceof ShadowRoot\n ? parentNode.host\n : parentNode instanceof Element\n ? parentNode\n : null;\n const customTagName = boundComponent ? getCustomElement(boundComponent) : null;\n if (boundComponent === null || customTagName === null) {\n raiseError(`\"bind-component\" requires <${config.tagNames.state}> to be a direct child of a custom element.`);\n }\n // LightDOMの場合、名前空間が上位スコープと共有されるためnameが必須\n if (!(parentNode instanceof ShadowRoot) && !this.hasAttribute(\"name\")) {\n raiseError(`\"bind-component\" in Light DOM requires a \"name\" attribute to avoid namespace conflicts with the parent scope.`);\n }\n const boundComponentStateProp = this.getAttribute(\"bind-component\")!;\n await customElements.whenDefined(customTagName.toLowerCase());\n // data-wcs属性がある場合は、上位の状態によりbinding情報の設定が完了するまで待機する\n if (boundComponent.hasAttribute(config.bindAttributeName)) {\n await waitInitializeBinding(boundComponent);\n }\n if (!(boundComponentStateProp in boundComponent)) {\n raiseError(`Component does not have property \"${boundComponentStateProp}\" for state binding.`);\n }\n const state = (boundComponent as any)[boundComponentStateProp] as Record<string, any>;\n if (typeof state !== 'object' || state === null) {\n raiseError(`Component property \"${boundComponentStateProp}\" is not an object for state binding.`);\n }\n this._boundComponent = boundComponent;\n this._boundComponentStateProp = boundComponentStateProp;\n bindWebComponent(this, this._boundComponent, this._boundComponentStateProp, state);\n }\n }\n\n private async _callStateConnectedCallback(): Promise<void> {\n await this.createStateAsync(\"writable\", async (state) => {\n // stateに\"$connectedCallback\"があるか確認し、connectedCallbackAPIを呼び出す\n if (STATE_CONNECTED_CALLBACK_NAME in state) {\n await state[connectedCallbackSymbol]();\n }\n });\n }\n\n private async _initializeDCC(hostElement: Element, shadowRoot: ShadowRoot): Promise<void> {\n let state: IState;\n try {\n if (this.hasAttribute('src')) {\n const src = this.getAttribute('src')!;\n if (src.endsWith('.js')) {\n state = await loadFromScriptFile(src);\n } else {\n raiseError(`DCC: Unsupported src type: ${src}`);\n }\n } else {\n const script = this.querySelector<HTMLScriptElement>('script[type=\"module\"]');\n if (script) {\n state = await loadFromInnerScript(script, hostElement.tagName.toLowerCase());\n } else {\n raiseError(`DCC: No state source found for \"${hostElement.tagName.toLowerCase()}\".`);\n }\n }\n } catch (e) {\n raiseError(`DCC: Failed to load state: ${e}`);\n }\n defineDCC(hostElement, shadowRoot, state!);\n this._dcc = true;\n this._initialized = true;\n this._rootNode = null; // disconnectedCallbackでのstate参照を防止\n this._resolveInitialize?.();\n this._resolveConnectedCallback?.();\n }\n\n private _callStateDisconnectedCallback(): void {\n this.createState(\"writable\", (state) => {\n // stateに\"$disconnectedCallback\"があるか確認し、disconnectedCallbackAPIを呼び出す\n if (STATE_DISCONNECTED_CALLBACK_NAME in state) {\n state[disconnectedCallbackSymbol]();\n }\n });\n }\n\n async connectedCallback() {\n this._rootNode = this.getRootNode() as Node;\n // connect 世代を進めて冒頭で捕捉する(末尾の startStreams 前に照合し、\n // $connectedCallback の await 中に「切断 → 即再接続」された陳腐 connect の\n // 再開からの起動を防ぐ)。前回接続中の再 set(S13)で立った\n // _streamsStartedGeneration も世代不一致となり自然に無効化される。\n const connectGeneration = ++this._connectGeneration;\n if (!this._initialized) {\n // DCC 検出: ShadowRoot 内かつホストに data-wc-definition がある場合\n const parentNode = this.parentNode;\n if (parentNode instanceof ShadowRoot &&\n parentNode.host.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) {\n await this._initializeDCC(parentNode.host, parentNode);\n return;\n }\n await this._initializeBindWebComponent();\n await this._initialize();\n this._initialized = true;\n this._resolveInitialize?.();\n } else if (!this._dcc && getStateElementByName(this._rootNode, this._name) !== this) {\n // 再接続(disconnect で名前登録が解除された後の再 connect): 登録を復元する。\n // createState が rootNode 経由でこの要素を解決できるようにするために必要\n // ($connectedCallback の再実行と $streams の initial からの再起動が依存する、設計書 §2-3)。\n setStateElementByName(this._rootNode, this._name, this);\n }\n // enable-ssr (クライアント側): SSR で $connectedCallback 済みなのでスキップ\n // inSsr() (サーバー側): レンダリング中なので実行する\n if (!this.hasAttribute('enable-ssr') || inSsr()) {\n await this._callStateConnectedCallback();\n }\n\n // サーバーモード + enable-ssr: バインディング完了後に <wcs-ssr> を生成\n if (inSsr() && this.hasAttribute('enable-ssr')) {\n await getBindingsReady(this.rootNode);\n\n const name = this.getAttribute('name') || 'default';\n const stateData = Ssr.extractStateData(this);\n const ssrEl = document.createElement(config.tagNames.ssr);\n ssrEl.setAttribute('name', name);\n ssrEl.setAttribute('version', VERSION);\n Ssr.buildContent(ssrEl, stateData);\n this.parentNode?.insertBefore(ssrEl, this);\n }\n\n // $streams の eager 起動($connectedCallback 完了後、設計書 §2-3)。\n // inSsr() 時は起動しない(SSR 出力には initial が乗る、§7-1)。\n // enable-ssr のクライアント側は $connectedCallback をスキップしても起動する\n // (stream はシリアライズ不能なランタイム副作用のため)。\n // _rootNode ガード: $connectedCallback の await 中に切断された場合は起動しない。\n // ガードなしだと startStream 内の createState が rootNode 解決(disconnectedCallback\n // で null 化済み)の raiseError で throw し、connectedCallbackPromise が永遠に\n // 未解決になる。「未接続の entry は restart しない」設計書 §3-2 とも整合し、\n // _state セッター側の startStreams 前ガード(_rootNode !== null)と対称。\n // 世代ガード(connectGeneration 照合): await 中に「切断 → 即再接続」された場合、\n // 新 connect が _rootNode を再設定済みで上のガードを素通りするため、世代不一致で\n // 陳腐化した connect の再開を検出して skip する。起動点が新 connect の末尾に\n // 一本化され、「$connectedCallback 完了後に起動」(S1)の順序保証も保たれる。\n // _streamsStartedGeneration ガード: $connectedCallback 内の setInitialState\n // (接続中の再 set)で _state セッター側が新宣言を起動済みの場合は skip する\n // (skip しないと同一 connect サイクルで source が 2 回起動する、設計書 §2-3)。\n if (\n !inSsr() &&\n this._rootNode !== null &&\n connectGeneration === this._connectGeneration &&\n this._streamsStartedGeneration !== connectGeneration\n ) {\n startStreams(this);\n }\n\n this._resolveConnectedCallback?.();\n }\n\n disconnectedCallback() {\n if (this._rootNode !== null) {\n // try/finally: ユーザーの $disconnectedCallback が throw しても後続の後始末を\n // 必ず実行する。特に abortAllStreams が飛ぶと stream が消費を続け(ゾンビ I/O)、\n // activeStateElements の強参照残留で GC が妨げられ、切断済み要素が依存駆動\n // restart の対象にも残る(設計書 §3-2 / §5-1 違反)。throw 自体は従来どおり\n // 呼び出し元へ伝播させる(変わるのは後始末の保証のみ)。\n try {\n this._callStateDisconnectedCallback();\n } finally {\n setStateElementByName(this.rootNode, this._name, null);\n clearCommandTokenRegistry(this);\n clearCommandNamespace(this);\n clearEventTokenRegistry(this);\n // stream は abort のみで registry は保持する(再接続時に同じ宣言から\n // initial で再起動できる、設計書 §5-1 / §5-2)。\n // namespace proxy の memo は破棄する(clearCommandNamespace と対称。\n // registry は残るため再接続後の初回アクセスで同内容の proxy が再生成される)。\n abortAllStreams(this);\n clearStreamNamespace(this);\n this._rootNode = null;\n }\n }\n }\n\n get initializePromise(): Promise<void> {\n return this._initializePromise;\n }\n\n get connectedCallbackPromise(): Promise<void> {\n return this._connectedCallbackPromise;\n }\n\n get listPaths(): Set<string> {\n return this._listPaths;\n }\n\n get elementPaths(): Set<string> {\n return this._elementPaths;\n }\n\n get getterPaths(): Set<string> {\n return this._getterPaths;\n }\n\n get setterPaths(): Set<string> {\n return this._setterPaths;\n }\n\n get loopContextStack(): ILoopContextStack {\n return this._loopContextStack;\n }\n\n get dynamicDependency(): Map<string, string[]> {\n return this._dynamicDependency;\n }\n\n get staticDependency(): Map<string, string[]> {\n return this._staticDependency;\n }\n\n get version(): number {\n return this._version;\n }\n\n get rootNode(): Node {\n if (this._rootNode === null) {\n raiseError('State rootNode is not available.');\n }\n return this._rootNode;\n }\n\n get boundComponentStateProp(): string | null {\n return this._boundComponentStateProp;\n }\n\n get bindableEventMap(): Record<string, string> {\n return this._bindableEventMap;\n }\n\n get commandTokenNames(): ReadonlySet<string> {\n return this._commandTokenNames;\n }\n\n get eventTokenNames(): ReadonlySet<string> {\n return this._eventTokenNames;\n }\n\n setBindableEventMap(map: Record<string, string>): void {\n this._bindableEventMap = map;\n }\n\n private _addDependency(\n map: Map<string, string[]>,\n sourcePath: string,\n targetPath: string\n ): boolean {\n const deps = map.get(sourcePath);\n if (deps === undefined) {\n map.set(sourcePath, [targetPath]);\n return true;\n } else if (!deps.includes(targetPath)) {\n deps.push(targetPath);\n return true;\n }\n return false;\n }\n\n /**\n * source, target\n *\n * products.*.price => products.*.tax\n * get \"products.*.tax\"() { return this[\"products.*.price\"] * 0.1; }\n *\n * products.*.price => products.summary\n * get \"products.summary\"() { return this.$getAll(\"products.*.price\", []).reduce(sum); }\n *\n * categories.*.name => categories.*.products.*.categoryName\n * get \"categories.*.products.*.categoryName\"() { return this[\"categories.*.name\"]; }\n *\n * @param sourcePath\n * @param targetPath\n */\n addDynamicDependency(sourcePath: string, targetPath: string): boolean {\n return this._addDependency(this._dynamicDependency, sourcePath, targetPath);\n }\n\n /**\n * source, target\n * products => products.*\n * products.* => products.*.price\n * products.* => products.*.name\n *\n * @param sourcePath\n * @param targetPath\n */\n addStaticDependency(sourcePath: string, targetPath: string): boolean {\n return this._addDependency(this._staticDependency, sourcePath, targetPath);\n }\n\n setPathInfo(path: string, bindingType: BindingType): void {\n if (bindingType === \"for\") {\n this._listPaths.add(path);\n this._elementPaths.add(path + '.' + WILDCARD);\n }\n if (!this._pathSet.has(path)) {\n const pathInfo = getPathInfo(path);\n this._pathSet.add(path);\n if (pathInfo.parentPath !== null) {\n let currentPathInfo = pathInfo;\n while(currentPathInfo.parentPath !== null) {\n if (!this.addStaticDependency(currentPathInfo.parentPath, currentPathInfo.path)) {\n break;\n }\n currentPathInfo = getPathInfo(currentPathInfo.parentPath);\n }\n }\n }\n }\n\n private _createState<T>(rootNode: Node, mutability: Mutability, callback: (state: IStateProxy) => T): T {\n try {\n const stateProxy = createStateProxy(rootNode, this._state, this._name, mutability);\n return callback(stateProxy);\n } finally {\n // cleanup if needed\n }\n }\n\n async createStateAsync(mutability: Mutability, callback: (state: IStateProxy) => Promise<void>): Promise<void> {\n return await this._createState(this.rootNode, mutability, callback);\n }\n\n createState(mutability: Mutability, callback: (state: IStateProxy) => void): void {\n this._createState(this.rootNode, mutability, callback);\n }\n\n nextVersion(): number {\n this._version++;\n return this._version;\n }\n\n get hasUpdatedCallback(): boolean {\n return this._hasUpdatedCallback;\n }\n\n get crossRowListPaths(): ReadonlySet<string> {\n return this._crossRowListPaths;\n }\n\n addCrossRowListPath(path: string): void {\n this._crossRowListPaths.add(path);\n }\n\n get indexDependentGetterPaths(): ReadonlySet<string> {\n return this._indexDependentGetterPaths;\n }\n\n addIndexDependentGetterPath(path: string): void {\n this._indexDependentGetterPaths.add(path);\n }\n\n bindProperty(prop: string, desc: PropertyDescriptor): void {\n Object.defineProperty(this._state, prop, desc);\n if (prop === STATE_UPDATED_CALLBACK_NAME) {\n this._hasUpdatedCallback = true;\n }\n }\n\n setInitialState(state: Record<string, any>): void {\n if (!this._initialized) {\n this._resolveSetState?.(state);\n } else {\n this._state = state;\n }\n }\n}\n","/**\n * `$commandTokens: [\"a\", \"b\", ...]` 配列宣言を解析し、宣言された名前群を Set で返す。\n *\n * 注入は行わず、proxy 側で `state.$command.<name>` として token を解決する設計。\n * (以前の実装は state 直下に各名前の getter を注入していたが、リアクティブ値との\n * 名前空間衝突を避け識別性を上げるため `$command` ネームスペース集約に切り替え。)\n *\n * 対応している宣言形式は **オブジェクトリテラル** のみ。\n * クラス本体に `static $commandTokens = [...]` を書く形式や、\n * クラスのプロトタイプ上の同名コマンドの検出は現状サポートしない。\n */\n\nimport { STATE_COMMAND_NAMESPACE_NAME, STATE_COMMAND_TOKENS_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport function processCommandTokensDeclaration(state: IState): Set<string> {\n const names = new Set<string>();\n const declared = (state as Record<string, unknown>)[STATE_COMMAND_TOKENS_NAME];\n if (typeof declared === \"undefined\") {\n return names;\n }\n if (!Array.isArray(declared)) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} must be an array of strings.`);\n }\n for (const name of declared) {\n if (typeof name !== \"string\" || name.length === 0) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entries must be non-empty strings.`);\n }\n if (name === STATE_COMMAND_NAMESPACE_NAME) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entry \"${name}\" conflicts with the reserved namespace name \"${STATE_COMMAND_NAMESPACE_NAME}\".`);\n }\n if (names.has(name)) {\n raiseError(`${STATE_COMMAND_TOKENS_NAME} entry \"${name}\" is duplicated.`);\n }\n names.add(name);\n }\n return names;\n}\n","/**\n * `$eventTokens: [\"a\", \"b\", ...]` 配列宣言を解析し、宣言された名前群を Set で返す。\n *\n * event-token は command-token の双対(element→state 方向)。要素が dispatch する\n * イベントを `eventToken.<prop>: <name>` で token に流し、state 側は `$on` マップで受ける。\n * ここで宣言された名前のみが `eventToken.X` / `$on` の有効なチャネル名になる(typo 耐性)。\n *\n * 対応している宣言形式は **オブジェクトリテラル** のみ。\n */\n\nimport { STATE_EVENT_TOKENS_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport function processEventTokensDeclaration(state: IState): Set<string> {\n const names = new Set<string>();\n const declared = (state as Record<string, unknown>)[STATE_EVENT_TOKENS_NAME];\n if (typeof declared === \"undefined\") {\n return names;\n }\n if (!Array.isArray(declared)) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} must be an array of strings.`);\n }\n for (const name of declared) {\n if (typeof name !== \"string\" || name.length === 0) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} entries must be non-empty strings.`);\n }\n if (names.has(name)) {\n raiseError(`${STATE_EVENT_TOKENS_NAME} entry \"${name}\" is duplicated.`);\n }\n names.add(name);\n }\n return names;\n}\n","/**\n * `$on: { <name>: (state, event, ...listIndexes) => {...} }` マップを解析し、\n * 各ハンドラを対応する event-token に subscribe する(state 側の受信配線)。\n *\n * - `$on` のキーは `$eventTokens` で宣言済みでなければならない(typo 耐性)。\n * - 各値は関数でなければならない。\n * - 引数規約は `(state, event, ...listIndexes)`。`this` 束縛は行わず引数で state を渡すため\n * アロー関数で書ける(command-token の emit 規約と対称)。\n *\n * `$eventTokens` で宣言されたが `$on` に対応が無い token は subscriber ゼロ(emit は no-op)。\n */\n\nimport { IStateElement } from \"../components/types\";\nimport { STATE_ON_NAME } from \"../define\";\nimport { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\nimport { TokenSubscriber } from \"../token/Token\";\nimport { getOrCreateEventToken } from \"./eventTokenRegistry\";\n\nexport function processOnDeclaration(\n stateElement: IStateElement,\n state: IState,\n eventTokenNames: ReadonlySet<string>,\n): void {\n const declared = (state as Record<string, unknown>)[STATE_ON_NAME];\n if (typeof declared === \"undefined\") {\n return;\n }\n if (typeof declared !== \"object\" || declared === null) {\n raiseError(`${STATE_ON_NAME} must be an object mapping event-token names to handler functions.`);\n }\n for (const [name, handler] of Object.entries(declared as Record<string, unknown>)) {\n if (!eventTokenNames.has(name)) {\n raiseError(`${STATE_ON_NAME} entry \"${name}\" is not declared in $eventTokens.`);\n }\n if (typeof handler !== \"function\") {\n raiseError(`${STATE_ON_NAME} entry \"${name}\" must be a function.`);\n }\n const token = getOrCreateEventToken(stateElement, name);\n token.subscribe(handler as TokenSubscriber);\n }\n}\n","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\n\nexport function loadFromScriptJson(id: string): IState {\n const script = document.getElementById(id) as HTMLScriptElement;\n if (script && script.type === 'application/json') {\n try {\n const data = JSON.parse(script.textContent || '{}');\n return data;\n } catch (e) {\n raiseError('Failed to parse JSON from script element:' + e);\n }\n }\n return {};\n}","import { raiseError } from \"../raiseError\";\nimport { IState } from \"../types\";\n\nexport async function loadFromJsonFile(url: string): Promise<IState> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n raiseError(`Failed to fetch JSON file: ${response.statusText}`);\n }\n const data = await response.json();\n return data;\n } catch (e) {\n console.error('Failed to load JSON file:', e);\n return {};\n }\n}","import { IState } from \"../types\";\nimport { DCC_DEFINITION_ATTRIBUTE, STATE_BINDABLES_NAME } from \"../define\";\nimport { config } from \"../config\";\nimport { raiseError } from \"../raiseError\";\nimport { getterFn, setterFn, callFn, isInternalProperty } from \"./dccPropertyFactories\";\nimport { createWcBindable, createBindableEventMap, IWcBindable } from \"./wcBindable\";\nimport { State } from \"../components/State\";\n\nexport function defineDCC(hostElement: Element, shadowRoot: ShadowRoot, state: IState): void {\n const tagName = hostElement.tagName.toLowerCase();\n\n // バリデーション\n if (!tagName.includes(\"-\")) {\n raiseError(`DCC: \"${tagName}\" is not a valid custom element name (must contain a hyphen).`);\n }\n if (customElements.get(tagName)) {\n // 既に登録済みならスキップ(重複定義の検知のため警告は出す)\n console.warn(`[@wcstack/state] DCC: \"${tagName}\" is already registered. Skipping redefinition.`);\n return;\n }\n\n // ShadowRoot は cloneNode 不可のため、template 経由で内容をクローン\n const template = document.createElement(\"template\");\n template.innerHTML = shadowRoot.innerHTML;\n const shadowRootMode = shadowRoot.mode as ShadowRootMode;\n\n // $bindables から wcBindable + bindableEventMap を生成\n const bindables: string[] = Array.isArray(state[STATE_BINDABLES_NAME])\n ? state[STATE_BINDABLES_NAME]\n : [];\n const wcBindable: IWcBindable | null = bindables.length > 0\n ? createWcBindable(tagName, bindables)\n : null;\n const bindableEventMap: Record<string, string> = bindables.length > 0\n ? createBindableEventMap(tagName, bindables)\n : {};\n\n // DCC クラス生成\n const stateTagSelector = `${config.tagNames.state}:not([name])` as const;\n\n const DCCElement = class extends HTMLElement {\n static template = template;\n static shadowRootMode = shadowRootMode;\n static wcBindable = wcBindable;\n static bindableEventMap = bindableEventMap;\n\n private _shadow: ShadowRoot | null = null;\n\n connectedCallback() {\n if (this.hasAttribute(DCC_DEFINITION_ATTRIBUTE)) return;\n this._shadow = this.attachShadow({ mode: DCCElement.shadowRootMode });\n this._shadow.appendChild(DCCElement.template.content.cloneNode(true));\n\n // bindableEventMap の設定\n if (Object.keys(DCCElement.bindableEventMap).length > 0) {\n const stateEl = this._shadow.querySelector(stateTagSelector) as State | null;\n if (stateEl) {\n stateEl.initializePromise.then(() => {\n stateEl.setBindableEventMap(DCCElement.bindableEventMap);\n });\n }\n }\n }\n\n get stateElement() {\n return this._shadow?.querySelector(stateTagSelector) as State | null;\n }\n };\n\n // state プロパティを走査して DCC クラスのプロトタイプにgetter/setter/methodを定義\n const descriptors = Object.getOwnPropertyDescriptors(state);\n for (const [name, desc] of Object.entries(descriptors)) {\n if (isInternalProperty(name)) continue;\n\n const newDesc: PropertyDescriptor = { configurable: true, enumerable: true };\n if (typeof desc.value === \"function\") {\n const isAsync = desc.value.constructor?.name === \"AsyncFunction\";\n newDesc.value = callFn(name, isAsync);\n } else {\n newDesc.get = getterFn(name);\n newDesc.set = setterFn(name);\n }\n Object.defineProperty(DCCElement.prototype, name, newDesc);\n }\n\n // カスタム要素登録\n customElements.define(tagName, DCCElement);\n}\n","// wc-bindable protocol manifest types — single source of truth in /protocol/wc-bindable.ts.\nexport type {\n IWcBindable, IWcBindableProperty, IWcBindableInput, IWcBindableCommand,\n} from \"../protocol/wcBindable.js\";\n// This module also uses the types in its runtime helpers below, so import them into scope.\nimport type { IWcBindable, IWcBindableInput, IWcBindableProperty } from \"../protocol/wcBindable.js\";\n\nexport function createWcBindable(tagName: string, bindables: string[]): IWcBindable {\n const properties: IWcBindableProperty[] = bindables.map((propName) => ({\n name: propName,\n event: `${tagName}:${propName}-changed`,\n }));\n // Every $bindables member gets both a getter and a setter on the DCC prototype,\n // so declare it in inputs as well — a property declared only in `properties` is\n // output-only under directional initial sync, which would permanently block\n // parent-state → DCC writes.\n const inputs: IWcBindableInput[] = bindables.map((propName) => ({\n name: propName,\n }));\n return {\n protocol: \"wc-bindable\",\n version: 1,\n properties,\n inputs,\n };\n}\n\nexport function createBindableEventMap(tagName: string, bindables: string[]): Record<string, string> {\n const map: Record<string, string> = {};\n for (const propName of bindables) {\n map[propName] = `${tagName}:${propName}-changed`;\n }\n return map;\n}\n","import { Ssr } from \"./components/Ssr\";\nimport { State } from \"./components/State\";\nimport { config } from \"./config\";\n\nexport function registerComponents() {\n if (!customElements.get(config.tagNames.ssr)) {\n customElements.define(config.tagNames.ssr, Ssr);\n }\n if (!customElements.get(config.tagNames.state)) {\n customElements.define(config.tagNames.state, State);\n }\n}\n","import { setConfig } from \"./config\";\nimport { registerDevtoolsSource } from \"./devtools/bridge\";\nimport { registerComponents } from \"./registerComponents\";\nimport { IWritableConfig } from \"./types\";\n\nexport function bootstrapState(config?: IWritableConfig): void {\n if (config) {\n setConfig(config);\n }\n registerComponents();\n // DevTools Hook Protocol への source 登録(SSR では no-op・冪等)\n registerDevtoolsSource();\n}","/**\n * defineState.ts\n *\n * 状態オブジェクトに型付けを提供するためのユーティリティ。\n * defineState() はアイデンティティ関数で、ThisType<> を付与することで\n * メソッド・computed getter 内の this に型補完を提供する。\n *\n * テンプレートリテラル型によるドットパスの型解決:\n * - WcsPaths<T> : T から生成される全ドットパスの union\n * - WcsPathValue<T,P>: パス P に対応する値の型\n * - WcsPathAccessor<T>: ブラケットアクセス用マップ型\n */\n\n// ============================================================\n// Internal helper types\n// ============================================================\n\n/**\n * `any` 型を検出する。\n * `0 extends (1 & T)` は T が `any` の場合のみ true になる。\n */\ntype IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/**\n * T がドットパス再帰の対象となる「プレーンなデータオブジェクト」かどうかを判定する。\n * プリミティブ、組み込みオブジェクト (Date, Map 等)、関数、配列、any は除外。\n */\ntype IsPlainObject<T> =\n IsAny<T> extends true ? false :\n T extends\n | string | number | boolean | null | undefined | symbol | bigint\n | ((...args: any[]) => any) | Date | RegExp | Error\n | Map<any, any> | Set<any> | WeakMap<any, any> | WeakSet<any>\n | Promise<any> | readonly any[]\n ? false\n : T extends Record<string, any>\n ? true\n : false;\n\n/**\n * T のキーのうち、関数でないもの(データプロパティ・computed getter)を抽出する。\n * メソッド(イベントハンドラ等)はドットパスの対象外。\n * `$` プレフィックスキー($streams / $commandTokens / $on 等の予約宣言)もドットパスにならない。\n * any 型のプロパティは除外せず保持する。\n */\ntype DataKeys<T> = {\n [K in keyof T & string]:\n K extends `$${string}` ? never :\n IsAny<T[K]> extends true ? K : T[K] extends (...args: any[]) => any ? never : K;\n}[keyof T & string];\n\n// ============================================================\n// WcsPaths — ドットパスの union 生成\n// ============================================================\n\n/**\n * 型 T から生成される全てのドットパスの union。\n * 配列プロパティはワイルドカード `*` を使用: `items.*.name`\n *\n * 再帰の深さは最大4レベルに制限(コンパイル性能の確保)。\n *\n * @example\n * ```ts\n * type S = {\n * count: number;\n * users: { name: string; age: number }[];\n * cart: { items: { price: number }[] };\n * };\n * type P = WcsPaths<S>;\n * // = \"count\" | \"users\" | \"users.*\" | \"users.*.name\" | \"users.*.age\"\n * // | \"cart\" | \"cart.items\" | \"cart.items.*\" | \"cart.items.*.price\"\n * ```\n */\nexport type WcsPaths<T, Depth extends readonly any[] = []> =\n Depth[\"length\"] extends 4 ? never :\n {\n [K in DataKeys<T>]:\n | K\n | (T[K] extends readonly (infer E)[]\n ? IsPlainObject<E> extends true\n ? `${K}.*` | WcsSubPaths<E, `${K}.*.`, [...Depth, 0]>\n : `${K}.*`\n : IsPlainObject<T[K]> extends true\n ? WcsSubPaths<T[K], `${K}.`, [...Depth, 0]>\n : never)\n }[DataKeys<T>];\n\n/** @internal プレフィックス付きサブパスの生成ヘルパー */\ntype WcsSubPaths<T, Prefix extends string, Depth extends readonly any[]> =\n WcsPaths<T, Depth> extends infer P extends string\n ? `${Prefix}${P}`\n : never;\n\n// ============================================================\n// WcsPathValue — パスから値の型を解決\n// ============================================================\n\n/**\n * ドットパス P に対応する値の型を T から解決する。\n *\n * 解決順序:\n * 1. T の直接キー(computed getter 含む)\n * 2. `K.*` → 配列要素型\n * 3. `K.rest` → オブジェクト/配列のネストを再帰的に辿る\n *\n * @example\n * ```ts\n * type S = { cart: { items: { price: number; qty: number }[] } };\n * type V1 = WcsPathValue<S, \"cart.items.*.price\">; // number\n * type V2 = WcsPathValue<S, \"cart.items.*\">; // { price: number; qty: number }\n * type V3 = WcsPathValue<S, \"cart\">; // { items: ... }\n * ```\n */\nexport type WcsPathValue<T, P extends string> =\n // 1. Direct key (includes computed getters like \"users.*.ageCategory\")\n P extends keyof T\n ? T[P]\n // 2. K.* → array element type\n : P extends `${infer K}.*`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[] ? E : never\n : never\n // 3. K.rest → recurse into nested structure\n : P extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? T[K] extends readonly (infer E)[]\n // Array: expect *.subpath or *\n ? Rest extends `*.${infer SubRest}`\n ? WcsPathValue<E, SubRest>\n : Rest extends \"*\"\n ? E\n : never\n // Object: recurse\n : T[K] extends Record<string, any>\n ? WcsPathValue<T[K], Rest>\n : never\n : never\n : never;\n\n// ============================================================\n// WcsPathAccessor — ブラケットアクセス用マップ型\n// ============================================================\n\n/**\n * 全ドットパスに対する型付きブラケットアクセスを提供するマップ型。\n *\n * `this[\"users.*.name\"]` のようなアクセスに対して、\n * WcsPaths で生成されたパスに対応する値の型を返す。\n */\ntype WcsPathAccessor<T> = {\n [P in WcsPaths<T>]: WcsPathValue<T, P>;\n};\n\n// ============================================================\n// State Proxy API — this 経由でアクセスできるAPI\n// ============================================================\n\n/**\n * `<wcs-state>` の Proxy 経由で提供されるAPIメソッド。\n * state定義オブジェクト内のメソッド・getter で `this.` 経由で利用可能。\n */\nexport interface WcsStateApi {\n /**\n * ワイルドカードを含むパスにマッチする全要素を配列で取得する。\n *\n * @param path - ワイルドカードを含むパス\n * @param indexes - 各ワイルドカード階層のインデックス(省略時はループコンテキストから解決)\n *\n * @example\n * ```ts\n * get \"cart.totalPrice\"() {\n * return this.$getAll(\"cart.items.*.price\").reduce((sum, v) => sum + v, 0);\n * }\n * ```\n */\n $getAll<V = any>(path: string, indexes?: number[]): V[];\n\n /**\n * 指定パスの更新を手動でトリガーする。\n * Proxy の set トラップを経由せずに内部状態を変更した場合に使用。\n */\n $postUpdate(path: string): void;\n\n /**\n * パスとインデックス配列を指定して、ワイルドカードを解決した値を取得・設定する。\n *\n * @param path - ワイルドカードを含むパス\n * @param indexes - 各ワイルドカード階層のインデックス\n * @param value - 設定する値(省略時は取得)\n */\n $resolve(path: string, indexes: number[], value?: any): any;\n\n /**\n * 指定パスへの依存関係を明示的に登録する。\n * computed getter 内で動的にパスを組み立てる場合に使用。\n */\n $trackDependency(path: string): void;\n\n /**\n * コールバック実行中の依存追跡(動的依存・`$1` インデックス依存の登録)を\n * 抑止して fn を実行し、その戻り値を返す(`$trackDependency` と対称)。\n * リスト行 getter が「行外の単一値」を読みたいが、その値の変更で全行を\n * 再評価させたくない場合に使う(該当行へ直接書き込む設計と組で用いる)。\n */\n $untrackDependency<T>(fn: () => T): T;\n\n /** `<wcs-state>` 要素への参照 */\n readonly $stateElement: HTMLElement;\n\n /**\n * `$commandTokens` で宣言した command token の名前空間。\n * `this.$command.<name>` で token を解決できる(バインディングでは\n * `onclick: $command.<name>` / `command.<method>: $command.<name>`)。\n */\n readonly $command: Record<string, { emit(...args: any[]): any }>;\n\n /** `$streams` 各エントリの状態(\"idle\" | \"active\" | \"done\" | \"error\")を返す読み取り専用名前空間 */\n readonly $streamStatus: Record<string, \"idle\" | \"active\" | \"done\" | \"error\">;\n\n /** `$streams` 各エントリの直近エラーを返す読み取り専用名前空間 */\n readonly $streamError: Record<string, unknown>;\n\n // computed getter 内での依存追跡付き読み取りの正規形は dotted パス\n // (`this[\"$streamStatus.<name>\"]` — docs/state-streams-design.md §4-3)\n readonly [key: `$streamStatus.${string}`]: \"idle\" | \"active\" | \"done\" | \"error\";\n readonly [key: `$streamError.${string}`]: unknown;\n\n // ループインデックス変数 ($1〜$9)\n // for テンプレート内のイベントハンドラで、ネストされたループの\n // 各階層のインデックスにアクセスするために使用。\n // (ランタイムは $1〜$128 まで解決するが、型宣言は実用域の $9 までとする)\n readonly $1: number;\n readonly $2: number;\n readonly $3: number;\n readonly $4: number;\n readonly $5: number;\n readonly $6: number;\n readonly $7: number;\n readonly $8: number;\n readonly $9: number;\n}\n\n// ============================================================\n// WcsThis — state メソッド/getter 内の this の型\n// ============================================================\n\n/**\n * state定義オブジェクト内の `this` の型。\n *\n * - `T` のプロパティに型付きでアクセス可能(直接キー)\n * - `WcsPathAccessor<T>` によるネストされたドットパスの型付きアクセス\n * - `WcsStateApi` のメソッド ($getAll, $postUpdate 等) にアクセス可能\n * - 動的パス (`this[\\`items.${i}.name\\`]`) は型チェック対象外(キャストが必要)\n *\n * @example\n * ```ts\n * defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n * increment() {\n * this.count++; // number\n * this[\"users.*.name\"]; // string (パス型解決)\n * this.$getAll(\"users.*.age\"); // API\n * }\n * });\n * ```\n */\nexport type WcsThis<T> = T & WcsStateApi & WcsPathAccessor<T>;\n\n// ============================================================\n// defineState — 型付き状態定義関数\n// ============================================================\n\n/**\n * `<wcs-state>` 用の型付き状態オブジェクトを定義する。\n *\n * ランタイムではアイデンティティ関数(引数をそのまま返す)として動作し、\n * コストはゼロ。TypeScript の `ThisType<>` を利用して、メソッド・getter 内の\n * `this` に型補完を提供する。\n *\n * ### 基本的な使い方 (TypeScript)\n * ```ts\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * users: [] as { name: string; age: number }[],\n *\n * increment() {\n * this.count++; // ✅ number\n * this[\"users.*.name\"]; // ✅ string (ドットパス型解決)\n * },\n *\n * get \"users.*.ageCategory\"() {\n * return this[\"users.*.age\"] < 25 ? \"Young\" : \"Adult\";\n * }\n * });\n * ```\n *\n * ### JavaScript (JSDoc)\n * ```js\n * import { defineState } from '@wcstack/state';\n *\n * export default defineState({\n * count: 0,\n * increment() {\n * this.count++; // ✅ JSDoc + tsconfig checkJs で型補完\n * }\n * });\n * ```\n *\n * ### HTML インラインスクリプト\n * ```html\n * <wcs-state>\n * <script type=\"module\">\n * import { defineState } from '@wcstack/state';\n * export default defineState({\n * count: 0,\n * increment() { this.count++; }\n * });\n * </script>\n * </wcs-state>\n * ```\n *\n * ### ライフサイクルコールバック\n * ```ts\n * export default defineState({\n * data: null,\n * async $connectedCallback() {\n * this.data = await fetch('/api/data').then(r => r.json());\n * },\n * $disconnectedCallback() {\n * // cleanup\n * },\n * $updatedCallback() {\n * // called after DOM update\n * }\n * });\n * ```\n */\nexport function defineState<T extends Record<string, any>>(\n definition: T & ThisType<WcsThis<T>>\n): T {\n return definition;\n}\n","/**\n * filterMeta.ts — 組み込みフィルタの構造化メタデータ(単一正本・route-a A2-1)。\n *\n * これまで vscode-wcs(completionData.ts BUILTIN_FILTERS)が手で持っていたフィルタの\n * 引数仕様・型・説明を、実装側(@wcstack/state)に**正本として移設**したもの。\n * manifest.ts がこれを公開し、vscode-wcs はそれを消費して手リストを撤去できる。\n *\n * 完全性は __tests__/manifest.test.ts のドリフト検出が保証する\n * (filterMeta のキー集合 == builtinFilters のキー集合)。フィルタを追加して meta を\n * 書き忘れると CI が落ちる。\n */\n\nexport type FilterResultType = \"boolean\" | \"number\" | \"string\" | \"passthrough\";\nexport type FilterArgType = \"number\" | \"string\" | \"any\";\n\nexport interface IFilterMeta {\n /** 説明(補完・ホバー用) */\n description: string;\n /** 引数を取るか */\n hasArgs: boolean;\n /** 適用後の結果型(passthrough は入力型をそのまま返す) */\n resultType: FilterResultType;\n /** 受け入れ可能な入力型('any' は任意) */\n acceptTypes: \"any\" | readonly string[];\n /** 引数の最小数 */\n minArgs: number;\n /** 引数の最大数 */\n maxArgs: number;\n /** 各引数の期待型(省略時はチェックしない) */\n argTypes?: readonly FilterArgType[];\n}\n\n/** 組み込みフィルタ名 → 構造化メタデータ。キー集合は builtinFilters と一致しなければならない。 */\nexport const builtinFilterMeta: Record<string, IFilterMeta> = {\n // 比較・論理\n eq: { description: \"等しいか比較\", hasArgs: true, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 1, maxArgs: 1, argTypes: [\"any\"] },\n ne: { description: \"異なるか比較\", hasArgs: true, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 1, maxArgs: 1, argTypes: [\"any\"] },\n not: { description: \"ブール値を反転\", hasArgs: false, resultType: \"boolean\", acceptTypes: [\"boolean\"], minArgs: 0, maxArgs: 0 },\n lt: { description: \"より小さいか\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n le: { description: \"以下か\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n gt: { description: \"より大きいか\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n ge: { description: \"以上か\", hasArgs: true, resultType: \"boolean\", acceptTypes: [\"number\", \"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n // 算術\n inc: { description: \"加算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n dec: { description: \"減算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n mul: { description: \"乗算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n div: { description: \"除算\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n mod: { description: \"剰余\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n // 数値フォーマット\n fix: { description: \"固定小数点表記\", hasArgs: true, resultType: \"string\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n locale: { description: \"ロケール形式で数値フォーマット\", hasArgs: true, resultType: \"string\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"string\"] },\n // 文字列\n uc: { description: \"大文字に変換\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n lc: { description: \"小文字に変換\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n cap: { description: \"先頭文字を大文字に\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n trim: { description: \"前後の空白を削除\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n slice: { description: \"部分文字列 (start[,end])\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 2, argTypes: [\"number\", \"number\"] },\n substr: { description: \"部分文字列 (pos,len)\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 2, argTypes: [\"number\", \"number\"] },\n pad: { description: \"パディング (length[,char])\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 2, argTypes: [\"number\", \"string\"] },\n rep: { description: \"繰り返し (count)\", hasArgs: true, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 1, maxArgs: 1, argTypes: [\"number\"] },\n rev: { description: \"文字順を反転\", hasArgs: false, resultType: \"string\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n // 数値パース・丸め\n int: { description: \"整数にパース\", hasArgs: false, resultType: \"number\", acceptTypes: [\"string\", \"number\"], minArgs: 0, maxArgs: 0 },\n float: { description: \"浮動小数点数にパース\", hasArgs: false, resultType: \"number\", acceptTypes: [\"string\", \"number\"], minArgs: 0, maxArgs: 0 },\n round: { description: \"四捨五入\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n floor: { description: \"切り下げ\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n ceil: { description: \"切り上げ\", hasArgs: true, resultType: \"number\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n percent: { description: \"パーセンテージ形式\", hasArgs: true, resultType: \"string\", acceptTypes: [\"number\"], minArgs: 0, maxArgs: 1, argTypes: [\"number\"] },\n // 日付・時刻\n date: { description: \"ロケール形式の日付\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n time: { description: \"ロケール形式の時刻\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n datetime: { description: \"ロケール形式の日時\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n ymd: { description: \"YYYY-MM-DD 形式\", hasArgs: true, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 1, argTypes: [\"string\"] },\n // 真偽値・変換\n falsy: { description: \"偽値か判定\", hasArgs: false, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n truthy: { description: \"真値か判定\", hasArgs: false, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n defaults: { description: \"偽値の場合デフォルト値\", hasArgs: true, resultType: \"passthrough\", acceptTypes: \"any\", minArgs: 1, maxArgs: 1, argTypes: [\"any\"] },\n boolean: { description: \"ブール値に変換\", hasArgs: false, resultType: \"boolean\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n number: { description: \"数値に変換\", hasArgs: false, resultType: \"number\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n string: { description: \"文字列に変換\", hasArgs: false, resultType: \"string\", acceptTypes: \"any\", minArgs: 0, maxArgs: 0 },\n null: { description: \"空文字列をnullに変換\", hasArgs: false, resultType: \"passthrough\", acceptTypes: [\"string\"], minArgs: 0, maxArgs: 0 },\n};\n","/**\n * manifest.ts — `<wcs-state>` の構文・フィルタ・予約名を機械可読な単一正本として公開する。\n *\n * 目的(route-a A2-1): vscode-wcs(wcstack-intellisense)が現在ハードコードで二重実装している\n * 「フィルタ一覧・構文区切り・予約名」を、state 側の実装から導出した manifest に一本化し、\n * 手作業同期によるドリフトを構造的に断つための土台。\n *\n * 設計:\n * - `filters` は実装(builtinFilters の Record キー)から **自動導出**=実装が唯一の正本。\n * - 構文・予約名は config / define.ts の定数から導出。\n * - 将来 `dist/wcs-manifest.json` としてビルド時に書き出し、vscode-wcs がそれを読む形に発展させる。\n * - ドリフト検出テスト(__tests__/manifest.test.ts)が、フィルタ集合の golden と実装の一致を CI で保証する。\n */\nimport { config } from \"./config.js\";\nimport { outputBuiltinFilters } from \"./filters/builtinFilters.js\";\nimport { builtinFilterMeta, IFilterMeta } from \"./filters/filterMeta.js\";\nimport { STRUCTURAL_BINDING_TYPE_SET } from \"./structural/define.js\";\nimport {\n DELIMITER,\n WILDCARD,\n BINDING_SEPARATOR,\n PROP_VALUE_SEPARATOR,\n MODIFIER_SEPARATOR,\n STATE_NAME_SEPARATOR,\n FILTER_SEPARATOR,\n STATE_CONNECTED_CALLBACK_NAME,\n STATE_DISCONNECTED_CALLBACK_NAME,\n STATE_UPDATED_CALLBACK_NAME,\n WEBCOMPONENT_STATE_READY_CALLBACK_NAME,\n STATE_BINDABLES_NAME,\n STATE_COMMAND_TOKENS_NAME,\n STATE_COMMAND_NAMESPACE_NAME,\n STATE_EVENT_TOKENS_NAME,\n STATE_ON_NAME,\n STATE_STREAMS_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n} from \"./define.js\";\n\n// 消費側(vscode-wcs 等)が `@wcstack/state/manifest` から正本を直接引けるよう再エクスポート。\nexport { builtinFilterMeta } from \"./filters/filterMeta.js\";\nexport type { IFilterMeta, FilterResultType, FilterArgType } from \"./filters/filterMeta.js\";\nexport { STRUCTURAL_BINDING_TYPE_SET } from \"./structural/define.js\";\n\n/** マニフェストのバージョン(構造を変えたら上げる)。 */\nexport const WCS_MANIFEST_VERSION = 1;\n\nexport interface IWcsManifest {\n version: number;\n syntax: {\n /** バインド属性名(既定 data-wcs) */\n bindAttribute: string;\n /** タグ名(既定 wcs-state) */\n tagName: string;\n /** パス区切り(`.`) */\n pathDelimiter: string;\n /** ワイルドカード(`*`) */\n wildcard: string;\n /** バインディング構文 `[prop][#mod]: [path][@state][|filter...]` の区切り文字 */\n delimiters: {\n binding: string; // ; 複数バインディングの区切り\n propValue: string; // : prop と path の区切り\n modifier: string; // # prop と修飾子の区切り\n stateName: string; // @ path と stateName の区切り\n filter: string; // | フィルタパイプの区切り\n };\n /** 構造ディレクティブ(`<template data-wcs=\"for: ...\">` 等) */\n structuralDirectives: readonly string[];\n };\n /** 組み込みフィルタ名(builtinFilters から自動導出=実装が正本) */\n filters: string[];\n /** 組み込みフィルタの構造化メタデータ(説明・引数仕様・型)。vscode-wcs の手リスト撤去用。 */\n filterMeta: Record<string, IFilterMeta>;\n /** 予約ライフサイクルフック名 */\n reservedLifecycle: readonly string[];\n /** 予約 state API(プロトコル系の `$` 名前空間) */\n reservedStateApi: readonly string[];\n}\n\n/** 機械可読な単一正本を返す。vscode-wcs はこれを消費する想定。 */\nexport function getWcsManifest(): IWcsManifest {\n return {\n version: WCS_MANIFEST_VERSION,\n syntax: {\n bindAttribute: config.bindAttributeName,\n tagName: config.tagNames.state,\n pathDelimiter: DELIMITER,\n wildcard: WILDCARD,\n delimiters: {\n binding: BINDING_SEPARATOR,\n propValue: PROP_VALUE_SEPARATOR,\n modifier: MODIFIER_SEPARATOR,\n stateName: STATE_NAME_SEPARATOR,\n filter: FILTER_SEPARATOR,\n },\n // 正本 STRUCTURAL_BINDING_TYPE_SET から導出(手書きの二重定義を排除)。\n structuralDirectives: Array.from(STRUCTURAL_BINDING_TYPE_SET),\n },\n // 実装(Record のキー)から自動導出。手リストを持たない=ドリフトの構造的排除。\n filters: Object.keys(outputBuiltinFilters),\n filterMeta: builtinFilterMeta,\n reservedLifecycle: [\n STATE_CONNECTED_CALLBACK_NAME,\n STATE_DISCONNECTED_CALLBACK_NAME,\n STATE_UPDATED_CALLBACK_NAME,\n WEBCOMPONENT_STATE_READY_CALLBACK_NAME,\n ],\n reservedStateApi: [\n STATE_BINDABLES_NAME,\n STATE_COMMAND_TOKENS_NAME,\n STATE_COMMAND_NAMESPACE_NAME,\n STATE_EVENT_TOKENS_NAME,\n STATE_ON_NAME,\n STATE_STREAMS_NAME,\n STATE_STREAM_STATUS_NAMESPACE_NAME,\n STATE_STREAM_ERROR_NAMESPACE_NAME,\n ],\n };\n}\n","/**\n * contract/contractAnalyzer.ts\n *\n * Phase 5b(09-remediation-design.md §5b / §7.1 dev runtime / §6 contract trace)の\n * opt-in dev-time analyzer。実際に登録済みの custom element の `static wcBindable`\n * 宣言(= 実行時の正本)を、利用者が渡した sidecar manifest と突き合わせ、drift を\n * DevTools trace(`contract:*`)へ流す。\n *\n * 完了条件「無効時の runtime 挙動・cost が不変」: `analyzeContract` は\n * `config.enableContractAnalyzer` が false のとき即 return し、manifest を一切走査\n * しない(hot path には一切フックしない — 純粋な on-demand API)。\n *\n * pure な core(`analyzeManifestContract`)は宣言解決と emit を注入で受けるためテスト可能。\n */\n\nimport { config } from \"../config.js\";\nimport { devtoolsSink } from \"../devtools/sink.js\";\nimport { ContractEvent } from \"../devtools/types.js\";\nimport { getCustomElementRegistry } from \"../platform/customElementRegistry.js\";\nimport { IContractComponent, IContractManifest, ILiveDeclaration } from \"./types.js\";\n\n/** runtime analyzer が解釈する manifest namespace。これ以外は unsupported-extension。 */\nconst KNOWN_NAMESPACES: ReadonlySet<string> = new Set([\n \"wcstack.types\",\n \"wcstack.async\",\n \"wcstack.platformCapabilities\",\n \"wcstack.application\",\n]);\n\nconst EMPTY: readonly ContractEvent[] = Object.freeze([]);\n\n/**\n * opt-in dev-time contract analysis。無効時はゼロコスト(即 return・manifest 非走査)。\n * 有効時は live 宣言と manifest を突き合わせ、`contract:*` trace を返しつつ、DevTools\n * sink が接続されていれば同時に流す。\n */\nexport function analyzeContract(manifest: IContractManifest): readonly ContractEvent[] {\n if (!config.enableContractAnalyzer) return EMPTY;\n const events: ContractEvent[] = [];\n const emit = (event: ContractEvent): void => {\n events.push(event);\n if (devtoolsSink !== null) devtoolsSink(event);\n };\n analyzeManifestContract(manifest, resolveLiveDeclaration, emit);\n return events;\n}\n\n/**\n * pure core。`resolveDeclaration(tag)` は該当タグの live 宣言(未登録なら null)を返す。\n * emit は生成した trace を受ける。config フラグは見ない(呼び出し側が guard 済み)。\n */\nexport function analyzeManifestContract(\n manifest: IContractManifest,\n resolveDeclaration: (tag: string) => ILiveDeclaration | null,\n emit: (event: ContractEvent) => void,\n): void {\n const extensions = manifest.manifestExtensions;\n if (extensions === null || typeof extensions !== \"object\") return;\n\n // 未知 namespace は runtime が解釈しない → unsupported-extension。\n for (const namespace of Object.keys(extensions)) {\n if (!KNOWN_NAMESPACES.has(namespace)) {\n emit({ type: \"contract:unsupported-extension\", namespace });\n }\n }\n\n const components = extensions[\"wcstack.types\"]?.components;\n if (components === undefined || components === null) return;\n\n for (const [tag, component] of Object.entries(components)) {\n const live = resolveDeclaration(tag);\n emit({ type: \"contract:manifest-read\", tag, loaded: live !== null });\n if (live === null) {\n // manifest が宣言するタグが実行時に登録されていない = component-not-loaded drift。\n emit({ type: \"contract:drift\", reason: \"component-not-loaded\", tag });\n continue;\n }\n checkComponentDrift(tag, component, live, emit);\n }\n}\n\nfunction checkComponentDrift(\n tag: string,\n rawComponent: unknown,\n live: ILiveDeclaration,\n emit: (event: ContractEvent) => void,\n): void {\n // 壊れた manifest(component が null / primitive)でも analyzer 全体を落とさない。\n const component: IContractComponent =\n rawComponent !== null && typeof rawComponent === \"object\" ? (rawComponent as IContractComponent) : {};\n for (const [member, observable] of Object.entries(component.observables ?? {})) {\n if (!live.propertyEvents.has(member)) {\n emit({ type: \"contract:drift\", reason: \"missing-member\", tag, member });\n continue;\n }\n const liveEvent = live.propertyEvents.get(member)!;\n const sidecarEvent = observable?.event;\n if (typeof sidecarEvent === \"string\" && sidecarEvent !== liveEvent) {\n emit({ type: \"contract:drift\", reason: \"event-mismatch\", tag, member, sidecarEvent, liveEvent });\n }\n }\n for (const member of Object.keys(component.inputs ?? {})) {\n if (!live.inputs.has(member)) {\n emit({ type: \"contract:drift\", reason: \"missing-member\", tag, member });\n }\n }\n for (const member of Object.keys(component.commands ?? {})) {\n if (!live.commands.has(member)) {\n emit({ type: \"contract:drift\", reason: \"missing-member\", tag, member });\n }\n }\n}\n\n/**\n * 登録済み custom element の `static wcBindable` を drift 照合用に索引化する。\n * 未登録・非 wc-bindable は null(= component-not-loaded)。\n */\nfunction resolveLiveDeclaration(tag: string): ILiveDeclaration | null {\n const registry = getCustomElementRegistry();\n const ctor = registry?.get(tag);\n if (ctor === undefined) return null;\n const declaration = (ctor as { readonly wcBindable?: unknown }).wcBindable;\n if (\n declaration === null\n || typeof declaration !== \"object\"\n || (declaration as { protocol?: unknown }).protocol !== \"wc-bindable\"\n ) {\n return null;\n }\n const decl = declaration as {\n readonly properties?: readonly { readonly name?: unknown; readonly event?: unknown }[];\n readonly inputs?: readonly { readonly name?: unknown }[];\n readonly commands?: readonly { readonly name?: unknown }[];\n };\n // 各配列は非配列(object 等)でも落ちないよう Array.isArray で container を守る。\n const propertyEvents = new Map<string, string>();\n for (const property of Array.isArray(decl.properties) ? decl.properties : []) {\n if (typeof property?.name === \"string\" && typeof property.event === \"string\") {\n propertyEvents.set(property.name, property.event);\n }\n }\n const inputs = new Set<string>();\n for (const input of Array.isArray(decl.inputs) ? decl.inputs : []) {\n if (typeof input?.name === \"string\") inputs.add(input.name);\n }\n const commands = new Set<string>();\n for (const command of Array.isArray(decl.commands) ? decl.commands : []) {\n if (typeof command?.name === \"string\") commands.add(command.name);\n }\n return { propertyEvents, inputs, commands };\n}\n"],"names":["inSsr","html","document","documentElement","hasAttribute","_config","bindAttributeName","commentTextPrefix","commentForPrefix","commentIfPrefix","commentElseIfPrefix","commentElsePrefix","tagNames","state","ssr","locale","debug","enableMustache","enableDirectionalInitialSync","enablePropagationContext","enableContractAnalyzer","sameValueGuard","config","getConfig","bindingPromiseByNode","WeakMap","resolvedNodes","WeakSet","id","async","waitInitializeBinding","node","bindingPromise","resolveFn","get","promise","Promise","resolve","set","has","getInitializeBindingPromiseByNode","resolveInitializedBinding","existing","add","DELIMITER","WILDCARD","MAX_LOOP_DEPTH","FILTER_SEPARATOR","tmpIndexByIndexName","i","INDEX_BY_INDEX_NAME","Object","freeze","STATE_CONNECTED_CALLBACK_NAME","STATE_DISCONNECTED_CALLBACK_NAME","STATE_UPDATED_CALLBACK_NAME","WEBCOMPONENT_STATE_READY_CALLBACK_NAME","STATE_BINDABLES_NAME","STATE_COMMAND_TOKENS_NAME","STATE_COMMAND_NAMESPACE_NAME","STATE_EVENT_TOKENS_NAME","STATE_ON_NAME","STATE_STREAMS_NAME","STATE_STREAM_STATUS_NAMESPACE_NAME","STATE_STREAM_ERROR_NAMESPACE_NAME","DCC_DEFINITION_ATTRIBUTE","_cache","Map","getPathInfo","path","pathInfo","PathInfo","segments","lastSegment","cumulativePaths","cumulativePathSet","cumulativePathInfos","cumulativePathInfoSet","parentPath","wildcardPaths","wildcardPathSet","indexByWildcardPath","wildcardPathInfos","wildcardPathInfoSet","wildcardParentPaths","wildcardParentPathSet","wildcardParentPathInfos","wildcardParentPathInfoSet","wildcardPositions","lastWildcardPath","lastWildcardInfo","wildcardCount","parentPathInfo","constructor","getPattern","_path","this","split","currentPatternPath","prevPatternPath","length","push","Set","cache","getCustomElement","cached","undefined","value","nodeType","Node","ELEMENT_NODE","element","tagName","toLowerCase","includes","is","getAttribute","getCustomElementRegistry","owner","globalRegistry","globalThis","customElements","registry","candidate","whenDefined","upgradeCustomElement","root","upgrade","readBindableDeclaration","target","addEventListener","removeEventListener","declaration","wcBindable","protocol","Number","isInteger","version","knownProperties","readNamedList","properties","isValidPropertyDescriptor","declaredInputs","inputs","isValidInputDescriptor","declaredCommands","commands","isValidCommandDescriptor","liveDeclaration","descriptor","name","event","getter","attribute","isValidEntry","Array","isArray","entries","entry","raiseError","message","Error","makeExpandedEntry","base","stateName","expandedPath","propName","propSegments","propModifiers","statePathName","statePathInfo","inFilters","outFilters","bindingType","dedupKey","r","resolveNodePath","currentNode","childNodes","bindingsByNode","getBindingsByNode","setBindingsByNode","bindings","STRUCTURAL_BINDING_TYPE_SET","optionsRequired","fnName","optionMustBeNumber","valueMustBeNumber","valueMustBeDate","validateNumberString","isNaN","builtinFilters","eq","options","opt","ne","not","_options","lt","le","gt","ge","inc","dec","mul","div","mod","fix","toFixed","toLocaleString","uc","String","toUpperCase","lc","cap","v","charAt","slice","trim","numberedOpts","opt1","opt2","substr","pad","padStart","rep","repeat","rev","reverse","join","int","parseInt","float","parseFloat","round","optValue","Math","pow","floor","ceil","percent","date","Date","toLocaleDateString","time","toLocaleTimeString","datetime","ymd","year","getFullYear","toString","month","getMonth","day","getDate","falsy","truthy","defaults","boolean","Boolean","number","string","null","outputBuiltinFilters","builtinFiltersByFilterIOType","input","output","builtinFilterFn","filters","filter","filterFnByKey","parseFilters","filterTextList","filterIOType","map","filterText","openParenIndex","indexOf","closeParenIndex","lastIndexOf","filterName","filterKey","filterFn","args","argsText","substring","current","inQuote","hasQuote","char","last","parseFilterArgs","trimFn","s","cacheFilterInfos","parseStatePart","statePart","pos","stateAndPath","filterTexts","filtersText","parseBindTextsForElement","bindText","bindTexts","results","separatorIndex","propPart","stateResult","propResult","propText","propModifiersText","parsePropPart","startsWith","some","bindTextByNode","bindingTypeKeywordSet","EMBEDDED_REGEX","RegExp","parseCommentNode","savedText","COMMENT_NODE","text","data","match","exec","keyword","fragmentInfoByUUID","setFragmentInfoByUUID","uuid","rootNode","fragmentInfo","delete","bindingPartial","parseBindTextResult","stateElement","getStateElementByName","setPathInfo","nodeInfo","nodeInfos","nodeBindingPartial","parseBindTextResults","nodeStateElement","getFragmentInfoByUUID","getParseBindTextResults","bindTextOrUUID","parseBindingTextResult","getSubscriberNodes","subscriberNodes","walker","createTreeWalker","NodeFilter","SHOW_ELEMENT","SHOW_COMMENT","acceptNode","FILTER_ACCEPT","FILTER_SKIP","nextNode","registeredNodeSet","processParseResultsForNode","parseResults","expanded","allowDeferred","spreadOrigin","result","bindable","targetBase","seen","keys","lastIndexByKey","key","final","overrider","tagText","console","expandSpread","deferred","parseBindingTextResults","bindingInfos","replaceNode","TEXT_NODE","createTextNode","getBindingInfos","collectNodesAndBindingInfos","allBindings","deferredSpreads","markNodeRegistered","processDeferredNode","unregisterNode","loopContextByNode","getLoopContextByNode","paramNode","loopContext","parentNode","setLoopContextByNode","lastListValueByAbsoluteStateAddress","getLastListValueByAbsoluteStateAddress","address","setLastListValueByAbsoluteStateAddress","setLoopContextAsyncSymbol","Symbol","setLoopContextSymbol","getByAddressSymbol","hasByAddressSymbol","setByAddressSymbol","connectedCallbackSymbol","disconnectedCallbackSymbol","updatedCallbackSymbol","getAbsolutePathInfo","pathMap","absolutePathInfo","AbsolutePathInfo","parentAbsolutePathInfo","_cacheNullListIndex","AbsoluteStateAddress","listIndex","_parentAbsoluteAddress","parentAbsoluteAddress","parentListIndex","createAbsoluteStateAddress","cacheByAbsolutePathInfo","rootNodeByFragment","setRootNodeByFragment","fragment","getRootNodeByFragment","cacheCalcWildcardLen","calcWildcardLen","targetPathInfo","path1","path2","len","intersection","size","listIndexByBindingInfoByLoopContext","getListIndexByBindingInfo","bindingInfo","listIndexByBindingInfo","wildcardLen","at","absoluteStateAddressByBinding","resolveBindingRootNode","binding","knownRootNode","getRootNode","isConnected","nodeName","getAbsoluteStateAddressByBinding","absoluteStateAddress","clearAbsoluteStateAddressByBinding","devtoolsSink","bindingsByAbsoluteStateAddress","addBindingByAbsoluteStateAddress","type","absoluteAddress","removeBindingByAbsoluteStateAddress","patternLedger","peekBindingsForAddress","StateAddress","_parentAddress","parentAddress","createStateAddress","cacheByPathInfo","stateAddressByBindingInfo","getStateAddressByBindingInfo","stateAddress","clearStateAddressByBindingInfo","createHandlerBindingRegistry","attachedByKey","countByKey","attached","remove","next","countOf","keyCount","clear","handlerByHandlerKey","bindingRegistry","getHandlerKey","eventName","f","getEventName","modifier","attachCheckboxEventHandler","checkboxEventHandler","warn","checked","filteredNewValue","createState","currentValue","concat","index","toSpliced","Token","_name","_subscribers","subscribe","fn","unsubscribe","emit","EventToken","_ownerStateName","ownerStateName","super","kind","tokenName","subscriberCount","registryByStateElement","getOrCreateEventToken","token","clearEventTokenRegistry","listenerByBinding","attachEventTokenHandler","customTagName","propertyName","getWcBindable","propDesc","modifiers","handler","preventDefault","stopPropagation","eventTokenNames","createStateAsync","indexes","CommandToken","isCommandToken","modifierKey","m","sort","stateEventHandlerFunction","handlerName","isCommand","Reflect","apply","attachEventHandler","stateEventHandler","attachRadioEventHandler","radioEventHandler","CHECK_TYPES","DEFAULT_VALUE_PROP_NAMES","isPossibleTwoWay","inputType","customClass","nextWireId","nextTransactionId","nextSynchronousScopeId","wireIdsByNode","getWireId","member","byKey","wireKey","wireId","getEdgeId","direction","EMPTY_EDGES","beginPropagationTransaction","originBindingId","transactionId","visitedEdges","hop","extendPropagationContext","context","edgeId","currentContext","getCurrentPropagationContext","runWithPropagationContext","callback","previous","receiptStack","producerValueObserversByNode","DEFAULT_GETTER","e","detail","hasGetter","getValueGetter","twowayEventHandlerFunction","valueGetter","newValue","producerObservers","observer","propagationContext","receipt","active","matchWriteReceipt","writtenValue","coveredBySameValueGuard","reason","toStateEdgeId","baseContext","commitToState","observerSkipNodes","markObserverSkipOnRemove","consumeObserverSkipOnRemove","observerSkipAddedNodes","markObserverSkipOnAdd","consumeObserverSkipOnAdd","pendingObservationCount","decrementPendingObservation","hasPendingObservation","DefinitionCoordinator","wait","reject","normalizedTagName","waiters","then","settle","error","waiter","pendingCount","from","coordinatorByRegistry","getDefinitionCoordinator","coordinator","readOption","separator","hasInitialSyncModifier","STATE_CALL_POLICY","authority","syncOn","observable","outputOnly","NONE_CALL_POLICY","statePolicy","resolveInitialSyncPolicy","explicitAuthority","parseSyncOn","hasOutput","hasInput","resolveInitialAuthority","initialized","isBindingStateInitialized","nextRecordId","nextGeneration","recordByBinding","sessionByRoot","bindingKeyByBinding","interestedSessionsByNode","addInterestedSession","session","forEachInterestedSession","forEachInclusive","firstChild","child","isObservableRoot","BindingOwner","Observer","MutationObserver","mutations","handleMutations","observe","childList","subtree","removed","added","mutation","removedNodes","addedNodes","reconnected","contains","handleRemovedNode","handleAddedNode","applyChangeFromBindings","ownerByRoot","getBindingOwner","bindingKey","addRecordTeardown","record","teardown","teardowns","BindingSession","records","rowPlan","knownBindingsByNode","optionsByBinding","deferredByNode","initialize","knownRoot","registerAddress","resolvedOptions","registerPathInfo","applyOnReconnect","remember","phase","start","anchor","patternListIndex","settleInitialRecord","settleConnectedSnapshot","shouldApplyState","activate","activatePlanRows","initialApplyDone","resolvedAuthority","outputOnlyMember","observationPending","getRecord","addTeardown","isAlive","generation","deferUntilDefined","task","cancel","tasks","finish","disposeBinding","disposeRecord","dispose","canWholesaleDestroy","pendingDefinitions","destroyRecords","info","observableRootFor","known","values","knownMapFor","remembered","rememberedOptions","initializeRow","plan","rowOptions","slots","slot","addKnownRowBinding","patternPathInfo","initialPolicy","policy","initialSettled","eventSequence","hasProducerValue","producerValue","eventAttached","twowayAttached","isEvent","runTeardowns","slotIndex","replaceChild","replaceToReplaceNode","recordOptions","attachListeners","detachRadioEventHandler","detachCheckboxEventHandler","attachAfterDefinition","removeObserver","byProperty","observers","addTwowayValueObserver","twowayEventHandler","attachTwowayEventHandler","listener","detachEventTokenHandler","attach","HTMLElement","readProducerSnapshot","eventWins","sequence","filteredValue","commitProducerValue","rowMap","addBindingByPattern","removeBindingByPattern","detachTwowayEventHandler","detachEventHandler","getOrCreateBindingSession","getBindingSession","completeByStateElementByWebComponent","isWebComponentComplete","webComponent","completeByStateElement","getFilteredValue","EMPTY_ARRAY","subscribedBindings","indexBindingsByContent","getIndexBindingsByContent","content","setIndexBindingsByContent","prototype","difference","other","elem","count","getUUID","ListIndex","position","_index","_version","_indexes","_listIndexes","dirty","listIndexes","WeakRef","varName","deref","createListIndex","listIndexesByList","getListIndexesByList","list","setListIndexesByList","listDiffByOldListByNewList","EMPTY_LIST","EMPTY_SET","createListDiff","rawOldList","rawNewList","diff","oldList","newList","cachedDiff","diffByNewList","getListDiff","oldIndexes","retValue","newIndexes","changeIndexSet","deleteIndexSet","addIndexSet","newListIndex","isSameList","newIndexSet","oldIndexSet","oldPosByIndex","calcDiffIndexes","indexByValue","val","existingIndexes","oldIndex","shift","existingListIndex","setListDiff","computeListDiff","syncListIndexes","computeStableIndexSet","reused","seq","prevPos","sorted","lis","n","tails","prev","fill","lo","hi","mid","k","longestIncreasingSubsequence","stable","seqIndex","bindingsByContent","getBindingsByContent","setBindingsByContent","bindingSessionByContent","getBindingSessionByContent","setBindingSessionByContent","nodesByContent","getNodesByContent","setNodesByContent","nodes","bindLoopContextToContent","activateContent","applyChange","deactivateContent","mounted","unbindLoopContextToContent","contentSetByNode","setContentByNode","contents","getContentSetByNode","deleteContentByNode","recursiveBindingTypes","Content","_content","_childNodeArray","_firstNode","_lastNode","_mounted","_ranged","ranged","firstNode","lastNode","appendTo","targetNode","appendChild","_movableNodes","first","nextSibling","mountAfter","insertBefore","tryDestroy","removeChild","unmount","resolveRanged","topLevelStructural","structural","test","hasTopLevelStructural","createContentFromNodes","createDocumentFragment","createPlanContent","cloneFragment","importNode","nodePath","indexBindings","nodeIndex","template","isIndexBinding","initializeRowBindings","createContent","directional","namespace","compileRowPlan","initialInfo","collectNodesAndBindingInfosByFragment","bindingSession","initializeBindingsByFragment","createComment","appendRowEndMarker","lastNodeByNode","contentByListIndexByNode","pooledContentsByNode","isOnlyNodeInParentContentByNode","hydrateSetContent","contentByListIndex","setContent","hydrateSetLastNode","setPooledContent","isPhysicallyAfter","compareDocumentPosition","DOCUMENT_POSITION_FOLLOWING","DOCUMENT_POSITION_DISCONNECTED","bindingInfoText","applyChangeToIf","rawNewValue","ssrMode","log","startComment","endComment","afterNode","store","getSsrProperties","trackedNodes","SSR_ATTR_PROPS","textContent","setAttribute","removeAttribute","selected","disabled","selectedIndex","querySelectorAll","idx","applyChangeToProperty","_context","firstSegment","performWrite","propertyWriteSucceeded","mirrorAttr","getInputAttributeMirror","attributeName","formatted","JSON","stringify","applyMirrorAttribute","propagationContextByBinding","extendedContext","bindingId","bindingGeneration","synchronousScopeId","pop","runWithWriteReceipt","attrHandler","find","addSsrProperty","subObject","segment","oldValue","isFrozen","ssrWrappedNodes","applyChangeToWebComponent","restSegments","getValue","indexName","indexPos","getIndexValueByLoopContext","scheduledBindings","reportFailure","applyChangeByFirstSegment","class","className","classList","toggle","attr","attrName","style","styleName","command","methodName","elementRef","el","method","applyChangeByBindingType","nodeValue","for","listPathInfo","absAddress","lastValue","newListValueByAbsAddress","fullDelete","isOnlyNode","prevCheckNode","previousSibling","nextCheckNode","onlyNode","isOnlyNodeInParentContent","contentMap","poolBudget","getPooledContents","POSITIVE_INFINITY","deleteIndex","elementPathInfo","loopContextStack","stableIndexSet","pooledContents","createLoopContext","indexBinding","if","else","elseif","radio","elementFilteredValue","checkbox","normalizedNewValue","fnByBinding","deferredSelectBindingByBinding","definedApplyVerifiedByBinding","_applyChange","deferredSelectBindings","appliedBindingSet","hasUpdatedCallback","updatedAbsAddressSetByStateElement","customTag","applyLatest","currentSession","scheduleDeferredApply","sameRootVerified","DocumentFragment","ShadowRoot","targetState","newContext","bindingIndex","nextBindingInfo","nextRootNode","newListValue","absAddressSet","initializeBindings","parentLoopContext","scheduleDeferredSpreads","MUSTACHE_REGEX","SKIP_TAGS","convertMustacheToComments","SHOW_TEXT","textNodes","textNode","parentElement","replaceTextNode","convertTextNodes","templates","namespaceURI","newTemplate","createElement","childNode","attributes","replaceWith","lastIndex","_notFilterInfo","createNotFilter","COMMENT_REGEX","expandShorthandInStatePart","forPath","prefix","pipeIndex","atIndex","pathPart","suffix","expandCommentData","commentPrefix","commentSuffix","expandBindAttribute","attrValue","parts","changed","part","trimmed","colonIndex","expandShorthandInBindAttribute","expandShorthandPaths","bindAttr","comment","HTMLTemplateElement","getNodePath","unshift","getFragmentNodeInfos","fragmnentNodeInfos","subscriberNode","optimizeFragment","keywordByBindingType","notFilter","cloneNotParseBindTextResult","_getFragmentInfo","collectStructuralFragments","walkRoot","elseKeyword","lastIfFragmentInfo","elseFragmentInfos","childForPath","lastElseFragmentInfo","placeHolder","elseUUID","elseFragmentInfo","elsePlaceHolder","waitForStateInitialize","elements","promises","initializePromise","all","buildBindings","body","shadowRoot","host","VERSION","HTMLElementBase","SSR_PLACEHOLDER_COMMENT","SSR_BLOCK_START","SSR_BLOCK_END","SSR_TEXT_START","escapeJsonForScript","json","replace","Ssr","_stateData","_templates","_hydrateProps","stateData","_loadStateData","_loadTemplates","hydrateProps","_loadHydrateProps","getTemplate","verifyVersion","serverVersion","serverParts","clientParts","setStateData","setHydrateProps","props","script","querySelector","parse","tpl","findByName","parentEl","Element","Document","extractStateData","stateEl","raw","__state","buildContent","ssrEl","jsonScript","uuids","bindResult","cloneNode","ssrNodes","propsData","propsScript","removeBlockBoundaryComments","toRemove","removeStructuralComments","restoreTextBindings","startComments","bindComment","sibling","endPattern","cleanupDom","ssrElements","templateByUuid","ssrNode","walker1","walker2","placeholders","restored","imported","ssrIdElements","STRUCTURAL_TYPES","collectBindingsFromLiveNodes","parent","wrapper","findPlaceholderComment","pattern","restoreFragments","lastIfParseResult","hydrateBindings","blocks","startMatch","collectSsrBlocks","listIndexesByUuid","block","placeholderComment","hydrateBlocks","ssrParents","normalBindings","structuralBindings","initializedBindings","absAddr","restoredSsrElements","propMap","completedEls","stateElementByNameByNode","bindingsReadyByNode","liveStateElements","stateElementByName","getBindingsReady","setStateElementByName","enableSsr","ready","queueMicrotask","updateBatchListeners","registerUpdateBatchListener","updater","_queueUpdateRecords","enqueueAbsoluteAddress","requireStartProcess","updateRecords","testApplyChange","absoluteAddresses","contexts","contextByAbsoluteAddress","droppedTransactionId","winnerTransactionId","processBindings","maxHops","batch","notifyUpdateBatchListeners","getUpdater","DEVTOOLS_HOOK_GLOBAL","getOrCreateHookRegistry","globals","sources","listeners","applySink","source","_setSink","sourceId","onEvent","register","onSourceRegistered","unregister","onSourceUnregistered","addListener","createMinimalRegistry","onUpdateBatch","addresses","setSink","sink","wasActive","setDevtoolsSink","isActive","createStateElementSummary","paths","listPaths","elementPaths","getterPaths","setter","setterPaths","commandTokenNames","staticDependency","dynamicDependency","requireStateElement","registeredSource","registerDevtoolsSource","random","packageVersion","getStateElements","summaries","read","write","loadFromInnerScript","scriptModule","uniq_comment","URL","createObjectURL","blob","Blob","url","import","revokeObjectURL","b64","btoa","fromCodePoint","TextEncoder","encode","default","loadFromScriptFile","LoopContextStack","_loopContextStack","_length","elementStateAddress","lastLoopContext","prevWildcardPathInfo","finally","getOrCreateCommandToken","namespaceProxyByStateElement","getCommandNamespace","proxy","Proxy","create","_target","prop","ownKeys","getOwnPropertyDescriptor","configurable","enumerable","deleteProperty","UNCERTAIN","lastNotifiedByStateElement","pruneLastNotified","liveNames","lastMap","invalidateLastNotified","status","activeStateElements","deleteActiveStateElement","getActiveStateElements","getStreamEntries","abortAllStreams","controller","abort","latestFold","_acc","chunk","NO_STREAM_NAMES","processStreamsDeclaration","declared","def","definition","hasFold","fold","initial","depAddresses","setStreamEntries","statusNamespaceByStateElement","errorNamespaceByStateElement","createStreamNamespaceProxy","namespaceName","pick","getStreamStatusNamespace","getStreamErrorNamespace","clearStreamNamespace","collector","consumeSource","signal","iterator","returned","onAbort","return","once","produced","getReader","stream","reader","catch","done","releaseLock","readableToAsyncIterable","asyncIterator","TypeError","iterate","aborted","fail","startStreams","addActiveStateElement","startStream","AbortController","argsValue","argsFn","previousCollector","captured","selfStatusPath","selfErrorPath","dep","traceArgs","updateStreamStatus","getLastNotified","statusChanged","errorChanged","setLastNotified","$postUpdate","getterFn","setterFn","callFn","isAsync","isInternalProperty","hits","ResolvedAddress","wildcardType","wildcardIndexes","tmpPatternSegments","incompleteCount","completeCount","getResolvedAddress","nameInfo","cacheEntryByAbsoluteStateAddress","setCacheEntryByAbsoluteStateAddress","cacheEntry","dirtyCacheEntryByAbsoluteStateAddress","walkNamespace","_getByAddress","receiver","parentValue","getByAddress","pushAddress","popAddress","_getByAddressWithCache","getCacheEntryByAbsoluteStateAddress","untracking","addressStackLength","lastAddress","lastAddressStack","lastInfo","addDynamicDependency","sharedLen","crossRow","level","addCrossRowListPath","checkDependency","collectStreamDependency","getContextListIndex","structuredPath","hasByAddress","swapInfoByStateAddress","setSwapInfoByAddress","swapInfo","_walkExpandWildcard","currentWildcardIndex","parentAbsPathInfo","stateProxy","loopIndexes","listDiff","searchType","getIndexes","targetListIndexes","EMPTY_INDEXES","selectExpansionIndexes","sourcePath","_lastValue","_newValue","listExpansion","crossRowListPaths","fullRows","movedRows","EMPTY_PATH_INFOS","getMovedRowExpansionPaths","wildcardPath","depPathInfo","indexGetters","indexDependentGetterPaths","queue","children","staticMap","walkDependency","startAddress","listPathSet","startPath","dynamicMap","visited","stack","depth","nextDepth","nextEntries","staticDeps","selection","depAddress","movedPathInfos","dynamicDeps","expandContext","_walkDependency","notifyWrite","absDepAddress","_setByAddress","beginUntrack","endUntrack","_setByAddressWithSwap","getSwapInfoByAddress","currentParentValue","currentListIndexes","curIndex","setByAddress","devOldValue","devHasOldValue","cacheable","hasOldValue","bindableEventMap","dispatchEvent","CustomEvent","bubbles","isSwappable","_prop","wildcardParentPathInfo","wildcardAddress","lastValueByListAddress","getListIndex","resolvedAddress","_setLoopContext","setLoopContext","clearLoopContext","STREAM_STATUS_PATH_PREFIX","STREAM_ERROR_PATH_PREFIX","symbolApiCacheByHandler","addIndexDependentGetterPath","newValueByAddress","wildcardPattern","walkWildcardPattern","wildcardIndexPos","parentIndexes","resultIndexes","resultValues","getAll","postUpdate","_receiver","trackDependency","untrackDependency","getSymbolApiCache","api","setLoopContextAsync","call","connectedCallback","disconnectedCallback","refs","indexesListByPath","ref","pathName","indexesList","updatedCallback","StateHandler","_stateElement","_stateName","_addressStack","_addressStackIndex","_loopContext","_mutability","_untrackDepth","mutability","trapGet","trapSet","lastValueByAbsoluteStateAddress","stateElementByWebComponent","getStateElementByWebComponent","stateMap","innerMappingByElement","outerMappingByElement","primaryMappingRuleSetByElement","primaryBindingByMappingRule","createMappingRuleByBinding","innerState","innerAbsPathInfo","outerAbsPathInfo","getOuterAbsolutePathInfo","innerMapping","outerMapping","primaryMappingRuleSet","primaryMappingRule","currentPrimaryMappingRule","primaryBinding","outerRemainingSegments","outerPathInfo","outerStateElement","addBindingByNode","meltFrozenObject","frozenObj","obj","proto","getPrototypeOf","clone","descriptors","getOwnPropertyDescriptors","writable","defineProperties","cloneWithDescriptors","InnerStateProxyHandler","_webComponent","_innerStateElement","innerPathInfo","setLastValueByAbsoluteStateAddress","OuterStateProxyHandler","absStateAddress","PlainOuterStateProxyHandler","getOuter","outerState","bindWebComponent","innerStateElement","component","stateProp","setStateElementByWebComponent","innerMappingRule","outerMappingRule","mappingRule","buildPrimaryMappingRule","createOuterState","boundComponentStateProp","createInnerState","setInitialState","defineProperty","createPlainOuterState","markWebComponentAsComplete","func","getStateInfo","assign","getAllPropertyDescriptors","State","static","_hasUpdatedCallback","_crossRowListPaths","_indexDependentGetterPaths","_initialized","_initializePromise","_resolveInitialize","_connectedCallbackPromise","_resolveConnectedCallback","_loadingPromise","_resolveLoading","_setStatePromise","_resolveSetState","_listPaths","_elementPaths","_getterPaths","_setterPaths","createLoopContextStack","_dynamicDependency","_staticDependency","_pathSet","_rootNode","_boundComponent","_boundComponentStateProp","_bindableEventMap","_commandTokenNames","_eventTokenNames","_dcc","_connectGeneration","_streamsStartedGeneration","_state","names","processCommandTokensDeclaration","processEventTokensDeclaration","processOnDeclaration","stateInfo","_loadFromSsrElement","_initialize","ssrState","getElementById","loadFromScriptJson","src","endsWith","response","fetch","ok","statusText","loadFromJsonFile","timerId","setTimeout","clearTimeout","desc","_initializeBindWebComponent","boundComponent","_callStateConnectedCallback","_initializeDCC","hostElement","innerHTML","shadowRootMode","mode","bindables","createWcBindable","createBindableEventMap","stateTagSelector","DCCElement","_shadow","attachShadow","setBindableEventMap","newDesc","define","defineDCC","_callStateDisconnectedCallback","connectGeneration","clearCommandNamespace","connectedCallbackPromise","_addDependency","targetPath","deps","addStaticDependency","currentPathInfo","_createState","createStateProxy","nextVersion","bindProperty","registerComponents","bootstrapState","partialConfig","defineState","builtinFilterMeta","description","hasArgs","resultType","acceptTypes","minArgs","maxArgs","argTypes","WCS_MANIFEST_VERSION","getWcsManifest","syntax","bindAttribute","pathDelimiter","wildcard","delimiters","propValue","structuralDirectives","filterMeta","reservedLifecycle","reservedStateApi","KNOWN_NAMESPACES","EMPTY","analyzeContract","manifest","events","resolveDeclaration","extensions","manifestExtensions","components","tag","live","loaded","checkComponentDrift","analyzeManifestContract","resolveLiveDeclaration","rawComponent","observables","propertyEvents","liveEvent","sidecarEvent","ctor","decl","property"],"mappings":"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"}