@forgeax/engine-render-graph 0.1.20 → 0.1.21
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.
- package/README.md +9 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/render-graph-gpu-timing-instrumentation.unit.test.d.ts +2 -0
- package/dist/__tests__/render-graph-gpu-timing-instrumentation.unit.test.d.ts.map +1 -0
- package/dist/builder.d.ts.map +1 -1
- package/dist/compiled-graph.d.ts +2 -2
- package/dist/compiled-graph.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +21 -7
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.ts +17 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/render-graph-builder.unit.test.ts +23 -0
- package/src/__tests__/render-graph-gpu-timing-instrumentation.unit.test.ts +183 -0
- package/src/builder.ts +6 -2
- package/src/compiled-graph.ts +25 -6
- package/src/index.ts +2 -0
- package/src/types.ts +26 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/kernel-internal.ts","../src/compiled-graph.ts","../src/resource-registry.ts","../src/builder.ts","../src/observation.ts","../src/pass-registry.ts","../src/pipeline/color-value-domain.ts","../src/graph.ts"],"names":["pooled"],"mappings":"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","file":"index.mjs","sourcesContent":["// @forgeax/engine-render-graph/src/errors.ts — RenderGraphError closed-union\n// error model + Result<T, E>.\n//\n// Shape (plan-strategy D-3):\n// - RenderGraphErrorCode, RenderGraphErrorDetail, and the constructor argument\n// union derive from one private code-to-detail map.\n// - RenderGraphError extends Error { readonly code; readonly expected;\n// readonly hint; readonly detail } — four-field structured error surface,\n// aligned with RhiError (research Finding 8).\n// - RenderGraphErrorDetail is projected from that map; the\n// constructor arguments correlate each code with its accepted detail:\n// - 'dangling-read' / 'unknown-resource' -> { resourceKey, passName }\n// - 'cap-missing' -> { cap, passName }\n// - 'duplicate-resource' -> { resourceKey }\n// - 'alias-source-missing' -> { aliasKey, sourceKey }\n// - Result<T, E=RenderGraphError> = binary tag union ('ok' / 'err') +\n// ok() / err() factories, aligned with RhiError Result (research Finding 8).\n//\n// Related: plan-strategy D-3; research Finding 8; AC-15.\n\n/**\n * Private code-to-detail authority for the complete RenderGraphError surface.\n *\n * The two resource-key errors intentionally share DanglingReadDetail. Keeping\n * that fact in this map lets the public code and detail unions, plus the\n * constructor arguments, derive from one authority without\n * exporting a framework or runtime registry.\n */\ninterface RenderGraphErrorDetailByCode {\n 'dangling-read': DanglingReadDetail;\n 'cap-missing': CapMissingDetail;\n 'duplicate-resource': DuplicateResourceDetail;\n 'alias-source-missing': AliasSourceDetail;\n 'unknown-resource': DanglingReadDetail;\n 'resource-alloc-failed': ResourceAllocFailedDetail;\n 'invalid-format': InvalidFormatDetail;\n 'observation-absent': ObservationDetail;\n 'observation-invalid-format': ObservationDetail;\n 'observation-invalid-size': ObservationDetail;\n 'observation-missing-copy-src': ObservationDetail;\n 'observation-stale': ObservationDetail;\n 'observation-retired': ObservationDetail;\n 'invalid-color-domain': ColorDomainDetail;\n 'missing-color-domain': ColorDomainDetail;\n 'color-domain-mismatch': ColorDomainDetail;\n 'duplicate-pass-name': DeclarationDetail;\n 'duplicate-resource-label': DeclarationDetail;\n 'builder-sealed': DeclarationDetail;\n 'foreign-resource-handle': ResourceAccessDetail;\n 'resource-not-declared-by-pass': ResourceAccessDetail;\n 'uninitialized-read': ResourceAccessDetail;\n 'access-conflict': ResourceAccessDetail;\n 'capability-missing': CapabilityDetail;\n 'resource-descriptor-invalid': DescriptorDetail;\n 'import-usage-mismatch': DescriptorDetail;\n 'resource-allocation-failed': ResourceAllocFailedDetail;\n 'resource-resolution-failed': ResourceAccessDetail;\n 'pass-encode-failed': PassFailureDetail;\n 'compiled-graph-retired': LifecycleDetail;\n 'resource-retire-failed': LifecycleDetail;\n}\n\n/** Closed RenderGraphErrorCode union derived from the private detail map. */\nexport type RenderGraphErrorCode = keyof RenderGraphErrorDetailByCode;\n\n/** Detail union projected from the private code-to-detail map. */\nexport type RenderGraphErrorDetail = RenderGraphErrorDetailByCode[RenderGraphErrorCode];\n\n/** Failure stages for the shared float/output surface contract. */\nexport type SurfaceFailureKind =\n | 'allocation'\n | 'attachment'\n | 'sampled-read'\n | 'view-domain'\n | 'raw-endpoint';\n\n/** Closed error codes derived from the surface failure kinds. */\nexport type SurfaceFailureCode = `surface-${SurfaceFailureKind}-failed`;\n\n/** Shared detail for graph and render-surface recovery. */\nexport interface RenderSurfaceFailureDetail {\n readonly lane: string;\n readonly stage: string;\n readonly target: string;\n readonly format: string;\n readonly domain: string;\n readonly endpoint: string;\n readonly capability: string;\n}\n\n/**\n * Constructor arguments correlated by code. `detail` remains optional to\n * preserve the existing envelope behavior for callers that only need the\n * top-level fields.\n */\ntype RenderGraphErrorConstructorArgs = {\n [Code in RenderGraphErrorCode]: {\n code: Code;\n expected: string;\n hint: string;\n detail?: RenderGraphErrorDetailByCode[Code] | undefined;\n };\n}[RenderGraphErrorCode];\n\n/** Detail variant for dangling-read and unknown-resource errors. */\nexport interface DanglingReadDetail {\n readonly resourceKey: string;\n readonly passName: string;\n}\n\n/** Detail variant for cap-missing errors. */\nexport interface CapMissingDetail {\n readonly cap: 'compute' | 'storageBuffer';\n readonly passName: string;\n}\n\n/** Detail variant for duplicate-resource errors. */\nexport interface DuplicateResourceDetail {\n readonly resourceKey: string;\n}\n\n/** Detail variant for aliases whose source is not a registered color target. */\nexport interface AliasSourceDetail {\n readonly aliasKey: string;\n readonly sourceKey: string;\n}\n\n/** Detail variant for resource-alloc-failed errors. */\nexport interface ResourceAllocFailedDetail {\n readonly resourceKey: string;\n readonly passName?: string | undefined;\n readonly rhiCode?: string | undefined;\n}\n\n/** Detail variant for invalid-format errors. */\nexport interface InvalidFormatDetail {\n readonly resourceKey: string;\n readonly format: string;\n readonly expected: readonly string[];\n}\n\n/** Generic current-frame observation failures. */\nexport interface ObservationDetail {\n readonly frameId?: number | undefined;\n readonly expected?: string | undefined;\n}\n\nexport interface ColorDomainDetail {\n readonly value?: string | undefined;\n readonly resourceKey?: string | undefined;\n readonly sourceDomain?: string | undefined;\n readonly destinationDomain?: string | undefined;\n}\n\nexport interface DeclarationDetail {\n readonly passName?: string | undefined;\n readonly resourceLabel?: string | undefined;\n}\n\nexport interface ResourceAccessDetail {\n readonly passName?: string | undefined;\n readonly resourceLabel?: string | undefined;\n readonly usage?: string | undefined;\n readonly accesses?: readonly string[] | undefined;\n}\n\nexport interface CapabilityDetail extends ResourceAccessDetail {\n readonly capability: 'compute' | 'storage-buffer' | 'storage-texture' | 'indirect';\n}\n\nexport interface DescriptorDetail {\n readonly resourceLabel: string;\n readonly field: string;\n readonly expected: string;\n readonly actual?: string | number | undefined;\n}\n\nexport interface PassFailureDetail {\n readonly passName: string;\n readonly passKind: 'raster' | 'compute' | 'copy';\n readonly cause: unknown;\n}\n\nexport interface LifecycleDetail {\n readonly generation: number;\n readonly resourceLabel?: string | undefined;\n readonly cause?: unknown;\n}\n\n/**\n * Structured RenderGraph error.\n *\n * Four readonly fields aligned with AGENTS.md \"Errors are structured\"\n * and RhiError (research Finding 8):\n * - `.code` — closed union member (L1 key signal).\n * - `.expected` — expected-state description (L2 detail).\n * - `.hint` — actionable recovery guidance (L2 detail).\n * - `.detail` — narrowed payload per code variant.\n */\nexport class RenderGraphError extends Error {\n readonly code: RenderGraphErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: RenderGraphErrorDetail | undefined;\n\n constructor(args: RenderGraphErrorConstructorArgs) {\n super(`[RenderGraphError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = 'RenderGraphError';\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n}\n\n// Result<T, E> + ok / err + ResultOk / ResultErr live in `@forgeax/engine-types`\n// (tweak-20260612-result-into-types). Consolidated upstream from this and 4\n// other packages' duplicate definitions; the barrel here re-exports them so\n// existing `import { err, ok, Result } from '@forgeax/engine-render-graph'`\n// consumers stay unchanged.\nexport {\n err,\n ok,\n type Result,\n type ResultErr,\n type ResultOk,\n} from '@forgeax/engine-types';\n","import type { Buffer, Texture, TextureView } from '@forgeax/engine-rhi';\nimport type {\n GraphAccess,\n GraphBuffer,\n GraphBufferDescriptor,\n GraphPass,\n GraphResourceKind,\n GraphResourceOrigin,\n GraphTexture,\n GraphTextureDescriptor,\n GraphTextureView,\n GraphTextureViewDescriptor,\n ImportedBufferDescriptor,\n ImportedTextureDescriptor,\n ImportedTextureViewResolver,\n RenderGraphFrame,\n} from './types.js';\n\nexport interface TextureHandleData {\n readonly owner: object;\n readonly id: number;\n readonly kind: 'texture';\n}\n\nexport interface TextureViewHandleData {\n readonly owner: object;\n readonly id: number;\n readonly kind: 'texture-view';\n readonly textureId: number;\n}\n\nexport interface BufferHandleData {\n readonly owner: object;\n readonly id: number;\n readonly kind: 'buffer';\n}\n\nexport type ResourceHandleData = TextureHandleData | TextureViewHandleData | BufferHandleData;\n\nexport function textureHandle(owner: object, id: number): GraphTexture {\n return Object.freeze({ owner, id, kind: 'texture' }) as unknown as GraphTexture;\n}\n\nexport function textureViewHandle(owner: object, id: number, textureId: number): GraphTextureView {\n return Object.freeze({\n owner,\n id,\n kind: 'texture-view',\n textureId,\n }) as unknown as GraphTextureView;\n}\n\nexport function bufferHandle(owner: object, id: number): GraphBuffer {\n return Object.freeze({ owner, id, kind: 'buffer' }) as unknown as GraphBuffer;\n}\n\nexport function handleData(resource: unknown): ResourceHandleData | undefined {\n if (typeof resource !== 'object' || resource === null) return undefined;\n const candidate = resource as Partial<ResourceHandleData>;\n if (typeof candidate.id !== 'number' || typeof candidate.owner !== 'object') return undefined;\n if (\n candidate.kind !== 'texture' &&\n candidate.kind !== 'texture-view' &&\n candidate.kind !== 'buffer'\n ) {\n return undefined;\n }\n return candidate as ResourceHandleData;\n}\n\ninterface ResourceRecordBase {\n readonly id: number;\n readonly label: string;\n readonly kind: GraphResourceKind;\n readonly origin: GraphResourceOrigin;\n}\n\nexport interface CreatedTextureRecord extends ResourceRecordBase {\n readonly kind: 'texture';\n readonly origin: 'created';\n readonly descriptor: GraphTextureDescriptor;\n}\n\nexport interface ImportedTextureRecord<FrameCtx> extends ResourceRecordBase {\n readonly kind: 'texture';\n readonly origin: 'imported';\n readonly descriptor: ImportedTextureDescriptor;\n readonly resolve: (frame: FrameCtx) => Texture;\n}\n\nexport interface CreatedBufferRecord extends ResourceRecordBase {\n readonly kind: 'buffer';\n readonly origin: 'created';\n readonly descriptor: GraphBufferDescriptor;\n}\n\nexport interface ImportedBufferRecord<FrameCtx> extends ResourceRecordBase {\n readonly kind: 'buffer';\n readonly origin: 'imported';\n readonly descriptor: ImportedBufferDescriptor;\n readonly resolve: (frame: FrameCtx) => Buffer;\n}\n\nexport type ResourceRecord<FrameCtx> =\n | CreatedTextureRecord\n | ImportedTextureRecord<FrameCtx>\n | CreatedBufferRecord\n | ImportedBufferRecord<FrameCtx>;\n\nexport interface TextureViewRecord<FrameCtx extends RenderGraphFrame = RenderGraphFrame> {\n readonly id: number;\n readonly label: string;\n readonly textureId: number;\n readonly descriptor: GraphTextureViewDescriptor;\n readonly resolve?: ImportedTextureViewResolver<FrameCtx> | undefined;\n}\n\nexport interface PassRecord<FrameCtx extends RenderGraphFrame> {\n readonly id: number;\n readonly name: string;\n readonly pass: GraphPass<FrameCtx>;\n}\n\nexport interface CompiledResource<FrameCtx> {\n readonly record: ResourceRecord<FrameCtx>;\n readonly usage: number;\n readonly firstUse: number | null;\n readonly lastUse: number | null;\n readonly texture?: Texture | undefined;\n readonly buffer?: Buffer | undefined;\n}\n\nexport interface CompiledView<FrameCtx extends RenderGraphFrame = RenderGraphFrame> {\n readonly record: TextureViewRecord<FrameCtx>;\n readonly view?: TextureView | undefined;\n}\n\nexport interface CompiledPass<FrameCtx extends RenderGraphFrame> extends PassRecord<FrameCtx> {\n readonly dependencies: readonly number[];\n readonly resourceIds: ReadonlySet<number>;\n readonly viewIds: ReadonlySet<number>;\n}\n\nexport function accessResourceId(access: GraphAccess): number | undefined {\n const data = handleData(access.resource);\n if (data?.kind === 'texture-view') return data.textureId;\n return data?.id;\n}\n","import type {\n Buffer,\n RenderPassColorAttachment,\n RenderPassDepthStencilAttachment,\n RhiComputePassEncoder,\n RhiDevice,\n Texture,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport { err, ok, RenderGraphError, type Result } from './errors.js';\nimport type { ResolvedColorTargetDescriptor } from './graph.js';\nimport type {\n CompiledPass,\n CompiledResource,\n CompiledView,\n ResourceHandleData,\n} from './kernel-internal.js';\nimport { handleData } from './kernel-internal.js';\nimport type {\n CompiledRenderGraph,\n CompiledRenderGraphInfo,\n GraphBuffer,\n GraphResourceResolver,\n GraphTexture,\n GraphTextureView,\n RenderGraphFrame,\n RenderGraphPassRunner,\n} from './types.js';\n\ninterface FrameResources {\n readonly buffers: ReadonlyMap<number, Buffer>;\n readonly textures: ReadonlyMap<number, Texture>;\n readonly views: ReadonlyMap<number, TextureView>;\n}\n\nfunction resolutionError(label: string, cause?: unknown): RenderGraphError {\n return new RenderGraphError({\n code: 'resource-resolution-failed',\n expected: `resource '${label}' resolves to a live RHI handle for this frame`,\n hint: `repair the imported owner for '${label}' before executing the graph`,\n detail: { resourceLabel: label, ...(cause === undefined ? {} : { accesses: [String(cause)] }) },\n });\n}\n\nexport class CompiledRenderGraphImpl<FrameCtx extends RenderGraphFrame>\n implements CompiledRenderGraph<FrameCtx>\n{\n private retired = false;\n private retireResult: Promise<Result<void, RenderGraphError>> | undefined;\n\n constructor(\n private readonly generation: number,\n private readonly owner: object,\n private readonly device: RhiDevice,\n private readonly resources: ReadonlyMap<number, CompiledResource<FrameCtx>>,\n private readonly views: ReadonlyMap<number, CompiledView<FrameCtx>>,\n private readonly passes: readonly CompiledPass<FrameCtx>[],\n private readonly info: CompiledRenderGraphInfo,\n private readonly colorTargetDescriptors: ReadonlyMap<string, ResolvedColorTargetDescriptor>,\n ) {}\n\n inspect(): CompiledRenderGraphInfo {\n return this.info;\n }\n\n getColorTargetView(name: string): TextureView | undefined {\n for (const view of this.views.values()) {\n const resource = this.resources.get(view.record.textureId);\n if (resource?.record.label === name) return view.view;\n }\n return undefined;\n }\n\n getColorTargetTexture(name: string): Texture | undefined {\n for (const resource of this.resources.values()) {\n if (resource.record.label === name) return resource.texture;\n }\n return undefined;\n }\n\n getColorTargetDescriptor(name: string): ResolvedColorTargetDescriptor | undefined {\n return this.colorTargetDescriptors.get(name);\n }\n\n execute(frame: FrameCtx, runPass?: RenderGraphPassRunner): Result<void, RenderGraphError> {\n if (this.retired) {\n return err(\n new RenderGraphError({\n code: 'compiled-graph-retired',\n expected: 'a compiled graph executes only before retire()',\n hint: 'publish and execute the replacement compiled graph',\n detail: { generation: this.generation },\n }),\n );\n }\n\n const resolved = this.resolveFrameResources(frame);\n if (!resolved.ok) return resolved;\n\n for (const [executionIndex, pass] of this.passes.entries()) {\n const resolver = this.createPassResolver(pass, resolved.value);\n try {\n if (pass.pass.descriptor.executeIf?.(frame) === false) continue;\n let encodeResult: Result<void, RenderGraphError> = ok(undefined);\n const encode = () => {\n switch (pass.pass.kind) {\n case 'raster': {\n const descriptor = pass.pass.descriptor;\n const colorAttachments: RenderPassColorAttachment[] = [];\n for (const attachment of descriptor.colorAttachments) {\n const view = resolver.textureView(attachment.view);\n if (!view.ok) {\n encodeResult = view;\n return;\n }\n const resolveTarget =\n attachment.resolveTarget === undefined\n ? undefined\n : resolver.textureView(attachment.resolveTarget);\n if (resolveTarget !== undefined && !resolveTarget.ok) {\n encodeResult = resolveTarget;\n return;\n }\n const clearValue =\n typeof attachment.clearValue === 'function'\n ? attachment.clearValue(frame)\n : attachment.clearValue;\n colorAttachments.push({\n view: view.value,\n ...(resolveTarget === undefined ? {} : { resolveTarget: resolveTarget.value }),\n ...(clearValue === undefined ? {} : { clearValue }),\n loadOp: attachment.loadOp,\n storeOp: attachment.storeOp,\n ...(attachment.depthSlice === undefined\n ? {}\n : { depthSlice: attachment.depthSlice }),\n });\n }\n let depthStencilAttachment: RenderPassDepthStencilAttachment | undefined;\n if (descriptor.depthStencilAttachment !== undefined) {\n const attachment = descriptor.depthStencilAttachment;\n const view = resolver.textureView(attachment.view);\n if (!view.ok) {\n encodeResult = view;\n return;\n }\n depthStencilAttachment = {\n view: view.value,\n ...(attachment.depthClearValue === undefined\n ? {}\n : { depthClearValue: attachment.depthClearValue }),\n ...(attachment.depthLoadOp === undefined\n ? {}\n : { depthLoadOp: attachment.depthLoadOp }),\n ...(attachment.depthStoreOp === undefined\n ? {}\n : { depthStoreOp: attachment.depthStoreOp }),\n ...(attachment.depthReadOnly === undefined\n ? {}\n : { depthReadOnly: attachment.depthReadOnly }),\n ...(attachment.stencilClearValue === undefined\n ? {}\n : { stencilClearValue: attachment.stencilClearValue }),\n ...(attachment.stencilLoadOp === undefined\n ? {}\n : { stencilLoadOp: attachment.stencilLoadOp }),\n ...(attachment.stencilStoreOp === undefined\n ? {}\n : { stencilStoreOp: attachment.stencilStoreOp }),\n ...(attachment.stencilReadOnly === undefined\n ? {}\n : { stencilReadOnly: attachment.stencilReadOnly }),\n };\n }\n const encoder = frame.encoder.beginRenderPass({\n label: pass.name,\n colorAttachments,\n ...(depthStencilAttachment === undefined ? {} : { depthStencilAttachment }),\n });\n try {\n descriptor.encode({ pass: encoder, frame, resources: resolver });\n } finally {\n encoder.end();\n }\n break;\n }\n case 'compute': {\n const begin = pass.pass.descriptor.begin?.(frame);\n let encoder: RhiComputePassEncoder;\n try {\n encoder = frame.encoder.beginComputePass({ ...(begin ?? {}), label: pass.name });\n } catch (cause) {\n pass.pass.descriptor.onBeginError?.(frame, cause);\n throw cause;\n }\n try {\n pass.pass.descriptor.encode({ pass: encoder, frame, resources: resolver });\n } finally {\n encoder.end();\n }\n pass.pass.descriptor.after?.(frame);\n break;\n }\n case 'copy':\n pass.pass.descriptor.encode({ encoder: frame.encoder, frame, resources: resolver });\n break;\n }\n };\n if (runPass === undefined) {\n encode();\n } else {\n runPass({ name: pass.name, kind: pass.pass.kind, executionIndex }, encode);\n }\n if (!encodeResult.ok) return encodeResult;\n } catch (cause) {\n return err(\n new RenderGraphError({\n code: 'pass-encode-failed',\n expected: `pass '${pass.name}' encodes without throwing`,\n hint: 'inspect detail.cause and repair the pass-owned RHI command',\n detail: { passName: pass.name, passKind: pass.pass.kind, cause },\n }),\n );\n }\n }\n return ok(undefined);\n }\n\n retire(): Promise<Result<void, RenderGraphError>> {\n if (this.retireResult !== undefined) return this.retireResult;\n this.retired = true;\n this.retireResult = this.finishRetire();\n return this.retireResult;\n }\n\n private async finishRetire(): Promise<Result<void, RenderGraphError>> {\n try {\n await this.device.queue.onSubmittedWorkDone();\n } catch (cause) {\n return err(\n new RenderGraphError({\n code: 'resource-retire-failed',\n expected: 'the GPU submission fence resolves before graph resources retire',\n hint: 'recover the device before retiring the replacement generation',\n detail: { generation: this.generation, cause },\n }),\n );\n }\n\n let firstFailure: RenderGraphError | undefined;\n for (const compiled of this.resources.values()) {\n if (compiled.record.origin === 'imported') continue;\n if (compiled.texture === undefined && compiled.buffer === undefined) continue;\n try {\n const destroyed =\n compiled.record.kind === 'texture'\n ? this.device.destroyTexture(compiled.texture as Texture)\n : this.device.destroyBuffer(compiled.buffer as Buffer);\n if (!destroyed.ok && firstFailure === undefined) {\n firstFailure = new RenderGraphError({\n code: 'resource-retire-failed',\n expected: `graph-created resource '${compiled.record.label}' retires exactly once`,\n hint: 'inspect detail.cause for the RHI destroy refusal',\n detail: {\n generation: this.generation,\n resourceLabel: compiled.record.label,\n cause: destroyed.error,\n },\n });\n }\n } catch (cause) {\n firstFailure ??= new RenderGraphError({\n code: 'resource-retire-failed',\n expected: `graph-created resource '${compiled.record.label}' retires exactly once`,\n hint: 'inspect detail.cause for the RHI destroy failure',\n detail: { generation: this.generation, resourceLabel: compiled.record.label, cause },\n });\n }\n }\n return firstFailure === undefined ? ok(undefined) : err(firstFailure);\n }\n\n private resolveFrameResources(frame: FrameCtx): Result<FrameResources, RenderGraphError> {\n const buffers = new Map<number, Buffer>();\n const textures = new Map<number, Texture>();\n const views = new Map<number, TextureView>();\n\n for (const compiled of this.resources.values()) {\n if (compiled.usage === 0) continue;\n try {\n if (compiled.record.kind === 'texture') {\n const texture =\n compiled.record.origin === 'created'\n ? compiled.texture\n : compiled.record.resolve(frame);\n if (texture === undefined) return err(resolutionError(compiled.record.label));\n textures.set(compiled.record.id, texture);\n } else {\n const buffer =\n compiled.record.origin === 'created' ? compiled.buffer : compiled.record.resolve(frame);\n if (buffer === undefined) return err(resolutionError(compiled.record.label));\n buffers.set(compiled.record.id, buffer);\n }\n } catch (cause) {\n return err(resolutionError(compiled.record.label, cause));\n }\n }\n\n for (const compiledView of this.views.values()) {\n if (this.resources.get(compiledView.record.textureId)?.usage === 0) continue;\n if (compiledView.record.resolve !== undefined) {\n try {\n views.set(compiledView.record.id, compiledView.record.resolve(frame));\n } catch (cause) {\n return err(resolutionError(compiledView.record.label, cause));\n }\n continue;\n }\n if (compiledView.view !== undefined) {\n views.set(compiledView.record.id, compiledView.view);\n continue;\n }\n const texture = textures.get(compiledView.record.textureId);\n if (texture === undefined) return err(resolutionError(compiledView.record.label));\n const created = this.device.createTextureView(texture, compiledView.record.descriptor);\n if (!created.ok) return err(resolutionError(compiledView.record.label, created.error));\n views.set(compiledView.record.id, created.value);\n }\n return ok({ buffers, textures, views });\n }\n\n private createPassResolver(\n pass: CompiledPass<FrameCtx>,\n frameResources: FrameResources,\n ): GraphResourceResolver {\n const lookup = (\n resource: GraphBuffer | GraphTexture | GraphTextureView,\n expectedKind: ResourceHandleData['kind'],\n ): Result<ResourceHandleData, RenderGraphError> => {\n const data = handleData(resource);\n const resourceId = data?.kind === 'texture-view' ? data.textureId : data?.id;\n if (data === undefined || data.owner !== this.owner || data.kind !== expectedKind) {\n return err(\n new RenderGraphError({\n code: 'foreign-resource-handle',\n expected: `pass '${pass.name}' resolves a handle owned by this compiled graph`,\n hint: 'use only handles created by the builder that declared this pass',\n detail: { passName: pass.name },\n }),\n );\n }\n if (resourceId === undefined || !pass.resourceIds.has(resourceId)) {\n const label = this.resources.get(resourceId ?? -1)?.record.label;\n return err(\n new RenderGraphError({\n code: 'resource-not-declared-by-pass',\n expected: `pass '${pass.name}' resolves only resources present in its accesses`,\n hint: 'add the resource access to this pass before resolving it',\n detail: { passName: pass.name, resourceLabel: label },\n }),\n );\n }\n if (data.kind === 'texture-view' && !pass.viewIds.has(data.id)) {\n const label = this.views.get(data.id)?.record.label;\n return err(\n new RenderGraphError({\n code: 'resource-not-declared-by-pass',\n expected: `pass '${pass.name}' resolves only texture views present in its accesses`,\n hint: 'add this exact texture view to the pass accesses',\n detail: { passName: pass.name, resourceLabel: label },\n }),\n );\n }\n return ok(data);\n };\n\n return {\n buffer: (resource) => {\n const data = lookup(resource, 'buffer');\n if (!data.ok) return data;\n const buffer = frameResources.buffers.get(data.value.id);\n return buffer === undefined\n ? err(resolutionError(this.resources.get(data.value.id)?.record.label ?? 'buffer'))\n : ok(buffer);\n },\n texture: (resource) => {\n const data = lookup(resource, 'texture');\n if (!data.ok) return data;\n const texture = frameResources.textures.get(data.value.id);\n return texture === undefined\n ? err(resolutionError(this.resources.get(data.value.id)?.record.label ?? 'texture'))\n : ok(texture);\n },\n textureView: (resource) => {\n const data = lookup(resource, 'texture-view');\n if (!data.ok) return data;\n const view = frameResources.views.get(data.value.id);\n return view === undefined\n ? err(resolutionError(this.views.get(data.value.id)?.record.label ?? 'texture view'))\n : ok(view);\n },\n };\n }\n}\n","// @forgeax/engine-render-graph/src/resource-registry.ts — resource\n// declaration registry (plan-strategy 3.1).\n//\n// Shape (D-4/D-6.1):\n// - string key -> ResourceDescriptor + bufferRole + lifetime\n// - duplicate-resource fail-fast across every declaration form\n// - unknown-resource fail-fast at pass binding time\n// - addColorTarget: color target registration with format/size/sample/usage\n\nimport type { TextureFormat } from '@forgeax/engine-rhi';\nimport {\n type AliasSourceDetail,\n type CapMissingDetail,\n type DanglingReadDetail,\n type DuplicateResourceDetail,\n err,\n ok,\n RenderGraphError,\n type Result,\n} from './errors.js';\nimport type {\n ColorTargetDescriptor,\n ColorTargetSize,\n ResourceDescriptor,\n ResourceLifetime,\n} from './graph.js';\nimport type { ColorValueDomain } from './pipeline/color-value-domain.js';\n\n/** Check the only allocation/view dimension combinations supported by WebGPU. */\nexport function isTextureViewDimensionCompatible(\n allocationDimension: GPUTextureDimension,\n viewDimension: GPUTextureViewDimension | undefined,\n): boolean {\n if (viewDimension === undefined) return true;\n if (allocationDimension === '3d') return viewDimension === '3d';\n return viewDimension !== '3d';\n}\n\n/**\n * Per-resource GPU allocation metadata carried through compile.\n * When the resource was registered via addColorTarget, colorTarget\n * carries the format/size/sample/usage fields (w5); when via\n * addResource it is undefined.\n */\nexport interface ColorTargetResourceMeta {\n readonly format: TextureFormat;\n readonly size: ColorTargetSize;\n readonly sample: number;\n readonly usage: number;\n /** Explicit semantic color domain; never derived from format. */\n readonly domain?: ColorValueDomain | undefined;\n /**\n * Extra texture view formats pre-declared at GPU texture creation. Mirrors\n * GPUTextureDescriptor.viewFormats. Used by the LDR MSAA path which needs a\n * `bgra8unorm` storage texture plus a `bgra8unorm-srgb` view of the same\n * texture for hardware sRGB encoding on store.\n */\n readonly viewFormats?: readonly TextureFormat[] | undefined;\n /**\n * When set, this resource is an alias of the given source resource.\n * The compile allocation phase folds the alias into the source's\n * physical texture (KB-1 MoveNode pattern, D-2).\n */\n readonly aliasedFrom?: string | undefined;\n}\n\nexport interface ResourceEntry {\n readonly key: string;\n readonly descriptor: ResourceDescriptor;\n readonly lifetime: ResourceLifetime;\n /** Present when the resource was registered via addColorTarget (w5). */\n readonly colorTarget?: ColorTargetResourceMeta | undefined;\n}\n\nexport class ResourceRegistry {\n private readonly resources = new Map<string, ResourceEntry>();\n\n add(key: string, descriptor: ResourceDescriptor): Result<ResourceEntry, RenderGraphError> {\n const entry: ResourceEntry = {\n key,\n descriptor,\n lifetime: descriptor.lifetime,\n };\n return this.register(entry);\n }\n\n /**\n * Register a color target resource (D-8).\n * Same semantics as addResource with kind:'texture' plus GPU texture\n * allocation metadata. Existing callers default to a transient target.\n */\n addColorTarget(\n name: string,\n desc: ColorTargetDescriptor,\n ): Result<ResourceEntry, RenderGraphError> {\n const lifetime = desc.lifetime ?? 'transient';\n const colorTargetMeta: ColorTargetResourceMeta = {\n format: desc.format,\n size: desc.size,\n sample: desc.sample ?? 1,\n usage: desc.usage ?? 0x10 | 0x04, // RENDER_ATTACHMENT | TEXTURE_BINDING\n ...(desc.domain !== undefined ? { domain: desc.domain } : {}),\n ...(desc.viewFormats !== undefined ? { viewFormats: desc.viewFormats } : {}),\n };\n const entry: ResourceEntry = {\n key: name,\n descriptor: { kind: 'texture', lifetime },\n lifetime,\n colorTarget: colorTargetMeta,\n };\n return this.register(entry);\n }\n\n /**\n * Register a color target alias that folds into the source's physical\n * texture at compile time (KB-1 MoveNode pattern, D-2).\n * The source must already be registered via addColorTarget.\n */\n addColorTargetAlias(name: string, source: string): Result<ResourceEntry, RenderGraphError> {\n if (this.resources.has(name)) return this.duplicateResource(name);\n const sourceMeta = this.resources.get(source)?.colorTarget;\n if (sourceMeta === undefined) {\n return err(\n new RenderGraphError({\n code: 'alias-source-missing',\n expected: `alias '${name}' source '${source}' must be a registered color target`,\n hint: `call addColorTarget('${source}', ...) before retrying alias '${name}'`,\n detail: { aliasKey: name, sourceKey: source } satisfies AliasSourceDetail,\n }),\n );\n }\n const entry: ResourceEntry = {\n key: name,\n descriptor: { kind: 'texture', lifetime: 'transient' },\n lifetime: 'transient',\n colorTarget: {\n format: sourceMeta.format,\n size: sourceMeta.size,\n sample: sourceMeta.sample,\n usage: sourceMeta.usage,\n ...(sourceMeta.domain !== undefined ? { domain: sourceMeta.domain } : {}),\n ...(sourceMeta.viewFormats !== undefined ? { viewFormats: sourceMeta.viewFormats } : {}),\n aliasedFrom: source,\n },\n };\n return this.register(entry);\n }\n\n private duplicateResource(key: string): Result<ResourceEntry, RenderGraphError> {\n return err(\n new RenderGraphError({\n code: 'duplicate-resource',\n expected: `resource key '${key}' registered exactly once`,\n hint: `remove the duplicate resource declaration for '${key}' or use a different key`,\n detail: { resourceKey: key } satisfies DuplicateResourceDetail,\n }),\n );\n }\n\n private register(entry: ResourceEntry): Result<ResourceEntry, RenderGraphError> {\n if (this.resources.has(entry.key)) return this.duplicateResource(entry.key);\n this.resources.set(entry.key, entry);\n return ok(entry);\n }\n\n get(key: string): ResourceEntry | undefined {\n return this.resources.get(key);\n }\n\n getColorTargetMeta(key: string): ColorTargetResourceMeta | undefined {\n return this.resources.get(key)?.colorTarget;\n }\n\n has(key: string): boolean {\n return this.resources.has(key);\n }\n\n entries(): IterableIterator<ResourceEntry> {\n return this.resources.values();\n }\n}\n\n// Re-export detail types for use by graph.ts compile fail-fast.\nexport type { CapMissingDetail, DanglingReadDetail, DuplicateResourceDetail };\n","import type { Buffer, RhiCaps, Texture, TextureView } from '@forgeax/engine-rhi';\nimport { CompiledRenderGraphImpl } from './compiled-graph.js';\nimport { err, ok, RenderGraphError, type Result } from './errors.js';\nimport type { ResolvedColorTargetDescriptor } from './graph.js';\nimport {\n accessResourceId,\n bufferHandle,\n type CompiledPass,\n type CompiledResource,\n type CompiledView,\n handleData,\n type PassRecord,\n type ResourceRecord,\n type TextureViewRecord,\n textureHandle,\n textureViewHandle,\n} from './kernel-internal.js';\nimport { isTextureViewDimensionCompatible } from './resource-registry.js';\nimport type {\n CompiledRenderGraph,\n CompiledRenderGraphInfo,\n CompiledResourceDescriptor,\n ComputeGraphPass,\n CopyGraphPass,\n GraphAccess,\n GraphBuffer,\n GraphBufferAccess,\n GraphBufferDescriptor,\n GraphExtent,\n GraphPass,\n GraphTexture,\n GraphTextureAccess,\n GraphTextureDescriptor,\n GraphTextureView,\n GraphTextureViewDescriptor,\n ImportedBufferDescriptor,\n ImportedTextureDescriptor,\n ImportedTextureViewResolver,\n RasterGraphPass,\n RenderGraphCompileOptions,\n RenderGraphFrame,\n} from './types.js';\n\nconst BUFFER_USAGE = {\n copySrc: 0x0004,\n copyDst: 0x0008,\n index: 0x0010,\n vertex: 0x0020,\n uniform: 0x0040,\n storage: 0x0080,\n indirect: 0x0100,\n} as const;\n\nconst TEXTURE_USAGE = {\n copySrc: 0x01,\n copyDst: 0x02,\n textureBinding: 0x04,\n storageBinding: 0x08,\n renderAttachment: 0x10,\n} as const;\n\nlet nextGeneration = 1;\n\nfunction textureByteSize(\n format: GPUTextureFormat,\n extent: { readonly width: number; readonly height: number; readonly depthOrArrayLayers: number },\n mipLevelCount: number,\n): number | undefined {\n const bytesPerTexel =\n format === 'r8unorm' || format === 'r8snorm' || format === 'r8uint' || format === 'r8sint'\n ? 1\n : format === 'rg8unorm' ||\n format === 'rg8snorm' ||\n format === 'rg8uint' ||\n format === 'rg8sint'\n ? 2\n : format === 'rgba8unorm' ||\n format === 'rgba8unorm-srgb' ||\n format === 'rgba8snorm' ||\n format === 'rgba8uint' ||\n format === 'rgba8sint' ||\n format === 'r32float' ||\n format === 'r32uint' ||\n format === 'r32sint'\n ? 4\n : format === 'rg16float' ||\n format === 'rg16uint' ||\n format === 'rg16sint' ||\n format === 'rg16snorm' ||\n format === 'rg16unorm'\n ? 4\n : format === 'rgba16float' ||\n format === 'rgba16uint' ||\n format === 'rgba16sint' ||\n format === 'rgba16snorm' ||\n format === 'rgba16unorm' ||\n format === 'rg32float' ||\n format === 'rg32uint' ||\n format === 'rg32sint'\n ? 8\n : format === 'rgba32float' || format === 'rgba32uint' || format === 'rgba32sint'\n ? 16\n : undefined;\n if (bytesPerTexel === undefined) return undefined;\n let bytes = 0;\n let width = extent.width;\n let height = extent.height;\n let depth = extent.depthOrArrayLayers;\n for (let level = 0; level < mipLevelCount; level += 1) {\n bytes += width * height * depth * bytesPerTexel;\n width = Math.max(1, Math.floor(width / 2));\n height = Math.max(1, Math.floor(height / 2));\n depth = Math.max(1, Math.floor(depth / 2));\n }\n return bytes;\n}\n\ninterface NormalizedRange {\n readonly mipStart: number;\n readonly mipEnd: number;\n readonly layerStart: number;\n readonly layerEnd: number;\n readonly aspect: GPUTextureAspect;\n}\n\ninterface NormalizedAccess {\n readonly passIndex: number;\n readonly passName: string;\n readonly resourceId: number;\n readonly viewId?: number | undefined;\n readonly usage: GraphBufferAccess | GraphTextureAccess;\n readonly read: boolean;\n readonly write: boolean;\n readonly range?: NormalizedRange | undefined;\n}\n\nfunction bufferUsage(access: GraphBufferAccess): number {\n switch (access) {\n case 'uniform-read':\n return BUFFER_USAGE.uniform;\n case 'storage-read':\n case 'storage-write':\n case 'storage-read-write':\n return BUFFER_USAGE.storage;\n case 'indirect-read':\n return BUFFER_USAGE.indirect;\n case 'vertex-read':\n return BUFFER_USAGE.vertex;\n case 'index-read':\n return BUFFER_USAGE.index;\n case 'copy-src':\n return BUFFER_USAGE.copySrc;\n case 'copy-dst':\n return BUFFER_USAGE.copyDst;\n }\n}\n\nfunction textureUsage(access: GraphTextureAccess): number {\n switch (access) {\n case 'sampled-read':\n return TEXTURE_USAGE.textureBinding;\n case 'storage-read':\n case 'storage-write':\n case 'storage-read-write':\n return TEXTURE_USAGE.storageBinding;\n case 'sampled-storage-read-write':\n return TEXTURE_USAGE.storageBinding | TEXTURE_USAGE.textureBinding;\n case 'color-attachment':\n case 'depth-stencil-read':\n case 'depth-stencil-write':\n return TEXTURE_USAGE.renderAttachment;\n case 'copy-src':\n return TEXTURE_USAGE.copySrc;\n case 'copy-dst':\n return TEXTURE_USAGE.copyDst;\n }\n}\n\nfunction accessMode(access: GraphBufferAccess | GraphTextureAccess): {\n readonly read: boolean;\n readonly write: boolean;\n} {\n switch (access) {\n case 'storage-read-write':\n case 'sampled-storage-read-write':\n return { read: true, write: true };\n case 'storage-write':\n case 'color-attachment':\n case 'depth-stencil-write':\n case 'copy-dst':\n return { read: false, write: true };\n default:\n return { read: true, write: false };\n }\n}\n\nfunction rangesOverlap(\n left: NormalizedRange | undefined,\n right: NormalizedRange | undefined,\n): boolean {\n if (left === undefined || right === undefined) return true;\n const aspectOverlap =\n left.aspect === 'all' || right.aspect === 'all' || left.aspect === right.aspect;\n return (\n aspectOverlap &&\n left.mipStart < right.mipEnd &&\n right.mipStart < left.mipEnd &&\n left.layerStart < right.layerEnd &&\n right.layerStart < left.layerEnd\n );\n}\n\nfunction freezeInfo(info: CompiledRenderGraphInfo): CompiledRenderGraphInfo {\n const freezeDescriptor = (descriptor: CompiledResourceDescriptor) => {\n if (descriptor.kind !== 'texture') return Object.freeze({ ...descriptor });\n const size =\n typeof descriptor.size === 'string' ? descriptor.size : Object.freeze({ ...descriptor.size });\n return Object.freeze({ ...descriptor, size });\n };\n return Object.freeze({\n generation: info.generation,\n passes: Object.freeze(\n info.passes.map((pass) =>\n Object.freeze({\n ...pass,\n accesses: Object.freeze(pass.accesses.map((access) => Object.freeze({ ...access }))),\n dependencies: Object.freeze([...pass.dependencies]),\n }),\n ),\n ),\n resources: Object.freeze(\n info.resources.map((resource) =>\n Object.freeze({\n ...resource,\n descriptor: freezeDescriptor(resource.descriptor),\n }),\n ),\n ),\n });\n}\n\nexport class RenderGraphBuilder<FrameCtx extends RenderGraphFrame> {\n private readonly owner = Object.freeze({});\n private readonly labels = new Set<string>();\n private readonly resources = new Map<number, ResourceRecord<FrameCtx>>();\n private readonly views = new Map<number, TextureViewRecord<FrameCtx>>();\n private readonly passes: PassRecord<FrameCtx>[] = [];\n private readonly passNames = new Set<string>();\n private nextId = 1;\n private sealed = false;\n\n createTexture(\n label: string,\n descriptor: GraphTextureDescriptor,\n ): Result<GraphTexture, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, { id, label, kind: 'texture', origin: 'created', descriptor });\n return ok(textureHandle(this.owner, id));\n }\n\n importTexture(\n label: string,\n descriptor: ImportedTextureDescriptor,\n resolve: (frame: FrameCtx) => Texture,\n ): Result<GraphTexture, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, {\n id,\n label,\n kind: 'texture',\n origin: 'imported',\n descriptor,\n resolve,\n });\n return ok(textureHandle(this.owner, id));\n }\n\n createBuffer(\n label: string,\n descriptor: GraphBufferDescriptor,\n ): Result<GraphBuffer, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, { id, label, kind: 'buffer', origin: 'created', descriptor });\n return ok(bufferHandle(this.owner, id));\n }\n\n importBuffer(\n label: string,\n descriptor: ImportedBufferDescriptor,\n resolve: (frame: FrameCtx) => Buffer,\n ): Result<GraphBuffer, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, {\n id,\n label,\n kind: 'buffer',\n origin: 'imported',\n descriptor,\n resolve,\n });\n return ok(bufferHandle(this.owner, id));\n }\n\n view(\n texture: GraphTexture,\n descriptor: GraphTextureViewDescriptor = {},\n ): Result<GraphTextureView, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const data = handleData(texture);\n if (data?.kind !== 'texture' || data.owner !== this.owner) {\n return err(this.foreignHandleError());\n }\n const textureRecord = this.resources.get(data.id);\n if (textureRecord?.kind !== 'texture') return err(this.foreignHandleError());\n const label = descriptor.label ?? `${textureRecord.label}.view.${this.nextId}`;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.views.set(id, { id, label, textureId: data.id, descriptor });\n return ok(textureViewHandle(this.owner, id, data.id));\n }\n\n importView(\n texture: GraphTexture,\n descriptor: GraphTextureViewDescriptor,\n resolve: ImportedTextureViewResolver<FrameCtx>,\n ): Result<GraphTextureView, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const data = handleData(texture);\n if (data?.kind !== 'texture' || data.owner !== this.owner) {\n return err(this.foreignHandleError());\n }\n const textureRecord = this.resources.get(data.id);\n if (textureRecord?.kind !== 'texture' || textureRecord.origin !== 'imported') {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: 'an imported view belongs to an imported texture',\n hint: 'use view() for graph-created textures and importView() for host-owned views',\n detail: {\n resourceLabel: textureRecord?.label ?? 'foreign',\n field: 'origin',\n expected: 'imported',\n actual: textureRecord?.origin ?? 'foreign',\n },\n }),\n );\n }\n const label = descriptor.label ?? `${textureRecord.label}.view.${this.nextId}`;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.views.set(id, { id, label, textureId: data.id, descriptor, resolve });\n return ok(textureViewHandle(this.owner, id, data.id));\n }\n\n addRasterPass(\n name: string,\n descriptor: RasterGraphPass<FrameCtx>,\n ): Result<void, RenderGraphError> {\n return this.addPass(name, { kind: 'raster', descriptor });\n }\n\n addComputePass(\n name: string,\n descriptor: ComputeGraphPass<FrameCtx>,\n ): Result<void, RenderGraphError> {\n return this.addPass(name, { kind: 'compute', descriptor });\n }\n\n addCopyPass(name: string, descriptor: CopyGraphPass<FrameCtx>): Result<void, RenderGraphError> {\n return this.addPass(name, { kind: 'copy', descriptor });\n }\n\n compile(\n options: RenderGraphCompileOptions,\n ): Result<CompiledRenderGraph<FrameCtx>, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n this.sealed = true;\n\n const descriptors = this.validateDescriptors(options.surfaceSize);\n if (!descriptors.ok) return descriptors;\n const analyzed = this.analyze(options.device.caps);\n if (!analyzed.ok) return analyzed;\n\n const allocated = this.allocate(\n options,\n analyzed.value.usageByResource,\n analyzed.value.firstUseByResource,\n analyzed.value.lastUseByResource,\n );\n if (!allocated.ok) return allocated;\n\n const generation = nextGeneration;\n const physicalAllocationKeys = new WeakMap<object, string>();\n let nextPhysicalAllocationKey = 1;\n const physicalKey = (resource: CompiledResource<FrameCtx>): string | undefined => {\n const handle = resource.texture ?? resource.buffer;\n if (handle === undefined) return undefined;\n const existing = physicalAllocationKeys.get(handle);\n if (existing !== undefined) return existing;\n const key = `allocation-${nextPhysicalAllocationKey++}`;\n physicalAllocationKeys.set(handle, key);\n return key;\n };\n const info = freezeInfo({\n generation,\n passes: analyzed.value.passes.map((pass, executionIndex) => ({\n name: pass.name,\n kind: pass.pass.kind,\n executionIndex,\n accesses: pass.pass.descriptor.accesses.map((access) => {\n const id = accessResourceId(access);\n return {\n resource: this.resources.get(id ?? -1)?.label ?? 'foreign',\n usage: access.usage,\n };\n }),\n dependencies: pass.dependencies.map(\n (dependency) => analyzed.value.passes[dependency]?.name ?? 'unknown',\n ),\n })),\n resources: [...allocated.value.resources.values()].map((resource) => {\n const texture =\n resource.record.kind === 'texture'\n ? (resource.record.descriptor as GraphTextureDescriptor)\n : undefined;\n const buffer =\n resource.record.kind === 'buffer'\n ? (resource.record.descriptor as GraphBufferDescriptor)\n : undefined;\n const allocationKey = physicalKey(resource);\n const extent =\n texture === undefined ? undefined : this.resolveExtent(texture.size, options.surfaceSize);\n return {\n label: resource.record.label,\n kind: resource.record.kind,\n origin: resource.record.origin,\n descriptor:\n texture === undefined\n ? {\n kind: 'buffer' as const,\n size: buffer?.size ?? 0,\n }\n : {\n kind: 'texture' as const,\n format: texture.format,\n ...(texture.domain === undefined ? {} : { domain: texture.domain }),\n size: texture.size,\n width: extent?.width ?? 1,\n height: extent?.height ?? 1,\n depthOrArrayLayers: extent?.depthOrArrayLayers ?? 1,\n mipLevelCount: texture.mipLevelCount ?? 1,\n sampleCount: texture.sampleCount ?? 1,\n },\n firstUse: resource.firstUse,\n lastUse: resource.lastUse,\n derivedUsage: resource.usage,\n ...(allocationKey === undefined ? {} : { physicalAllocationKey: allocationKey }),\n ...(texture === undefined ? {} : { format: texture.format }),\n ...(texture === undefined\n ? buffer === undefined\n ? {}\n : { byteSize: buffer.size }\n : {\n byteSize: textureByteSize(\n texture.format,\n this.resolveExtent(texture.size, options.surfaceSize),\n texture.mipLevelCount ?? 1,\n ),\n }),\n ...(texture === undefined\n ? {}\n : {\n dimension: texture.dimension ?? '2d',\n extent,\n }),\n };\n }),\n });\n\n const colorTargetDescriptors = new Map<string, ResolvedColorTargetDescriptor>();\n for (const resource of allocated.value.resources.values()) {\n if (resource.record.kind !== 'texture' || resource.texture === undefined) continue;\n const extent = this.resolveExtent(resource.record.descriptor.size, options.surfaceSize);\n colorTargetDescriptors.set(resource.record.label, {\n texture: resource.texture,\n format: resource.record.descriptor.format,\n size: { width: extent.width, height: extent.height },\n usage: resource.usage,\n sample: resource.record.descriptor.sampleCount ?? 1,\n });\n }\n\n return ok(\n new CompiledRenderGraphImpl(\n nextGeneration++,\n this.owner,\n options.device,\n allocated.value.resources,\n allocated.value.views,\n Object.freeze(analyzed.value.passes),\n info,\n colorTargetDescriptors,\n ),\n );\n }\n\n private addPass(name: string, pass: GraphPass<FrameCtx>): Result<void, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n if (this.passNames.has(name)) {\n return err(\n new RenderGraphError({\n code: 'duplicate-pass-name',\n expected: `pass name '${name}' is unique within one builder`,\n hint: `rename the second '${name}' pass; names are diagnostics, not identity`,\n detail: { passName: name },\n }),\n );\n }\n for (const access of pass.descriptor.accesses) {\n const valid = this.validateAccessHandle(name, access);\n if (!valid.ok) return valid;\n }\n this.passNames.add(name);\n this.passes.push({ id: this.passes.length, name, pass });\n return ok(undefined);\n }\n\n private validateAccessHandle(\n passName: string,\n access: GraphAccess,\n ): Result<void, RenderGraphError> {\n const data = handleData(access.resource);\n if (data === undefined || data.owner !== this.owner) {\n return err(this.foreignHandleError(passName));\n }\n if (data.kind === 'texture-view') {\n if (!this.views.has(data.id)) return err(this.foreignHandleError(passName));\n return ok(undefined);\n }\n if (data.kind !== 'buffer' || !this.resources.has(data.id)) {\n return err(this.foreignHandleError(passName));\n }\n return ok(undefined);\n }\n\n private analyze(caps: RhiCaps): Result<\n {\n readonly passes: readonly CompiledPass<FrameCtx>[];\n readonly usageByResource: ReadonlyMap<number, number>;\n readonly firstUseByResource: ReadonlyMap<number, number>;\n readonly lastUseByResource: ReadonlyMap<number, number>;\n },\n RenderGraphError\n > {\n const normalizedByPass: NormalizedAccess[][] = [];\n const usageByResource = new Map<number, number>();\n const firstUseByResource = new Map<number, number>();\n const lastUseByResource = new Map<number, number>();\n const compiledPasses: CompiledPass<FrameCtx>[] = [];\n const history: NormalizedAccess[] = [];\n\n for (const resource of this.resources.values()) {\n if (resource.kind !== 'texture' || resource.origin !== 'created') continue;\n const usage = resource.descriptor.usage ?? 0;\n if (usage !== 0) usageByResource.set(resource.id, usage);\n }\n\n for (let passIndex = 0; passIndex < this.passes.length; passIndex++) {\n const pass = this.passes[passIndex];\n if (pass === undefined) continue;\n const capability = this.validateCapabilities(pass, caps);\n if (!capability.ok) return capability;\n const normalized: NormalizedAccess[] = [];\n for (const access of pass.pass.descriptor.accesses) {\n const item = this.normalizeAccess(passIndex, pass, access);\n if (!item.ok) return item;\n normalized.push(item.value);\n const usage =\n this.resources.get(item.value.resourceId)?.kind === 'buffer'\n ? bufferUsage(access.usage as GraphBufferAccess)\n : textureUsage(access.usage as GraphTextureAccess);\n usageByResource.set(\n item.value.resourceId,\n (usageByResource.get(item.value.resourceId) ?? 0) | usage,\n );\n if (!firstUseByResource.has(item.value.resourceId)) {\n firstUseByResource.set(item.value.resourceId, passIndex);\n }\n lastUseByResource.set(item.value.resourceId, passIndex);\n }\n const conflict = this.validatePassAccesses(pass, normalized);\n if (!conflict.ok) return conflict;\n const attachments = this.validateAttachments(pass);\n if (!attachments.ok) return attachments;\n\n const dependencies = new Set<number>();\n for (const current of normalized) {\n if (current.read) {\n const priorWrite = this.findPriorWrite(history, current);\n if (priorWrite !== undefined) {\n dependencies.add(priorWrite.passIndex);\n } else if (this.resources.get(current.resourceId)?.origin === 'created') {\n const label = this.resources.get(current.resourceId)?.label;\n return err(\n new RenderGraphError({\n code: 'uninitialized-read',\n expected: `graph-created resource '${label}' is written before pass '${pass.name}' reads it`,\n hint: 'add a clear/write/copy-dst pass before the first read, or import initialized data',\n detail: { passName: pass.name, resourceLabel: label, usage: current.usage },\n }),\n );\n }\n }\n if (current.write) {\n for (const dependency of this.findWriteDependencies(history, current)) {\n dependencies.add(dependency);\n }\n }\n }\n normalizedByPass.push(normalized);\n history.push(...normalized);\n compiledPasses.push({\n ...pass,\n dependencies: Object.freeze([...dependencies].sort((left, right) => left - right)),\n resourceIds: new Set(normalized.map((access) => access.resourceId)),\n viewIds: new Set(\n normalized.flatMap((access) => (access.viewId === undefined ? [] : [access.viewId])),\n ),\n });\n }\n\n for (const [resourceId, usage] of usageByResource) {\n const resource = this.resources.get(resourceId);\n if (resource?.origin !== 'imported') continue;\n if ((resource.descriptor.usage & usage) !== usage) {\n return err(\n new RenderGraphError({\n code: 'import-usage-mismatch',\n expected: `imported resource '${resource.label}' physical usage contains derived graph usage ${usage}`,\n hint: 'recreate the imported resource with every usage declared by graph accesses',\n detail: {\n resourceLabel: resource.label,\n field: 'usage',\n expected: String(usage),\n actual: resource.descriptor.usage,\n },\n }),\n );\n }\n }\n\n return ok({\n passes: compiledPasses,\n usageByResource,\n firstUseByResource,\n lastUseByResource,\n });\n }\n\n private normalizeAccess(\n passIndex: number,\n pass: PassRecord<FrameCtx>,\n access: GraphAccess,\n ): Result<NormalizedAccess, RenderGraphError> {\n const passName = pass.name;\n const data = handleData(access.resource);\n if (data === undefined || data.owner !== this.owner) {\n return err(this.foreignHandleError(passName));\n }\n const mode = this.accessModeForPass(pass, access);\n if (data.kind === 'buffer') {\n return ok({ passIndex, passName, resourceId: data.id, usage: access.usage, ...mode });\n }\n if (data.kind !== 'texture-view') return err(this.foreignHandleError(passName));\n const view = this.views.get(data.id);\n const texture = this.resources.get(data.textureId);\n if (view === undefined || texture?.kind !== 'texture') {\n return err(this.foreignHandleError(passName));\n }\n const mipLevels = texture.descriptor.mipLevelCount ?? 1;\n const layers =\n typeof texture.descriptor.size === 'object'\n ? (texture.descriptor.size.depthOrArrayLayers ?? 1)\n : 1;\n const mipStart = view.descriptor.baseMipLevel ?? 0;\n const layerStart = view.descriptor.baseArrayLayer ?? 0;\n return ok({\n passIndex,\n passName,\n resourceId: data.textureId,\n viewId: data.id,\n usage: access.usage,\n ...mode,\n range: {\n mipStart,\n mipEnd: mipStart + (view.descriptor.mipLevelCount ?? mipLevels - mipStart),\n layerStart,\n layerEnd: layerStart + (view.descriptor.arrayLayerCount ?? layers - layerStart),\n aspect: view.descriptor.aspect ?? 'all',\n },\n });\n }\n\n private accessModeForPass(\n pass: PassRecord<FrameCtx>,\n access: GraphAccess,\n ): { readonly read: boolean; readonly write: boolean } {\n const base = accessMode(access.usage);\n if (pass.pass.kind !== 'raster' || handleData(access.resource)?.kind !== 'texture-view') {\n return base;\n }\n if (access.usage === 'color-attachment') {\n const attachment = pass.pass.descriptor.colorAttachments.find(\n (candidate) => candidate.view === access.resource,\n );\n return attachment?.loadOp === 'load' ? { read: true, write: true } : base;\n }\n if (access.usage === 'depth-stencil-write') {\n const attachment = pass.pass.descriptor.depthStencilAttachment;\n if (\n attachment?.view === access.resource &&\n (attachment.depthLoadOp === 'load' || attachment.stencilLoadOp === 'load')\n ) {\n return { read: true, write: true };\n }\n }\n return base;\n }\n\n private validateCapabilities(\n pass: PassRecord<FrameCtx>,\n caps: RhiCaps,\n ): Result<void, RenderGraphError> {\n if (pass.pass.kind === 'compute' && !caps.compute) {\n return this.capabilityError(pass.name, 'compute');\n }\n for (const access of pass.pass.descriptor.accesses) {\n if (\n (access.usage === 'storage-read' ||\n access.usage === 'storage-write' ||\n access.usage === 'storage-read-write') &&\n handleData(access.resource)?.kind === 'buffer' &&\n !caps.storageBuffer\n ) {\n return this.capabilityError(pass.name, 'storage-buffer', access);\n }\n if (\n (access.usage === 'storage-read' ||\n access.usage === 'storage-write' ||\n access.usage === 'storage-read-write') &&\n handleData(access.resource)?.kind === 'texture-view' &&\n !caps.storageTexture\n ) {\n return this.capabilityError(pass.name, 'storage-texture', access);\n }\n if (access.usage === 'indirect-read' && !caps.indirectDrawing) {\n return this.capabilityError(pass.name, 'indirect', access);\n }\n }\n return ok(undefined);\n }\n\n private capabilityError(\n passName: string,\n capability: 'compute' | 'storage-buffer' | 'storage-texture' | 'indirect',\n access?: GraphAccess,\n ): Result<never, RenderGraphError> {\n const resourceId = access === undefined ? undefined : accessResourceId(access);\n return err(\n new RenderGraphError({\n code: 'capability-missing',\n expected: `pass '${passName}' is built only when capability '${capability}' is available`,\n hint: 'select the fallback algorithm before adding this pass to the builder',\n detail: {\n passName,\n capability,\n ...(resourceId === undefined\n ? {}\n : { resourceLabel: this.resources.get(resourceId)?.label, usage: access?.usage }),\n },\n }),\n );\n }\n\n private validatePassAccesses(\n pass: PassRecord<FrameCtx>,\n accesses: readonly NormalizedAccess[],\n ): Result<void, RenderGraphError> {\n for (let leftIndex = 0; leftIndex < accesses.length; leftIndex++) {\n const left = accesses[leftIndex];\n if (left === undefined) continue;\n for (let rightIndex = leftIndex + 1; rightIndex < accesses.length; rightIndex++) {\n const right = accesses[rightIndex];\n if (\n right === undefined ||\n left.resourceId !== right.resourceId ||\n !rangesOverlap(left.range, right.range)\n ) {\n continue;\n }\n if (!left.write && !right.write) continue;\n if (\n left.usage === right.usage &&\n (left.usage === 'storage-read-write' || left.usage === 'sampled-storage-read-write')\n )\n continue;\n const label = this.resources.get(left.resourceId)?.label;\n return err(\n new RenderGraphError({\n code: 'access-conflict',\n expected: `pass '${pass.name}' uses resource '${label}' in one compatible WebGPU usage scope`,\n hint: 'split conflicting read/write roles into ordered passes or use storage-read-write once',\n detail: {\n passName: pass.name,\n resourceLabel: label,\n accesses: [left.usage, right.usage],\n },\n }),\n );\n }\n }\n if (pass.pass.kind === 'copy') {\n const invalid = accesses.find(\n (access) => access.usage !== 'copy-src' && access.usage !== 'copy-dst',\n );\n if (invalid !== undefined) {\n return err(\n new RenderGraphError({\n code: 'access-conflict',\n expected: `copy pass '${pass.name}' declares only copy-src/copy-dst accesses`,\n hint: 'move shader or attachment work into raster/compute passes',\n detail: { passName: pass.name, usage: invalid.usage },\n }),\n );\n }\n }\n return ok(undefined);\n }\n\n private validateAttachments(pass: PassRecord<FrameCtx>): Result<void, RenderGraphError> {\n if (pass.pass.kind !== 'raster') return ok(undefined);\n const accesses = pass.pass.descriptor.accesses;\n const has = (view: GraphTextureView, usage: GraphTextureAccess): boolean =>\n accesses.some((access) => access.resource === view && access.usage === usage);\n for (const attachment of pass.pass.descriptor.colorAttachments) {\n if (!has(attachment.view, 'color-attachment')) {\n return this.missingAttachmentAccess(pass.name, attachment.view, 'color-attachment');\n }\n if (\n attachment.resolveTarget !== undefined &&\n !has(attachment.resolveTarget, 'color-attachment')\n ) {\n return this.missingAttachmentAccess(\n pass.name,\n attachment.resolveTarget,\n 'color-attachment',\n );\n }\n }\n const depth = pass.pass.descriptor.depthStencilAttachment;\n if (depth !== undefined) {\n const usage = depth.depthReadOnly === true ? 'depth-stencil-read' : 'depth-stencil-write';\n if (!has(depth.view, usage))\n return this.missingAttachmentAccess(pass.name, depth.view, usage);\n }\n return ok(undefined);\n }\n\n private missingAttachmentAccess(\n passName: string,\n view: GraphTextureView,\n usage: GraphTextureAccess,\n ): Result<never, RenderGraphError> {\n const data = handleData(view);\n const label = data?.kind === 'texture-view' ? this.views.get(data.id)?.label : undefined;\n return err(\n new RenderGraphError({\n code: 'resource-not-declared-by-pass',\n expected: `raster pass '${passName}' attachment '${label}' declares '${usage}' access`,\n hint: 'add the attachment view and matching usage to accesses',\n detail: { passName, resourceLabel: label, usage },\n }),\n );\n }\n\n private findPriorWrite(\n history: readonly NormalizedAccess[],\n current: NormalizedAccess,\n ): NormalizedAccess | undefined {\n for (let index = history.length - 1; index >= 0; index--) {\n const prior = history[index];\n if (\n prior !== undefined &&\n prior.resourceId === current.resourceId &&\n prior.write &&\n rangesOverlap(prior.range, current.range)\n ) {\n return prior;\n }\n }\n return undefined;\n }\n\n private findWriteDependencies(\n history: readonly NormalizedAccess[],\n current: NormalizedAccess,\n ): readonly number[] {\n const dependencies = new Set<number>();\n for (let index = history.length - 1; index >= 0; index--) {\n const prior = history[index];\n if (\n prior === undefined ||\n prior.resourceId !== current.resourceId ||\n !rangesOverlap(prior.range, current.range)\n ) {\n continue;\n }\n if (prior.read) dependencies.add(prior.passIndex);\n if (prior.write) {\n dependencies.add(prior.passIndex);\n break;\n }\n }\n return [...dependencies];\n }\n\n private validateDescriptors(\n surfaceSize: RenderGraphCompileOptions['surfaceSize'],\n ): Result<void, RenderGraphError> {\n if (surfaceSize.width <= 0 || surfaceSize.height <= 0) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: 'surfaceSize width and height are positive integers',\n hint: 'compile after the render surface has a non-zero physical extent',\n detail: {\n resourceLabel: 'surface',\n field: 'surfaceSize',\n expected: 'width > 0 and height > 0',\n actual: `${surfaceSize.width}x${surfaceSize.height}`,\n },\n }),\n );\n }\n for (const resource of this.resources.values()) {\n if (resource.kind === 'buffer' && resource.descriptor.size <= 0) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: `buffer '${resource.label}' size is greater than zero`,\n hint: 'derive a positive byte size before creating/importing the buffer',\n detail: {\n resourceLabel: resource.label,\n field: 'size',\n expected: 'size > 0',\n actual: resource.descriptor.size,\n },\n }),\n );\n }\n if (resource.kind === 'texture') {\n const extent = this.resolveExtent(resource.descriptor.size, surfaceSize);\n if (extent.width <= 0 || extent.height <= 0 || extent.depthOrArrayLayers <= 0) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: `texture '${resource.label}' extent is positive`,\n hint: 'repair the authored extent or compile surface size',\n detail: {\n resourceLabel: resource.label,\n field: 'size',\n expected: 'all extent axes > 0',\n actual: `${extent.width}x${extent.height}x${extent.depthOrArrayLayers}`,\n },\n }),\n );\n }\n }\n }\n for (const view of this.views.values()) {\n const texture = this.resources.get(view.textureId);\n if (texture?.kind !== 'texture') continue;\n const allocationDimension = texture.descriptor.dimension ?? '2d';\n const viewDimension = view.descriptor.dimension;\n if (!isTextureViewDimensionCompatible(allocationDimension, viewDimension)) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: `texture '${texture.label}' view dimension matches allocation dimension`,\n hint: 'use a 3d view only for a 3d allocation and preserve array views on 2d allocations',\n detail: {\n resourceLabel: texture.label,\n field: 'dimension',\n expected: allocationDimension,\n actual: viewDimension ?? '2d',\n },\n }),\n );\n }\n }\n return ok(undefined);\n }\n\n private allocate(\n options: RenderGraphCompileOptions,\n usageByResource: ReadonlyMap<number, number>,\n firstUseByResource: ReadonlyMap<number, number>,\n lastUseByResource: ReadonlyMap<number, number>,\n ): Result<\n {\n readonly resources: ReadonlyMap<number, CompiledResource<FrameCtx>>;\n readonly views: ReadonlyMap<number, CompiledView<FrameCtx>>;\n },\n RenderGraphError\n > {\n const compiledResources = new Map<number, CompiledResource<FrameCtx>>();\n const compiledViews = new Map<number, CompiledView<FrameCtx>>();\n const createdTextures: Texture[] = [];\n const createdBuffers: Buffer[] = [];\n const discard = (): void => {\n for (const texture of createdTextures) options.device.destroyTexture(texture);\n for (const buffer of createdBuffers) options.device.destroyBuffer(buffer);\n };\n\n for (const resource of this.resources.values()) {\n const usage = usageByResource.get(resource.id) ?? 0;\n let texture: Texture | undefined;\n let buffer: Buffer | undefined;\n if (resource.origin === 'created' && usage !== 0) {\n if (resource.kind === 'texture') {\n const extent = this.resolveExtent(resource.descriptor.size, options.surfaceSize);\n const created = options.device.createTexture({\n label: resource.label,\n size: extent,\n mipLevelCount: resource.descriptor.mipLevelCount ?? 1,\n sampleCount: resource.descriptor.sampleCount ?? 1,\n dimension: resource.descriptor.dimension ?? '2d',\n format: resource.descriptor.format,\n usage,\n viewFormats: [...(resource.descriptor.viewFormats ?? [])],\n });\n if (!created.ok) {\n discard();\n return err(\n new RenderGraphError({\n code: 'resource-allocation-failed',\n expected: `RHI creates graph texture '${resource.label}'`,\n hint: 'inspect detail.rhiCode and repair the descriptor/capability route',\n detail: { resourceKey: resource.label, rhiCode: created.error.code },\n }),\n );\n }\n texture = created.value;\n createdTextures.push(texture);\n } else {\n const created = options.device.createBuffer({\n label: resource.label,\n size: resource.descriptor.size,\n usage,\n mappedAtCreation: resource.descriptor.mappedAtCreation ?? false,\n });\n if (!created.ok) {\n discard();\n return err(\n new RenderGraphError({\n code: 'resource-allocation-failed',\n expected: `RHI creates graph buffer '${resource.label}'`,\n hint: 'inspect detail.rhiCode and repair the descriptor/capability route',\n detail: { resourceKey: resource.label, rhiCode: created.error.code },\n }),\n );\n }\n buffer = created.value;\n createdBuffers.push(buffer);\n }\n }\n compiledResources.set(resource.id, {\n record: resource,\n usage,\n firstUse: firstUseByResource.get(resource.id) ?? null,\n lastUse: lastUseByResource.get(resource.id) ?? null,\n ...(texture === undefined ? {} : { texture }),\n ...(buffer === undefined ? {} : { buffer }),\n });\n }\n\n for (const view of this.views.values()) {\n const resource = compiledResources.get(view.textureId);\n let physicalView: TextureView | undefined;\n if (resource?.record.origin === 'created' && resource.texture !== undefined) {\n const created = options.device.createTextureView(resource.texture, view.descriptor);\n if (!created.ok) {\n discard();\n return err(\n new RenderGraphError({\n code: 'resource-allocation-failed',\n expected: `RHI creates graph texture view '${view.label}'`,\n hint: 'inspect detail.rhiCode and repair the view descriptor',\n detail: { resourceKey: view.label, rhiCode: created.error.code },\n }),\n );\n }\n physicalView = created.value;\n }\n compiledViews.set(view.id, {\n record: view,\n ...(physicalView === undefined ? {} : { view: physicalView }),\n });\n }\n return ok({ resources: compiledResources, views: compiledViews });\n }\n\n private resolveExtent(\n extent: GraphExtent,\n surface: RenderGraphCompileOptions['surfaceSize'],\n ): { readonly width: number; readonly height: number; readonly depthOrArrayLayers: number } {\n if (extent === 'surface') return { ...surface, depthOrArrayLayers: 1 };\n if (extent === 'half-surface') {\n return {\n width: Math.ceil(surface.width / 2),\n height: Math.ceil(surface.height / 2),\n depthOrArrayLayers: 1,\n };\n }\n return {\n width: extent.width,\n height: extent.height,\n depthOrArrayLayers: extent.depthOrArrayLayers ?? 1,\n };\n }\n\n private ensureWritable(): Result<void, RenderGraphError> {\n return this.sealed\n ? err(\n new RenderGraphError({\n code: 'builder-sealed',\n expected: 'a RenderGraphBuilder accepts declarations only before compile()',\n hint: 'create a new builder for a changed topology',\n detail: {},\n }),\n )\n : ok(undefined);\n }\n\n private reserveLabel(label: string): Result<void, RenderGraphError> {\n if (this.labels.has(label)) {\n return err(\n new RenderGraphError({\n code: 'duplicate-resource-label',\n expected: `resource label '${label}' is unique within one builder`,\n hint: `rename the second '${label}' declaration`,\n detail: { resourceLabel: label },\n }),\n );\n }\n this.labels.add(label);\n return ok(undefined);\n }\n\n private foreignHandleError(passName?: string): RenderGraphError {\n return new RenderGraphError({\n code: 'foreign-resource-handle',\n expected: 'every graph resource handle belongs to this builder',\n hint: 'create/import/view the resource on the same builder that declares the pass',\n detail: { ...(passName === undefined ? {} : { passName }) },\n });\n }\n}\n","import type { Texture, TextureFormat } from '@forgeax/engine-rhi';\nimport { err, ok, RenderGraphError, type Result } from './errors.js';\n\nexport { RenderGraphError } from './errors.js';\n\nconst COPY_SRC = 0x01;\n\nexport interface ObservationSize {\n readonly width: number;\n readonly height: number;\n}\n\n/** Generic producer-owned metadata for one current-frame texture. */\nexport interface CurrentFrameObservationDescriptor {\n readonly texture: Texture;\n readonly format: TextureFormat;\n readonly size: ObservationSize;\n readonly usage: number;\n readonly frameId: number;\n}\n\nexport interface CurrentFrameObservationLifetime {\n readonly frameId: number;\n readonly state: 'active' | 'retired';\n}\n\n/** The only resource information a downstream copy consumer receives. */\nexport interface CurrentFrameObservationSource {\n readonly texture: Texture;\n readonly descriptor: CurrentFrameObservationDescriptor;\n readonly lifetime: CurrentFrameObservationLifetime;\n}\n\nexport interface CurrentFrameObservationLease {\n readonly descriptor: CurrentFrameObservationDescriptor;\n readonly lifetime: CurrentFrameObservationLifetime;\n readonly state: 'active' | 'retired';\n beginReadback(): Result<CurrentFrameObservationSource, RenderGraphError>;\n retire(): void;\n}\n\nfunction observationError(\n code:\n | 'observation-absent'\n | 'observation-invalid-format'\n | 'observation-invalid-size'\n | 'observation-missing-copy-src'\n | 'observation-stale',\n expected: string,\n hint: string,\n): Result<never, RenderGraphError> {\n return err(new RenderGraphError({ code, expected, hint }));\n}\n\n/**\n * Validate and lease a producer's current-frame texture without naming any\n * semantic, pipeline, backend policy, or graph resource key.\n */\nexport function createCurrentFrameObservationLease(\n descriptor: CurrentFrameObservationDescriptor,\n currentFrameId: number,\n): Result<CurrentFrameObservationLease, RenderGraphError> {\n if (descriptor.texture === undefined || descriptor.texture === null) {\n return observationError(\n 'observation-absent',\n 'a producer-owned texture handle',\n 'provide the current frame color texture before requesting an observation',\n );\n }\n if (descriptor.format !== 'rgba16float') {\n return observationError(\n 'observation-invalid-format',\n \"current-frame observation format 'rgba16float'\",\n 'use the producer target format without reinterpretation',\n );\n }\n if (\n !Number.isInteger(descriptor.size.width) ||\n !Number.isInteger(descriptor.size.height) ||\n descriptor.size.width <= 0 ||\n descriptor.size.height <= 0\n ) {\n return observationError(\n 'observation-invalid-size',\n 'positive integer observation width and height',\n 'capture a non-empty current-frame target',\n );\n }\n if ((descriptor.usage & COPY_SRC) === 0) {\n return observationError(\n 'observation-missing-copy-src',\n 'current-frame texture usage includes COPY_SRC',\n 'add COPY_SRC to the producer target before requesting readback',\n );\n }\n if (descriptor.frameId !== currentFrameId) {\n return observationError(\n 'observation-stale',\n `observation frame ${currentFrameId}`,\n `discard frame ${descriptor.frameId} and request the current producer target`,\n );\n }\n\n let state: 'active' | 'retired' = 'active';\n const lifetime: CurrentFrameObservationLifetime = {\n frameId: descriptor.frameId,\n get state() {\n return state;\n },\n };\n const lease: CurrentFrameObservationLease = {\n descriptor,\n lifetime,\n get state() {\n return state;\n },\n beginReadback() {\n if (state === 'retired') {\n return err(\n new RenderGraphError({\n code: 'observation-retired',\n expected: 'active current-frame observation lease',\n hint: 'submit the eager copy before the producer retires this frame',\n }),\n );\n }\n return ok({ texture: descriptor.texture, descriptor, lifetime });\n },\n retire() {\n state = 'retired';\n },\n };\n return ok(lease);\n}\n","// @forgeax/engine-render-graph/src/pass-registry.ts — pass declaration\n// registry (plan-strategy 3.1).\n//\n// Shape (D-5):\n// - name -> reads/writes declaration + optional execute closure\n// - supports listPasses enumeration\n\nimport { RenderGraphError } from './errors.js';\nimport type { PassDescriptor } from './graph.js';\n\nexport interface PassEntry<Ctx = unknown> {\n readonly name: string;\n readonly descriptor: PassDescriptor<Ctx>;\n}\n\nexport class PassRegistry<Ctx = unknown> {\n private readonly passes: PassEntry<Ctx>[] = [];\n\n add(name: string, descriptor: PassDescriptor<Ctx>, before?: string): PassEntry<Ctx> {\n if (this.passes.some((pass) => pass.name === name)) {\n throw new RenderGraphError({\n code: 'duplicate-pass-name',\n expected: `pass name '${name}' is unique within one graph`,\n hint: `rename the second '${name}' pass; labels are diagnostics, not identity`,\n detail: { passName: name },\n });\n }\n const entry: PassEntry<Ctx> = { name, descriptor };\n const beforeIndex =\n before === undefined ? -1 : this.passes.findIndex((pass) => pass.name === before);\n if (beforeIndex < 0) this.passes.push(entry);\n else this.passes.splice(beforeIndex, 0, entry);\n return entry;\n }\n\n list(): readonly PassEntry<Ctx>[] {\n return this.passes;\n }\n\n count(): number {\n return this.passes.length;\n }\n}\n","import { err, ok, RenderGraphError, type Result } from '../errors.js';\n\nexport const COLOR_VALUE_DOMAINS = ['linear-hdr', 'linear-ldr', 'display-encoded'] as const;\n\nexport type ColorValueDomain = (typeof COLOR_VALUE_DOMAINS)[number];\n\nexport type ColorDomainConversion =\n | { readonly kind: 'encode-srgb' }\n | { readonly kind: 'decode-srgb' }\n | { readonly kind: 'tone-map' };\n\nexport interface ColorResourceDescriptor {\n readonly domain: ColorValueDomain;\n readonly format: string;\n}\n\nexport interface ColorDomainConnection {\n readonly source: string;\n readonly destination: string;\n readonly conversion?: ColorDomainConversion | undefined;\n}\n\nexport type ColorDomainValidation =\n | { readonly ok: true }\n | { readonly ok: false; readonly error: RenderGraphError };\n\nexport function isColorValueDomain(value: unknown): value is ColorValueDomain {\n return typeof value === 'string' && COLOR_VALUE_DOMAINS.includes(value as ColorValueDomain);\n}\n\nfunction invalidDomain(value: unknown): RenderGraphError {\n return new RenderGraphError({\n code: 'invalid-color-domain',\n expected: `domain is one of ${COLOR_VALUE_DOMAINS.join(', ')}`,\n hint: 'set an explicit color domain; do not infer it from the attachment format',\n detail: { value: String(value) },\n });\n}\n\nfunction missingDomain(resourceKey?: string): RenderGraphError {\n return new RenderGraphError({\n code: 'missing-color-domain',\n expected: 'every connected color resource has an explicit domain',\n hint: `add domain to the color resource descriptor${resourceKey === undefined ? '' : ` '${resourceKey}'`}`,\n detail: { resourceKey: resourceKey ?? '<descriptor>' },\n });\n}\n\nexport function serializeColorValueDomain(domain: ColorValueDomain): string {\n if (!isColorValueDomain(domain)) throw invalidDomain(domain);\n return JSON.stringify(domain);\n}\n\nexport function deserializeColorValueDomain(\n value: unknown,\n): Result<ColorValueDomain, RenderGraphError> {\n let candidate = value;\n if (typeof value === 'string') {\n try {\n candidate = JSON.parse(value) as unknown;\n } catch {\n candidate = value;\n }\n }\n return isColorValueDomain(candidate) ? ok(candidate) : err(invalidDomain(candidate));\n}\n\nexport function serializeColorResourceDescriptor(descriptor: ColorResourceDescriptor): string {\n if (!isColorValueDomain(descriptor.domain)) throw invalidDomain(descriptor.domain);\n return JSON.stringify(descriptor);\n}\n\nexport function deserializeColorResourceDescriptor(\n value: unknown,\n): Result<ColorResourceDescriptor, RenderGraphError> {\n if (typeof value !== 'object' || value === null) return err(missingDomain());\n const candidate = value as { domain?: unknown; format?: unknown };\n if (candidate.domain === undefined) return err(missingDomain());\n if (!isColorValueDomain(candidate.domain)) return err(invalidDomain(candidate.domain));\n if (typeof candidate.format !== 'string' || candidate.format.length === 0) {\n return err(\n new RenderGraphError({\n code: 'invalid-color-domain',\n expected: 'color resource descriptor includes a non-empty format',\n hint: 'set format separately from the explicit color domain',\n detail: { value: String(candidate.format) },\n }),\n );\n }\n return ok({ domain: candidate.domain, format: candidate.format });\n}\n\nfunction conversionMatches(\n source: ColorValueDomain,\n destination: ColorValueDomain,\n conversion: ColorDomainConversion,\n): boolean {\n if (conversion.kind === 'encode-srgb') {\n return (\n (source === 'linear-hdr' || source === 'linear-ldr') && destination === 'display-encoded'\n );\n }\n if (conversion.kind === 'decode-srgb') {\n return (\n source === 'display-encoded' && (destination === 'linear-hdr' || destination === 'linear-ldr')\n );\n }\n return (\n source === 'linear-hdr' && (destination === 'linear-ldr' || destination === 'display-encoded')\n );\n}\n\nexport function validateColorDomainConnection(\n source: unknown,\n destination: unknown,\n conversion?: ColorDomainConversion,\n): ColorDomainValidation {\n if (source === undefined || source === null) return { ok: false, error: missingDomain('source') };\n if (destination === undefined || destination === null) {\n return { ok: false, error: missingDomain('destination') };\n }\n if (!isColorValueDomain(source)) return { ok: false, error: invalidDomain(source) };\n if (!isColorValueDomain(destination)) return { ok: false, error: invalidDomain(destination) };\n if (source === destination) return { ok: true };\n if (conversion !== undefined && conversionMatches(source, destination, conversion)) {\n return { ok: true };\n }\n return {\n ok: false,\n error: new RenderGraphError({\n code: 'color-domain-mismatch',\n expected: `source and destination share a domain or use an explicit valid conversion (${source} -> ${destination})`,\n hint: 'insert an explicit linear blend or output encoding pass; never mix into an encoded destination',\n detail: { sourceDomain: source, destinationDomain: destination },\n }),\n };\n}\n\nexport { invalidDomain, missingDomain };\n","// @forgeax/engine-render-graph/src/graph.ts — RenderGraph core primitives.\n//\n// Shape (plan-strategy D-1/D-4/D-5/D-6.1):\n// - ResourceDescriptor / PassDescriptor — declaration types\n// - RenderGraph — main class: addResource / addPass / compile / execute\n// - PassInfo / ResourceInfo — query interfaces (D-5)\n\nimport type {\n RhiCaps,\n ComputePassDescriptor as RhiComputePassDescriptor,\n RhiComputePassEncoder,\n RhiDevice,\n Texture,\n TextureFormat,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport {\n type AliasSourceDetail,\n type CapMissingDetail,\n type DanglingReadDetail,\n err,\n ok,\n RenderGraphError,\n type Result,\n} from './errors.js';\nimport {\n type CurrentFrameObservationDescriptor,\n type CurrentFrameObservationLease,\n createCurrentFrameObservationLease,\n} from './observation.js';\nimport type { PassEntry } from './pass-registry.js';\nimport { PassRegistry } from './pass-registry.js';\nimport {\n type ColorDomainConnection,\n type ColorValueDomain,\n validateColorDomainConnection,\n} from './pipeline/color-value-domain.js';\nimport type { ResourceEntry } from './resource-registry.js';\nimport { ResourceRegistry } from './resource-registry.js';\n\n// ── Declaration types ────────────────────────────────────────────\n\nexport type ResourceKind = 'texture' | 'buffer';\n\nexport type ResourceLifetime = 'transient' | 'persistent';\n\nexport type BufferRole = 'auto-storage-or-uniform' | 'uniform';\n\n/**\n * Three-state size for addColorTarget (D-8):\n * - 'swapchain' — matches the output canvas size\n * - 'half-swapchain' — 1/2 the output canvas size (bloom downscale)\n * - { w, h } — fixed pixel dimensions (shadow maps, etc.)\n */\nexport type ColorTargetSize =\n | 'swapchain'\n | 'half-swapchain'\n | { readonly w: number; readonly h: number };\n\n/**\n * Color target descriptor for addColorTarget (D-8).\n *\n * format: GPU texture format (e.g. 'rgba16float', 'bgra8unorm').\n * size: target dimensions relative to swap-chain or absolute.\n * lifetime: allocation lifetime (default 'transient'); persistent targets keep\n * their physical texture across unchanged compiles and replace it on descriptor drift.\n * sample: multisample count (default 1; MSAA count=4 via #301).\n * usage: GPU texture usage flags (default RENDER_ATTACHMENT | TEXTURE_BINDING).\n * viewFormats: extra GPU texture formats viewable via createTextureView from this\n * texture; mirrors GPUTextureDescriptor.viewFormats. The LDR MSAA path needs\n * `bgra8unorm` storage + `bgra8unorm-srgb` view (hardware sRGB encoding on\n * store), so the consumer pre-declares the alternate format here.\n */\nexport interface ColorTargetDescriptor {\n readonly format: TextureFormat;\n readonly size: ColorTargetSize;\n readonly lifetime?: ResourceLifetime | undefined;\n readonly sample?: number | undefined;\n readonly usage?: number | undefined;\n readonly viewFormats?: readonly TextureFormat[] | undefined;\n /** Semantic color domain. Omitted only for legacy graphs without domain connections. */\n readonly domain?: ColorValueDomain | undefined;\n}\n\nexport interface ResolvedColorTargetDescriptor {\n readonly texture: Texture;\n readonly format: TextureFormat;\n readonly size: { readonly width: number; readonly height: number };\n readonly usage: number;\n readonly sample: number;\n}\n\nexport interface ResourceDescriptor {\n readonly kind: ResourceKind;\n readonly lifetime: ResourceLifetime;\n readonly bufferRole?: BufferRole;\n}\n\n/**\n * Opaque handle returned by addColorTarget. Resolved to a TextureView after\n * compile by calling resolve(name) in a pass execute closure.\n */\nexport type ColorTargetHandle = string;\n\n/**\n * Per-pass resolve context: maps color target names to compiled TextureViews.\n * A pass execute closure receives this alongside the user-provided Ctx.\n */\nexport interface ResolveContext {\n /** Resolve a color target name to its compiled TextureView, or undefined if not compiled. */\n readonly resolve: (name: string) => unknown;\n}\n\nexport interface PassDescriptor<Ctx = unknown> {\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n readonly execute?: ((ctx: Ctx) => void) | ((ctx: Ctx, resolve: ResolveContext) => void);\n readonly compute?: boolean;\n readonly storageBuffer?: boolean;\n /** Explicit resource-to-resource color-domain edges validated at compile time. */\n readonly colorConnections?: readonly ColorDomainConnection[] | undefined;\n}\n\nexport interface ComputePassDescriptor<Ctx> {\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n readonly storageBuffer?: boolean | undefined;\n readonly begin?: ((frame: Ctx) => RhiComputePassDescriptor) | undefined;\n readonly onBeginError?: ((frame: Ctx, cause: unknown) => void) | undefined;\n readonly after?: ((frame: Ctx) => void) | undefined;\n encode(context: {\n readonly pass: RhiComputePassEncoder;\n readonly frame: Ctx;\n readonly resources: ResolveContext;\n }): void;\n}\n\n/** Optional nested observer for per-pass execution attribution. */\nexport type PassExecuteRunner = (passName: string, action: () => void) => void;\n\n// ── Query types (D-5) ────────────────────────────────────────────\n\nexport interface PassInfo {\n readonly name: string;\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n}\n\nexport interface ResourceInfo {\n readonly key: string;\n readonly kind: ResourceKind;\n readonly lifetime: ResourceLifetime;\n}\n\n// ── Internalized graph ───────────────────────────────────────────\n\nexport interface InternalizedPass {\n readonly name: string;\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n}\n\n/**\n * RHI buffer binding type a buffer resource resolves to after compile.\n * Mirrors the `@webgpu/types` GPUBufferBindingType subset used by the\n * storage-vs-uniform cap switch (research Finding 7; runtime template\n * `pbr-pipeline.ts` `caps.storageBuffer ? 'read-only-storage' : 'uniform'`).\n */\nexport type ResolvedBufferType = 'read-only-storage' | 'uniform';\n\n/**\n * Resolved buffer binding for a registered `kind:'buffer'` resource.\n * Produced by compile() per AC-09 / D-6.1: the declarative graph picks the\n * concrete binding type from `caps.storageBuffer`, so a consumer building a\n * bind-group layout reads `resolvedBufferType` instead of duplicating the\n * cap switch.\n */\nexport interface ResolvedBuffer {\n readonly key: string;\n readonly resolvedBufferType: ResolvedBufferType;\n}\n\nexport interface InternalizedGraph {\n readonly passes: readonly InternalizedPass[];\n /**\n * Buffer resources resolved to a concrete RHI binding type (AC-09).\n * Empty when the graph declares no `kind:'buffer'` resources.\n */\n readonly resolvedBuffers: readonly ResolvedBuffer[];\n /**\n * Resolved TextureViews keyed by resource name.\n * Populated by the compile allocation phase for addColorTarget resources.\n * Empty when no color targets were declared.\n */\n readonly resolvedTextures: ReadonlyMap<string, TextureView>;\n}\n\n// ── Compile options ──────────────────────────────────────────────\n\nexport interface CompileOptions {\n // D-6: second independent literal union (NOT derived from RhiCaps['backendKind']);\n // add-only '|null' member so passthrough callers forwarding\n // device.caps.backendKind type-check. Deriving from RhiCaps to collapse the\n // duplicate is a known OOS follow-on (architecture-principles #2 Derive).\n readonly backendKind: 'webgpu' | 'wgpu-native' | 'wgpu-webgl2' | 'null';\n readonly caps: RhiCaps;\n /**\n * RHI device interface handle for real GPU texture allocation (D-1).\n * Required when the graph has addColorTarget resources; the compile phase\n * calls device.createTexture/createTextureView for each color target.\n */\n readonly device?: RhiDevice | undefined;\n}\n\n// ── RenderGraph ──────────────────────────────────────────────────\n\n/**\n * Descriptor key for texture pool lookups (D-2 / D-8 / KB-2).\n * Transient resources with identical descriptors share the same physical\n * texture; drift in any field triggers rebuild.\n * NOTE: stringified form is used as Map key; the interface is for doc only.\n */\n// interface _TexturePoolKey { format:string; width:number; height:number; usage:number; sample:number; viewFormats:string[]; }\n\n/** Pooled texture entry shared by transient and persistent allocation paths. */\ninterface PooledTexture {\n readonly texture: unknown; // opaque RHI Texture handle\n readonly view: unknown; // opaque RHI TextureView handle\n readonly descriptorKey: string;\n}\n\ninterface StagedColorTargetAllocation {\n readonly resolvedTextures: Map<string, TextureView>;\n readonly transient: ReadonlyMap<string, PooledTexture>;\n readonly persistent: ReadonlyMap<string, PooledTexture>;\n}\n\n/** A subset of RhiDevice surface needed by drain() and reclaim to release pooled textures. */\ntype DrainDevice = Pick<RhiDevice, 'destroyTexture' | 'queue'>;\n\nfunction poolKey(meta: {\n format: TextureFormat;\n width: number;\n height: number;\n usage: number;\n sample: number;\n viewFormats: readonly TextureFormat[];\n}): string {\n return `${meta.format}:${meta.width}x${meta.height}:${meta.usage}:${meta.sample}:${JSON.stringify(meta.viewFormats)}`;\n}\n\n/**\n * Runtime projection of the type-only WebGPU GPUTextureFormat union.\n *\n * `TextureFormat` is erased at runtime, but RenderGraph must reject malformed\n * declarations before it calls an RHI device. Keep this ordered vocabulary as\n * the single runtime validation authority; backend capability or usage refusal\n * remains a `resource-alloc-failed` result after this syntax gate.\n */\nconst VALID_GPU_TEXTURE_FORMATS = [\n 'r8unorm',\n 'r8snorm',\n 'r8uint',\n 'r8sint',\n 'r16unorm',\n 'r16snorm',\n 'r16uint',\n 'r16sint',\n 'r16float',\n 'rg8unorm',\n 'rg8snorm',\n 'rg8uint',\n 'rg8sint',\n 'r32uint',\n 'r32sint',\n 'r32float',\n 'rg16unorm',\n 'rg16snorm',\n 'rg16uint',\n 'rg16sint',\n 'rg16float',\n 'rgba8unorm',\n 'rgba8unorm-srgb',\n 'rgba8snorm',\n 'rgba8uint',\n 'rgba8sint',\n 'bgra8unorm',\n 'bgra8unorm-srgb',\n 'rgb9e5ufloat',\n 'rgb10a2uint',\n 'rgb10a2unorm',\n 'rg11b10ufloat',\n 'rg32uint',\n 'rg32sint',\n 'rg32float',\n 'rgba16unorm',\n 'rgba16snorm',\n 'rgba16uint',\n 'rgba16sint',\n 'rgba16float',\n 'rgba32uint',\n 'rgba32sint',\n 'rgba32float',\n 'stencil8',\n 'depth16unorm',\n 'depth24plus',\n 'depth24plus-stencil8',\n 'depth32float',\n 'depth32float-stencil8',\n 'bc1-rgba-unorm',\n 'bc1-rgba-unorm-srgb',\n 'bc2-rgba-unorm',\n 'bc2-rgba-unorm-srgb',\n 'bc3-rgba-unorm',\n 'bc3-rgba-unorm-srgb',\n 'bc4-r-unorm',\n 'bc4-r-snorm',\n 'bc5-rg-unorm',\n 'bc5-rg-snorm',\n 'bc6h-rgb-ufloat',\n 'bc6h-rgb-float',\n 'bc7-rgba-unorm',\n 'bc7-rgba-unorm-srgb',\n 'etc2-rgb8unorm',\n 'etc2-rgb8unorm-srgb',\n 'etc2-rgb8a1unorm',\n 'etc2-rgb8a1unorm-srgb',\n 'etc2-rgba8unorm',\n 'etc2-rgba8unorm-srgb',\n 'eac-r11unorm',\n 'eac-r11snorm',\n 'eac-rg11unorm',\n 'eac-rg11snorm',\n 'astc-4x4-unorm',\n 'astc-4x4-unorm-srgb',\n 'astc-5x4-unorm',\n 'astc-5x4-unorm-srgb',\n 'astc-5x5-unorm',\n 'astc-5x5-unorm-srgb',\n 'astc-6x5-unorm',\n 'astc-6x5-unorm-srgb',\n 'astc-6x6-unorm',\n 'astc-6x6-unorm-srgb',\n 'astc-8x5-unorm',\n 'astc-8x5-unorm-srgb',\n 'astc-8x6-unorm',\n 'astc-8x6-unorm-srgb',\n 'astc-8x8-unorm',\n 'astc-8x8-unorm-srgb',\n 'astc-10x5-unorm',\n 'astc-10x5-unorm-srgb',\n 'astc-10x6-unorm',\n 'astc-10x6-unorm-srgb',\n 'astc-10x8-unorm',\n 'astc-10x8-unorm-srgb',\n 'astc-10x10-unorm',\n 'astc-10x10-unorm-srgb',\n 'astc-12x10-unorm',\n 'astc-12x10-unorm-srgb',\n 'astc-12x12-unorm',\n 'astc-12x12-unorm-srgb',\n] as const satisfies readonly TextureFormat[];\n\nconst VALID_GPU_TEXTURE_FORMAT_SET: ReadonlySet<string> = new Set(VALID_GPU_TEXTURE_FORMATS);\n\nexport class RenderGraph<Ctx = unknown> {\n private readonly resources = new ResourceRegistry();\n private readonly passes = new PassRegistry<Ctx>();\n private compiled: InternalizedGraph | null = null;\n\n /** Transient texture pool: keyed by descriptor, reused across compiles (D-2). */\n private readonly transientPool = new Map<string, PooledTexture>();\n /**\n * Pending-destroy queue (bug-20260622): replaced textures awaiting GPU\n * retirement before actual device.destroyTexture. drainTransient(),\n * setTransientEntry(), and setPersistentEntry() push here instead of destroying immediately;\n * reclaimRetiredTransients() (called post-queue.submit in recordFrame) drains\n * the queue when the GPU signals onSubmittedWorkDone.\n */\n private readonly pendingDestroy: PooledTexture[] = [];\n /** Persistent textures: keyed by resource name, kept across compiles. */\n private readonly persistentTextures = new Map<string, PooledTexture>();\n /** Swap-chain size for resolving 'swapchain' / 'half-swapchain' sizes. */\n private swapChainWidth = 800;\n private swapChainHeight = 600;\n /** Last compile-time swap-chain size; diff triggers recompile-invalidation. */\n private compiledWidth = 800;\n private compiledHeight = 600;\n /**\n * feat-20260612 M-4 / w15: device reference stashed at compile-time so\n * drain() can release pooled textures via device.destroyTexture without\n * a separate parameter. Set by compile(); null until the first compile.\n * Render-graph stays RHI-pure (no runtime dep): the destroy bookkeeping\n * SSOT is the RHI shim, exactly as GpuTexture.destroy() routes through it.\n */\n private lastDevice: DrainDevice | null = null;\n\n /**\n * Set the current swap-chain dimensions (w7).\n * The compile allocation phase uses this to resolve 'swapchain' and\n * 'half-swapchain' size specifiers. Returns true when dimensions differ\n * from the last compile, signalling that a recompile is needed.\n */\n setSwapChainSize(width: number, height: number): boolean {\n this.swapChainWidth = width;\n this.swapChainHeight = height;\n if (width !== this.compiledWidth || height !== this.compiledHeight) {\n return true;\n }\n return false;\n }\n\n /**\n * w7: resolve a color-target name to its compiled TextureView.\n * Returns the GPU view after compile, or undefined if not yet compiled\n * or the name was not registered via addColorTarget.\n */\n getColorTargetView(name: string): unknown {\n return this.compiled?.resolvedTextures.get(name);\n }\n\n /**\n * w7: resolve a color-target name to its compiled GPU Texture handle.\n * Returns the texture after compile, or undefined if not yet compiled.\n */\n getColorTargetTexture(name: string): unknown {\n return this.compiled?.resolvedTextures.get(`${name}::tex`);\n }\n\n getColorTargetDescriptor(name: string): ResolvedColorTargetDescriptor | undefined {\n const meta = this.resources.getColorTargetMeta(name);\n const texture = this.compiled?.resolvedTextures.get(`${name}::tex`);\n if (meta === undefined || texture === undefined) return undefined;\n return {\n texture: texture as unknown as Texture,\n format: meta.format,\n size: {\n width: this.resolveWidth(meta.size),\n height: this.resolveHeight(meta.size),\n },\n usage: meta.usage,\n sample: meta.sample,\n };\n }\n\n /**\n * Declare a color target alias: both names share the same physical texture.\n * The source must already be registered via addColorTarget.\n * Used for hdrComposited -> hdrColor folding (KB-1 / D-2). The returned\n * Result contains the opaque alias handle or a duplicate-resource error.\n */\n addColorTargetAlias(name: string, source: string): Result<ColorTargetHandle, RenderGraphError> {\n const result = this.resources.addColorTargetAlias(name, source);\n if (!result.ok) return result;\n return ok(name);\n }\n\n addResource(\n key: string,\n descriptor: ResourceDescriptor,\n ): Result<ResourceEntry, RenderGraphError> {\n return this.resources.add(key, descriptor);\n }\n\n /**\n * Declare a color target resource that the compiler will allocate as a\n * transient or persistent GPU texture (D-1 / D-8). A successful Result\n * contains an opaque string handle that can be referenced in pass read/write\n * arrays and resolved to a TextureView via resolve(name) inside a pass\n * execute closure. A duplicate key is rejected before registry publication.\n *\n * Omitted lifetime preserves the default `transient`; `persistent` retains\n * identity across unchanged compiles and replaces on descriptor drift.\n * format/size/sample/usage are stored on the resource entry for the compile\n * allocation phase (w6).\n */\n addColorTarget(\n name: string,\n desc: ColorTargetDescriptor,\n ): Result<ColorTargetHandle, RenderGraphError> {\n const result = this.resources.addColorTarget(name, desc);\n if (!result.ok) return result;\n return ok(name);\n }\n\n addPass(name: string, descriptor: PassDescriptor<Ctx>): PassEntry<Ctx> {\n return this.passes.add(name, descriptor);\n }\n\n /** @internal Renderer composition seam for declaring feature work at its semantic target. */\n _addPassBefore(name: string, before: string, descriptor: PassDescriptor<Ctx>): PassEntry<Ctx> {\n return this.passes.add(name, descriptor, before);\n }\n\n addComputePass(name: string, descriptor: ComputePassDescriptor<Ctx>): PassEntry<Ctx> {\n return this.addComputePassAt(name, descriptor);\n }\n\n /** @internal Renderer composition seam for declaring feature work at its semantic target. */\n _addComputePassBefore(\n name: string,\n before: string,\n descriptor: ComputePassDescriptor<Ctx>,\n ): PassEntry<Ctx> {\n return this.addComputePassAt(name, descriptor, before);\n }\n\n private addComputePassAt(\n name: string,\n descriptor: ComputePassDescriptor<Ctx>,\n before?: string,\n ): PassEntry<Ctx> {\n return this.passes.add(\n name,\n {\n reads: descriptor.reads,\n writes: descriptor.writes,\n compute: true,\n storageBuffer: descriptor.storageBuffer ?? true,\n execute: (frame: Ctx, resources: ResolveContext) => {\n const encoder = (\n frame as Ctx & { readonly encoder: import('@forgeax/engine-rhi').RhiCommandEncoder }\n ).encoder;\n const begin = descriptor.begin?.(frame);\n let pass: RhiComputePassEncoder;\n try {\n pass = encoder.beginComputePass({\n label: name,\n ...(begin?.timestampWrites === undefined\n ? {}\n : { timestampWrites: begin.timestampWrites }),\n });\n } catch (cause) {\n descriptor.onBeginError?.(frame, cause);\n return;\n }\n try {\n descriptor.encode({ pass, frame, resources });\n } finally {\n pass.end();\n }\n descriptor.after?.(frame);\n },\n },\n before,\n );\n }\n\n /**\n * Validate a producer-scoped current-frame texture without exposing graph\n * resource names through the observation lease.\n */\n createCurrentFrameObservationLease(\n descriptor: CurrentFrameObservationDescriptor,\n currentFrameId: number,\n ): Result<CurrentFrameObservationLease, RenderGraphError> {\n return createCurrentFrameObservationLease(descriptor, currentFrameId);\n }\n\n /**\n * Compile the graph into an internalized form.\n *\n * Phases (plan-strategy 3.1):\n * 1. Cap-gate fail-fast\n * 2. Unknown-resource fail-fast (every pass read/write key is registered)\n * 3. Dangling-read fail-fast\n * 4. Preserve declaration order as the temporal authority\n * 5. Buffer-role resolution (AC-09 / D-6.1)\n * 6. GPU allocation for color targets (D-1) — when device is provided and the\n * graph has addColorTarget resources, allocate textures via\n * device.createTexture/createTextureView. Errors surface as\n * 'resource-alloc-failed' or 'invalid-format'.\n */\n compile(opts: CompileOptions): Result<InternalizedGraph, RenderGraphError> {\n const passList = this.passes.list();\n const { caps, device } = opts;\n\n const capErr = this.validateCaps(passList, caps);\n if (capErr) return capErr;\n\n const colorDomainErr = this.validateColorDomains(passList);\n if (colorDomainErr) return colorDomainErr;\n\n const unknownErr = this.validateNoUnknownResource(passList);\n if (unknownErr) return unknownErr;\n\n const danglingErr = this.validateNoDanglingRead(passList);\n if (danglingErr) return danglingErr;\n\n const formatErr = this.validateColorTargetFormats();\n if (!formatErr.ok) return formatErr;\n\n const internalizedPasses: InternalizedPass[] = passList.map((pass) => {\n return {\n name: pass.name,\n reads: pass.descriptor.reads,\n writes: pass.descriptor.writes,\n };\n });\n\n const resolvedBuffers = this.resolveBuffers(caps);\n\n // Phase 7: GPU allocation for color targets (D-1).\n const resizeDetected =\n this.swapChainWidth !== this.compiledWidth || this.swapChainHeight !== this.compiledHeight;\n const allocatedTextures = this.allocateColorTargets(device, resizeDetected);\n if (!allocatedTextures.ok) return allocatedTextures;\n\n // Phase 6.5: resize drain (AC-09, plan-strategy D-4). Defer the drain\n // until allocation succeeds so a refused compile leaves the active graph\n // and its pool untouched for a retry.\n if (resizeDetected) {\n this.drainTransient();\n }\n\n for (const [key, pooled] of allocatedTextures.value.transient) {\n this.setTransientEntry(key, pooled);\n }\n for (const [key, pooled] of allocatedTextures.value.persistent) {\n this.setPersistentEntry(key, pooled);\n }\n\n this.compiled = {\n passes: internalizedPasses,\n resolvedBuffers,\n resolvedTextures: allocatedTextures.value.resolvedTextures,\n };\n this.compiledWidth = this.swapChainWidth;\n this.compiledHeight = this.swapChainHeight;\n if (device !== undefined) {\n this.lastDevice = device;\n }\n return ok(this.compiled);\n }\n\n /**\n * feat-20260612 M-4 / w15: release every pooled GPU texture and clear\n * the pools.\n *\n * Walks `transientPool` + `persistentTextures`, forwarding each\n * `PooledTexture.texture` opaque handle to `device.destroyTexture(...)`,\n * then clears both Maps. The destroy bookkeeping SSOT is the RHI shim\n * (architecture-principles §1 SSOT: same path GpuTexture.destroy()\n * uses); render-graph stays RHI-pure (no runtime dep).\n *\n * Plan-strategy D-7: drain covers the dispose exit path (`Renderer.dispose()`);\n * descriptor-drift replacement during compile is fenced through\n * `pendingDestroy` and `reclaimRetiredTransients()`.\n *\n * Idempotent (architecture-principles §6): a second drain on cleared\n * Maps is a no-op. drain() before any compile is also a safe no-op.\n * Per-handle errors from the RHI shim (e.g. 'destroy-after-destroy'\n * on a stale handle) are tolerated so the dispose chain can make\n * progress (mirrors gpuStore.destroyAll's swallow-and-continue\n * policy; plan-strategy D-3 / D-8). The structured error stays\n * available on the device handle for future inspector hooks.\n */\n drain(): void {\n const device = this.lastDevice;\n if (device === null) {\n this.transientPool.clear();\n this.persistentTextures.clear();\n this.pendingDestroy.length = 0;\n return;\n }\n for (const pooled of this.transientPool.values()) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy failures do not\n // interrupt the drain chain (docstring tolerance contract).\n }\n }\n this.transientPool.clear();\n // bug-20260622 D-6: drain teardown path — destroy any pendingDestroy\n // items left over (Renderer.dispose() has no in-flight frames).\n for (const pooled of this.pendingDestroy) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy failures do not\n // interrupt the drain chain (docstring tolerance contract).\n }\n }\n this.pendingDestroy.length = 0;\n for (const pooled of this.persistentTextures.values()) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy failures do not\n // interrupt the drain chain (docstring tolerance contract).\n }\n }\n this.persistentTextures.clear();\n }\n\n /**\n * Relinquish every texture owned by this graph after its last frame has\n * been submitted. Unlike {@link drain}, this does not synchronously destroy\n * GPU resources: they join `pendingDestroy` and are released by\n * `reclaimRetiredTransients()` only after `onSubmittedWorkDone` resolves.\n *\n * A retired graph is no longer executable. Runtime replaces a memoized\n * per-frame graph through this entry when topology changes (rather than\n * dropping the graph and its pools), while `drain()` remains the teardown\n * path where immediate destruction is safe.\n */\n retire(): void {\n const device = this.lastDevice;\n if (device === null) {\n this.transientPool.clear();\n this.persistentTextures.clear();\n this.pendingDestroy.length = 0;\n this.compiled = null;\n return;\n }\n for (const pooled of this.transientPool.values()) {\n this.pendingDestroy.push(pooled);\n }\n this.transientPool.clear();\n for (const pooled of this.persistentTextures.values()) {\n this.pendingDestroy.push(pooled);\n }\n this.persistentTextures.clear();\n this.compiled = null;\n }\n\n /**\n * Release every transient-pool texture while keeping persistentTextures\n * intact (AC-09: resize drain, plan-strategy D-4).\n *\n * Walks `transientPool` values and forwards each `PooledTexture.texture`\n * opaque handle to `device.destroyTexture(...)`, then clears the transient\n * pool. Mirror of `drain()` but scoped to the transient pool only.\n *\n * Persistent textures survive `drainTransient` — they are only released by\n * the full `drain()` on teardown. `drainTransient` is an internal helper\n * called by `compile()` when swap-chain size changes; it is NOT a public API\n * (callers should use `drain()` for teardown).\n *\n * Idempotent (architecture-principles §6): a second drainTransient on an\n * already-cleared transient pool is a no-op.\n */\n private drainTransient(): void {\n const device = this.lastDevice;\n if (device === null) {\n this.transientPool.clear();\n return;\n }\n // bug-20260622 D-1: push old transient textures into pendingDestroy\n // queue instead of destroying immediately. The GPU may still hold\n // references from a prior in-flight command buffer.\n for (const pooled of this.transientPool.values()) {\n this.pendingDestroy.push(pooled);\n }\n this.transientPool.clear();\n }\n\n /**\n * Guarded transient pool insert (AC-08, plan-strategy D-4).\n *\n * Before overwriting a key in the transient pool, destroys the old pooled\n * texture via `device.destroyTexture(...)` to prevent stranded GPU textures.\n * The guard is defensive: in current production code flow this code path is\n * unreachable (set() only follows a get() miss inside allocateColorTargets),\n * but the single-line guard costs almost nothing and closes the symmetry gap\n * (every GPU resource allocation has a paired destroy).\n *\n * When `lastDevice` is null (no device ever stashed), the old entry is\n * silently dropped without destroy (mirrors drainTransient's null-device\n * fast path).\n */\n private setTransientEntry(key: string, pooled: PooledTexture): void {\n const old = this.transientPool.get(key);\n if (old) {\n // bug-20260622 D-1: push into pendingDestroy queue instead of\n // destroying immediately — the old texture may still be referenced\n // by an in-flight command buffer.\n this.pendingDestroy.push(old);\n }\n this.transientPool.set(key, pooled);\n }\n\n /**\n * Publish a persistent replacement only after a complete allocation succeeds.\n * The old handle remains fenced until the GPU retires work that may still\n * reference it, just like a transient replacement.\n */\n private setPersistentEntry(key: string, pooled: PooledTexture): void {\n const old = this.persistentTextures.get(key);\n if (old && old.texture !== pooled.texture) {\n this.pendingDestroy.push(old);\n }\n this.persistentTextures.set(key, pooled);\n }\n\n /**\n * bug-20260622 D-2: reclaim pool textures queued in pendingDestroy after\n * the GPU has retired all prior command buffers.\n *\n * Takes a snapshot of pendingDestroy, then calls\n * `lastDevice.queue.onSubmittedWorkDone()`. When the promise resolves,\n * the snapshot items are actually destroyed via\n * `device.destroyTexture(...)` and removed from the queue.\n *\n * Idempotent (architecture-principles D-4): a second reclaim on an\n * already-drained pendingDestroy is a no-op. When lastDevice is null\n * (no device ever stashed), pendingDestroy is cleared directly.\n *\n * Per-handle destroy errors are tolerated (swallow-and-continue,\n * plan-strategy D-5) — a stale-handle destroy-after-destroy does not\n * interrupt the reclaim chain.\n */\n async reclaimRetiredTransients(): Promise<void> {\n const device = this.lastDevice;\n if (device === null) {\n this.pendingDestroy.length = 0;\n return;\n }\n if (this.pendingDestroy.length === 0) return;\n\n // Snapshot the queue; items added after this point are handled by the\n // next reclaim call (D-4: no race with concurrent push from same-frame\n // drainTransient).\n const snapshot = this.pendingDestroy.splice(0);\n\n // Wait for all prior GPU work to complete.\n await device.queue.onSubmittedWorkDone();\n\n // Destroy snapshot items.\n for (const pooled of snapshot) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy errors are tolerated\n // (docstring contract) — a stale handle does not interrupt the\n // reclaim chain for subsequent items.\n }\n }\n }\n\n /**\n * Drop the pendingDestroy queue WITHOUT calling device.destroyTexture\n * (feat-20260622-s5 M3 / B-2 / B-AC-02).\n *\n * Used on the device-lost recover() rebuild path: the queue holds\n * PooledTexture handles minted against the now-lost device, so calling\n * destroyTexture on them against the freshly-rebuilt device is meaningless\n * (the old GPUDevice owns them; spec retires its resources implicitly when\n * it is lost). recover() calls this after `gpuStore.destroyAll()` and before\n * `tryCreateWebGPURenderer` so no stale handle reaches the new device.\n *\n * device-lost is an upstream judgement (createRenderer's health state); the\n * graph stays RHI-pure and takes no device parameter — it only exposes the\n * clear entry. Same effect as the existing null-device fast paths in drain()\n * / reclaimRetiredTransients() (`pendingDestroy.length = 0`), surfaced as a\n * method recover() can call directly. Idempotent: a second call on an\n * already-empty queue is a no-op.\n */\n clearPendingDestroy(): void {\n this.pendingDestroy.length = 0;\n }\n\n /**\n * Execute the compiled graph in declaration order, calling\n * each pass's execute closure with the provided context. Passes without an\n * execute closure are silently skipped.\n */\n execute(ctx: Ctx, runPass?: PassExecuteRunner): void {\n const compiled = this.compiled;\n if (!compiled) return;\n const resolvedTextures: ReadonlyMap<string, unknown> = compiled.resolvedTextures;\n const resolveCtx: ResolveContext = {\n resolve: (name: string) => resolvedTextures.get(name),\n };\n const passList = this.passes.list();\n const passByName = new Map<string, PassEntry<Ctx>>(passList.map((p) => [p.name, p]));\n for (const internalPass of compiled.passes) {\n const entry = passByName.get(internalPass.name);\n const execute = entry?.descriptor.execute;\n if (execute) {\n if (runPass === undefined) {\n (execute as (ctx: Ctx, resolve: ResolveContext) => void)(ctx, resolveCtx);\n } else {\n runPass(internalPass.name, () =>\n (execute as (ctx: Ctx, resolve: ResolveContext) => void)(ctx, resolveCtx),\n );\n }\n }\n }\n }\n\n listPasses(): readonly PassInfo[] {\n return this.passes.list().map((p) => ({\n name: p.name,\n reads: p.descriptor.reads,\n writes: p.descriptor.writes,\n }));\n }\n\n listResources(): readonly ResourceInfo[] {\n const result: ResourceInfo[] = [];\n for (const entry of this.resources.entries()) {\n result.push({\n key: entry.key,\n kind: entry.descriptor.kind,\n lifetime: entry.descriptor.lifetime,\n });\n }\n return result;\n }\n\n // ── Private helpers ────────────────────────────────────────────\n\n private validateCaps(\n passList: readonly PassEntry<Ctx>[],\n caps: RhiCaps,\n ): Result<never, RenderGraphError> | null {\n for (const pass of passList) {\n const { name, descriptor } = pass;\n\n if (descriptor.compute && !caps.compute) {\n return err(\n new RenderGraphError({\n code: 'cap-missing',\n expected: `pass '${name}' is a compute pass but caps.compute is false`,\n hint: 'use a render pass path or enable compute on the backend',\n detail: { cap: 'compute', passName: name } satisfies CapMissingDetail,\n }),\n );\n }\n\n if (descriptor.storageBuffer && !caps.storageBuffer) {\n return err(\n new RenderGraphError({\n code: 'cap-missing',\n expected: `pass '${name}' requires storage buffer but caps.storageBuffer is false`,\n hint: 'switch to uniform buffer or enable storageBuffer on the backend',\n detail: {\n cap: 'storageBuffer',\n passName: name,\n } satisfies CapMissingDetail,\n }),\n );\n }\n }\n return null;\n }\n\n private validateColorDomains(\n passList: readonly PassEntry<Ctx>[],\n ): Result<never, RenderGraphError> | null {\n for (const pass of passList) {\n for (const connection of pass.descriptor.colorConnections ?? []) {\n const source = this.resources.get(connection.source)?.colorTarget?.domain;\n const destination = this.resources.get(connection.destination)?.colorTarget?.domain;\n const validation = validateColorDomainConnection(\n source,\n destination,\n connection.conversion,\n );\n if (!validation.ok) return err(validation.error);\n }\n }\n return null;\n }\n\n private validateNoUnknownResource(\n passList: readonly PassEntry<Ctx>[],\n ): Result<never, RenderGraphError> | null {\n for (const pass of passList) {\n for (const key of [...pass.descriptor.reads, ...pass.descriptor.writes]) {\n // Built-in reserved key 'swapchain' (feat-20260609 framebuffers demo\n // M5 / T-12-a): the swap-chain output is not a graph-allocated\n // resource; passes that write to 'swapchain' surface their writeView\n // through the resolveCtx fallback (`resolveCtx.resolve('swapchain')`\n // returns undefined -> the dispatcher falls back to `ctx.view`, the\n // current swap-chain view). Allowed in `writes` (a fullscreen pass\n // outputs to the swap-chain) and in `reads` (a future pass that\n // samples the swap-chain via copyTextureToTexture). The graph never\n // allocates, owns, or aliases this resource — it is purely an\n // ordering/contract token.\n if (key === 'swapchain') continue;\n if (!this.resources.has(key)) {\n return err(\n new RenderGraphError({\n code: 'unknown-resource',\n expected: `pass '${pass.name}' references resource key '${key}' but it is not registered`,\n hint: `call addResource('${key}', ...) before compile, or remove '${key}' from pass '${pass.name}'`,\n detail: {\n resourceKey: key,\n passName: pass.name,\n } satisfies DanglingReadDetail,\n }),\n );\n }\n }\n }\n return null;\n }\n\n /**\n * Resolve every registered `kind:'buffer'` resource to a concrete RHI\n * binding type (AC-09 / D-6.1). `bufferRole='auto-storage-or-uniform'`\n * (the default when unset) picks `'read-only-storage'` when the backend\n * advertises `caps.storageBuffer`, else falls back to `'uniform'`;\n * `bufferRole='uniform'` is always `'uniform'`. Mirrors the runtime\n * `pbr-pipeline.ts` cap switch (research Finding 7), expressed here in the\n * RHI-pure graph layer so consumers never duplicate the branch.\n */\n private resolveBuffers(caps: RhiCaps): ResolvedBuffer[] {\n const resolved: ResolvedBuffer[] = [];\n for (const entry of this.resources.entries()) {\n if (entry.descriptor.kind !== 'buffer') continue;\n const role = entry.descriptor.bufferRole ?? 'auto-storage-or-uniform';\n const resolvedBufferType: ResolvedBufferType =\n role === 'uniform' ? 'uniform' : caps.storageBuffer ? 'read-only-storage' : 'uniform';\n resolved.push({ key: entry.key, resolvedBufferType });\n }\n return resolved;\n }\n\n private validateColorTargetFormats(): Result<undefined, RenderGraphError> {\n for (const entry of this.resources.entries()) {\n const meta = entry.colorTarget;\n if (!meta || VALID_GPU_TEXTURE_FORMAT_SET.has(meta.format)) continue;\n\n return err(\n new RenderGraphError({\n code: 'invalid-format',\n expected: `addColorTarget format must be a valid GPU texture format; received '${meta.format}'`,\n hint: `replace '${meta.format}' with one of detail.expected before recompiling`,\n detail: {\n resourceKey: entry.key,\n format: meta.format,\n expected: VALID_GPU_TEXTURE_FORMATS,\n },\n }),\n );\n }\n return ok(undefined);\n }\n\n /**\n * Phase 7: allocate GPU textures for registered color targets (D-1 / D-2).\n *\n * For each addColorTarget resource, resolves the concrete size from the\n * ColorTargetSize descriptor and swapChainSize, then looks up the transient\n * pool by descriptor key. Pool hit reuses the same physical texture/view;\n * pool miss (drift) triggers device.createTexture/createTextureView rebuild.\n *\n * Alias targets (addColorTargetAlias) fold into the source's physical texture\n * (KB-1 MoveNode pattern). Persistent targets are retained across compiles\n * with size-drift rebuild.\n *\n * device === undefined is a no-op (returns an empty map).\n * Allocation is transactional: newly created textures are destroyed on any\n * failure, and pool mutations are committed only after every target succeeds.\n */\n private allocateColorTargets(\n device: RhiDevice | undefined,\n invalidateTransientPool = false,\n ): Result<StagedColorTargetAllocation, RenderGraphError> {\n const result = new Map<string, TextureView>();\n if (\n !device ||\n typeof (device as unknown as Record<string, unknown>).createTexture !== 'function'\n )\n return ok({ resolvedTextures: result, transient: new Map(), persistent: new Map() });\n\n const stagedTransient = new Map<string, PooledTexture>();\n const stagedPersistent = new Map<string, PooledTexture>();\n const stagedAllocations: PooledTexture[] = [];\n const discardStaged = (): void => {\n for (const pooled of stagedAllocations) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // A cleanup failure must not hide the allocation error.\n }\n }\n };\n\n for (const entry of this.resources.entries()) {\n const meta = entry.colorTarget;\n if (!meta) continue;\n\n // Resolve alias: fold to source physical texture.\n if (meta.aliasedFrom !== undefined) {\n const sourceView = result.get(meta.aliasedFrom);\n const sourceTexture = result.get(`${meta.aliasedFrom}::tex`);\n if (sourceView === undefined || sourceTexture === undefined) {\n discardStaged();\n return err(\n new RenderGraphError({\n code: 'alias-source-missing',\n expected: `alias '${entry.key}' source '${meta.aliasedFrom}' must resolve to a compiled color target`,\n hint: `register color target '${meta.aliasedFrom}' before compiling alias '${entry.key}'`,\n detail: {\n aliasKey: entry.key,\n sourceKey: meta.aliasedFrom,\n } satisfies AliasSourceDetail,\n }),\n );\n }\n result.set(entry.key, sourceView);\n result.set(`${entry.key}::tex`, sourceTexture);\n continue;\n }\n\n const width = this.resolveWidth(meta.size);\n const height = this.resolveHeight(meta.size);\n const lifetime = entry.lifetime;\n\n // feat-20260612-hdrp-ssao M9 scope-amendment (M8 graph barrier):\n // Include the resource name in the transient pool key. Without this,\n // two simultaneously-active transient color targets with identical\n // descriptors (e.g. ssaoRaw / ssaoBlurred — both r8unorm half-swapchain\n // RENDER_ATTACHMENT|TEXTURE_BINDING) share the same GPU texture. When\n // one pass writes and the next pass both writes (color attachment) and\n // reads (texture binding from the same view), WebGPU rejects the command\n // buffer: \"TextureBinding|RenderAttachment in the same synchronization\n // scope.\"\n const descriptorKey = poolKey({\n format: meta.format,\n width,\n height,\n usage: meta.usage,\n sample: meta.sample,\n viewFormats: meta.viewFormats ?? [],\n });\n const key = `${entry.key}:${descriptorKey}`;\n\n if (lifetime === 'transient') {\n const pooled = invalidateTransientPool ? undefined : this.transientPool.get(key);\n if (pooled) {\n result.set(entry.key, pooled.view as TextureView);\n // w7-fix (round 3): re-publish the GPU Texture handle on every\n // compile, not only on pool-miss. Without this the second compile\n // (the recompile-on-resize path) leaves `${entry.key}::tex` empty,\n // breaking consumers that read `getColorTargetTexture` (shadow\n // debugReadback, fxaa copyTextureToTexture, MSAA srgb-view creation).\n // biome-ignore lint/suspicious/noExplicitAny: opaque RHI texture handle\n result.set(`${entry.key}::tex`, pooled.texture as any);\n continue;\n }\n } else if (lifetime === 'persistent') {\n const persisted = this.persistentTextures.get(entry.key);\n if (persisted?.descriptorKey === descriptorKey) {\n result.set(entry.key, persisted.view as TextureView);\n // biome-ignore lint/suspicious/noExplicitAny: opaque RHI texture handle\n result.set(`${entry.key}::tex`, persisted.texture as any);\n continue;\n }\n }\n\n // Pool miss or persistent fresh allocation: create new texture.\n const texResult = device.createTexture({\n label: entry.key,\n size: { width, height, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: meta.sample,\n dimension: '2d',\n format: meta.format,\n usage: meta.usage,\n viewFormats: meta.viewFormats ?? [],\n } as never);\n\n if (!texResult.ok) {\n discardStaged();\n return err(\n new RenderGraphError({\n code: 'resource-alloc-failed',\n expected: `device.createTexture must succeed for color target '${entry.key}'`,\n hint: `retry after recovering the RHI allocation failure for '${entry.key}'`,\n detail: {\n resourceKey: entry.key,\n rhiCode: texResult.error.code,\n },\n }),\n );\n }\n\n const viewResult = device.createTextureView(texResult.value, {});\n if (!viewResult.ok) {\n try {\n device.destroyTexture(texResult.value);\n } catch {\n // A cleanup failure must not hide the allocation error.\n }\n discardStaged();\n return err(\n new RenderGraphError({\n code: 'resource-alloc-failed',\n expected: `device.createTextureView must succeed for color target '${entry.key}'`,\n hint: `retry after recovering the RHI view allocation failure for '${entry.key}'`,\n detail: {\n resourceKey: entry.key,\n rhiCode: viewResult.error.code,\n },\n }),\n );\n }\n\n const pooled: PooledTexture = {\n texture: texResult.value,\n view: viewResult.value,\n descriptorKey,\n };\n stagedAllocations.push(pooled);\n\n if (lifetime === 'transient') {\n stagedTransient.set(key, pooled);\n } else {\n stagedPersistent.set(entry.key, pooled);\n }\n\n result.set(entry.key, viewResult.value);\n // biome-ignore lint/suspicious/noExplicitAny: store Texture alongside TextureView\n result.set(`${entry.key}::tex`, texResult.value as any);\n }\n\n return ok({\n resolvedTextures: result,\n transient: stagedTransient,\n persistent: stagedPersistent,\n });\n }\n\n private resolveWidth(size: ColorTargetDescriptor['size']): number {\n if (typeof size === 'string') {\n return size === 'half-swapchain' ? Math.ceil(this.swapChainWidth / 2) : this.swapChainWidth;\n }\n return size.w;\n }\n\n private resolveHeight(size: ColorTargetDescriptor['size']): number {\n if (typeof size === 'string') {\n return size === 'half-swapchain' ? Math.ceil(this.swapChainHeight / 2) : this.swapChainHeight;\n }\n return size.h;\n }\n\n private validateNoDanglingRead(\n passList: readonly PassEntry<Ctx>[],\n ): Result<never, RenderGraphError> | null {\n const writers = new Set<string>();\n for (const pass of passList) {\n for (const key of pass.descriptor.reads) {\n const imported = this.resources.get(key)?.descriptor.lifetime === 'persistent';\n if (key !== 'swapchain' && !imported && !writers.has(key)) {\n return err(\n new RenderGraphError({\n code: 'dangling-read',\n expected: `pass '${pass.name}' reads key '${key}' but no pass writes it`,\n hint: `add a pass that writes '${key}', or remove '${key}' from pass '${pass.name}' reads`,\n detail: {\n resourceKey: key,\n passName: pass.name,\n } satisfies DanglingReadDetail,\n }),\n );\n }\n }\n for (const key of pass.descriptor.writes) writers.add(key);\n }\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/kernel-internal.ts","../src/compiled-graph.ts","../src/resource-registry.ts","../src/builder.ts","../src/observation.ts","../src/pass-registry.ts","../src/pipeline/color-value-domain.ts","../src/graph.ts"],"names":["pooled"],"mappings":";;;;AAuMO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACjC,IAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EAET,YAAY,IAAA,EAAuC;AACjD,IAAA,KAAA,CAAM,CAAA,kBAAA,EAAqB,KAAK,IAAI,CAAA,YAAA,EAAe,KAAK,QAAQ,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACtF,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACjB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AACF;;;AC9KO,SAAS,aAAA,CAAc,OAAe,EAAA,EAA0B;AACrE,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,OAAO,EAAA,EAAI,IAAA,EAAM,WAAW,CAAA;AACrD;AAEO,SAAS,iBAAA,CAAkB,KAAA,EAAe,EAAA,EAAY,SAAA,EAAqC;AAChG,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,KAAA;AAAA,IACA,EAAA;AAAA,IACA,IAAA,EAAM,cAAA;AAAA,IACN;AAAA,GACD,CAAA;AACH;AAEO,SAAS,YAAA,CAAa,OAAe,EAAA,EAAyB;AACnE,EAAA,OAAO,OAAO,MAAA,CAAO,EAAE,OAAO,EAAA,EAAI,IAAA,EAAM,UAAU,CAAA;AACpD;AAEO,SAAS,WAAW,QAAA,EAAmD;AAC5E,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,MAAM,OAAO,MAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,QAAA;AAClB,EAAA,IAAI,OAAO,UAAU,EAAA,KAAO,QAAA,IAAY,OAAO,SAAA,CAAU,KAAA,KAAU,UAAU,OAAO,MAAA;AACpF,EAAA,IACE,SAAA,CAAU,SAAS,SAAA,IACnB,SAAA,CAAU,SAAS,cAAA,IACnB,SAAA,CAAU,SAAS,QAAA,EACnB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAA;AACT;AA2EO,SAAS,iBAAiB,MAAA,EAAyC;AACxE,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AACvC,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,cAAA,EAAgB,OAAO,IAAA,CAAK,SAAA;AAC/C,EAAA,OAAO,IAAA,EAAM,EAAA;AACf;;;AC/GA,SAAS,eAAA,CAAgB,OAAe,KAAA,EAAmC;AACzE,EAAA,OAAO,IAAI,gBAAA,CAAiB;AAAA,IAC1B,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,aAAa,KAAK,CAAA,8CAAA,CAAA;AAAA,IAC5B,IAAA,EAAM,kCAAkC,KAAK,CAAA,4BAAA,CAAA;AAAA,IAC7C,QAAQ,EAAE,aAAA,EAAe,KAAA,EAAO,GAAI,UAAU,MAAA,GAAY,EAAC,GAAI,EAAE,UAAU,CAAC,MAAA,CAAO,KAAK,CAAC,GAAE;AAAG,GAC/F,CAAA;AACH;AAEO,IAAM,0BAAN,MAEP;AAAA,EAIE,WAAA,CACmB,YACA,KAAA,EACA,MAAA,EACA,WACA,KAAA,EACA,MAAA,EACA,MACA,sBAAA,EACjB;AARiB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,sBAAA,GAAA,sBAAA;AAAA,EAChB;AAAA,EARgB,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,sBAAA;AAAA,EAXX,OAAA,GAAU,KAAA;AAAA,EACV,YAAA;AAAA,EAaR,OAAA,GAAmC;AACjC,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEA,mBAAmB,IAAA,EAAuC;AACxD,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,OAAO,SAAS,CAAA;AACzD,MAAA,IAAI,QAAA,EAAU,MAAA,CAAO,KAAA,KAAU,IAAA,SAAa,IAAA,CAAK,IAAA;AAAA,IACnD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,sBAAsB,IAAA,EAAmC;AACvD,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,KAAA,KAAU,IAAA,SAAa,QAAA,CAAS,OAAA;AAAA,IACtD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,yBAAyB,IAAA,EAAyD;AAChF,IAAA,OAAO,IAAA,CAAK,sBAAA,CAAuB,GAAA,CAAI,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAA,CACE,KAAA,EACA,OAAA,EACA,eAAA,EACgC;AAChC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,wBAAA;AAAA,UACN,QAAA,EAAU,gDAAA;AAAA,UACV,IAAA,EAAM,oDAAA;AAAA,UACN,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA;AAAW,SACvC;AAAA,OACH;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,qBAAA,CAAsB,KAAK,CAAA;AACjD,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AAEzB,IAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,IAAI,KAAK,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG;AAC1D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,SAAS,KAAK,CAAA;AAC7D,MAAA,IAAI;AACF,QAAA,IAAI,KAAK,IAAA,CAAK,UAAA,CAAW,SAAA,GAAY,KAAK,MAAM,KAAA,EAAO;AACvD,QAAA,MAAM,SAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,cAAA,EAAe;AAC1E,QAAA,MAAM,KAAA,GAAQ,eAAA,EAAiB,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AACrD,QAAA,IAAI,YAAA,GAA+C,GAAG,KAAA,CAAS,CAAA;AAC/D,QAAA,MAAM,SAAS,MAAM;AACnB,UAAA,QAAQ,IAAA,CAAK,KAAK,IAAA;AAAM,YACtB,KAAK,QAAA,EAAU;AACb,cAAA,MAAM,UAAA,GAAa,KAAK,IAAA,CAAK,UAAA;AAC7B,cAAA,MAAM,mBAAgD,EAAC;AACvD,cAAA,KAAA,MAAW,UAAA,IAAc,WAAW,gBAAA,EAAkB;AACpD,gBAAA,MAAM,IAAA,GAAO,QAAA,CAAS,WAAA,CAAY,UAAA,CAAW,IAAI,CAAA;AACjD,gBAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,kBAAA,YAAA,GAAe,IAAA;AACf,kBAAA;AAAA,gBACF;AACA,gBAAA,MAAM,aAAA,GACJ,WAAW,aAAA,KAAkB,KAAA,CAAA,GACzB,SACA,QAAA,CAAS,WAAA,CAAY,WAAW,aAAa,CAAA;AACnD,gBAAA,IAAI,aAAA,KAAkB,KAAA,CAAA,IAAa,CAAC,aAAA,CAAc,EAAA,EAAI;AACpD,kBAAA,YAAA,GAAe,aAAA;AACf,kBAAA;AAAA,gBACF;AACA,gBAAA,MAAM,UAAA,GACJ,OAAO,UAAA,CAAW,UAAA,KAAe,aAC7B,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,GAC3B,UAAA,CAAW,UAAA;AACjB,gBAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,kBACpB,MAAM,IAAA,CAAK,KAAA;AAAA,kBACX,GAAI,kBAAkB,KAAA,CAAA,GAAY,KAAK,EAAE,aAAA,EAAe,cAAc,KAAA,EAAM;AAAA,kBAC5E,GAAI,UAAA,KAAe,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,UAAA,EAAW;AAAA,kBACjD,QAAQ,UAAA,CAAW,MAAA;AAAA,kBACnB,SAAS,UAAA,CAAW,OAAA;AAAA,kBACpB,GAAI,WAAW,UAAA,KAAe,KAAA,CAAA,GAC1B,EAAC,GACD,EAAE,UAAA,EAAY,UAAA,CAAW,UAAA;AAAW,iBACzC,CAAA;AAAA,cACH;AACA,cAAA,IAAI,sBAAA;AACJ,cAAA,IAAI,UAAA,CAAW,2BAA2B,KAAA,CAAA,EAAW;AACnD,gBAAA,MAAM,aAAa,UAAA,CAAW,sBAAA;AAC9B,gBAAA,MAAM,IAAA,GAAO,QAAA,CAAS,WAAA,CAAY,UAAA,CAAW,IAAI,CAAA;AACjD,gBAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,kBAAA,YAAA,GAAe,IAAA;AACf,kBAAA;AAAA,gBACF;AACA,gBAAA,sBAAA,GAAyB;AAAA,kBACvB,MAAM,IAAA,CAAK,KAAA;AAAA,kBACX,GAAI,WAAW,eAAA,KAAoB,KAAA,CAAA,GAC/B,EAAC,GACD,EAAE,eAAA,EAAiB,UAAA,CAAW,eAAA,EAAgB;AAAA,kBAClD,GAAI,WAAW,WAAA,KAAgB,KAAA,CAAA,GAC3B,EAAC,GACD,EAAE,WAAA,EAAa,UAAA,CAAW,WAAA,EAAY;AAAA,kBAC1C,GAAI,WAAW,YAAA,KAAiB,KAAA,CAAA,GAC5B,EAAC,GACD,EAAE,YAAA,EAAc,UAAA,CAAW,YAAA,EAAa;AAAA,kBAC5C,GAAI,WAAW,aAAA,KAAkB,KAAA,CAAA,GAC7B,EAAC,GACD,EAAE,aAAA,EAAe,UAAA,CAAW,aAAA,EAAc;AAAA,kBAC9C,GAAI,WAAW,iBAAA,KAAsB,KAAA,CAAA,GACjC,EAAC,GACD,EAAE,iBAAA,EAAmB,UAAA,CAAW,iBAAA,EAAkB;AAAA,kBACtD,GAAI,WAAW,aAAA,KAAkB,KAAA,CAAA,GAC7B,EAAC,GACD,EAAE,aAAA,EAAe,UAAA,CAAW,aAAA,EAAc;AAAA,kBAC9C,GAAI,WAAW,cAAA,KAAmB,KAAA,CAAA,GAC9B,EAAC,GACD,EAAE,cAAA,EAAgB,UAAA,CAAW,cAAA,EAAe;AAAA,kBAChD,GAAI,WAAW,eAAA,KAAoB,KAAA,CAAA,GAC/B,EAAC,GACD,EAAE,eAAA,EAAiB,UAAA,CAAW,eAAA;AAAgB,iBACpD;AAAA,cACF;AACA,cAAA,MAAM,cAAA,GAAiB;AAAA,gBACrB,OAAO,IAAA,CAAK,IAAA;AAAA,gBACZ,gBAAA;AAAA,gBACA,GAAI,sBAAA,KAA2B,KAAA,CAAA,GAAY,EAAC,GAAI,EAAE,sBAAA;AAAuB,eAC3E;AACA,cAAA,MAAM,sBAAA,GACJ,KAAA,EAAO,oBAAA,GAAuB,cAAc,CAAA,IAAK,cAAA;AACnD,cAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,eAAA,CAAgB,sBAAsB,CAAA;AACpE,cAAA,IAAI;AACF,gBAAA,UAAA,CAAW,OAAO,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,SAAA,EAAW,UAAU,CAAA;AAAA,cACjE,CAAA,SAAE;AACA,gBAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,cACd;AACA,cAAA;AAAA,YACF;AAAA,YACA,KAAK,SAAA,EAAW;AACd,cAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,KAAK,CAAA;AAChD,cAAA,MAAM,oBAAoB,KAAA,EAAO,qBAAA,GAAwB,KAAA,IAAS,EAAE,CAAA,IAAK,KAAA;AACzE,cAAA,IAAI,OAAA;AACJ,cAAA,IAAI;AACF,gBAAA,OAAA,GAAU,KAAA,CAAM,QAAQ,gBAAA,CAAiB;AAAA,kBACvC,GAAI,qBAAqB,EAAC;AAAA,kBAC1B,OAAO,IAAA,CAAK;AAAA,iBACb,CAAA;AAAA,cACH,SAAS,KAAA,EAAO;AACd,gBAAA,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,YAAA,GAAe,KAAA,EAAO,KAAK,CAAA;AAChD,gBAAA,MAAM,KAAA;AAAA,cACR;AACA,cAAA,IAAI;AACF,gBAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAA,CAAO,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,CAAA;AAAA,cAC3E,CAAA,SAAE;AACA,gBAAA,OAAA,CAAQ,GAAA,EAAI;AAAA,cACd;AACA,cAAA,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,KAAA,GAAQ,KAAK,CAAA;AAClC,cAAA;AAAA,YACF;AAAA,YACA,KAAK,MAAA;AACH,cAAA,KAAA,EAAO,UAAA,GAAa,MAAM,OAAO,CAAA;AACjC,cAAA,IAAI;AACF,gBAAA,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,CAAA;AAAA,cACpF,CAAA,SAAE;AACA,gBAAA,KAAA,EAAO,SAAA,GAAY,MAAM,OAAO,CAAA;AAAA,cAClC;AACA,cAAA;AAAA;AACJ,QACF,CAAA;AACA,QAAA,IAAI,YAAY,KAAA,CAAA,EAAW;AACzB,UAAA,MAAA,EAAO;AAAA,QACT,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,WAAW,MAAM,CAAA;AAAA,QAC3B;AACA,QAAA,IAAI,CAAC,YAAA,CAAa,EAAA,EAAI,OAAO,YAAA;AAAA,MAC/B,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,oBAAA;AAAA,YACN,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,0BAAA,CAAA;AAAA,YAC5B,IAAA,EAAM,4DAAA;AAAA,YACN,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,MAAM,QAAA,EAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA;AAAM,WAChE;AAAA,SACH;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEA,MAAA,GAAkD;AAChD,IAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,MAAA,EAAW,OAAO,IAAA,CAAK,YAAA;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAA,CAAK,YAAA,GAAe,KAAK,YAAA,EAAa;AACtC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,MAAc,YAAA,GAAwD;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAoB;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,wBAAA;AAAA,UACN,QAAA,EAAU,iEAAA;AAAA,UACV,IAAA,EAAM,+DAAA;AAAA,UACN,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,CAAK,YAAY,KAAA;AAAM,SAC9C;AAAA,OACH;AAAA,IACF;AAEA,IAAA,IAAI,YAAA;AACJ,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AAC3C,MAAA,IAAI,QAAA,CAAS,OAAA,KAAY,MAAA,IAAa,QAAA,CAAS,WAAW,MAAA,EAAW;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GACJ,QAAA,CAAS,MAAA,CAAO,IAAA,KAAS,YACrB,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,QAAA,CAAS,OAAkB,CAAA,GACtD,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,SAAS,MAAgB,CAAA;AACzD,QAAA,IAAI,CAAC,SAAA,CAAU,EAAA,IAAM,YAAA,KAAiB,KAAA,CAAA,EAAW;AAC/C,UAAA,YAAA,GAAe,IAAI,gBAAA,CAAiB;AAAA,YAClC,IAAA,EAAM,wBAAA;AAAA,YACN,QAAA,EAAU,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,sBAAA,CAAA;AAAA,YAC1D,IAAA,EAAM,kDAAA;AAAA,YACN,MAAA,EAAQ;AAAA,cACN,YAAY,IAAA,CAAK,UAAA;AAAA,cACjB,aAAA,EAAe,SAAS,MAAA,CAAO,KAAA;AAAA,cAC/B,OAAO,SAAA,CAAU;AAAA;AACnB,WACD,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,KAAiB,IAAI,gBAAA,CAAiB;AAAA,UACpC,IAAA,EAAM,wBAAA;AAAA,UACN,QAAA,EAAU,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,sBAAA,CAAA;AAAA,UAC1D,IAAA,EAAM,kDAAA;AAAA,UACN,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,CAAK,YAAY,aAAA,EAAe,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,KAAA;AAAM,SACpF,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,OAAO,iBAAiB,MAAA,GAAY,EAAA,CAAG,MAAS,CAAA,GAAI,IAAI,YAAY,CAAA;AAAA,EACtE;AAAA,EAEQ,sBAAsB,KAAA,EAA2D;AACvF,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAqB;AAC1C,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAE3C,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1B,MAAA,IAAI;AACF,QAAA,IAAI,QAAA,CAAS,MAAA,CAAO,IAAA,KAAS,SAAA,EAAW;AACtC,UAAA,MAAM,OAAA,GACJ,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,SAAA,GACvB,SAAS,OAAA,GACT,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACnC,UAAA,IAAI,OAAA,KAAY,QAAW,OAAO,GAAA,CAAI,gBAAgB,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAC5E,UAAA,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,OAAO,CAAA;AAAA,QAC1C,CAAA,MAAO;AACL,UAAA,MAAM,MAAA,GACJ,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,SAAA,GAAY,SAAS,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACxF,UAAA,IAAI,MAAA,KAAW,QAAW,OAAO,GAAA,CAAI,gBAAgB,QAAA,CAAS,MAAA,CAAO,KAAK,CAAC,CAAA;AAC3E,UAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA,QACxC;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,IAAI,eAAA,CAAgB,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,YAAA,IAAgB,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,YAAA,CAAa,OAAO,SAAS,CAAA,EAAG,UAAU,CAAA,EAAG;AACpE,MAAA,IAAI,YAAA,CAAa,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW;AAC7C,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,GAAA,CAAI,aAAa,MAAA,CAAO,EAAA,EAAI,aAAa,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,QACtE,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,IAAI,eAAA,CAAgB,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,QAC9D;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,YAAA,CAAa,SAAS,MAAA,EAAW;AACnC,QAAA,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,aAAa,IAAI,CAAA;AACnD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,YAAA,CAAa,OAAO,SAAS,CAAA;AAC1D,MAAA,IAAI,OAAA,KAAY,QAAW,OAAO,GAAA,CAAI,gBAAgB,YAAA,CAAa,MAAA,CAAO,KAAK,CAAC,CAAA;AAChF,MAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,kBAAkB,OAAA,EAAS,YAAA,CAAa,OAAO,UAAU,CAAA;AACrF,MAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,EAAI,OAAO,GAAA,CAAI,eAAA,CAAgB,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AACrF,MAAA,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,QAAQ,KAAK,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,EAAA,CAAG,EAAE,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAAA,EACxC;AAAA,EAEQ,kBAAA,CACN,MACA,cAAA,EACuB;AACvB,IAAA,MAAM,MAAA,GAAS,CACb,QAAA,EACA,YAAA,KACiD;AACjD,MAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA;AAChC,MAAA,MAAM,aAAa,IAAA,EAAM,IAAA,KAAS,cAAA,GAAiB,IAAA,CAAK,YAAY,IAAA,EAAM,EAAA;AAC1E,MAAA,IAAI,IAAA,KAAS,UAAa,IAAA,CAAK,KAAA,KAAU,KAAK,KAAA,IAAS,IAAA,CAAK,SAAS,YAAA,EAAc;AACjF,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,yBAAA;AAAA,YACN,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,gDAAA,CAAA;AAAA,YAC5B,IAAA,EAAM,iEAAA;AAAA,YACN,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA;AAAK,WAC/B;AAAA,SACH;AAAA,MACF;AACA,MAAA,IAAI,eAAe,MAAA,IAAa,CAAC,KAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA,EAAG;AACjE,QAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,IAAI,UAAA,IAAc,EAAE,GAAG,MAAA,CAAO,KAAA;AAC3D,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,+BAAA;AAAA,YACN,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,iDAAA,CAAA;AAAA,YAC5B,IAAA,EAAM,0DAAA;AAAA,YACN,QAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,eAAe,KAAA;AAAM,WACrD;AAAA,SACH;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,SAAS,cAAA,IAAkB,CAAC,KAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC9D,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,EAAE,GAAG,MAAA,CAAO,KAAA;AAC9C,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,+BAAA;AAAA,YACN,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,CAAA,qDAAA,CAAA;AAAA,YAC5B,IAAA,EAAM,kDAAA;AAAA,YACN,QAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,eAAe,KAAA;AAAM,WACrD;AAAA,SACH;AAAA,MACF;AACA,MAAA,OAAO,GAAG,IAAI,CAAA;AAAA,IAChB,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,CAAC,QAAA,KAAa;AACpB,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA;AACtC,QAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA;AACrB,QAAA,MAAM,SAAS,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,EAAE,CAAA;AACvD,QAAA,OAAO,WAAW,MAAA,GACd,GAAA,CAAI,eAAA,CAAgB,IAAA,CAAK,UAAU,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,EAAE,GAAG,MAAA,CAAO,KAAA,IAAS,QAAQ,CAAC,CAAA,GAChF,GAAG,MAAM,CAAA;AAAA,MACf,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,QAAA,KAAa;AACrB,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,EAAU,SAAS,CAAA;AACvC,QAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA;AACrB,QAAA,MAAM,UAAU,cAAA,CAAe,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,MAAM,EAAE,CAAA;AACzD,QAAA,OAAO,YAAY,MAAA,GACf,GAAA,CAAI,eAAA,CAAgB,IAAA,CAAK,UAAU,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,EAAE,GAAG,MAAA,CAAO,KAAA,IAAS,SAAS,CAAC,CAAA,GACjF,GAAG,OAAO,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,WAAA,EAAa,CAAC,QAAA,KAAa;AACzB,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,EAAU,cAAc,CAAA;AAC5C,QAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA;AACrB,QAAA,MAAM,OAAO,cAAA,CAAe,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAM,EAAE,CAAA;AACnD,QAAA,OAAO,SAAS,MAAA,GACZ,GAAA,CAAI,eAAA,CAAgB,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,EAAE,GAAG,MAAA,CAAO,KAAA,IAAS,cAAc,CAAC,CAAA,GAClF,GAAG,IAAI,CAAA;AAAA,MACb;AAAA,KACF;AAAA,EACF;AACF,CAAA;;;ACzYO,SAAS,gCAAA,CACd,qBACA,aAAA,EACS;AACT,EAAA,IAAI,aAAA,KAAkB,QAAW,OAAO,IAAA;AACxC,EAAA,IAAI,mBAAA,KAAwB,IAAA,EAAM,OAAO,aAAA,KAAkB,IAAA;AAC3D,EAAA,OAAO,aAAA,KAAkB,IAAA;AAC3B;AAsCO,IAAM,mBAAN,MAAuB;AAAA,EACX,SAAA,uBAAgB,GAAA,EAA2B;AAAA,EAE5D,GAAA,CAAI,KAAa,UAAA,EAAyE;AACxF,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,GAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAU,UAAA,CAAW;AAAA,KACvB;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAA,CACE,MACA,IAAA,EACyC;AACzC,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,WAAA;AAClC,IAAA,MAAM,eAAA,GAA2C;AAAA,MAC/C,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAA,EAAQ,KAAK,MAAA,IAAU,CAAA;AAAA,MACvB,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,EAAA,GAAO,CAAA;AAAA;AAAA,MAC5B,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,EAAC;AAAA,MAC3D,GAAI,KAAK,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY,GAAI;AAAC,KAC5E;AACA,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,GAAA,EAAK,IAAA;AAAA,MACL,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS;AAAA,MACxC,QAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACf;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAA,CAAoB,MAAc,MAAA,EAAyD;AACzF,IAAA,IAAI,IAAA,CAAK,UAAU,GAAA,CAAI,IAAI,GAAG,OAAO,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAChE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,EAAG,WAAA;AAC/C,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,sBAAA;AAAA,UACN,QAAA,EAAU,CAAA,OAAA,EAAU,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,mCAAA,CAAA;AAAA,UAC3C,IAAA,EAAM,CAAA,qBAAA,EAAwB,MAAM,CAAA,+BAAA,EAAkC,IAAI,CAAA,CAAA,CAAA;AAAA,UAC1E,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,EAAM,WAAW,MAAA;AAAO,SAC7C;AAAA,OACH;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,GAAA,EAAK,IAAA;AAAA,MACL,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,WAAA,EAAY;AAAA,MACrD,QAAA,EAAU,WAAA;AAAA,MACV,WAAA,EAAa;AAAA,QACX,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,GAAI,WAAW,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAO,GAAI,EAAC;AAAA,QACvE,GAAI,WAAW,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,UAAA,CAAW,WAAA,EAAY,GAAI,EAAC;AAAA,QACtF,WAAA,EAAa;AAAA;AACf,KACF;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEQ,kBAAkB,GAAA,EAAsD;AAC9E,IAAA,OAAO,GAAA;AAAA,MACL,IAAI,gBAAA,CAAiB;AAAA,QACnB,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,iBAAiB,GAAG,CAAA,yBAAA,CAAA;AAAA,QAC9B,IAAA,EAAM,kDAAkD,GAAG,CAAA,wBAAA,CAAA;AAAA,QAC3D,MAAA,EAAQ,EAAE,WAAA,EAAa,GAAA;AAAI,OAC5B;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,SAAS,KAAA,EAA+D;AAC9E,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,GAAG,GAAG,OAAO,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,GAAG,CAAA;AAC1E,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA;AACnC,IAAA,OAAO,GAAG,KAAK,CAAA;AAAA,EACjB;AAAA,EAEA,IAAI,GAAA,EAAwC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAAA,EAC/B;AAAA,EAEA,mBAAmB,GAAA,EAAkD;AACnE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG,WAAA;AAAA,EAClC;AAAA,EAEA,IAAI,GAAA,EAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAAA,EAC/B;AAAA,EAEA,OAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,UAAU,MAAA,EAAO;AAAA,EAC/B;AACF,CAAA;;;ACzIA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,KAAA,EAAO,EAAA;AAAA,EACP,MAAA,EAAQ,EAAA;AAAA,EACR,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,GAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,cAAA,EAAgB,CAAA;AAAA,EAChB,cAAA,EAAgB,CAAA;AAAA,EAChB,gBAAA,EAAkB;AACpB,CAAA;AAEA,IAAI,cAAA,GAAiB,CAAA;AAErB,SAAS,eAAA,CACP,MAAA,EACA,MAAA,EACA,aAAA,EACoB;AACpB,EAAA,MAAM,aAAA,GACJ,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,aAAa,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,QAAA,GAC9E,CAAA,GACA,MAAA,KAAW,UAAA,IACT,MAAA,KAAW,cACX,MAAA,KAAW,SAAA,IACX,MAAA,KAAW,SAAA,GACX,CAAA,GACA,MAAA,KAAW,YAAA,IACT,MAAA,KAAW,qBACX,MAAA,KAAW,YAAA,IACX,MAAA,KAAW,WAAA,IACX,WAAW,WAAA,IACX,MAAA,KAAW,UAAA,IACX,MAAA,KAAW,aACX,MAAA,KAAW,SAAA,GACX,CAAA,GACA,MAAA,KAAW,WAAA,IACT,MAAA,KAAW,UAAA,IACX,MAAA,KAAW,cACX,MAAA,KAAW,WAAA,IACX,MAAA,KAAW,WAAA,GACX,CAAA,GACA,MAAA,KAAW,aAAA,IACT,MAAA,KAAW,gBACX,MAAA,KAAW,YAAA,IACX,MAAA,KAAW,aAAA,IACX,MAAA,KAAW,aAAA,IACX,MAAA,KAAW,WAAA,IACX,WAAW,UAAA,IACX,MAAA,KAAW,UAAA,GACX,CAAA,GACA,WAAW,aAAA,IAAiB,MAAA,KAAW,YAAA,IAAgB,MAAA,KAAW,eAChE,EAAA,GACA,MAAA;AAChB,EAAA,IAAI,aAAA,KAAkB,QAAW,OAAO,MAAA;AACxC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,QAAQ,MAAA,CAAO,KAAA;AACnB,EAAA,IAAI,SAAS,MAAA,CAAO,MAAA;AACpB,EAAA,IAAI,QAAQ,MAAA,CAAO,kBAAA;AACnB,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,aAAA,EAAe,SAAS,CAAA,EAAG;AACrD,IAAA,KAAA,IAAS,KAAA,GAAQ,SAAS,KAAA,GAAQ,aAAA;AAClC,IAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AACzC,IAAA,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAC3C,IAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,KAAA;AACT;AAqBA,SAAS,YAAY,MAAA,EAAmC;AACtD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,cAAA;AACH,MAAA,OAAO,YAAA,CAAa,OAAA;AAAA,IACtB,KAAK,cAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,oBAAA;AACH,MAAA,OAAO,YAAA,CAAa,OAAA;AAAA,IACtB,KAAK,eAAA;AACH,MAAA,OAAO,YAAA,CAAa,QAAA;AAAA,IACtB,KAAK,aAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAA;AAAA,IACtB,KAAK,YAAA;AACH,MAAA,OAAO,YAAA,CAAa,KAAA;AAAA,IACtB,KAAK,UAAA;AACH,MAAA,OAAO,YAAA,CAAa,OAAA;AAAA,IACtB,KAAK,UAAA;AACH,MAAA,OAAO,YAAA,CAAa,OAAA;AAAA;AAE1B;AAEA,SAAS,aAAa,MAAA,EAAoC;AACxD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,cAAA;AACH,MAAA,OAAO,aAAA,CAAc,cAAA;AAAA,IACvB,KAAK,cAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,oBAAA;AACH,MAAA,OAAO,aAAA,CAAc,cAAA;AAAA,IACvB,KAAK,4BAAA;AACH,MAAA,OAAO,aAAA,CAAc,iBAAiB,aAAA,CAAc,cAAA;AAAA,IACtD,KAAK,kBAAA;AAAA,IACL,KAAK,oBAAA;AAAA,IACL,KAAK,qBAAA;AACH,MAAA,OAAO,aAAA,CAAc,gBAAA;AAAA,IACvB,KAAK,UAAA;AACH,MAAA,OAAO,aAAA,CAAc,OAAA;AAAA,IACvB,KAAK,UAAA;AACH,MAAA,OAAO,aAAA,CAAc,OAAA;AAAA;AAE3B;AAEA,SAAS,WAAW,MAAA,EAGlB;AACA,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,oBAAA;AAAA,IACL,KAAK,4BAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IACnC,KAAK,eAAA;AAAA,IACL,KAAK,kBAAA;AAAA,IACL,KAAK,qBAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAAA,IACpC;AACE,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAAA;AAExC;AAEA,SAAS,aAAA,CACP,MACA,KAAA,EACS;AACT,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW,OAAO,IAAA;AACtD,EAAA,MAAM,aAAA,GACJ,KAAK,MAAA,KAAW,KAAA,IAAS,MAAM,MAAA,KAAW,KAAA,IAAS,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,MAAA;AAC3E,EAAA,OACE,aAAA,IACA,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,UACtB,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,MAAA,IACtB,KAAK,UAAA,GAAa,KAAA,CAAM,QAAA,IACxB,KAAA,CAAM,aAAa,IAAA,CAAK,QAAA;AAE5B;AAEA,SAAS,WAAW,IAAA,EAAwD;AAC1E,EAAA,MAAM,gBAAA,GAAmB,CAAC,UAAA,KAA2C;AACnE,IAAA,IAAI,UAAA,CAAW,SAAS,SAAA,EAAW,OAAO,OAAO,MAAA,CAAO,EAAE,GAAG,UAAA,EAAY,CAAA;AACzE,IAAA,MAAM,IAAA,GACJ,OAAO,UAAA,CAAW,IAAA,KAAS,QAAA,GAAW,UAAA,CAAW,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,UAAA,CAAW,MAAM,CAAA;AAC9F,IAAA,OAAO,OAAO,MAAA,CAAO,EAAE,GAAG,UAAA,EAAY,MAAM,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACb,KAAK,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,IAAA,KACf,MAAA,CAAO,MAAA,CAAO;AAAA,UACZ,GAAG,IAAA;AAAA,UACH,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,OAAO,EAAE,GAAG,MAAA,EAAQ,CAAC,CAAC,CAAA;AAAA,UACnF,cAAc,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,IAAA,CAAK,YAAY,CAAC;AAAA,SACnD;AAAA;AACH,KACF;AAAA,IACA,WAAW,MAAA,CAAO,MAAA;AAAA,MAChB,KAAK,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,QAAA,KAClB,MAAA,CAAO,MAAA,CAAO;AAAA,UACZ,GAAG,QAAA;AAAA,UACH,UAAA,EAAY,gBAAA,CAAiB,QAAA,CAAS,UAAU;AAAA,SACjD;AAAA;AACH;AACF,GACD,CAAA;AACH;AAEO,IAAM,qBAAN,MAA4D;AAAA,EAChD,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,EACxB,MAAA,uBAAa,GAAA,EAAY;AAAA,EACzB,SAAA,uBAAgB,GAAA,EAAsC;AAAA,EACtD,KAAA,uBAAY,GAAA,EAAyC;AAAA,EACrD,SAAiC,EAAC;AAAA,EAClC,SAAA,uBAAgB,GAAA,EAAY;AAAA,EACrC,MAAA,GAAS,CAAA;AAAA,EACT,MAAA,GAAS,KAAA;AAAA,EAEjB,aAAA,CACE,OACA,UAAA,EACwC;AACxC,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,CAAA;AACpF,IAAA,OAAO,EAAA,CAAG,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EACzC;AAAA,EAEA,aAAA,CACE,KAAA,EACA,UAAA,EACA,OAAA,EACwC;AACxC,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,EAAA,EAAI;AAAA,MACrB,EAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,UAAA;AAAA,MACR,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,EAAA,CAAG,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EACzC;AAAA,EAEA,YAAA,CACE,OACA,UAAA,EACuC;AACvC,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAA,EAAI,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,CAAA;AACnF,IAAA,OAAO,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EACxC;AAAA,EAEA,YAAA,CACE,KAAA,EACA,UAAA,EACA,OAAA,EACuC;AACvC,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,EAAA,EAAI;AAAA,MACrB,EAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ,UAAA;AAAA,MACR,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,EAAA,CAAG,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,EACxC;AAAA,EAEA,IAAA,CACE,OAAA,EACA,UAAA,GAAyC,EAAC,EACE;AAC5C,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAC/B,IAAA,IAAI,MAAM,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,KAAA,KAAU,KAAK,KAAA,EAAO;AACzD,MAAA,OAAO,GAAA,CAAI,IAAA,CAAK,kBAAA,EAAoB,CAAA;AAAA,IACtC;AACA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,EAAE,CAAA;AAChD,IAAA,IAAI,eAAe,IAAA,KAAS,SAAA,SAAkB,GAAA,CAAI,IAAA,CAAK,oBAAoB,CAAA;AAC3E,IAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,IAAS,CAAA,EAAG,cAAc,KAAK,CAAA,MAAA,EAAS,KAAK,MAAM,CAAA,CAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,EAAE,EAAA,EAAI,OAAO,SAAA,EAAW,IAAA,CAAK,EAAA,EAAI,UAAA,EAAY,CAAA;AAChE,IAAA,OAAO,GAAG,iBAAA,CAAkB,IAAA,CAAK,OAAO,EAAA,EAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,UAAA,CACE,OAAA,EACA,UAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,MAAM,IAAA,GAAO,WAAW,OAAO,CAAA;AAC/B,IAAA,IAAI,MAAM,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,KAAA,KAAU,KAAK,KAAA,EAAO;AACzD,MAAA,OAAO,GAAA,CAAI,IAAA,CAAK,kBAAA,EAAoB,CAAA;AAAA,IACtC;AACA,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,EAAE,CAAA;AAChD,IAAA,IAAI,aAAA,EAAe,IAAA,KAAS,SAAA,IAAa,aAAA,CAAc,WAAW,UAAA,EAAY;AAC5E,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,6BAAA;AAAA,UACN,QAAA,EAAU,iDAAA;AAAA,UACV,IAAA,EAAM,6EAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,aAAA,EAAe,eAAe,KAAA,IAAS,SAAA;AAAA,YACvC,KAAA,EAAO,QAAA;AAAA,YACP,QAAA,EAAU,UAAA;AAAA,YACV,MAAA,EAAQ,eAAe,MAAA,IAAU;AAAA;AACnC,SACD;AAAA,OACH;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,IAAS,CAAA,EAAG,cAAc,KAAK,CAAA,MAAA,EAAS,KAAK,MAAM,CAAA,CAAA;AAC5E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,EAAE,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,EAAA,EAAI,UAAA,EAAY,OAAA,EAAS,CAAA;AACzE,IAAA,OAAO,GAAG,iBAAA,CAAkB,IAAA,CAAK,OAAO,EAAA,EAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,aAAA,CACE,MACA,UAAA,EACgC;AAChC,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,CAAA;AAAA,EAC1D;AAAA,EAEA,cAAA,CACE,MACA,UAAA,EACgC;AAChC,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,CAAA;AAAA,EAC3D;AAAA,EAEA,WAAA,CAAY,MAAc,UAAA,EAAqE;AAC7F,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,YAAY,CAAA;AAAA,EACxD;AAAA,EAEA,QACE,OAAA,EACyD;AACzD,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAEd,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,OAAA,CAAQ,WAAW,CAAA;AAChE,IAAA,IAAI,CAAC,WAAA,CAAY,EAAA,EAAI,OAAO,WAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AAEzB,IAAA,MAAM,YAAY,IAAA,CAAK,QAAA;AAAA,MACrB,OAAA;AAAA,MACA,SAAS,KAAA,CAAM,eAAA;AAAA,MACf,SAAS,KAAA,CAAM,kBAAA;AAAA,MACf,SAAS,KAAA,CAAM;AAAA,KACjB;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAE1B,IAAA,MAAM,UAAA,GAAa,cAAA;AACnB,IAAA,MAAM,sBAAA,uBAA6B,OAAA,EAAwB;AAC3D,IAAA,IAAI,yBAAA,GAA4B,CAAA;AAChC,IAAA,MAAM,WAAA,GAAc,CAAC,QAAA,KAA6D;AAChF,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,MAAA;AAC5C,MAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,MAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,GAAA,CAAI,MAAM,CAAA;AAClD,MAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,MAAA,MAAM,GAAA,GAAM,cAAc,yBAAA,EAA2B,CAAA,CAAA;AACrD,MAAA,sBAAA,CAAuB,GAAA,CAAI,QAAQ,GAAG,CAAA;AACtC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,OAAO,UAAA,CAAW;AAAA,MACtB,UAAA;AAAA,MACA,QAAQ,QAAA,CAAS,KAAA,CAAM,OAAO,GAAA,CAAI,CAAC,MAAM,cAAA,MAAoB;AAAA,QAC3D,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,QAChB,cAAA;AAAA,QACA,UAAU,IAAA,CAAK,IAAA,CAAK,WAAW,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,KAAW;AACtD,UAAA,MAAM,EAAA,GAAK,iBAAiB,MAAM,CAAA;AAClC,UAAA,OAAO;AAAA,YACL,UAAU,IAAA,CAAK,SAAA,CAAU,IAAI,EAAA,IAAM,EAAE,GAAG,KAAA,IAAS,SAAA;AAAA,YACjD,OAAO,MAAA,CAAO;AAAA,WAChB;AAAA,QACF,CAAC,CAAA;AAAA,QACD,YAAA,EAAc,KAAK,YAAA,CAAa,GAAA;AAAA,UAC9B,CAAC,UAAA,KAAe,QAAA,CAAS,MAAM,MAAA,CAAO,UAAU,GAAG,IAAA,IAAQ;AAAA;AAC7D,OACF,CAAE,CAAA;AAAA,MACF,SAAA,EAAW,CAAC,GAAG,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,KAAa;AACnE,QAAA,MAAM,UACJ,QAAA,CAAS,MAAA,CAAO,SAAS,SAAA,GACpB,QAAA,CAAS,OAAO,UAAA,GACjB,MAAA;AACN,QAAA,MAAM,SACJ,QAAA,CAAS,MAAA,CAAO,SAAS,QAAA,GACpB,QAAA,CAAS,OAAO,UAAA,GACjB,MAAA;AACN,QAAA,MAAM,aAAA,GAAgB,YAAY,QAAQ,CAAA;AAC1C,QAAA,MAAM,MAAA,GACJ,YAAY,MAAA,GAAY,MAAA,GAAY,KAAK,aAAA,CAAc,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,WAAW,CAAA;AAC1F,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA;AAAA,UACvB,IAAA,EAAM,SAAS,MAAA,CAAO,IAAA;AAAA,UACtB,MAAA,EAAQ,SAAS,MAAA,CAAO,MAAA;AAAA,UACxB,UAAA,EACE,YAAY,MAAA,GACR;AAAA,YACE,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,QAAQ,IAAA,IAAQ;AAAA,WACxB,GACA;AAAA,YACE,IAAA,EAAM,SAAA;AAAA,YACN,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO;AAAA,YACjE,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,KAAA,EAAO,QAAQ,KAAA,IAAS,CAAA;AAAA,YACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU,CAAA;AAAA,YAC1B,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,CAAA;AAAA,YAClD,aAAA,EAAe,QAAQ,aAAA,IAAiB,CAAA;AAAA,YACxC,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,WACtC;AAAA,UACN,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,SAAS,QAAA,CAAS,OAAA;AAAA,UAClB,cAAc,QAAA,CAAS,KAAA;AAAA,UACvB,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAC,GAAI,EAAE,uBAAuB,aAAA,EAAc;AAAA,UAC9E,GAAI,YAAY,MAAA,GAAY,KAAK,EAAE,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,UAC1D,GAAI,OAAA,KAAY,MAAA,GACZ,MAAA,KAAW,MAAA,GACT,EAAC,GACD,EAAE,QAAA,EAAU,MAAA,CAAO,IAAA,EAAK,GAC1B;AAAA,YACE,QAAA,EAAU,eAAA;AAAA,cACR,OAAA,CAAQ,MAAA;AAAA,cACR,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,IAAA,EAAM,QAAQ,WAAW,CAAA;AAAA,cACpD,QAAQ,aAAA,IAAiB;AAAA;AAC3B,WACF;AAAA,UACJ,GAAI,OAAA,KAAY,MAAA,GACZ,EAAC,GACD;AAAA,YACE,SAAA,EAAW,QAAQ,SAAA,IAAa,IAAA;AAAA,YAChC;AAAA;AACF,SACN;AAAA,MACF,CAAC;AAAA,KACF,CAAA;AAED,IAAA,MAAM,sBAAA,uBAA6B,GAAA,EAA2C;AAC9E,IAAA,KAAA,MAAW,QAAA,IAAY,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,QAAO,EAAG;AACzD,MAAA,IAAI,SAAS,MAAA,CAAO,IAAA,KAAS,SAAA,IAAa,QAAA,CAAS,YAAY,MAAA,EAAW;AAC1E,MAAA,MAAM,MAAA,GAAS,KAAK,aAAA,CAAc,QAAA,CAAS,OAAO,UAAA,CAAW,IAAA,EAAM,QAAQ,WAAW,CAAA;AACtF,MAAA,sBAAA,CAAuB,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO;AAAA,QAChD,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,MAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,UAAA,CAAW,MAAA;AAAA,QACnC,MAAM,EAAE,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,QACnD,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,MAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,UAAA,CAAW,WAAA,IAAe;AAAA,OACnD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAA;AAAA,MACL,IAAI,uBAAA;AAAA,QACF,cAAA,EAAA;AAAA,QACA,IAAA,CAAK,KAAA;AAAA,QACL,OAAA,CAAQ,MAAA;AAAA,QACR,UAAU,KAAA,CAAM,SAAA;AAAA,QAChB,UAAU,KAAA,CAAM,KAAA;AAAA,QAChB,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAAA,QACnC,IAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAAA,EAEQ,OAAA,CAAQ,MAAc,IAAA,EAA2D;AACvF,IAAA,MAAM,QAAA,GAAW,KAAK,cAAA,EAAe;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,qBAAA;AAAA,UACN,QAAA,EAAU,cAAc,IAAI,CAAA,8BAAA,CAAA;AAAA,UAC5B,IAAA,EAAM,sBAAsB,IAAI,CAAA,2CAAA,CAAA;AAAA,UAChC,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA;AAAK,SAC1B;AAAA,OACH;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU;AAC7C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAM,MAAM,CAAA;AACpD,MAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,KAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,EAAE,EAAA,EAAI,KAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,CAAA;AACvD,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEQ,oBAAA,CACN,UACA,MAAA,EACgC;AAChC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AACvC,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,KAAA,KAAU,KAAK,KAAA,EAAO;AACnD,MAAA,OAAO,GAAA,CAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,cAAA,EAAgB;AAChC,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,GAAA,CAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC1E,MAAA,OAAO,GAAG,MAAS,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,IAAY,CAAC,KAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC1D,MAAA,OAAO,GAAA,CAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEQ,QAAQ,IAAA,EAQd;AAEA,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAoB;AAChD,IAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAoB;AACnD,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAClD,IAAA,MAAM,iBAA2C,EAAC;AAClD,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,SAAA,IAAa,QAAA,CAAS,WAAW,SAAA,EAAW;AAClE,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,KAAA,IAAS,CAAA;AAC3C,MAAA,IAAI,UAAU,CAAA,EAAG,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,IACzD;AAEA,IAAA,KAAA,IAAS,YAAY,CAAA,EAAG,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,QAAQ,SAAA,EAAA,EAAa;AACnE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAClC,MAAA,IAAI,SAAS,MAAA,EAAW;AACxB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAM,IAAI,CAAA;AACvD,MAAA,IAAI,CAAC,UAAA,CAAW,EAAA,EAAI,OAAO,UAAA;AAC3B,MAAA,MAAM,aAAiC,EAAC;AACxC,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU;AAClD,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,MAAM,MAAM,CAAA;AACzD,QAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA;AACrB,QAAA,UAAA,CAAW,IAAA,CAAK,KAAK,KAAK,CAAA;AAC1B,QAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAM,UAAU,CAAA;AACzD,QAAA,MAAM,KAAA,GAAA,CACH,UAAU,IAAA,KAAS,SAAA,IAAa,SAAS,MAAA,KAAW,SAAA,GAChD,SAAS,UAAA,CAAW,KAAA,IAAS,IAC9B,CAAA,KACH,QAAA,EAAU,SAAS,QAAA,GAChB,WAAA,CAAY,OAAO,KAA0B,CAAA,GAC7C,YAAA,CAAa,MAAA,CAAO,KAA2B,CAAA,CAAA;AACrD,QAAA,eAAA,CAAgB,GAAA;AAAA,UACd,KAAK,KAAA,CAAM,UAAA;AAAA,UAAA,CACV,gBAAgB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,UAAU,KAAK,CAAA,IAAK;AAAA,SACtD;AACA,QAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAClD,UAAA,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,SAAS,CAAA;AAAA,QACzD;AACA,QAAA,iBAAA,CAAkB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,SAAS,CAAA;AAAA,MACxD;AACA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAM,UAAU,CAAA;AAC3D,MAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,QAAA;AACzB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AACjD,MAAA,IAAI,CAAC,WAAA,CAAY,EAAA,EAAI,OAAO,WAAA;AAE5B,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,MAAA,KAAA,MAAW,WAAW,UAAA,EAAY;AAChC,QAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AACvD,UAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,YAAA,YAAA,CAAa,GAAA,CAAI,WAAW,SAAS,CAAA;AAAA,UACvC,CAAA,MAAA,IAAW,KAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,UAAU,CAAA,EAAG,WAAW,SAAA,EAAW;AACvE,YAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,UAAU,CAAA,EAAG,KAAA;AACtD,YAAA,OAAO,GAAA;AAAA,cACL,IAAI,gBAAA,CAAiB;AAAA,gBACnB,IAAA,EAAM,oBAAA;AAAA,gBACN,QAAA,EAAU,CAAA,wBAAA,EAA2B,KAAK,CAAA,0BAAA,EAA6B,KAAK,IAAI,CAAA,UAAA,CAAA;AAAA,gBAChF,IAAA,EAAM,mFAAA;AAAA,gBACN,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,MAAM,aAAA,EAAe,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA;AAAM,eAC3E;AAAA,aACH;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,qBAAA,CAAsB,OAAA,EAAS,OAAO,CAAA,EAAG;AACrE,YAAA,YAAA,CAAa,IAAI,UAAU,CAAA;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,UAAU,CAAA;AAC1B,MAAA,cAAA,CAAe,IAAA,CAAK;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,YAAY,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,IAAA,GAAO,KAAK,CAAC,CAAA;AAAA,QACjF,WAAA,EAAa,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAC,MAAA,KAAW,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,QAClE,SAAS,IAAI,GAAA;AAAA,UACX,UAAA,CAAW,OAAA,CAAQ,CAAC,MAAA,KAAY,MAAA,CAAO,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,CAAC,MAAA,CAAO,MAAM,CAAE;AAAA;AACrF,OACD,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,CAAA,IAAK,eAAA,EAAiB;AACjD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAC9C,MAAA,IAAI,QAAA,EAAU,WAAW,UAAA,EAAY;AACrC,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,KAAA,GAAQ,KAAA,MAAW,KAAA,EAAO;AACjD,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,uBAAA;AAAA,YACN,QAAA,EAAU,CAAA,mBAAA,EAAsB,QAAA,CAAS,KAAK,iDAAiD,KAAK,CAAA,CAAA;AAAA,YACpG,IAAA,EAAM,4EAAA;AAAA,YACN,MAAA,EAAQ;AAAA,cACN,eAAe,QAAA,CAAS,KAAA;AAAA,cACxB,KAAA,EAAO,OAAA;AAAA,cACP,QAAA,EAAU,OAAO,KAAK,CAAA;AAAA,cACtB,MAAA,EAAQ,SAAS,UAAA,CAAW;AAAA;AAC9B,WACD;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAA,CAAG;AAAA,MACR,MAAA,EAAQ,cAAA;AAAA,MACR,eAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,eAAA,CACN,SAAA,EACA,IAAA,EACA,MAAA,EAC4C;AAC5C,IAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AACvC,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,KAAA,KAAU,KAAK,KAAA,EAAO;AACnD,MAAA,OAAO,GAAA,CAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,OAAO,EAAA,CAAG,EAAE,SAAA,EAAW,QAAA,EAAU,UAAA,EAAY,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,GAAG,IAAA,EAAM,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,cAAA,EAAgB,OAAO,IAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC9E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,EAAE,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,SAAS,CAAA;AACjD,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,OAAA,EAAS,IAAA,KAAS,SAAA,EAAW;AACrD,MAAA,OAAO,GAAA,CAAI,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,CAAW,aAAA,IAAiB,CAAA;AACtD,IAAA,MAAM,MAAA,GACJ,OAAO,OAAA,CAAQ,UAAA,CAAW,IAAA,KAAS,WAC9B,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,kBAAA,IAAsB,CAAA,GAC/C,CAAA;AACN,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,YAAA,IAAgB,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,cAAA,IAAkB,CAAA;AACrD,IAAA,OAAO,EAAA,CAAG;AAAA,MACR,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,GAAG,IAAA;AAAA,MACH,KAAA,EAAO;AAAA,QACL,QAAA;AAAA,QACA,MAAA,EAAQ,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,iBAAiB,SAAA,GAAY,QAAA,CAAA;AAAA,QACjE,UAAA;AAAA,QACA,QAAA,EAAU,UAAA,IAAc,IAAA,CAAK,UAAA,CAAW,mBAAmB,MAAA,GAAS,UAAA,CAAA;AAAA,QACpE,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,MAAA,IAAU;AAAA;AACpC,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,iBAAA,CACN,MACA,MAAA,EACqD;AACrD,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AACpC,IAAA,IAAI,IAAA,CAAK,KAAK,IAAA,KAAS,QAAA,IAAY,WAAW,MAAA,CAAO,QAAQ,CAAA,EAAG,IAAA,KAAS,cAAA,EAAgB;AACvF,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,kBAAA,EAAoB;AACvC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,IAAA;AAAA,QACvD,CAAC,SAAA,KAAc,SAAA,CAAU,IAAA,KAAS,MAAA,CAAO;AAAA,OAC3C;AACA,MAAA,OAAO,UAAA,EAAY,WAAW,MAAA,GAAS,EAAE,MAAM,IAAA,EAAM,KAAA,EAAO,MAAK,GAAI,IAAA;AAAA,IACvE;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,qBAAA,EAAuB;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,sBAAA;AACxC,MAAA,IACE,UAAA,EAAY,SAAS,MAAA,CAAO,QAAA,KAC3B,WAAW,WAAA,KAAgB,MAAA,IAAU,UAAA,CAAW,aAAA,KAAkB,MAAA,CAAA,EACnE;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,MACnC;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,CACN,MACA,IAAA,EACgC;AAChC,IAAA,IAAI,KAAK,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,CAAC,KAAK,OAAA,EAAS;AACjD,MAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AAAA,IAClD;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU;AAClD,MAAA,IAAA,CACG,OAAO,KAAA,KAAU,cAAA,IAChB,MAAA,CAAO,KAAA,KAAU,mBACjB,MAAA,CAAO,KAAA,KAAU,oBAAA,KACnB,UAAA,CAAW,OAAO,QAAQ,CAAA,EAAG,SAAS,QAAA,IACtC,CAAC,KAAK,aAAA,EACN;AACA,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,kBAAkB,MAAM,CAAA;AAAA,MACjE;AACA,MAAA,IAAA,CACG,OAAO,KAAA,KAAU,cAAA,IAChB,MAAA,CAAO,KAAA,KAAU,mBACjB,MAAA,CAAO,KAAA,KAAU,oBAAA,KACnB,UAAA,CAAW,OAAO,QAAQ,CAAA,EAAG,SAAS,cAAA,IACtC,CAAC,KAAK,cAAA,EACN;AACA,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,mBAAmB,MAAM,CAAA;AAAA,MAClE;AACA,MAAA,IAAI,MAAA,CAAO,KAAA,KAAU,eAAA,IAAmB,CAAC,KAAK,eAAA,EAAiB;AAC7D,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,YAAY,MAAM,CAAA;AAAA,MAC3D;AAAA,IACF;AACA,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEQ,eAAA,CACN,QAAA,EACA,UAAA,EACA,MAAA,EACiC;AACjC,IAAA,MAAM,UAAA,GAAa,MAAA,KAAW,MAAA,GAAY,MAAA,GAAY,iBAAiB,MAAM,CAAA;AAC7E,IAAA,OAAO,GAAA;AAAA,MACL,IAAI,gBAAA,CAAiB;AAAA,QACnB,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,CAAA,MAAA,EAAS,QAAQ,CAAA,iCAAA,EAAoC,UAAU,CAAA,cAAA,CAAA;AAAA,QACzE,IAAA,EAAM,sEAAA;AAAA,QACN,MAAA,EAAQ;AAAA,UACN,QAAA;AAAA,UACA,UAAA;AAAA,UACA,GAAI,UAAA,KAAe,MAAA,GACf,KACA,EAAE,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,IAAI,UAAU,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,QAAQ,KAAA;AAAM;AACnF,OACD;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,oBAAA,CACN,MACA,QAAA,EACgC;AAChC,IAAA,KAAA,IAAS,SAAA,GAAY,CAAA,EAAG,SAAA,GAAY,QAAA,CAAS,QAAQ,SAAA,EAAA,EAAa;AAChE,MAAA,MAAM,IAAA,GAAO,SAAS,SAAS,CAAA;AAC/B,MAAA,IAAI,SAAS,MAAA,EAAW;AACxB,MAAA,KAAA,IAAS,aAAa,SAAA,GAAY,CAAA,EAAG,UAAA,GAAa,QAAA,CAAS,QAAQ,UAAA,EAAA,EAAc;AAC/E,QAAA,MAAM,KAAA,GAAQ,SAAS,UAAU,CAAA;AACjC,QAAA,IACE,KAAA,KAAU,MAAA,IACV,IAAA,CAAK,UAAA,KAAe,KAAA,CAAM,UAAA,IAC1B,CAAC,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,EACtC;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,IAAS,CAAC,MAAM,KAAA,EAAO;AACjC,QAAA,IACE,IAAA,CAAK,UAAU,KAAA,CAAM,KAAA,KACpB,KAAK,KAAA,KAAU,oBAAA,IAAwB,KAAK,KAAA,KAAU,4BAAA,CAAA;AAEvD,UAAA;AACF,QAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA,EAAG,KAAA;AACnD,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,iBAAA;AAAA,YACN,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,oBAAoB,KAAK,CAAA,sCAAA,CAAA;AAAA,YACrD,IAAA,EAAM,uFAAA;AAAA,YACN,MAAA,EAAQ;AAAA,cACN,UAAU,IAAA,CAAK,IAAA;AAAA,cACf,aAAA,EAAe,KAAA;AAAA,cACf,QAAA,EAAU,CAAC,IAAA,CAAK,KAAA,EAAO,MAAM,KAAK;AAAA;AACpC,WACD;AAAA,SACH;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC7B,MAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAAA,QACvB,CAAC,MAAA,KAAW,MAAA,CAAO,KAAA,KAAU,UAAA,IAAc,OAAO,KAAA,KAAU;AAAA,OAC9D;AACA,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,iBAAA;AAAA,YACN,QAAA,EAAU,CAAA,WAAA,EAAc,IAAA,CAAK,IAAI,CAAA,0CAAA,CAAA;AAAA,YACjC,IAAA,EAAM,2DAAA;AAAA,YACN,QAAQ,EAAE,QAAA,EAAU,KAAK,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA;AAAM,WACrD;AAAA,SACH;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEQ,oBAAoB,IAAA,EAA4D;AACtF,IAAA,IAAI,KAAK,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,GAAG,MAAS,CAAA;AACpD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAA;AACtC,IAAA,MAAM,GAAA,GAAM,CAAC,IAAA,EAAwB,KAAA,KACnC,QAAA,CAAS,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,QAAA,KAAa,IAAA,IAAQ,MAAA,CAAO,UAAU,KAAK,CAAA;AAC9E,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,gBAAA,EAAkB;AAC9D,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,kBAAkB,CAAA,EAAG;AAC7C,QAAA,OAAO,KAAK,uBAAA,CAAwB,IAAA,CAAK,IAAA,EAAM,UAAA,CAAW,MAAM,kBAAkB,CAAA;AAAA,MACpF;AACA,MAAA,IACE,UAAA,CAAW,kBAAkB,MAAA,IAC7B,CAAC,IAAI,UAAA,CAAW,aAAA,EAAe,kBAAkB,CAAA,EACjD;AACA,QAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,UACV,IAAA,CAAK,IAAA;AAAA,UACL,UAAA,CAAW,aAAA;AAAA,UACX;AAAA,SACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,sBAAA;AACnC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,KAAkB,IAAA,GAAO,oBAAA,GAAuB,qBAAA;AACpE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AACxB,QAAA,OAAO,KAAK,uBAAA,CAAwB,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,MAAM,KAAK,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEQ,uBAAA,CACN,QAAA,EACA,IAAA,EACA,KAAA,EACiC;AACjC,IAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,IAAA,KAAS,cAAA,GAAiB,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,GAAQ,MAAA;AAC/E,IAAA,OAAO,GAAA;AAAA,MACL,IAAI,gBAAA,CAAiB;AAAA,QACnB,IAAA,EAAM,+BAAA;AAAA,QACN,UAAU,CAAA,aAAA,EAAgB,QAAQ,CAAA,cAAA,EAAiB,KAAK,eAAe,KAAK,CAAA,QAAA,CAAA;AAAA,QAC5E,IAAA,EAAM,wDAAA;AAAA,QACN,MAAA,EAAQ,EAAE,QAAA,EAAU,aAAA,EAAe,OAAO,KAAA;AAAM,OACjD;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,cAAA,CACN,SACA,OAAA,EAC8B;AAC9B,IAAA,KAAA,IAAS,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACxD,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,MAAA,IACE,KAAA,KAAU,MAAA,IACV,KAAA,CAAM,UAAA,KAAe,OAAA,CAAQ,UAAA,IAC7B,KAAA,CAAM,KAAA,IACN,aAAA,CAAc,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EACxC;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,qBAAA,CACN,SACA,OAAA,EACmB;AACnB,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,IAAA,KAAA,IAAS,QAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACxD,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAK,CAAA;AAC3B,MAAA,IACE,KAAA,KAAU,MAAA,IACV,KAAA,CAAM,UAAA,KAAe,OAAA,CAAQ,UAAA,IAC7B,CAAC,aAAA,CAAc,KAAA,CAAM,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,EACzC;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,IAAA,EAAM,YAAA,CAAa,GAAA,CAAI,MAAM,SAAS,CAAA;AAChD,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,YAAA,CAAa,GAAA,CAAI,MAAM,SAAS,CAAA;AAChC,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,CAAC,GAAG,YAAY,CAAA;AAAA,EACzB;AAAA,EAEQ,oBACN,WAAA,EACgC;AAChC,IAAA,IAAI,WAAA,CAAY,KAAA,IAAS,CAAA,IAAK,WAAA,CAAY,UAAU,CAAA,EAAG;AACrD,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,6BAAA;AAAA,UACN,QAAA,EAAU,oDAAA;AAAA,UACV,IAAA,EAAM,iEAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,aAAA,EAAe,SAAA;AAAA,YACf,KAAA,EAAO,aAAA;AAAA,YACP,QAAA,EAAU,0BAAA;AAAA,YACV,QAAQ,CAAA,EAAG,WAAA,CAAY,KAAK,CAAA,CAAA,EAAI,YAAY,MAAM,CAAA;AAAA;AACpD,SACD;AAAA,OACH;AAAA,IACF;AACA,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC9C,MAAA,IAAI,SAAS,IAAA,KAAS,QAAA,IAAY,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/D,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,6BAAA;AAAA,YACN,QAAA,EAAU,CAAA,QAAA,EAAW,QAAA,CAAS,KAAK,CAAA,2BAAA,CAAA;AAAA,YACnC,IAAA,EAAM,kEAAA;AAAA,YACN,MAAA,EAAQ;AAAA,cACN,eAAe,QAAA,CAAS,KAAA;AAAA,cACxB,KAAA,EAAO,MAAA;AAAA,cACP,QAAA,EAAU,UAAA;AAAA,cACV,MAAA,EAAQ,SAAS,UAAA,CAAW;AAAA;AAC9B,WACD;AAAA,SACH;AAAA,MACF;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,SAAA,EAAW;AAC/B,QAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,QAAA,CAAS,UAAA,CAAW,MAAM,WAAW,CAAA;AACvE,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,IAAK,MAAA,CAAO,UAAU,CAAA,IAAK,MAAA,CAAO,sBAAsB,CAAA,EAAG;AAC7E,UAAA,OAAO,GAAA;AAAA,YACL,IAAI,gBAAA,CAAiB;AAAA,cACnB,IAAA,EAAM,6BAAA;AAAA,cACN,QAAA,EAAU,CAAA,SAAA,EAAY,QAAA,CAAS,KAAK,CAAA,oBAAA,CAAA;AAAA,cACpC,IAAA,EAAM,oDAAA;AAAA,cACN,MAAA,EAAQ;AAAA,gBACN,eAAe,QAAA,CAAS,KAAA;AAAA,gBACxB,KAAA,EAAO,MAAA;AAAA,gBACP,QAAA,EAAU,qBAAA;AAAA,gBACV,MAAA,EAAQ,GAAG,MAAA,CAAO,KAAK,IAAI,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,kBAAkB,CAAA;AAAA;AACvE,aACD;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,SAAS,CAAA;AACjD,MAAA,IAAI,OAAA,EAAS,SAAS,SAAA,EAAW;AACjC,MAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,UAAA,CAAW,SAAA,IAAa,IAAA;AAC5D,MAAA,MAAM,aAAA,GAAgB,KAAK,UAAA,CAAW,SAAA;AACtC,MAAA,IAAI,CAAC,gCAAA,CAAiC,mBAAA,EAAqB,aAAa,CAAA,EAAG;AACzE,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,6BAAA;AAAA,YACN,QAAA,EAAU,CAAA,SAAA,EAAY,OAAA,CAAQ,KAAK,CAAA,6CAAA,CAAA;AAAA,YACnC,IAAA,EAAM,mFAAA;AAAA,YACN,MAAA,EAAQ;AAAA,cACN,eAAe,OAAA,CAAQ,KAAA;AAAA,cACvB,KAAA,EAAO,WAAA;AAAA,cACP,QAAA,EAAU,mBAAA;AAAA,cACV,QAAQ,aAAA,IAAiB;AAAA;AAC3B,WACD;AAAA,SACH;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEQ,QAAA,CACN,OAAA,EACA,eAAA,EACA,kBAAA,EACA,iBAAA,EAOA;AACA,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAwC;AACtE,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoC;AAC9D,IAAA,MAAM,kBAA6B,EAAC;AACpC,IAAA,MAAM,iBAA2B,EAAC;AAClC,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,KAAA,MAAW,OAAA,IAAW,eAAA,EAAiB,OAAA,CAAQ,MAAA,CAAO,eAAe,OAAO,CAAA;AAC5E,MAAA,KAAA,MAAW,MAAA,IAAU,cAAA,EAAgB,OAAA,CAAQ,MAAA,CAAO,cAAc,MAAM,CAAA;AAAA,IAC1E,CAAA;AAEA,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAC9C,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,IAAK,CAAA;AAClD,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,QAAA,CAAS,MAAA,KAAW,SAAA,IAAa,KAAA,KAAU,CAAA,EAAG;AAChD,QAAA,IAAI,QAAA,CAAS,SAAS,SAAA,EAAW;AAC/B,UAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,SAAS,UAAA,CAAW,IAAA,EAAM,QAAQ,WAAW,CAAA;AAC/E,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,aAAA,CAAc;AAAA,YAC3C,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,IAAA,EAAM,MAAA;AAAA,YACN,aAAA,EAAe,QAAA,CAAS,UAAA,CAAW,aAAA,IAAiB,CAAA;AAAA,YACpD,WAAA,EAAa,QAAA,CAAS,UAAA,CAAW,WAAA,IAAe,CAAA;AAAA,YAChD,SAAA,EAAW,QAAA,CAAS,UAAA,CAAW,SAAA,IAAa,IAAA;AAAA,YAC5C,MAAA,EAAQ,SAAS,UAAA,CAAW,MAAA;AAAA,YAC5B,KAAA;AAAA,YACA,aAAa,CAAC,GAAI,SAAS,UAAA,CAAW,WAAA,IAAe,EAAG;AAAA,WACzD,CAAA;AACD,UAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,YAAA,OAAA,EAAQ;AACR,YAAA,OAAO,GAAA;AAAA,cACL,IAAI,gBAAA,CAAiB;AAAA,gBACnB,IAAA,EAAM,4BAAA;AAAA,gBACN,QAAA,EAAU,CAAA,2BAAA,EAA8B,QAAA,CAAS,KAAK,CAAA,CAAA,CAAA;AAAA,gBACtD,IAAA,EAAM,mEAAA;AAAA,gBACN,MAAA,EAAQ,EAAE,WAAA,EAAa,QAAA,CAAS,OAAO,OAAA,EAAS,OAAA,CAAQ,MAAM,IAAA;AAAK,eACpE;AAAA,aACH;AAAA,UACF;AACA,UAAA,OAAA,GAAU,OAAA,CAAQ,KAAA;AAClB,UAAA,eAAA,CAAgB,KAAK,OAAO,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,YAAA,CAAa;AAAA,YAC1C,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,IAAA,EAAM,SAAS,UAAA,CAAW,IAAA;AAAA,YAC1B,KAAA;AAAA,YACA,gBAAA,EAAkB,QAAA,CAAS,UAAA,CAAW,gBAAA,IAAoB;AAAA,WAC3D,CAAA;AACD,UAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,YAAA,OAAA,EAAQ;AACR,YAAA,OAAO,GAAA;AAAA,cACL,IAAI,gBAAA,CAAiB;AAAA,gBACnB,IAAA,EAAM,4BAAA;AAAA,gBACN,QAAA,EAAU,CAAA,0BAAA,EAA6B,QAAA,CAAS,KAAK,CAAA,CAAA,CAAA;AAAA,gBACrD,IAAA,EAAM,mEAAA;AAAA,gBACN,MAAA,EAAQ,EAAE,WAAA,EAAa,QAAA,CAAS,OAAO,OAAA,EAAS,OAAA,CAAQ,MAAM,IAAA;AAAK,eACpE;AAAA,aACH;AAAA,UACF;AACA,UAAA,MAAA,GAAS,OAAA,CAAQ,KAAA;AACjB,UAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,QAC5B;AAAA,MACF;AACA,MAAA,iBAAA,CAAkB,GAAA,CAAI,SAAS,EAAA,EAAI;AAAA,QACjC,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA;AAAA,QACA,QAAA,EAAU,kBAAA,CAAmB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,IAAK,IAAA;AAAA,QACjD,OAAA,EAAS,iBAAA,CAAkB,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,IAAK,IAAA;AAAA,QAC/C,GAAI,OAAA,KAAY,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,QAC3C,GAAI,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA;AAAO,OAC1C,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AACtC,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AACrD,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,UAAU,MAAA,CAAO,MAAA,KAAW,SAAA,IAAa,QAAA,CAAS,YAAY,MAAA,EAAW;AAC3E,QAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CAAO,kBAAkB,QAAA,CAAS,OAAA,EAAS,KAAK,UAAU,CAAA;AAClF,QAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,UAAA,OAAA,EAAQ;AACR,UAAA,OAAO,GAAA;AAAA,YACL,IAAI,gBAAA,CAAiB;AAAA,cACnB,IAAA,EAAM,4BAAA;AAAA,cACN,QAAA,EAAU,CAAA,gCAAA,EAAmC,IAAA,CAAK,KAAK,CAAA,CAAA,CAAA;AAAA,cACvD,IAAA,EAAM,uDAAA;AAAA,cACN,MAAA,EAAQ,EAAE,WAAA,EAAa,IAAA,CAAK,OAAO,OAAA,EAAS,OAAA,CAAQ,MAAM,IAAA;AAAK,aAChE;AAAA,WACH;AAAA,QACF;AACA,QAAA,YAAA,GAAe,OAAA,CAAQ,KAAA;AAAA,MACzB;AACA,MAAA,aAAA,CAAc,GAAA,CAAI,KAAK,EAAA,EAAI;AAAA,QACzB,MAAA,EAAQ,IAAA;AAAA,QACR,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAC,GAAI,EAAE,MAAM,YAAA;AAAa,OAC5D,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAG,EAAE,SAAA,EAAW,iBAAA,EAAmB,KAAA,EAAO,eAAe,CAAA;AAAA,EAClE;AAAA,EAEQ,aAAA,CACN,QACA,OAAA,EAC0F;AAC1F,IAAA,IAAI,WAAW,SAAA,EAAW,OAAO,EAAE,GAAG,OAAA,EAAS,oBAAoB,CAAA,EAAE;AACrE,IAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,QAClC,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,QACpC,kBAAA,EAAoB;AAAA,OACtB;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,kBAAA,EAAoB,OAAO,kBAAA,IAAsB;AAAA,KACnD;AAAA,EACF;AAAA,EAEQ,cAAA,GAAiD;AACvD,IAAA,OAAO,KAAK,MAAA,GACR,GAAA;AAAA,MACE,IAAI,gBAAA,CAAiB;AAAA,QACnB,IAAA,EAAM,gBAAA;AAAA,QACN,QAAA,EAAU,iEAAA;AAAA,QACV,IAAA,EAAM,6CAAA;AAAA,QACN,QAAQ;AAAC,OACV;AAAA,KACH,GACA,GAAG,MAAS,CAAA;AAAA,EAClB;AAAA,EAEQ,aAAa,KAAA,EAA+C;AAClE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,0BAAA;AAAA,UACN,QAAA,EAAU,mBAAmB,KAAK,CAAA,8BAAA,CAAA;AAAA,UAClC,IAAA,EAAM,sBAAsB,KAAK,CAAA,aAAA,CAAA;AAAA,UACjC,MAAA,EAAQ,EAAE,aAAA,EAAe,KAAA;AAAM,SAChC;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,KAAK,CAAA;AACrB,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA,EAEQ,mBAAmB,QAAA,EAAqC;AAC9D,IAAA,OAAO,IAAI,gBAAA,CAAiB;AAAA,MAC1B,IAAA,EAAM,yBAAA;AAAA,MACN,QAAA,EAAU,qDAAA;AAAA,MACV,IAAA,EAAM,4EAAA;AAAA,MACN,MAAA,EAAQ,EAAE,GAAI,QAAA,KAAa,SAAY,EAAC,GAAI,EAAE,QAAA,EAAS;AAAG,KAC3D,CAAA;AAAA,EACH;AACF;;;ACpqCA,IAAM,QAAA,GAAW,CAAA;AAoCjB,SAAS,gBAAA,CACP,IAAA,EAMA,QAAA,EACA,IAAA,EACiC;AACjC,EAAA,OAAO,GAAA,CAAI,IAAI,gBAAA,CAAiB,EAAE,MAAM,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAC3D;AAMO,SAAS,kCAAA,CACd,YACA,cAAA,EACwD;AACxD,EAAA,IAAI,UAAA,CAAW,OAAA,KAAY,MAAA,IAAa,UAAA,CAAW,YAAY,IAAA,EAAM;AACnE,IAAA,OAAO,gBAAA;AAAA,MACL,oBAAA;AAAA,MACA,iCAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,UAAA,CAAW,WAAW,aAAA,EAAe;AACvC,IAAA,OAAO,gBAAA;AAAA,MACL,4BAAA;AAAA,MACA,gDAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IACE,CAAC,OAAO,SAAA,CAAU,UAAA,CAAW,KAAK,KAAK,CAAA,IACvC,CAAC,MAAA,CAAO,SAAA,CAAU,WAAW,IAAA,CAAK,MAAM,KACxC,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,IACzB,UAAA,CAAW,IAAA,CAAK,MAAA,IAAU,CAAA,EAC1B;AACA,IAAA,OAAO,gBAAA;AAAA,MACL,0BAAA;AAAA,MACA,+CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAA,CAAK,UAAA,CAAW,KAAA,GAAQ,QAAA,MAAc,CAAA,EAAG;AACvC,IAAA,OAAO,gBAAA;AAAA,MACL,8BAAA;AAAA,MACA,+CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,IAAI,UAAA,CAAW,YAAY,cAAA,EAAgB;AACzC,IAAA,OAAO,gBAAA;AAAA,MACL,mBAAA;AAAA,MACA,qBAAqB,cAAc,CAAA,CAAA;AAAA,MACnC,CAAA,cAAA,EAAiB,WAAW,OAAO,CAAA,wCAAA;AAAA,KACrC;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,GAA8B,QAAA;AAClC,EAAA,MAAM,QAAA,GAA4C;AAAA,IAChD,SAAS,UAAA,CAAW,OAAA;AAAA,IACpB,IAAI,KAAA,GAAQ;AACV,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACA,EAAA,MAAM,KAAA,GAAsC;AAAA,IAC1C,UAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAI,KAAA,GAAQ;AACV,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,aAAA,GAAgB;AACd,MAAA,IAAI,UAAU,SAAA,EAAW;AACvB,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,qBAAA;AAAA,YACN,QAAA,EAAU,wCAAA;AAAA,YACV,IAAA,EAAM;AAAA,WACP;AAAA,SACH;AAAA,MACF;AACA,MAAA,OAAO,GAAG,EAAE,OAAA,EAAS,WAAW,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA;AAAA,IACjE,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,KAAA,GAAQ,SAAA;AAAA,IACV;AAAA,GACF;AACA,EAAA,OAAO,GAAG,KAAK,CAAA;AACjB;;;ACtHO,IAAM,eAAN,MAAkC;AAAA,EACtB,SAA2B,EAAC;AAAA,EAE7C,GAAA,CAAI,IAAA,EAAc,UAAA,EAAiC,MAAA,EAAiC;AAClF,IAAA,IAAI,IAAA,CAAK,OAAO,IAAA,CAAK,CAAC,SAAS,IAAA,CAAK,IAAA,KAAS,IAAI,CAAA,EAAG;AAClD,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,qBAAA;AAAA,QACN,QAAA,EAAU,cAAc,IAAI,CAAA,4BAAA,CAAA;AAAA,QAC5B,IAAA,EAAM,sBAAsB,IAAI,CAAA,4CAAA,CAAA;AAAA,QAChC,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA;AAAK,OAC1B,CAAA;AAAA,IACH;AACA,IAAA,MAAM,KAAA,GAAwB,EAAE,IAAA,EAAM,UAAA,EAAW;AACjD,IAAA,MAAM,WAAA,GACJ,MAAA,KAAW,MAAA,GAAY,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,KAAS,MAAM,CAAA;AAClF,IAAA,IAAI,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,SACtC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,GAAG,KAAK,CAAA;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,OAAO,KAAK,MAAA,CAAO,MAAA;AAAA,EACrB;AACF,CAAA;;;ACxCO,IAAM,mBAAA,GAAsB,CAAC,YAAA,EAAc,YAAA,EAAc,iBAAiB;AAwB1E,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,mBAAA,CAAoB,SAAS,KAAyB,CAAA;AAC5F;AAEA,SAAS,cAAc,KAAA,EAAkC;AACvD,EAAA,OAAO,IAAI,gBAAA,CAAiB;AAAA,IAC1B,IAAA,EAAM,sBAAA;AAAA,IACN,QAAA,EAAU,CAAA,iBAAA,EAAoB,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IAC5D,IAAA,EAAM,0EAAA;AAAA,IACN,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAAE,GAChC,CAAA;AACH;AAEA,SAAS,cAAc,WAAA,EAAwC;AAC7D,EAAA,OAAO,IAAI,gBAAA,CAAiB;AAAA,IAC1B,IAAA,EAAM,sBAAA;AAAA,IACN,QAAA,EAAU,uDAAA;AAAA,IACV,MAAM,CAAA,2CAAA,EAA8C,WAAA,KAAgB,SAAY,EAAA,GAAK,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,CAAG,CAAA,CAAA;AAAA,IACxG,MAAA,EAAQ,EAAE,WAAA,EAAa,WAAA,IAAe,cAAA;AAAe,GACtD,CAAA;AACH;AAEO,SAAS,0BAA0B,MAAA,EAAkC;AAC1E,EAAA,IAAI,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAG,MAAM,cAAc,MAAM,CAAA;AAC3D,EAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9B;AAEO,SAAS,4BACd,KAAA,EAC4C;AAC5C,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,SAAA,GAAY,KAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,kBAAA,CAAmB,SAAS,CAAA,GAAI,EAAA,CAAG,SAAS,CAAA,GAAI,GAAA,CAAI,aAAA,CAAc,SAAS,CAAC,CAAA;AACrF;AAEO,SAAS,iCAAiC,UAAA,EAA6C;AAC5F,EAAA,IAAI,CAAC,mBAAmB,UAAA,CAAW,MAAM,GAAG,MAAM,aAAA,CAAc,WAAW,MAAM,CAAA;AACjF,EAAA,OAAO,IAAA,CAAK,UAAU,UAAU,CAAA;AAClC;AAEO,SAAS,mCACd,KAAA,EACmD;AACnD,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,GAAA,CAAI,eAAe,CAAA;AAC3E,EAAA,MAAM,SAAA,GAAY,KAAA;AAClB,EAAA,IAAI,UAAU,MAAA,KAAW,MAAA,EAAW,OAAO,GAAA,CAAI,eAAe,CAAA;AAC9D,EAAA,IAAI,CAAC,kBAAA,CAAmB,SAAA,CAAU,MAAM,CAAA,SAAU,GAAA,CAAI,aAAA,CAAc,SAAA,CAAU,MAAM,CAAC,CAAA;AACrF,EAAA,IAAI,OAAO,SAAA,CAAU,MAAA,KAAW,YAAY,SAAA,CAAU,MAAA,CAAO,WAAW,CAAA,EAAG;AACzE,IAAA,OAAO,GAAA;AAAA,MACL,IAAI,gBAAA,CAAiB;AAAA,QACnB,IAAA,EAAM,sBAAA;AAAA,QACN,QAAA,EAAU,uDAAA;AAAA,QACV,IAAA,EAAM,sDAAA;AAAA,QACN,QAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA;AAAE,OAC3C;AAAA,KACH;AAAA,EACF;AACA,EAAA,OAAO,EAAA,CAAG,EAAE,MAAA,EAAQ,SAAA,CAAU,QAAQ,MAAA,EAAQ,SAAA,CAAU,QAAQ,CAAA;AAClE;AAEA,SAAS,iBAAA,CACP,MAAA,EACA,WAAA,EACA,UAAA,EACS;AACT,EAAA,IAAI,UAAA,CAAW,SAAS,aAAA,EAAe;AACrC,IAAA,OAAA,CACG,MAAA,KAAW,YAAA,IAAgB,MAAA,KAAW,YAAA,KAAiB,WAAA,KAAgB,iBAAA;AAAA,EAE5E;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,aAAA,EAAe;AACrC,IAAA,OACE,MAAA,KAAW,iBAAA,KAAsB,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,YAAA,CAAA;AAAA,EAErF;AACA,EAAA,OACE,MAAA,KAAW,YAAA,KAAiB,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,iBAAA,CAAA;AAEhF;AAEO,SAAS,6BAAA,CACd,MAAA,EACA,WAAA,EACA,UAAA,EACuB;AACvB,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,QAAQ,CAAA,EAAE;AAChG,EAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,WAAA,KAAgB,IAAA,EAAM;AACrD,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,aAAa,CAAA,EAAE;AAAA,EAC1D;AACA,EAAA,IAAI,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,MAAM,CAAA,EAAE;AAClF,EAAA,IAAI,CAAC,kBAAA,CAAmB,WAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,aAAA,CAAc,WAAW,CAAA,EAAE;AAC5F,EAAA,IAAI,MAAA,KAAW,WAAA,EAAa,OAAO,EAAE,IAAI,IAAA,EAAK;AAC9C,EAAA,IAAI,eAAe,MAAA,IAAa,iBAAA,CAAkB,MAAA,EAAQ,WAAA,EAAa,UAAU,CAAA,EAAG;AAClF,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB;AACA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,KAAA,EAAO,IAAI,gBAAA,CAAiB;AAAA,MAC1B,IAAA,EAAM,uBAAA;AAAA,MACN,QAAA,EAAU,CAAA,2EAAA,EAA8E,MAAM,CAAA,IAAA,EAAO,WAAW,CAAA,CAAA,CAAA;AAAA,MAChH,IAAA,EAAM,gGAAA;AAAA,MACN,MAAA,EAAQ,EAAE,YAAA,EAAc,MAAA,EAAQ,mBAAmB,WAAA;AAAY,KAChE;AAAA,GACH;AACF;;;ACwGA,SAAS,QAAQ,IAAA,EAON;AACT,EAAA,OAAO,CAAA,EAAG,KAAK,MAAM,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA;AACrH;AAUA,IAAM,yBAAA,GAA4B;AAAA,EAChC,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,sBAAA;AAAA,EACA,cAAA;AAAA,EACA,uBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,kBAAA;AAAA,EACA,uBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,kBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,4BAAA,GAAoD,IAAI,GAAA,CAAI,yBAAyB,CAAA;AAEpF,IAAM,cAAN,MAAiC;AAAA,EACrB,SAAA,GAAY,IAAI,gBAAA,EAAiB;AAAA,EACjC,MAAA,GAAS,IAAI,YAAA,EAAkB;AAAA,EACxC,QAAA,GAAqC,IAAA;AAAA;AAAA,EAG5B,aAAA,uBAAoB,GAAA,EAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/C,iBAAkC,EAAC;AAAA;AAAA,EAEnC,kBAAA,uBAAyB,GAAA,EAA2B;AAAA;AAAA,EAE7D,cAAA,GAAiB,GAAA;AAAA,EACjB,eAAA,GAAkB,GAAA;AAAA;AAAA,EAElB,aAAA,GAAgB,GAAA;AAAA,EAChB,cAAA,GAAiB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,UAAA,GAAiC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzC,gBAAA,CAAiB,OAAe,MAAA,EAAyB;AACvD,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAI,KAAA,KAAU,IAAA,CAAK,aAAA,IAAiB,MAAA,KAAW,KAAK,cAAA,EAAgB;AAClE,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,IAAA,EAAuB;AACxC,IAAA,OAAO,IAAA,CAAK,QAAA,EAAU,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAsB,IAAA,EAAuB;AAC3C,IAAA,OAAO,KAAK,QAAA,EAAU,gBAAA,CAAiB,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO,CAAA;AAAA,EAC3D;AAAA,EAEA,yBAAyB,IAAA,EAAyD;AAChF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,kBAAA,CAAmB,IAAI,CAAA;AACnD,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,EAAU,iBAAiB,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO,CAAA;AAClE,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,OAAA,KAAY,MAAA,EAAW,OAAO,MAAA;AACxD,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAAA,QAClC,MAAA,EAAQ,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI;AAAA,OACtC;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAA,CAAoB,MAAc,MAAA,EAA6D;AAC7F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,MAAM,MAAM,CAAA;AAC9D,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,OAAO,GAAG,IAAI,CAAA;AAAA,EAChB;AAAA,EAEA,WAAA,CACE,KACA,UAAA,EACyC;AACzC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,cAAA,CACE,MACA,IAAA,EAC6C;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,MAAM,IAAI,CAAA;AACvD,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,IAAA,OAAO,GAAG,IAAI,CAAA;AAAA,EAChB;AAAA,EAEA,OAAA,CAAQ,MAAc,UAAA,EAAiD;AACrE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,UAAU,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,cAAA,CAAe,IAAA,EAAc,MAAA,EAAgB,UAAA,EAAiD;AAC5F,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,YAAY,MAAM,CAAA;AAAA,EACjD;AAAA,EAEA,cAAA,CAAe,MAAc,UAAA,EAAwD;AACnF,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,UAAU,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,qBAAA,CACE,IAAA,EACA,MAAA,EACA,UAAA,EACgB;AAChB,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,UAAA,EAAY,MAAM,CAAA;AAAA,EACvD;AAAA,EAEQ,gBAAA,CACN,IAAA,EACA,UAAA,EACA,MAAA,EACgB;AAChB,IAAA,OAAO,KAAK,MAAA,CAAO,GAAA;AAAA,MACjB,IAAA;AAAA,MACA;AAAA,QACE,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,OAAA,EAAS,IAAA;AAAA,QACT,aAAA,EAAe,WAAW,aAAA,IAAiB,IAAA;AAAA,QAC3C,OAAA,EAAS,CAAC,KAAA,EAAY,SAAA,KAA8B;AAClD,UAAA,MAAM,UACJ,KAAA,CACA,OAAA;AACF,UAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,GAAQ,KAAK,CAAA;AACtC,UAAA,IAAI,IAAA;AACJ,UAAA,IAAI;AACF,YAAA,IAAA,GAAO,QAAQ,gBAAA,CAAiB;AAAA,cAC9B,KAAA,EAAO,IAAA;AAAA,cACP,GAAI,OAAO,eAAA,KAAoB,KAAA,CAAA,GAC3B,EAAC,GACD,EAAE,eAAA,EAAiB,KAAA,CAAM,eAAA;AAAgB,aAC9C,CAAA;AAAA,UACH,SAAS,KAAA,EAAO;AACd,YAAA,UAAA,CAAW,YAAA,GAAe,OAAO,KAAK,CAAA;AACtC,YAAA;AAAA,UACF;AACA,UAAA,IAAI;AACF,YAAA,UAAA,CAAW,MAAA,CAAO,EAAE,IAAA,EAAM,KAAA,EAAO,WAAW,CAAA;AAAA,UAC9C,CAAA,SAAE;AACA,YAAA,IAAA,CAAK,GAAA,EAAI;AAAA,UACX;AACA,UAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,QAC1B;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kCAAA,CACE,YACA,cAAA,EACwD;AACxD,IAAA,OAAO,kCAAA,CAAmC,YAAY,cAAc,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQ,IAAA,EAAmE;AACzE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAClC,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,IAAA;AAEzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,IAAI,CAAA;AAC/C,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AACzD,IAAA,IAAI,gBAAgB,OAAO,cAAA;AAE3B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,yBAAA,CAA0B,QAAQ,CAAA;AAC1D,IAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,QAAQ,CAAA;AACxD,IAAA,IAAI,aAAa,OAAO,WAAA;AAExB,IAAA,MAAM,SAAA,GAAY,KAAK,0BAAA,EAA2B;AAClD,IAAA,IAAI,CAAC,SAAA,CAAU,EAAA,EAAI,OAAO,SAAA;AAE1B,IAAA,MAAM,kBAAA,GAAyC,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAS;AACpE,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA,EAAO,KAAK,UAAA,CAAW,KAAA;AAAA,QACvB,MAAA,EAAQ,KAAK,UAAA,CAAW;AAAA,OAC1B;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAGhD,IAAA,MAAM,iBACJ,IAAA,CAAK,cAAA,KAAmB,KAAK,aAAA,IAAiB,IAAA,CAAK,oBAAoB,IAAA,CAAK,cAAA;AAC9E,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,oBAAA,CAAqB,MAAA,EAAQ,cAAc,CAAA;AAC1E,IAAA,IAAI,CAAC,iBAAA,CAAkB,EAAA,EAAI,OAAO,iBAAA;AAKlC,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACtB;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,iBAAA,CAAkB,MAAM,SAAA,EAAW;AAC7D,MAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,MAAM,CAAA;AAAA,IACpC;AACA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,iBAAA,CAAkB,MAAM,UAAA,EAAY;AAC9D,MAAA,IAAA,CAAK,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAAA,IACrC;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,MAAA,EAAQ,kBAAA;AAAA,MACR,eAAA;AAAA,MACA,gBAAA,EAAkB,kBAAkB,KAAA,CAAM;AAAA,KAC5C;AACA,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,cAAA;AAC1B,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,eAAA;AAC3B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,IACpB;AACA,IAAA,OAAO,EAAA,CAAG,KAAK,QAAQ,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,KAAA,GAAc;AACZ,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,MAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,MAAA,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,EAAG;AAChD,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,cAAA,CAAe,OAAO,OAAkB,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAGzB,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,cAAA,EAAgB;AACxC,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,cAAA,CAAe,OAAO,OAAkB,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF;AACA,IAAA,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAC7B,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAO,EAAG;AACrD,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,cAAA,CAAe,OAAO,OAAkB,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF;AACA,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAA,GAAe;AACb,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,MAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,MAAA,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAC7B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,EAAG;AAChD,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAO,EAAG;AACrD,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBQ,cAAA,GAAuB;AAC7B,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,MAAA;AAAA,IACF;AAIA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,aAAA,CAAc,MAAA,EAAO,EAAG;AAChD,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBQ,iBAAA,CAAkB,KAAa,MAAA,EAA6B;AAClE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,GAAA,EAAK;AAIP,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,GAAG,CAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,CAAmB,KAAa,MAAA,EAA6B;AACnE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AAC3C,IAAA,IAAI,GAAA,IAAO,GAAA,CAAI,OAAA,KAAY,MAAA,CAAO,OAAA,EAAS;AACzC,MAAA,IAAA,CAAK,cAAA,CAAe,KAAK,GAAG,CAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAA,EAAK,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,wBAAA,GAA0C;AAC9C,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAKtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA;AAG7C,IAAA,MAAM,MAAA,CAAO,MAAM,mBAAA,EAAoB;AAGvC,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,cAAA,CAAe,OAAO,OAAkB,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAIR;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,mBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,CAAQ,KAAU,OAAA,EAAmC;AACnD,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,mBAAiD,QAAA,CAAS,gBAAA;AAChE,IAAA,MAAM,UAAA,GAA6B;AAAA,MACjC,OAAA,EAAS,CAAC,IAAA,KAAiB,gBAAA,CAAiB,IAAI,IAAI;AAAA,KACtD;AACA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAClC,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAA4B,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AACnF,IAAA,KAAA,MAAW,YAAA,IAAgB,SAAS,MAAA,EAAQ;AAC1C,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,OAAO,UAAA,CAAW,OAAA;AAClC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI,YAAY,MAAA,EAAW;AACzB,UAAC,OAAA,CAAwD,KAAK,UAAU,CAAA;AAAA,QAC1E,CAAA,MAAO;AACL,UAAA,OAAA;AAAA,YAAQ,YAAA,CAAa,IAAA;AAAA,YAAM,MACxB,OAAA,CAAwD,GAAA,EAAK,UAAU;AAAA,WAC1E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAA,GAAkC;AAChC,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,EAAK,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACpC,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAA,EAAO,EAAE,UAAA,CAAW,KAAA;AAAA,MACpB,MAAA,EAAQ,EAAE,UAAA,CAAW;AAAA,KACvB,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,aAAA,GAAyC;AACvC,IAAA,MAAM,SAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,EAAG;AAC5C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,IAAA,EAAM,MAAM,UAAA,CAAW,IAAA;AAAA,QACvB,QAAA,EAAU,MAAM,UAAA,CAAW;AAAA,OAC5B,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAIQ,YAAA,CACN,UACA,IAAA,EACwC;AACxC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,IAAA;AAE7B,MAAA,IAAI,UAAA,CAAW,OAAA,IAAW,CAAC,IAAA,CAAK,OAAA,EAAS;AACvC,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,aAAA;AAAA,YACN,QAAA,EAAU,SAAS,IAAI,CAAA,6CAAA,CAAA;AAAA,YACvB,IAAA,EAAM,yDAAA;AAAA,YACN,MAAA,EAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,UAAU,IAAA;AAAK,WAC1C;AAAA,SACH;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,aAAA,IAAiB,CAAC,IAAA,CAAK,aAAA,EAAe;AACnD,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,aAAA;AAAA,YACN,QAAA,EAAU,SAAS,IAAI,CAAA,yDAAA,CAAA;AAAA,YACvB,IAAA,EAAM,iEAAA;AAAA,YACN,MAAA,EAAQ;AAAA,cACN,GAAA,EAAK,eAAA;AAAA,cACL,QAAA,EAAU;AAAA;AACZ,WACD;AAAA,SACH;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,qBACN,QAAA,EACwC;AACxC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,UAAA,CAAW,gBAAA,IAAoB,EAAC,EAAG;AAC/D,QAAA,MAAM,SAAS,IAAA,CAAK,SAAA,CAAU,IAAI,UAAA,CAAW,MAAM,GAAG,WAAA,EAAa,MAAA;AACnE,QAAA,MAAM,cAAc,IAAA,CAAK,SAAA,CAAU,IAAI,UAAA,CAAW,WAAW,GAAG,WAAA,EAAa,MAAA;AAC7E,QAAA,MAAM,UAAA,GAAa,6BAAA;AAAA,UACjB,MAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA,CAAW;AAAA,SACb;AACA,QAAA,IAAI,CAAC,UAAA,CAAW,EAAA,EAAI,OAAO,GAAA,CAAI,WAAW,KAAK,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,0BACN,QAAA,EACwC;AACxC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,KAAA,MAAW,GAAA,IAAO,CAAC,GAAG,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAWvE,QAAA,IAAI,QAAQ,WAAA,EAAa;AACzB,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AAC5B,UAAA,OAAO,GAAA;AAAA,YACL,IAAI,gBAAA,CAAiB;AAAA,cACnB,IAAA,EAAM,kBAAA;AAAA,cACN,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,8BAA8B,GAAG,CAAA,0BAAA,CAAA;AAAA,cAC7D,MAAM,CAAA,kBAAA,EAAqB,GAAG,sCAAsC,GAAG,CAAA,aAAA,EAAgB,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,cAChG,MAAA,EAAQ;AAAA,gBACN,WAAA,EAAa,GAAA;AAAA,gBACb,UAAU,IAAA,CAAK;AAAA;AACjB,aACD;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,eAAe,IAAA,EAAiC;AACtD,IAAA,MAAM,WAA6B,EAAC;AACpC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,EAAG;AAC5C,MAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAA,KAAS,QAAA,EAAU;AACxC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,CAAW,UAAA,IAAc,yBAAA;AAC5C,MAAA,MAAM,qBACJ,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,IAAA,CAAK,gBAAgB,mBAAA,GAAsB,SAAA;AAC9E,MAAA,QAAA,CAAS,KAAK,EAAE,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,oBAAoB,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,0BAAA,GAAkE;AACxE,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,EAAG;AAC5C,MAAA,MAAM,OAAO,KAAA,CAAM,WAAA;AACnB,MAAA,IAAI,CAAC,IAAA,IAAQ,4BAAA,CAA6B,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAE5D,MAAA,OAAO,GAAA;AAAA,QACL,IAAI,gBAAA,CAAiB;AAAA,UACnB,IAAA,EAAM,gBAAA;AAAA,UACN,QAAA,EAAU,CAAA,oEAAA,EAAuE,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA;AAAA,UAC5F,IAAA,EAAM,CAAA,SAAA,EAAY,IAAA,CAAK,MAAM,CAAA,gDAAA,CAAA;AAAA,UAC7B,MAAA,EAAQ;AAAA,YACN,aAAa,KAAA,CAAM,GAAA;AAAA,YACnB,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,QAAA,EAAU;AAAA;AACZ,SACD;AAAA,OACH;AAAA,IACF;AACA,IAAA,OAAO,GAAG,MAAS,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBQ,oBAAA,CACN,MAAA,EACA,uBAAA,GAA0B,KAAA,EAC6B;AACvD,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAyB;AAC5C,IAAA,IACE,CAAC,MAAA,IACD,OAAQ,MAAA,CAA8C,aAAA,KAAkB,UAAA;AAExE,MAAA,OAAO,EAAA,CAAG,EAAE,gBAAA,EAAkB,MAAA,EAAQ,SAAA,kBAAW,IAAI,GAAA,EAAI,EAAG,UAAA,kBAAY,IAAI,GAAA,EAAI,EAAG,CAAA;AAErF,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAA2B;AACvD,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAA2B;AACxD,IAAA,MAAM,oBAAqC,EAAC;AAC5C,IAAA,MAAM,gBAAgB,MAAY;AAChC,MAAA,KAAA,MAAW,UAAU,iBAAA,EAAmB;AACtC,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,cAAA,CAAe,OAAO,OAAkB,CAAA;AAAA,QACjD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ,EAAG;AAC5C,MAAA,MAAM,OAAO,KAAA,CAAM,WAAA;AACnB,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW;AAClC,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,WAAW,CAAA;AAC9C,QAAA,MAAM,gBAAgB,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,KAAA,CAAO,CAAA;AAC3D,QAAA,IAAI,UAAA,KAAe,MAAA,IAAa,aAAA,KAAkB,MAAA,EAAW;AAC3D,UAAA,aAAA,EAAc;AACd,UAAA,OAAO,GAAA;AAAA,YACL,IAAI,gBAAA,CAAiB;AAAA,cACnB,IAAA,EAAM,sBAAA;AAAA,cACN,UAAU,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,UAAA,EAAa,KAAK,WAAW,CAAA,yCAAA,CAAA;AAAA,cAC1D,MAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,WAAW,CAAA,0BAAA,EAA6B,MAAM,GAAG,CAAA,CAAA,CAAA;AAAA,cACtF,MAAA,EAAQ;AAAA,gBACN,UAAU,KAAA,CAAM,GAAA;AAAA,gBAChB,WAAW,IAAA,CAAK;AAAA;AAClB,aACD;AAAA,WACH;AAAA,QACF;AACA,QAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,UAAU,CAAA;AAChC,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,GAAG,SAAS,aAAa,CAAA;AAC7C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACzC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAC3C,MAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAWvB,MAAA,MAAM,gBAAgB,OAAA,CAAQ;AAAA,QAC5B,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,KAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe;AAAC,OACnC,CAAA;AACD,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,GAAG,IAAI,aAAa,CAAA,CAAA;AAEzC,MAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,QAAA,MAAMA,UAAS,uBAAA,GAA0B,MAAA,GAAY,IAAA,CAAK,aAAA,CAAc,IAAI,GAAG,CAAA;AAC/E,QAAA,IAAIA,OAAAA,EAAQ;AACV,UAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAA,EAAKA,OAAAA,CAAO,IAAmB,CAAA;AAOhD,UAAA,MAAA,CAAO,IAAI,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,KAAA,CAAA,EAASA,QAAO,OAAc,CAAA;AACrD,UAAA;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,YAAA,EAAc;AACpC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,MAAM,GAAG,CAAA;AACvD,QAAA,IAAI,SAAA,EAAW,kBAAkB,aAAA,EAAe;AAC9C,UAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,SAAA,CAAU,IAAmB,CAAA;AAEnD,UAAA,MAAA,CAAO,IAAI,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,KAAA,CAAA,EAAS,UAAU,OAAc,CAAA;AACxD,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,OAAO,aAAA,CAAc;AAAA,QACrC,OAAO,KAAA,CAAM,GAAA;AAAA,QACb,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,oBAAoB,CAAA,EAAE;AAAA,QAC7C,aAAA,EAAe,CAAA;AAAA,QACf,aAAa,IAAA,CAAK,MAAA;AAAA,QAClB,SAAA,EAAW,IAAA;AAAA,QACX,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,WAAA,EAAa,IAAA,CAAK,WAAA,IAAe;AAAC,OAC1B,CAAA;AAEV,MAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACjB,QAAA,aAAA,EAAc;AACd,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,uBAAA;AAAA,YACN,QAAA,EAAU,CAAA,oDAAA,EAAuD,KAAA,CAAM,GAAG,CAAA,CAAA,CAAA;AAAA,YAC1E,IAAA,EAAM,CAAA,uDAAA,EAA0D,KAAA,CAAM,GAAG,CAAA,CAAA,CAAA;AAAA,YACzE,MAAA,EAAQ;AAAA,cACN,aAAa,KAAA,CAAM,GAAA;AAAA,cACnB,OAAA,EAAS,UAAU,KAAA,CAAM;AAAA;AAC3B,WACD;AAAA,SACH;AAAA,MACF;AAEA,MAAA,MAAM,aAAa,MAAA,CAAO,iBAAA,CAAkB,SAAA,CAAU,KAAA,EAAO,EAAE,CAAA;AAC/D,MAAA,IAAI,CAAC,WAAW,EAAA,EAAI;AAClB,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,cAAA,CAAe,UAAU,KAAK,CAAA;AAAA,QACvC,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,aAAA,EAAc;AACd,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,gBAAA,CAAiB;AAAA,YACnB,IAAA,EAAM,uBAAA;AAAA,YACN,QAAA,EAAU,CAAA,wDAAA,EAA2D,KAAA,CAAM,GAAG,CAAA,CAAA,CAAA;AAAA,YAC9E,IAAA,EAAM,CAAA,4DAAA,EAA+D,KAAA,CAAM,GAAG,CAAA,CAAA,CAAA;AAAA,YAC9E,MAAA,EAAQ;AAAA,cACN,aAAa,KAAA,CAAM,GAAA;AAAA,cACnB,OAAA,EAAS,WAAW,KAAA,CAAM;AAAA;AAC5B,WACD;AAAA,SACH;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,SAAS,SAAA,CAAU,KAAA;AAAA,QACnB,MAAM,UAAA,CAAW,KAAA;AAAA,QACjB;AAAA,OACF;AACA,MAAA,iBAAA,CAAkB,KAAK,MAAM,CAAA;AAE7B,MAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,QAAA,eAAA,CAAgB,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,MAAM,CAAA;AAAA,MACxC;AAEA,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,UAAA,CAAW,KAAK,CAAA;AAEtC,MAAA,MAAA,CAAO,IAAI,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,KAAA,CAAA,EAAS,UAAU,KAAY,CAAA;AAAA,IACxD;AAEA,IAAA,OAAO,EAAA,CAAG;AAAA,MACR,gBAAA,EAAkB,MAAA;AAAA,MAClB,SAAA,EAAW,eAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEQ,aAAa,IAAA,EAA6C;AAChE,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,OAAO,IAAA,KAAS,mBAAmB,IAAA,CAAK,IAAA,CAAK,KAAK,cAAA,GAAiB,CAAC,IAAI,IAAA,CAAK,cAAA;AAAA,IAC/E;AACA,IAAA,OAAO,IAAA,CAAK,CAAA;AAAA,EACd;AAAA,EAEQ,cAAc,IAAA,EAA6C;AACjE,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,OAAO,IAAA,KAAS,mBAAmB,IAAA,CAAK,IAAA,CAAK,KAAK,eAAA,GAAkB,CAAC,IAAI,IAAA,CAAK,eAAA;AAAA,IAChF;AACA,IAAA,OAAO,IAAA,CAAK,CAAA;AAAA,EACd;AAAA,EAEQ,uBACN,QAAA,EACwC;AACxC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO;AACvC,QAAA,MAAM,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,GAAG,CAAA,EAAG,WAAW,QAAA,KAAa,YAAA;AAClE,QAAA,IAAI,GAAA,KAAQ,eAAe,CAAC,QAAA,IAAY,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACzD,UAAA,OAAO,GAAA;AAAA,YACL,IAAI,gBAAA,CAAiB;AAAA,cACnB,IAAA,EAAM,eAAA;AAAA,cACN,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,IAAI,gBAAgB,GAAG,CAAA,uBAAA,CAAA;AAAA,cAC/C,MAAM,CAAA,wBAAA,EAA2B,GAAG,iBAAiB,GAAG,CAAA,aAAA,EAAgB,KAAK,IAAI,CAAA,OAAA,CAAA;AAAA,cACjF,MAAA,EAAQ;AAAA,gBACN,WAAA,EAAa,GAAA;AAAA,gBACb,UAAU,IAAA,CAAK;AAAA;AACjB,aACD;AAAA,WACH;AAAA,QACF;AAAA,MACF;AACA,MAAA,KAAA,MAAW,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"index.mjs","sourcesContent":["// @forgeax/engine-render-graph/src/errors.ts — RenderGraphError closed-union\n// error model + Result<T, E>.\n//\n// Shape (plan-strategy D-3):\n// - RenderGraphErrorCode, RenderGraphErrorDetail, and the constructor argument\n// union derive from one private code-to-detail map.\n// - RenderGraphError extends Error { readonly code; readonly expected;\n// readonly hint; readonly detail } — four-field structured error surface,\n// aligned with RhiError (research Finding 8).\n// - RenderGraphErrorDetail is projected from that map; the\n// constructor arguments correlate each code with its accepted detail:\n// - 'dangling-read' / 'unknown-resource' -> { resourceKey, passName }\n// - 'cap-missing' -> { cap, passName }\n// - 'duplicate-resource' -> { resourceKey }\n// - 'alias-source-missing' -> { aliasKey, sourceKey }\n// - Result<T, E=RenderGraphError> = binary tag union ('ok' / 'err') +\n// ok() / err() factories, aligned with RhiError Result (research Finding 8).\n//\n// Related: plan-strategy D-3; research Finding 8; AC-15.\n\n/**\n * Private code-to-detail authority for the complete RenderGraphError surface.\n *\n * The two resource-key errors intentionally share DanglingReadDetail. Keeping\n * that fact in this map lets the public code and detail unions, plus the\n * constructor arguments, derive from one authority without\n * exporting a framework or runtime registry.\n */\ninterface RenderGraphErrorDetailByCode {\n 'dangling-read': DanglingReadDetail;\n 'cap-missing': CapMissingDetail;\n 'duplicate-resource': DuplicateResourceDetail;\n 'alias-source-missing': AliasSourceDetail;\n 'unknown-resource': DanglingReadDetail;\n 'resource-alloc-failed': ResourceAllocFailedDetail;\n 'invalid-format': InvalidFormatDetail;\n 'observation-absent': ObservationDetail;\n 'observation-invalid-format': ObservationDetail;\n 'observation-invalid-size': ObservationDetail;\n 'observation-missing-copy-src': ObservationDetail;\n 'observation-stale': ObservationDetail;\n 'observation-retired': ObservationDetail;\n 'invalid-color-domain': ColorDomainDetail;\n 'missing-color-domain': ColorDomainDetail;\n 'color-domain-mismatch': ColorDomainDetail;\n 'duplicate-pass-name': DeclarationDetail;\n 'duplicate-resource-label': DeclarationDetail;\n 'builder-sealed': DeclarationDetail;\n 'foreign-resource-handle': ResourceAccessDetail;\n 'resource-not-declared-by-pass': ResourceAccessDetail;\n 'uninitialized-read': ResourceAccessDetail;\n 'access-conflict': ResourceAccessDetail;\n 'capability-missing': CapabilityDetail;\n 'resource-descriptor-invalid': DescriptorDetail;\n 'import-usage-mismatch': DescriptorDetail;\n 'resource-allocation-failed': ResourceAllocFailedDetail;\n 'resource-resolution-failed': ResourceAccessDetail;\n 'pass-encode-failed': PassFailureDetail;\n 'compiled-graph-retired': LifecycleDetail;\n 'resource-retire-failed': LifecycleDetail;\n}\n\n/** Closed RenderGraphErrorCode union derived from the private detail map. */\nexport type RenderGraphErrorCode = keyof RenderGraphErrorDetailByCode;\n\n/** Detail union projected from the private code-to-detail map. */\nexport type RenderGraphErrorDetail = RenderGraphErrorDetailByCode[RenderGraphErrorCode];\n\n/** Failure stages for the shared float/output surface contract. */\nexport type SurfaceFailureKind =\n | 'allocation'\n | 'attachment'\n | 'sampled-read'\n | 'view-domain'\n | 'raw-endpoint';\n\n/** Closed error codes derived from the surface failure kinds. */\nexport type SurfaceFailureCode = `surface-${SurfaceFailureKind}-failed`;\n\n/** Shared detail for graph and render-surface recovery. */\nexport interface RenderSurfaceFailureDetail {\n readonly lane: string;\n readonly stage: string;\n readonly target: string;\n readonly format: string;\n readonly domain: string;\n readonly endpoint: string;\n readonly capability: string;\n}\n\n/**\n * Constructor arguments correlated by code. `detail` remains optional to\n * preserve the existing envelope behavior for callers that only need the\n * top-level fields.\n */\ntype RenderGraphErrorConstructorArgs = {\n [Code in RenderGraphErrorCode]: {\n code: Code;\n expected: string;\n hint: string;\n detail?: RenderGraphErrorDetailByCode[Code] | undefined;\n };\n}[RenderGraphErrorCode];\n\n/** Detail variant for dangling-read and unknown-resource errors. */\nexport interface DanglingReadDetail {\n readonly resourceKey: string;\n readonly passName: string;\n}\n\n/** Detail variant for cap-missing errors. */\nexport interface CapMissingDetail {\n readonly cap: 'compute' | 'storageBuffer';\n readonly passName: string;\n}\n\n/** Detail variant for duplicate-resource errors. */\nexport interface DuplicateResourceDetail {\n readonly resourceKey: string;\n}\n\n/** Detail variant for aliases whose source is not a registered color target. */\nexport interface AliasSourceDetail {\n readonly aliasKey: string;\n readonly sourceKey: string;\n}\n\n/** Detail variant for resource-alloc-failed errors. */\nexport interface ResourceAllocFailedDetail {\n readonly resourceKey: string;\n readonly passName?: string | undefined;\n readonly rhiCode?: string | undefined;\n}\n\n/** Detail variant for invalid-format errors. */\nexport interface InvalidFormatDetail {\n readonly resourceKey: string;\n readonly format: string;\n readonly expected: readonly string[];\n}\n\n/** Generic current-frame observation failures. */\nexport interface ObservationDetail {\n readonly frameId?: number | undefined;\n readonly expected?: string | undefined;\n}\n\nexport interface ColorDomainDetail {\n readonly value?: string | undefined;\n readonly resourceKey?: string | undefined;\n readonly sourceDomain?: string | undefined;\n readonly destinationDomain?: string | undefined;\n}\n\nexport interface DeclarationDetail {\n readonly passName?: string | undefined;\n readonly resourceLabel?: string | undefined;\n}\n\nexport interface ResourceAccessDetail {\n readonly passName?: string | undefined;\n readonly resourceLabel?: string | undefined;\n readonly usage?: string | undefined;\n readonly accesses?: readonly string[] | undefined;\n}\n\nexport interface CapabilityDetail extends ResourceAccessDetail {\n readonly capability: 'compute' | 'storage-buffer' | 'storage-texture' | 'indirect';\n}\n\nexport interface DescriptorDetail {\n readonly resourceLabel: string;\n readonly field: string;\n readonly expected: string;\n readonly actual?: string | number | undefined;\n}\n\nexport interface PassFailureDetail {\n readonly passName: string;\n readonly passKind: 'raster' | 'compute' | 'copy';\n readonly cause: unknown;\n}\n\nexport interface LifecycleDetail {\n readonly generation: number;\n readonly resourceLabel?: string | undefined;\n readonly cause?: unknown;\n}\n\n/**\n * Structured RenderGraph error.\n *\n * Four readonly fields aligned with AGENTS.md \"Errors are structured\"\n * and RhiError (research Finding 8):\n * - `.code` — closed union member (L1 key signal).\n * - `.expected` — expected-state description (L2 detail).\n * - `.hint` — actionable recovery guidance (L2 detail).\n * - `.detail` — narrowed payload per code variant.\n */\nexport class RenderGraphError extends Error {\n readonly code: RenderGraphErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: RenderGraphErrorDetail | undefined;\n\n constructor(args: RenderGraphErrorConstructorArgs) {\n super(`[RenderGraphError ${args.code}] expected: ${args.expected}; hint: ${args.hint}`);\n this.name = 'RenderGraphError';\n this.code = args.code;\n this.expected = args.expected;\n this.hint = args.hint;\n this.detail = args.detail;\n }\n}\n\n// Result<T, E> + ok / err + ResultOk / ResultErr live in `@forgeax/engine-types`\n// (tweak-20260612-result-into-types). Consolidated upstream from this and 4\n// other packages' duplicate definitions; the barrel here re-exports them so\n// existing `import { err, ok, Result } from '@forgeax/engine-render-graph'`\n// consumers stay unchanged.\nexport {\n err,\n ok,\n type Result,\n type ResultErr,\n type ResultOk,\n} from '@forgeax/engine-types';\n","import type { Buffer, Texture, TextureView } from '@forgeax/engine-rhi';\nimport type {\n GraphAccess,\n GraphBuffer,\n GraphBufferDescriptor,\n GraphPass,\n GraphResourceKind,\n GraphResourceOrigin,\n GraphTexture,\n GraphTextureDescriptor,\n GraphTextureView,\n GraphTextureViewDescriptor,\n ImportedBufferDescriptor,\n ImportedTextureDescriptor,\n ImportedTextureViewResolver,\n RenderGraphFrame,\n} from './types.js';\n\nexport interface TextureHandleData {\n readonly owner: object;\n readonly id: number;\n readonly kind: 'texture';\n}\n\nexport interface TextureViewHandleData {\n readonly owner: object;\n readonly id: number;\n readonly kind: 'texture-view';\n readonly textureId: number;\n}\n\nexport interface BufferHandleData {\n readonly owner: object;\n readonly id: number;\n readonly kind: 'buffer';\n}\n\nexport type ResourceHandleData = TextureHandleData | TextureViewHandleData | BufferHandleData;\n\nexport function textureHandle(owner: object, id: number): GraphTexture {\n return Object.freeze({ owner, id, kind: 'texture' }) as unknown as GraphTexture;\n}\n\nexport function textureViewHandle(owner: object, id: number, textureId: number): GraphTextureView {\n return Object.freeze({\n owner,\n id,\n kind: 'texture-view',\n textureId,\n }) as unknown as GraphTextureView;\n}\n\nexport function bufferHandle(owner: object, id: number): GraphBuffer {\n return Object.freeze({ owner, id, kind: 'buffer' }) as unknown as GraphBuffer;\n}\n\nexport function handleData(resource: unknown): ResourceHandleData | undefined {\n if (typeof resource !== 'object' || resource === null) return undefined;\n const candidate = resource as Partial<ResourceHandleData>;\n if (typeof candidate.id !== 'number' || typeof candidate.owner !== 'object') return undefined;\n if (\n candidate.kind !== 'texture' &&\n candidate.kind !== 'texture-view' &&\n candidate.kind !== 'buffer'\n ) {\n return undefined;\n }\n return candidate as ResourceHandleData;\n}\n\ninterface ResourceRecordBase {\n readonly id: number;\n readonly label: string;\n readonly kind: GraphResourceKind;\n readonly origin: GraphResourceOrigin;\n}\n\nexport interface CreatedTextureRecord extends ResourceRecordBase {\n readonly kind: 'texture';\n readonly origin: 'created';\n readonly descriptor: GraphTextureDescriptor;\n}\n\nexport interface ImportedTextureRecord<FrameCtx> extends ResourceRecordBase {\n readonly kind: 'texture';\n readonly origin: 'imported';\n readonly descriptor: ImportedTextureDescriptor;\n readonly resolve: (frame: FrameCtx) => Texture;\n}\n\nexport interface CreatedBufferRecord extends ResourceRecordBase {\n readonly kind: 'buffer';\n readonly origin: 'created';\n readonly descriptor: GraphBufferDescriptor;\n}\n\nexport interface ImportedBufferRecord<FrameCtx> extends ResourceRecordBase {\n readonly kind: 'buffer';\n readonly origin: 'imported';\n readonly descriptor: ImportedBufferDescriptor;\n readonly resolve: (frame: FrameCtx) => Buffer;\n}\n\nexport type ResourceRecord<FrameCtx> =\n | CreatedTextureRecord\n | ImportedTextureRecord<FrameCtx>\n | CreatedBufferRecord\n | ImportedBufferRecord<FrameCtx>;\n\nexport interface TextureViewRecord<FrameCtx extends RenderGraphFrame = RenderGraphFrame> {\n readonly id: number;\n readonly label: string;\n readonly textureId: number;\n readonly descriptor: GraphTextureViewDescriptor;\n readonly resolve?: ImportedTextureViewResolver<FrameCtx> | undefined;\n}\n\nexport interface PassRecord<FrameCtx extends RenderGraphFrame> {\n readonly id: number;\n readonly name: string;\n readonly pass: GraphPass<FrameCtx>;\n}\n\nexport interface CompiledResource<FrameCtx> {\n readonly record: ResourceRecord<FrameCtx>;\n readonly usage: number;\n readonly firstUse: number | null;\n readonly lastUse: number | null;\n readonly texture?: Texture | undefined;\n readonly buffer?: Buffer | undefined;\n}\n\nexport interface CompiledView<FrameCtx extends RenderGraphFrame = RenderGraphFrame> {\n readonly record: TextureViewRecord<FrameCtx>;\n readonly view?: TextureView | undefined;\n}\n\nexport interface CompiledPass<FrameCtx extends RenderGraphFrame> extends PassRecord<FrameCtx> {\n readonly dependencies: readonly number[];\n readonly resourceIds: ReadonlySet<number>;\n readonly viewIds: ReadonlySet<number>;\n}\n\nexport function accessResourceId(access: GraphAccess): number | undefined {\n const data = handleData(access.resource);\n if (data?.kind === 'texture-view') return data.textureId;\n return data?.id;\n}\n","import type {\n Buffer,\n RenderPassColorAttachment,\n RenderPassDepthStencilAttachment,\n RhiComputePassEncoder,\n RhiDevice,\n Texture,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport { err, ok, RenderGraphError, type Result } from './errors.js';\nimport type { ResolvedColorTargetDescriptor } from './graph.js';\nimport type {\n CompiledPass,\n CompiledResource,\n CompiledView,\n ResourceHandleData,\n} from './kernel-internal.js';\nimport { handleData } from './kernel-internal.js';\nimport type {\n CompiledRenderGraph,\n CompiledRenderGraphInfo,\n GraphBuffer,\n GraphResourceResolver,\n GraphTexture,\n GraphTextureView,\n RenderGraphFrame,\n RenderGraphPassInstrumentation,\n RenderGraphPassRunner,\n} from './types.js';\n\ninterface FrameResources {\n readonly buffers: ReadonlyMap<number, Buffer>;\n readonly textures: ReadonlyMap<number, Texture>;\n readonly views: ReadonlyMap<number, TextureView>;\n}\n\nfunction resolutionError(label: string, cause?: unknown): RenderGraphError {\n return new RenderGraphError({\n code: 'resource-resolution-failed',\n expected: `resource '${label}' resolves to a live RHI handle for this frame`,\n hint: `repair the imported owner for '${label}' before executing the graph`,\n detail: { resourceLabel: label, ...(cause === undefined ? {} : { accesses: [String(cause)] }) },\n });\n}\n\nexport class CompiledRenderGraphImpl<FrameCtx extends RenderGraphFrame>\n implements CompiledRenderGraph<FrameCtx>\n{\n private retired = false;\n private retireResult: Promise<Result<void, RenderGraphError>> | undefined;\n\n constructor(\n private readonly generation: number,\n private readonly owner: object,\n private readonly device: RhiDevice,\n private readonly resources: ReadonlyMap<number, CompiledResource<FrameCtx>>,\n private readonly views: ReadonlyMap<number, CompiledView<FrameCtx>>,\n private readonly passes: readonly CompiledPass<FrameCtx>[],\n private readonly info: CompiledRenderGraphInfo,\n private readonly colorTargetDescriptors: ReadonlyMap<string, ResolvedColorTargetDescriptor>,\n ) {}\n\n inspect(): CompiledRenderGraphInfo {\n return this.info;\n }\n\n getColorTargetView(name: string): TextureView | undefined {\n for (const view of this.views.values()) {\n const resource = this.resources.get(view.record.textureId);\n if (resource?.record.label === name) return view.view;\n }\n return undefined;\n }\n\n getColorTargetTexture(name: string): Texture | undefined {\n for (const resource of this.resources.values()) {\n if (resource.record.label === name) return resource.texture;\n }\n return undefined;\n }\n\n getColorTargetDescriptor(name: string): ResolvedColorTargetDescriptor | undefined {\n return this.colorTargetDescriptors.get(name);\n }\n\n execute(\n frame: FrameCtx,\n runPass?: RenderGraphPassRunner,\n instrumentation?: RenderGraphPassInstrumentation<FrameCtx>,\n ): Result<void, RenderGraphError> {\n if (this.retired) {\n return err(\n new RenderGraphError({\n code: 'compiled-graph-retired',\n expected: 'a compiled graph executes only before retire()',\n hint: 'publish and execute the replacement compiled graph',\n detail: { generation: this.generation },\n }),\n );\n }\n\n const resolved = this.resolveFrameResources(frame);\n if (!resolved.ok) return resolved;\n\n for (const [executionIndex, pass] of this.passes.entries()) {\n const resolver = this.createPassResolver(pass, resolved.value);\n try {\n if (pass.pass.descriptor.executeIf?.(frame) === false) continue;\n const execution = { name: pass.name, kind: pass.pass.kind, executionIndex };\n const scope = instrumentation?.begin(execution, frame);\n let encodeResult: Result<void, RenderGraphError> = ok(undefined);\n const encode = () => {\n switch (pass.pass.kind) {\n case 'raster': {\n const descriptor = pass.pass.descriptor;\n const colorAttachments: RenderPassColorAttachment[] = [];\n for (const attachment of descriptor.colorAttachments) {\n const view = resolver.textureView(attachment.view);\n if (!view.ok) {\n encodeResult = view;\n return;\n }\n const resolveTarget =\n attachment.resolveTarget === undefined\n ? undefined\n : resolver.textureView(attachment.resolveTarget);\n if (resolveTarget !== undefined && !resolveTarget.ok) {\n encodeResult = resolveTarget;\n return;\n }\n const clearValue =\n typeof attachment.clearValue === 'function'\n ? attachment.clearValue(frame)\n : attachment.clearValue;\n colorAttachments.push({\n view: view.value,\n ...(resolveTarget === undefined ? {} : { resolveTarget: resolveTarget.value }),\n ...(clearValue === undefined ? {} : { clearValue }),\n loadOp: attachment.loadOp,\n storeOp: attachment.storeOp,\n ...(attachment.depthSlice === undefined\n ? {}\n : { depthSlice: attachment.depthSlice }),\n });\n }\n let depthStencilAttachment: RenderPassDepthStencilAttachment | undefined;\n if (descriptor.depthStencilAttachment !== undefined) {\n const attachment = descriptor.depthStencilAttachment;\n const view = resolver.textureView(attachment.view);\n if (!view.ok) {\n encodeResult = view;\n return;\n }\n depthStencilAttachment = {\n view: view.value,\n ...(attachment.depthClearValue === undefined\n ? {}\n : { depthClearValue: attachment.depthClearValue }),\n ...(attachment.depthLoadOp === undefined\n ? {}\n : { depthLoadOp: attachment.depthLoadOp }),\n ...(attachment.depthStoreOp === undefined\n ? {}\n : { depthStoreOp: attachment.depthStoreOp }),\n ...(attachment.depthReadOnly === undefined\n ? {}\n : { depthReadOnly: attachment.depthReadOnly }),\n ...(attachment.stencilClearValue === undefined\n ? {}\n : { stencilClearValue: attachment.stencilClearValue }),\n ...(attachment.stencilLoadOp === undefined\n ? {}\n : { stencilLoadOp: attachment.stencilLoadOp }),\n ...(attachment.stencilStoreOp === undefined\n ? {}\n : { stencilStoreOp: attachment.stencilStoreOp }),\n ...(attachment.stencilReadOnly === undefined\n ? {}\n : { stencilReadOnly: attachment.stencilReadOnly }),\n };\n }\n const baseDescriptor = {\n label: pass.name,\n colorAttachments,\n ...(depthStencilAttachment === undefined ? {} : { depthStencilAttachment }),\n };\n const instrumentedDescriptor =\n scope?.renderPassDescriptor?.(baseDescriptor) ?? baseDescriptor;\n const encoder = frame.encoder.beginRenderPass(instrumentedDescriptor);\n try {\n descriptor.encode({ pass: encoder, frame, resources: resolver });\n } finally {\n encoder.end();\n }\n break;\n }\n case 'compute': {\n const begin = pass.pass.descriptor.begin?.(frame);\n const instrumentedBegin = scope?.computePassDescriptor?.(begin ?? {}) ?? begin;\n let encoder: RhiComputePassEncoder;\n try {\n encoder = frame.encoder.beginComputePass({\n ...(instrumentedBegin ?? {}),\n label: pass.name,\n });\n } catch (cause) {\n pass.pass.descriptor.onBeginError?.(frame, cause);\n throw cause;\n }\n try {\n pass.pass.descriptor.encode({ pass: encoder, frame, resources: resolver });\n } finally {\n encoder.end();\n }\n pass.pass.descriptor.after?.(frame);\n break;\n }\n case 'copy':\n scope?.beforeCopy?.(frame.encoder);\n try {\n pass.pass.descriptor.encode({ encoder: frame.encoder, frame, resources: resolver });\n } finally {\n scope?.afterCopy?.(frame.encoder);\n }\n break;\n }\n };\n if (runPass === undefined) {\n encode();\n } else {\n runPass(execution, encode);\n }\n if (!encodeResult.ok) return encodeResult;\n } catch (cause) {\n return err(\n new RenderGraphError({\n code: 'pass-encode-failed',\n expected: `pass '${pass.name}' encodes without throwing`,\n hint: 'inspect detail.cause and repair the pass-owned RHI command',\n detail: { passName: pass.name, passKind: pass.pass.kind, cause },\n }),\n );\n }\n }\n return ok(undefined);\n }\n\n retire(): Promise<Result<void, RenderGraphError>> {\n if (this.retireResult !== undefined) return this.retireResult;\n this.retired = true;\n this.retireResult = this.finishRetire();\n return this.retireResult;\n }\n\n private async finishRetire(): Promise<Result<void, RenderGraphError>> {\n try {\n await this.device.queue.onSubmittedWorkDone();\n } catch (cause) {\n return err(\n new RenderGraphError({\n code: 'resource-retire-failed',\n expected: 'the GPU submission fence resolves before graph resources retire',\n hint: 'recover the device before retiring the replacement generation',\n detail: { generation: this.generation, cause },\n }),\n );\n }\n\n let firstFailure: RenderGraphError | undefined;\n for (const compiled of this.resources.values()) {\n if (compiled.record.origin === 'imported') continue;\n if (compiled.texture === undefined && compiled.buffer === undefined) continue;\n try {\n const destroyed =\n compiled.record.kind === 'texture'\n ? this.device.destroyTexture(compiled.texture as Texture)\n : this.device.destroyBuffer(compiled.buffer as Buffer);\n if (!destroyed.ok && firstFailure === undefined) {\n firstFailure = new RenderGraphError({\n code: 'resource-retire-failed',\n expected: `graph-created resource '${compiled.record.label}' retires exactly once`,\n hint: 'inspect detail.cause for the RHI destroy refusal',\n detail: {\n generation: this.generation,\n resourceLabel: compiled.record.label,\n cause: destroyed.error,\n },\n });\n }\n } catch (cause) {\n firstFailure ??= new RenderGraphError({\n code: 'resource-retire-failed',\n expected: `graph-created resource '${compiled.record.label}' retires exactly once`,\n hint: 'inspect detail.cause for the RHI destroy failure',\n detail: { generation: this.generation, resourceLabel: compiled.record.label, cause },\n });\n }\n }\n return firstFailure === undefined ? ok(undefined) : err(firstFailure);\n }\n\n private resolveFrameResources(frame: FrameCtx): Result<FrameResources, RenderGraphError> {\n const buffers = new Map<number, Buffer>();\n const textures = new Map<number, Texture>();\n const views = new Map<number, TextureView>();\n\n for (const compiled of this.resources.values()) {\n if (compiled.usage === 0) continue;\n try {\n if (compiled.record.kind === 'texture') {\n const texture =\n compiled.record.origin === 'created'\n ? compiled.texture\n : compiled.record.resolve(frame);\n if (texture === undefined) return err(resolutionError(compiled.record.label));\n textures.set(compiled.record.id, texture);\n } else {\n const buffer =\n compiled.record.origin === 'created' ? compiled.buffer : compiled.record.resolve(frame);\n if (buffer === undefined) return err(resolutionError(compiled.record.label));\n buffers.set(compiled.record.id, buffer);\n }\n } catch (cause) {\n return err(resolutionError(compiled.record.label, cause));\n }\n }\n\n for (const compiledView of this.views.values()) {\n if (this.resources.get(compiledView.record.textureId)?.usage === 0) continue;\n if (compiledView.record.resolve !== undefined) {\n try {\n views.set(compiledView.record.id, compiledView.record.resolve(frame));\n } catch (cause) {\n return err(resolutionError(compiledView.record.label, cause));\n }\n continue;\n }\n if (compiledView.view !== undefined) {\n views.set(compiledView.record.id, compiledView.view);\n continue;\n }\n const texture = textures.get(compiledView.record.textureId);\n if (texture === undefined) return err(resolutionError(compiledView.record.label));\n const created = this.device.createTextureView(texture, compiledView.record.descriptor);\n if (!created.ok) return err(resolutionError(compiledView.record.label, created.error));\n views.set(compiledView.record.id, created.value);\n }\n return ok({ buffers, textures, views });\n }\n\n private createPassResolver(\n pass: CompiledPass<FrameCtx>,\n frameResources: FrameResources,\n ): GraphResourceResolver {\n const lookup = (\n resource: GraphBuffer | GraphTexture | GraphTextureView,\n expectedKind: ResourceHandleData['kind'],\n ): Result<ResourceHandleData, RenderGraphError> => {\n const data = handleData(resource);\n const resourceId = data?.kind === 'texture-view' ? data.textureId : data?.id;\n if (data === undefined || data.owner !== this.owner || data.kind !== expectedKind) {\n return err(\n new RenderGraphError({\n code: 'foreign-resource-handle',\n expected: `pass '${pass.name}' resolves a handle owned by this compiled graph`,\n hint: 'use only handles created by the builder that declared this pass',\n detail: { passName: pass.name },\n }),\n );\n }\n if (resourceId === undefined || !pass.resourceIds.has(resourceId)) {\n const label = this.resources.get(resourceId ?? -1)?.record.label;\n return err(\n new RenderGraphError({\n code: 'resource-not-declared-by-pass',\n expected: `pass '${pass.name}' resolves only resources present in its accesses`,\n hint: 'add the resource access to this pass before resolving it',\n detail: { passName: pass.name, resourceLabel: label },\n }),\n );\n }\n if (data.kind === 'texture-view' && !pass.viewIds.has(data.id)) {\n const label = this.views.get(data.id)?.record.label;\n return err(\n new RenderGraphError({\n code: 'resource-not-declared-by-pass',\n expected: `pass '${pass.name}' resolves only texture views present in its accesses`,\n hint: 'add this exact texture view to the pass accesses',\n detail: { passName: pass.name, resourceLabel: label },\n }),\n );\n }\n return ok(data);\n };\n\n return {\n buffer: (resource) => {\n const data = lookup(resource, 'buffer');\n if (!data.ok) return data;\n const buffer = frameResources.buffers.get(data.value.id);\n return buffer === undefined\n ? err(resolutionError(this.resources.get(data.value.id)?.record.label ?? 'buffer'))\n : ok(buffer);\n },\n texture: (resource) => {\n const data = lookup(resource, 'texture');\n if (!data.ok) return data;\n const texture = frameResources.textures.get(data.value.id);\n return texture === undefined\n ? err(resolutionError(this.resources.get(data.value.id)?.record.label ?? 'texture'))\n : ok(texture);\n },\n textureView: (resource) => {\n const data = lookup(resource, 'texture-view');\n if (!data.ok) return data;\n const view = frameResources.views.get(data.value.id);\n return view === undefined\n ? err(resolutionError(this.views.get(data.value.id)?.record.label ?? 'texture view'))\n : ok(view);\n },\n };\n }\n}\n","// @forgeax/engine-render-graph/src/resource-registry.ts — resource\n// declaration registry (plan-strategy 3.1).\n//\n// Shape (D-4/D-6.1):\n// - string key -> ResourceDescriptor + bufferRole + lifetime\n// - duplicate-resource fail-fast across every declaration form\n// - unknown-resource fail-fast at pass binding time\n// - addColorTarget: color target registration with format/size/sample/usage\n\nimport type { TextureFormat } from '@forgeax/engine-rhi';\nimport {\n type AliasSourceDetail,\n type CapMissingDetail,\n type DanglingReadDetail,\n type DuplicateResourceDetail,\n err,\n ok,\n RenderGraphError,\n type Result,\n} from './errors.js';\nimport type {\n ColorTargetDescriptor,\n ColorTargetSize,\n ResourceDescriptor,\n ResourceLifetime,\n} from './graph.js';\nimport type { ColorValueDomain } from './pipeline/color-value-domain.js';\n\n/** Check the only allocation/view dimension combinations supported by WebGPU. */\nexport function isTextureViewDimensionCompatible(\n allocationDimension: GPUTextureDimension,\n viewDimension: GPUTextureViewDimension | undefined,\n): boolean {\n if (viewDimension === undefined) return true;\n if (allocationDimension === '3d') return viewDimension === '3d';\n return viewDimension !== '3d';\n}\n\n/**\n * Per-resource GPU allocation metadata carried through compile.\n * When the resource was registered via addColorTarget, colorTarget\n * carries the format/size/sample/usage fields (w5); when via\n * addResource it is undefined.\n */\nexport interface ColorTargetResourceMeta {\n readonly format: TextureFormat;\n readonly size: ColorTargetSize;\n readonly sample: number;\n readonly usage: number;\n /** Explicit semantic color domain; never derived from format. */\n readonly domain?: ColorValueDomain | undefined;\n /**\n * Extra texture view formats pre-declared at GPU texture creation. Mirrors\n * GPUTextureDescriptor.viewFormats. Used by the LDR MSAA path which needs a\n * `bgra8unorm` storage texture plus a `bgra8unorm-srgb` view of the same\n * texture for hardware sRGB encoding on store.\n */\n readonly viewFormats?: readonly TextureFormat[] | undefined;\n /**\n * When set, this resource is an alias of the given source resource.\n * The compile allocation phase folds the alias into the source's\n * physical texture (KB-1 MoveNode pattern, D-2).\n */\n readonly aliasedFrom?: string | undefined;\n}\n\nexport interface ResourceEntry {\n readonly key: string;\n readonly descriptor: ResourceDescriptor;\n readonly lifetime: ResourceLifetime;\n /** Present when the resource was registered via addColorTarget (w5). */\n readonly colorTarget?: ColorTargetResourceMeta | undefined;\n}\n\nexport class ResourceRegistry {\n private readonly resources = new Map<string, ResourceEntry>();\n\n add(key: string, descriptor: ResourceDescriptor): Result<ResourceEntry, RenderGraphError> {\n const entry: ResourceEntry = {\n key,\n descriptor,\n lifetime: descriptor.lifetime,\n };\n return this.register(entry);\n }\n\n /**\n * Register a color target resource (D-8).\n * Same semantics as addResource with kind:'texture' plus GPU texture\n * allocation metadata. Existing callers default to a transient target.\n */\n addColorTarget(\n name: string,\n desc: ColorTargetDescriptor,\n ): Result<ResourceEntry, RenderGraphError> {\n const lifetime = desc.lifetime ?? 'transient';\n const colorTargetMeta: ColorTargetResourceMeta = {\n format: desc.format,\n size: desc.size,\n sample: desc.sample ?? 1,\n usage: desc.usage ?? 0x10 | 0x04, // RENDER_ATTACHMENT | TEXTURE_BINDING\n ...(desc.domain !== undefined ? { domain: desc.domain } : {}),\n ...(desc.viewFormats !== undefined ? { viewFormats: desc.viewFormats } : {}),\n };\n const entry: ResourceEntry = {\n key: name,\n descriptor: { kind: 'texture', lifetime },\n lifetime,\n colorTarget: colorTargetMeta,\n };\n return this.register(entry);\n }\n\n /**\n * Register a color target alias that folds into the source's physical\n * texture at compile time (KB-1 MoveNode pattern, D-2).\n * The source must already be registered via addColorTarget.\n */\n addColorTargetAlias(name: string, source: string): Result<ResourceEntry, RenderGraphError> {\n if (this.resources.has(name)) return this.duplicateResource(name);\n const sourceMeta = this.resources.get(source)?.colorTarget;\n if (sourceMeta === undefined) {\n return err(\n new RenderGraphError({\n code: 'alias-source-missing',\n expected: `alias '${name}' source '${source}' must be a registered color target`,\n hint: `call addColorTarget('${source}', ...) before retrying alias '${name}'`,\n detail: { aliasKey: name, sourceKey: source } satisfies AliasSourceDetail,\n }),\n );\n }\n const entry: ResourceEntry = {\n key: name,\n descriptor: { kind: 'texture', lifetime: 'transient' },\n lifetime: 'transient',\n colorTarget: {\n format: sourceMeta.format,\n size: sourceMeta.size,\n sample: sourceMeta.sample,\n usage: sourceMeta.usage,\n ...(sourceMeta.domain !== undefined ? { domain: sourceMeta.domain } : {}),\n ...(sourceMeta.viewFormats !== undefined ? { viewFormats: sourceMeta.viewFormats } : {}),\n aliasedFrom: source,\n },\n };\n return this.register(entry);\n }\n\n private duplicateResource(key: string): Result<ResourceEntry, RenderGraphError> {\n return err(\n new RenderGraphError({\n code: 'duplicate-resource',\n expected: `resource key '${key}' registered exactly once`,\n hint: `remove the duplicate resource declaration for '${key}' or use a different key`,\n detail: { resourceKey: key } satisfies DuplicateResourceDetail,\n }),\n );\n }\n\n private register(entry: ResourceEntry): Result<ResourceEntry, RenderGraphError> {\n if (this.resources.has(entry.key)) return this.duplicateResource(entry.key);\n this.resources.set(entry.key, entry);\n return ok(entry);\n }\n\n get(key: string): ResourceEntry | undefined {\n return this.resources.get(key);\n }\n\n getColorTargetMeta(key: string): ColorTargetResourceMeta | undefined {\n return this.resources.get(key)?.colorTarget;\n }\n\n has(key: string): boolean {\n return this.resources.has(key);\n }\n\n entries(): IterableIterator<ResourceEntry> {\n return this.resources.values();\n }\n}\n\n// Re-export detail types for use by graph.ts compile fail-fast.\nexport type { CapMissingDetail, DanglingReadDetail, DuplicateResourceDetail };\n","import type { Buffer, RhiCaps, Texture, TextureView } from '@forgeax/engine-rhi';\nimport { CompiledRenderGraphImpl } from './compiled-graph.js';\nimport { err, ok, RenderGraphError, type Result } from './errors.js';\nimport type { ResolvedColorTargetDescriptor } from './graph.js';\nimport {\n accessResourceId,\n bufferHandle,\n type CompiledPass,\n type CompiledResource,\n type CompiledView,\n handleData,\n type PassRecord,\n type ResourceRecord,\n type TextureViewRecord,\n textureHandle,\n textureViewHandle,\n} from './kernel-internal.js';\nimport { isTextureViewDimensionCompatible } from './resource-registry.js';\nimport type {\n CompiledRenderGraph,\n CompiledRenderGraphInfo,\n CompiledResourceDescriptor,\n ComputeGraphPass,\n CopyGraphPass,\n GraphAccess,\n GraphBuffer,\n GraphBufferAccess,\n GraphBufferDescriptor,\n GraphExtent,\n GraphPass,\n GraphTexture,\n GraphTextureAccess,\n GraphTextureDescriptor,\n GraphTextureView,\n GraphTextureViewDescriptor,\n ImportedBufferDescriptor,\n ImportedTextureDescriptor,\n ImportedTextureViewResolver,\n RasterGraphPass,\n RenderGraphCompileOptions,\n RenderGraphFrame,\n} from './types.js';\n\nconst BUFFER_USAGE = {\n copySrc: 0x0004,\n copyDst: 0x0008,\n index: 0x0010,\n vertex: 0x0020,\n uniform: 0x0040,\n storage: 0x0080,\n indirect: 0x0100,\n} as const;\n\nconst TEXTURE_USAGE = {\n copySrc: 0x01,\n copyDst: 0x02,\n textureBinding: 0x04,\n storageBinding: 0x08,\n renderAttachment: 0x10,\n} as const;\n\nlet nextGeneration = 1;\n\nfunction textureByteSize(\n format: GPUTextureFormat,\n extent: { readonly width: number; readonly height: number; readonly depthOrArrayLayers: number },\n mipLevelCount: number,\n): number | undefined {\n const bytesPerTexel =\n format === 'r8unorm' || format === 'r8snorm' || format === 'r8uint' || format === 'r8sint'\n ? 1\n : format === 'rg8unorm' ||\n format === 'rg8snorm' ||\n format === 'rg8uint' ||\n format === 'rg8sint'\n ? 2\n : format === 'rgba8unorm' ||\n format === 'rgba8unorm-srgb' ||\n format === 'rgba8snorm' ||\n format === 'rgba8uint' ||\n format === 'rgba8sint' ||\n format === 'r32float' ||\n format === 'r32uint' ||\n format === 'r32sint'\n ? 4\n : format === 'rg16float' ||\n format === 'rg16uint' ||\n format === 'rg16sint' ||\n format === 'rg16snorm' ||\n format === 'rg16unorm'\n ? 4\n : format === 'rgba16float' ||\n format === 'rgba16uint' ||\n format === 'rgba16sint' ||\n format === 'rgba16snorm' ||\n format === 'rgba16unorm' ||\n format === 'rg32float' ||\n format === 'rg32uint' ||\n format === 'rg32sint'\n ? 8\n : format === 'rgba32float' || format === 'rgba32uint' || format === 'rgba32sint'\n ? 16\n : undefined;\n if (bytesPerTexel === undefined) return undefined;\n let bytes = 0;\n let width = extent.width;\n let height = extent.height;\n let depth = extent.depthOrArrayLayers;\n for (let level = 0; level < mipLevelCount; level += 1) {\n bytes += width * height * depth * bytesPerTexel;\n width = Math.max(1, Math.floor(width / 2));\n height = Math.max(1, Math.floor(height / 2));\n depth = Math.max(1, Math.floor(depth / 2));\n }\n return bytes;\n}\n\ninterface NormalizedRange {\n readonly mipStart: number;\n readonly mipEnd: number;\n readonly layerStart: number;\n readonly layerEnd: number;\n readonly aspect: GPUTextureAspect;\n}\n\ninterface NormalizedAccess {\n readonly passIndex: number;\n readonly passName: string;\n readonly resourceId: number;\n readonly viewId?: number | undefined;\n readonly usage: GraphBufferAccess | GraphTextureAccess;\n readonly read: boolean;\n readonly write: boolean;\n readonly range?: NormalizedRange | undefined;\n}\n\nfunction bufferUsage(access: GraphBufferAccess): number {\n switch (access) {\n case 'uniform-read':\n return BUFFER_USAGE.uniform;\n case 'storage-read':\n case 'storage-write':\n case 'storage-read-write':\n return BUFFER_USAGE.storage;\n case 'indirect-read':\n return BUFFER_USAGE.indirect;\n case 'vertex-read':\n return BUFFER_USAGE.vertex;\n case 'index-read':\n return BUFFER_USAGE.index;\n case 'copy-src':\n return BUFFER_USAGE.copySrc;\n case 'copy-dst':\n return BUFFER_USAGE.copyDst;\n }\n}\n\nfunction textureUsage(access: GraphTextureAccess): number {\n switch (access) {\n case 'sampled-read':\n return TEXTURE_USAGE.textureBinding;\n case 'storage-read':\n case 'storage-write':\n case 'storage-read-write':\n return TEXTURE_USAGE.storageBinding;\n case 'sampled-storage-read-write':\n return TEXTURE_USAGE.storageBinding | TEXTURE_USAGE.textureBinding;\n case 'color-attachment':\n case 'depth-stencil-read':\n case 'depth-stencil-write':\n return TEXTURE_USAGE.renderAttachment;\n case 'copy-src':\n return TEXTURE_USAGE.copySrc;\n case 'copy-dst':\n return TEXTURE_USAGE.copyDst;\n }\n}\n\nfunction accessMode(access: GraphBufferAccess | GraphTextureAccess): {\n readonly read: boolean;\n readonly write: boolean;\n} {\n switch (access) {\n case 'storage-read-write':\n case 'sampled-storage-read-write':\n return { read: true, write: true };\n case 'storage-write':\n case 'color-attachment':\n case 'depth-stencil-write':\n case 'copy-dst':\n return { read: false, write: true };\n default:\n return { read: true, write: false };\n }\n}\n\nfunction rangesOverlap(\n left: NormalizedRange | undefined,\n right: NormalizedRange | undefined,\n): boolean {\n if (left === undefined || right === undefined) return true;\n const aspectOverlap =\n left.aspect === 'all' || right.aspect === 'all' || left.aspect === right.aspect;\n return (\n aspectOverlap &&\n left.mipStart < right.mipEnd &&\n right.mipStart < left.mipEnd &&\n left.layerStart < right.layerEnd &&\n right.layerStart < left.layerEnd\n );\n}\n\nfunction freezeInfo(info: CompiledRenderGraphInfo): CompiledRenderGraphInfo {\n const freezeDescriptor = (descriptor: CompiledResourceDescriptor) => {\n if (descriptor.kind !== 'texture') return Object.freeze({ ...descriptor });\n const size =\n typeof descriptor.size === 'string' ? descriptor.size : Object.freeze({ ...descriptor.size });\n return Object.freeze({ ...descriptor, size });\n };\n return Object.freeze({\n generation: info.generation,\n passes: Object.freeze(\n info.passes.map((pass) =>\n Object.freeze({\n ...pass,\n accesses: Object.freeze(pass.accesses.map((access) => Object.freeze({ ...access }))),\n dependencies: Object.freeze([...pass.dependencies]),\n }),\n ),\n ),\n resources: Object.freeze(\n info.resources.map((resource) =>\n Object.freeze({\n ...resource,\n descriptor: freezeDescriptor(resource.descriptor),\n }),\n ),\n ),\n });\n}\n\nexport class RenderGraphBuilder<FrameCtx extends RenderGraphFrame> {\n private readonly owner = Object.freeze({});\n private readonly labels = new Set<string>();\n private readonly resources = new Map<number, ResourceRecord<FrameCtx>>();\n private readonly views = new Map<number, TextureViewRecord<FrameCtx>>();\n private readonly passes: PassRecord<FrameCtx>[] = [];\n private readonly passNames = new Set<string>();\n private nextId = 1;\n private sealed = false;\n\n createTexture(\n label: string,\n descriptor: GraphTextureDescriptor,\n ): Result<GraphTexture, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, { id, label, kind: 'texture', origin: 'created', descriptor });\n return ok(textureHandle(this.owner, id));\n }\n\n importTexture(\n label: string,\n descriptor: ImportedTextureDescriptor,\n resolve: (frame: FrameCtx) => Texture,\n ): Result<GraphTexture, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, {\n id,\n label,\n kind: 'texture',\n origin: 'imported',\n descriptor,\n resolve,\n });\n return ok(textureHandle(this.owner, id));\n }\n\n createBuffer(\n label: string,\n descriptor: GraphBufferDescriptor,\n ): Result<GraphBuffer, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, { id, label, kind: 'buffer', origin: 'created', descriptor });\n return ok(bufferHandle(this.owner, id));\n }\n\n importBuffer(\n label: string,\n descriptor: ImportedBufferDescriptor,\n resolve: (frame: FrameCtx) => Buffer,\n ): Result<GraphBuffer, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.resources.set(id, {\n id,\n label,\n kind: 'buffer',\n origin: 'imported',\n descriptor,\n resolve,\n });\n return ok(bufferHandle(this.owner, id));\n }\n\n view(\n texture: GraphTexture,\n descriptor: GraphTextureViewDescriptor = {},\n ): Result<GraphTextureView, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const data = handleData(texture);\n if (data?.kind !== 'texture' || data.owner !== this.owner) {\n return err(this.foreignHandleError());\n }\n const textureRecord = this.resources.get(data.id);\n if (textureRecord?.kind !== 'texture') return err(this.foreignHandleError());\n const label = descriptor.label ?? `${textureRecord.label}.view.${this.nextId}`;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.views.set(id, { id, label, textureId: data.id, descriptor });\n return ok(textureViewHandle(this.owner, id, data.id));\n }\n\n importView(\n texture: GraphTexture,\n descriptor: GraphTextureViewDescriptor,\n resolve: ImportedTextureViewResolver<FrameCtx>,\n ): Result<GraphTextureView, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n const data = handleData(texture);\n if (data?.kind !== 'texture' || data.owner !== this.owner) {\n return err(this.foreignHandleError());\n }\n const textureRecord = this.resources.get(data.id);\n if (textureRecord?.kind !== 'texture' || textureRecord.origin !== 'imported') {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: 'an imported view belongs to an imported texture',\n hint: 'use view() for graph-created textures and importView() for host-owned views',\n detail: {\n resourceLabel: textureRecord?.label ?? 'foreign',\n field: 'origin',\n expected: 'imported',\n actual: textureRecord?.origin ?? 'foreign',\n },\n }),\n );\n }\n const label = descriptor.label ?? `${textureRecord.label}.view.${this.nextId}`;\n const unique = this.reserveLabel(label);\n if (!unique.ok) return unique;\n const id = this.nextId++;\n this.views.set(id, { id, label, textureId: data.id, descriptor, resolve });\n return ok(textureViewHandle(this.owner, id, data.id));\n }\n\n addRasterPass(\n name: string,\n descriptor: RasterGraphPass<FrameCtx>,\n ): Result<void, RenderGraphError> {\n return this.addPass(name, { kind: 'raster', descriptor });\n }\n\n addComputePass(\n name: string,\n descriptor: ComputeGraphPass<FrameCtx>,\n ): Result<void, RenderGraphError> {\n return this.addPass(name, { kind: 'compute', descriptor });\n }\n\n addCopyPass(name: string, descriptor: CopyGraphPass<FrameCtx>): Result<void, RenderGraphError> {\n return this.addPass(name, { kind: 'copy', descriptor });\n }\n\n compile(\n options: RenderGraphCompileOptions,\n ): Result<CompiledRenderGraph<FrameCtx>, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n this.sealed = true;\n\n const descriptors = this.validateDescriptors(options.surfaceSize);\n if (!descriptors.ok) return descriptors;\n const analyzed = this.analyze(options.device.caps);\n if (!analyzed.ok) return analyzed;\n\n const allocated = this.allocate(\n options,\n analyzed.value.usageByResource,\n analyzed.value.firstUseByResource,\n analyzed.value.lastUseByResource,\n );\n if (!allocated.ok) return allocated;\n\n const generation = nextGeneration;\n const physicalAllocationKeys = new WeakMap<object, string>();\n let nextPhysicalAllocationKey = 1;\n const physicalKey = (resource: CompiledResource<FrameCtx>): string | undefined => {\n const handle = resource.texture ?? resource.buffer;\n if (handle === undefined) return undefined;\n const existing = physicalAllocationKeys.get(handle);\n if (existing !== undefined) return existing;\n const key = `allocation-${nextPhysicalAllocationKey++}`;\n physicalAllocationKeys.set(handle, key);\n return key;\n };\n const info = freezeInfo({\n generation,\n passes: analyzed.value.passes.map((pass, executionIndex) => ({\n name: pass.name,\n kind: pass.pass.kind,\n executionIndex,\n accesses: pass.pass.descriptor.accesses.map((access) => {\n const id = accessResourceId(access);\n return {\n resource: this.resources.get(id ?? -1)?.label ?? 'foreign',\n usage: access.usage,\n };\n }),\n dependencies: pass.dependencies.map(\n (dependency) => analyzed.value.passes[dependency]?.name ?? 'unknown',\n ),\n })),\n resources: [...allocated.value.resources.values()].map((resource) => {\n const texture =\n resource.record.kind === 'texture'\n ? (resource.record.descriptor as GraphTextureDescriptor)\n : undefined;\n const buffer =\n resource.record.kind === 'buffer'\n ? (resource.record.descriptor as GraphBufferDescriptor)\n : undefined;\n const allocationKey = physicalKey(resource);\n const extent =\n texture === undefined ? undefined : this.resolveExtent(texture.size, options.surfaceSize);\n return {\n label: resource.record.label,\n kind: resource.record.kind,\n origin: resource.record.origin,\n descriptor:\n texture === undefined\n ? {\n kind: 'buffer' as const,\n size: buffer?.size ?? 0,\n }\n : {\n kind: 'texture' as const,\n format: texture.format,\n ...(texture.domain === undefined ? {} : { domain: texture.domain }),\n size: texture.size,\n width: extent?.width ?? 1,\n height: extent?.height ?? 1,\n depthOrArrayLayers: extent?.depthOrArrayLayers ?? 1,\n mipLevelCount: texture.mipLevelCount ?? 1,\n sampleCount: texture.sampleCount ?? 1,\n },\n firstUse: resource.firstUse,\n lastUse: resource.lastUse,\n derivedUsage: resource.usage,\n ...(allocationKey === undefined ? {} : { physicalAllocationKey: allocationKey }),\n ...(texture === undefined ? {} : { format: texture.format }),\n ...(texture === undefined\n ? buffer === undefined\n ? {}\n : { byteSize: buffer.size }\n : {\n byteSize: textureByteSize(\n texture.format,\n this.resolveExtent(texture.size, options.surfaceSize),\n texture.mipLevelCount ?? 1,\n ),\n }),\n ...(texture === undefined\n ? {}\n : {\n dimension: texture.dimension ?? '2d',\n extent,\n }),\n };\n }),\n });\n\n const colorTargetDescriptors = new Map<string, ResolvedColorTargetDescriptor>();\n for (const resource of allocated.value.resources.values()) {\n if (resource.record.kind !== 'texture' || resource.texture === undefined) continue;\n const extent = this.resolveExtent(resource.record.descriptor.size, options.surfaceSize);\n colorTargetDescriptors.set(resource.record.label, {\n texture: resource.texture,\n format: resource.record.descriptor.format,\n size: { width: extent.width, height: extent.height },\n usage: resource.usage,\n sample: resource.record.descriptor.sampleCount ?? 1,\n });\n }\n\n return ok(\n new CompiledRenderGraphImpl(\n nextGeneration++,\n this.owner,\n options.device,\n allocated.value.resources,\n allocated.value.views,\n Object.freeze(analyzed.value.passes),\n info,\n colorTargetDescriptors,\n ),\n );\n }\n\n private addPass(name: string, pass: GraphPass<FrameCtx>): Result<void, RenderGraphError> {\n const writable = this.ensureWritable();\n if (!writable.ok) return writable;\n if (this.passNames.has(name)) {\n return err(\n new RenderGraphError({\n code: 'duplicate-pass-name',\n expected: `pass name '${name}' is unique within one builder`,\n hint: `rename the second '${name}' pass; names are diagnostics, not identity`,\n detail: { passName: name },\n }),\n );\n }\n for (const access of pass.descriptor.accesses) {\n const valid = this.validateAccessHandle(name, access);\n if (!valid.ok) return valid;\n }\n this.passNames.add(name);\n this.passes.push({ id: this.passes.length, name, pass });\n return ok(undefined);\n }\n\n private validateAccessHandle(\n passName: string,\n access: GraphAccess,\n ): Result<void, RenderGraphError> {\n const data = handleData(access.resource);\n if (data === undefined || data.owner !== this.owner) {\n return err(this.foreignHandleError(passName));\n }\n if (data.kind === 'texture-view') {\n if (!this.views.has(data.id)) return err(this.foreignHandleError(passName));\n return ok(undefined);\n }\n if (data.kind !== 'buffer' || !this.resources.has(data.id)) {\n return err(this.foreignHandleError(passName));\n }\n return ok(undefined);\n }\n\n private analyze(caps: RhiCaps): Result<\n {\n readonly passes: readonly CompiledPass<FrameCtx>[];\n readonly usageByResource: ReadonlyMap<number, number>;\n readonly firstUseByResource: ReadonlyMap<number, number>;\n readonly lastUseByResource: ReadonlyMap<number, number>;\n },\n RenderGraphError\n > {\n const normalizedByPass: NormalizedAccess[][] = [];\n const usageByResource = new Map<number, number>();\n const firstUseByResource = new Map<number, number>();\n const lastUseByResource = new Map<number, number>();\n const compiledPasses: CompiledPass<FrameCtx>[] = [];\n const history: NormalizedAccess[] = [];\n\n for (const resource of this.resources.values()) {\n if (resource.kind !== 'texture' || resource.origin !== 'created') continue;\n const usage = resource.descriptor.usage ?? 0;\n if (usage !== 0) usageByResource.set(resource.id, usage);\n }\n\n for (let passIndex = 0; passIndex < this.passes.length; passIndex++) {\n const pass = this.passes[passIndex];\n if (pass === undefined) continue;\n const capability = this.validateCapabilities(pass, caps);\n if (!capability.ok) return capability;\n const normalized: NormalizedAccess[] = [];\n for (const access of pass.pass.descriptor.accesses) {\n const item = this.normalizeAccess(passIndex, pass, access);\n if (!item.ok) return item;\n normalized.push(item.value);\n const resource = this.resources.get(item.value.resourceId);\n const usage =\n (resource?.kind === 'texture' && resource.origin === 'created'\n ? (resource.descriptor.usage ?? 0)\n : 0) |\n (resource?.kind === 'buffer'\n ? bufferUsage(access.usage as GraphBufferAccess)\n : textureUsage(access.usage as GraphTextureAccess));\n usageByResource.set(\n item.value.resourceId,\n (usageByResource.get(item.value.resourceId) ?? 0) | usage,\n );\n if (!firstUseByResource.has(item.value.resourceId)) {\n firstUseByResource.set(item.value.resourceId, passIndex);\n }\n lastUseByResource.set(item.value.resourceId, passIndex);\n }\n const conflict = this.validatePassAccesses(pass, normalized);\n if (!conflict.ok) return conflict;\n const attachments = this.validateAttachments(pass);\n if (!attachments.ok) return attachments;\n\n const dependencies = new Set<number>();\n for (const current of normalized) {\n if (current.read) {\n const priorWrite = this.findPriorWrite(history, current);\n if (priorWrite !== undefined) {\n dependencies.add(priorWrite.passIndex);\n } else if (this.resources.get(current.resourceId)?.origin === 'created') {\n const label = this.resources.get(current.resourceId)?.label;\n return err(\n new RenderGraphError({\n code: 'uninitialized-read',\n expected: `graph-created resource '${label}' is written before pass '${pass.name}' reads it`,\n hint: 'add a clear/write/copy-dst pass before the first read, or import initialized data',\n detail: { passName: pass.name, resourceLabel: label, usage: current.usage },\n }),\n );\n }\n }\n if (current.write) {\n for (const dependency of this.findWriteDependencies(history, current)) {\n dependencies.add(dependency);\n }\n }\n }\n normalizedByPass.push(normalized);\n history.push(...normalized);\n compiledPasses.push({\n ...pass,\n dependencies: Object.freeze([...dependencies].sort((left, right) => left - right)),\n resourceIds: new Set(normalized.map((access) => access.resourceId)),\n viewIds: new Set(\n normalized.flatMap((access) => (access.viewId === undefined ? [] : [access.viewId])),\n ),\n });\n }\n\n for (const [resourceId, usage] of usageByResource) {\n const resource = this.resources.get(resourceId);\n if (resource?.origin !== 'imported') continue;\n if ((resource.descriptor.usage & usage) !== usage) {\n return err(\n new RenderGraphError({\n code: 'import-usage-mismatch',\n expected: `imported resource '${resource.label}' physical usage contains derived graph usage ${usage}`,\n hint: 'recreate the imported resource with every usage declared by graph accesses',\n detail: {\n resourceLabel: resource.label,\n field: 'usage',\n expected: String(usage),\n actual: resource.descriptor.usage,\n },\n }),\n );\n }\n }\n\n return ok({\n passes: compiledPasses,\n usageByResource,\n firstUseByResource,\n lastUseByResource,\n });\n }\n\n private normalizeAccess(\n passIndex: number,\n pass: PassRecord<FrameCtx>,\n access: GraphAccess,\n ): Result<NormalizedAccess, RenderGraphError> {\n const passName = pass.name;\n const data = handleData(access.resource);\n if (data === undefined || data.owner !== this.owner) {\n return err(this.foreignHandleError(passName));\n }\n const mode = this.accessModeForPass(pass, access);\n if (data.kind === 'buffer') {\n return ok({ passIndex, passName, resourceId: data.id, usage: access.usage, ...mode });\n }\n if (data.kind !== 'texture-view') return err(this.foreignHandleError(passName));\n const view = this.views.get(data.id);\n const texture = this.resources.get(data.textureId);\n if (view === undefined || texture?.kind !== 'texture') {\n return err(this.foreignHandleError(passName));\n }\n const mipLevels = texture.descriptor.mipLevelCount ?? 1;\n const layers =\n typeof texture.descriptor.size === 'object'\n ? (texture.descriptor.size.depthOrArrayLayers ?? 1)\n : 1;\n const mipStart = view.descriptor.baseMipLevel ?? 0;\n const layerStart = view.descriptor.baseArrayLayer ?? 0;\n return ok({\n passIndex,\n passName,\n resourceId: data.textureId,\n viewId: data.id,\n usage: access.usage,\n ...mode,\n range: {\n mipStart,\n mipEnd: mipStart + (view.descriptor.mipLevelCount ?? mipLevels - mipStart),\n layerStart,\n layerEnd: layerStart + (view.descriptor.arrayLayerCount ?? layers - layerStart),\n aspect: view.descriptor.aspect ?? 'all',\n },\n });\n }\n\n private accessModeForPass(\n pass: PassRecord<FrameCtx>,\n access: GraphAccess,\n ): { readonly read: boolean; readonly write: boolean } {\n const base = accessMode(access.usage);\n if (pass.pass.kind !== 'raster' || handleData(access.resource)?.kind !== 'texture-view') {\n return base;\n }\n if (access.usage === 'color-attachment') {\n const attachment = pass.pass.descriptor.colorAttachments.find(\n (candidate) => candidate.view === access.resource,\n );\n return attachment?.loadOp === 'load' ? { read: true, write: true } : base;\n }\n if (access.usage === 'depth-stencil-write') {\n const attachment = pass.pass.descriptor.depthStencilAttachment;\n if (\n attachment?.view === access.resource &&\n (attachment.depthLoadOp === 'load' || attachment.stencilLoadOp === 'load')\n ) {\n return { read: true, write: true };\n }\n }\n return base;\n }\n\n private validateCapabilities(\n pass: PassRecord<FrameCtx>,\n caps: RhiCaps,\n ): Result<void, RenderGraphError> {\n if (pass.pass.kind === 'compute' && !caps.compute) {\n return this.capabilityError(pass.name, 'compute');\n }\n for (const access of pass.pass.descriptor.accesses) {\n if (\n (access.usage === 'storage-read' ||\n access.usage === 'storage-write' ||\n access.usage === 'storage-read-write') &&\n handleData(access.resource)?.kind === 'buffer' &&\n !caps.storageBuffer\n ) {\n return this.capabilityError(pass.name, 'storage-buffer', access);\n }\n if (\n (access.usage === 'storage-read' ||\n access.usage === 'storage-write' ||\n access.usage === 'storage-read-write') &&\n handleData(access.resource)?.kind === 'texture-view' &&\n !caps.storageTexture\n ) {\n return this.capabilityError(pass.name, 'storage-texture', access);\n }\n if (access.usage === 'indirect-read' && !caps.indirectDrawing) {\n return this.capabilityError(pass.name, 'indirect', access);\n }\n }\n return ok(undefined);\n }\n\n private capabilityError(\n passName: string,\n capability: 'compute' | 'storage-buffer' | 'storage-texture' | 'indirect',\n access?: GraphAccess,\n ): Result<never, RenderGraphError> {\n const resourceId = access === undefined ? undefined : accessResourceId(access);\n return err(\n new RenderGraphError({\n code: 'capability-missing',\n expected: `pass '${passName}' is built only when capability '${capability}' is available`,\n hint: 'select the fallback algorithm before adding this pass to the builder',\n detail: {\n passName,\n capability,\n ...(resourceId === undefined\n ? {}\n : { resourceLabel: this.resources.get(resourceId)?.label, usage: access?.usage }),\n },\n }),\n );\n }\n\n private validatePassAccesses(\n pass: PassRecord<FrameCtx>,\n accesses: readonly NormalizedAccess[],\n ): Result<void, RenderGraphError> {\n for (let leftIndex = 0; leftIndex < accesses.length; leftIndex++) {\n const left = accesses[leftIndex];\n if (left === undefined) continue;\n for (let rightIndex = leftIndex + 1; rightIndex < accesses.length; rightIndex++) {\n const right = accesses[rightIndex];\n if (\n right === undefined ||\n left.resourceId !== right.resourceId ||\n !rangesOverlap(left.range, right.range)\n ) {\n continue;\n }\n if (!left.write && !right.write) continue;\n if (\n left.usage === right.usage &&\n (left.usage === 'storage-read-write' || left.usage === 'sampled-storage-read-write')\n )\n continue;\n const label = this.resources.get(left.resourceId)?.label;\n return err(\n new RenderGraphError({\n code: 'access-conflict',\n expected: `pass '${pass.name}' uses resource '${label}' in one compatible WebGPU usage scope`,\n hint: 'split conflicting read/write roles into ordered passes or use storage-read-write once',\n detail: {\n passName: pass.name,\n resourceLabel: label,\n accesses: [left.usage, right.usage],\n },\n }),\n );\n }\n }\n if (pass.pass.kind === 'copy') {\n const invalid = accesses.find(\n (access) => access.usage !== 'copy-src' && access.usage !== 'copy-dst',\n );\n if (invalid !== undefined) {\n return err(\n new RenderGraphError({\n code: 'access-conflict',\n expected: `copy pass '${pass.name}' declares only copy-src/copy-dst accesses`,\n hint: 'move shader or attachment work into raster/compute passes',\n detail: { passName: pass.name, usage: invalid.usage },\n }),\n );\n }\n }\n return ok(undefined);\n }\n\n private validateAttachments(pass: PassRecord<FrameCtx>): Result<void, RenderGraphError> {\n if (pass.pass.kind !== 'raster') return ok(undefined);\n const accesses = pass.pass.descriptor.accesses;\n const has = (view: GraphTextureView, usage: GraphTextureAccess): boolean =>\n accesses.some((access) => access.resource === view && access.usage === usage);\n for (const attachment of pass.pass.descriptor.colorAttachments) {\n if (!has(attachment.view, 'color-attachment')) {\n return this.missingAttachmentAccess(pass.name, attachment.view, 'color-attachment');\n }\n if (\n attachment.resolveTarget !== undefined &&\n !has(attachment.resolveTarget, 'color-attachment')\n ) {\n return this.missingAttachmentAccess(\n pass.name,\n attachment.resolveTarget,\n 'color-attachment',\n );\n }\n }\n const depth = pass.pass.descriptor.depthStencilAttachment;\n if (depth !== undefined) {\n const usage = depth.depthReadOnly === true ? 'depth-stencil-read' : 'depth-stencil-write';\n if (!has(depth.view, usage))\n return this.missingAttachmentAccess(pass.name, depth.view, usage);\n }\n return ok(undefined);\n }\n\n private missingAttachmentAccess(\n passName: string,\n view: GraphTextureView,\n usage: GraphTextureAccess,\n ): Result<never, RenderGraphError> {\n const data = handleData(view);\n const label = data?.kind === 'texture-view' ? this.views.get(data.id)?.label : undefined;\n return err(\n new RenderGraphError({\n code: 'resource-not-declared-by-pass',\n expected: `raster pass '${passName}' attachment '${label}' declares '${usage}' access`,\n hint: 'add the attachment view and matching usage to accesses',\n detail: { passName, resourceLabel: label, usage },\n }),\n );\n }\n\n private findPriorWrite(\n history: readonly NormalizedAccess[],\n current: NormalizedAccess,\n ): NormalizedAccess | undefined {\n for (let index = history.length - 1; index >= 0; index--) {\n const prior = history[index];\n if (\n prior !== undefined &&\n prior.resourceId === current.resourceId &&\n prior.write &&\n rangesOverlap(prior.range, current.range)\n ) {\n return prior;\n }\n }\n return undefined;\n }\n\n private findWriteDependencies(\n history: readonly NormalizedAccess[],\n current: NormalizedAccess,\n ): readonly number[] {\n const dependencies = new Set<number>();\n for (let index = history.length - 1; index >= 0; index--) {\n const prior = history[index];\n if (\n prior === undefined ||\n prior.resourceId !== current.resourceId ||\n !rangesOverlap(prior.range, current.range)\n ) {\n continue;\n }\n if (prior.read) dependencies.add(prior.passIndex);\n if (prior.write) {\n dependencies.add(prior.passIndex);\n break;\n }\n }\n return [...dependencies];\n }\n\n private validateDescriptors(\n surfaceSize: RenderGraphCompileOptions['surfaceSize'],\n ): Result<void, RenderGraphError> {\n if (surfaceSize.width <= 0 || surfaceSize.height <= 0) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: 'surfaceSize width and height are positive integers',\n hint: 'compile after the render surface has a non-zero physical extent',\n detail: {\n resourceLabel: 'surface',\n field: 'surfaceSize',\n expected: 'width > 0 and height > 0',\n actual: `${surfaceSize.width}x${surfaceSize.height}`,\n },\n }),\n );\n }\n for (const resource of this.resources.values()) {\n if (resource.kind === 'buffer' && resource.descriptor.size <= 0) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: `buffer '${resource.label}' size is greater than zero`,\n hint: 'derive a positive byte size before creating/importing the buffer',\n detail: {\n resourceLabel: resource.label,\n field: 'size',\n expected: 'size > 0',\n actual: resource.descriptor.size,\n },\n }),\n );\n }\n if (resource.kind === 'texture') {\n const extent = this.resolveExtent(resource.descriptor.size, surfaceSize);\n if (extent.width <= 0 || extent.height <= 0 || extent.depthOrArrayLayers <= 0) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: `texture '${resource.label}' extent is positive`,\n hint: 'repair the authored extent or compile surface size',\n detail: {\n resourceLabel: resource.label,\n field: 'size',\n expected: 'all extent axes > 0',\n actual: `${extent.width}x${extent.height}x${extent.depthOrArrayLayers}`,\n },\n }),\n );\n }\n }\n }\n for (const view of this.views.values()) {\n const texture = this.resources.get(view.textureId);\n if (texture?.kind !== 'texture') continue;\n const allocationDimension = texture.descriptor.dimension ?? '2d';\n const viewDimension = view.descriptor.dimension;\n if (!isTextureViewDimensionCompatible(allocationDimension, viewDimension)) {\n return err(\n new RenderGraphError({\n code: 'resource-descriptor-invalid',\n expected: `texture '${texture.label}' view dimension matches allocation dimension`,\n hint: 'use a 3d view only for a 3d allocation and preserve array views on 2d allocations',\n detail: {\n resourceLabel: texture.label,\n field: 'dimension',\n expected: allocationDimension,\n actual: viewDimension ?? '2d',\n },\n }),\n );\n }\n }\n return ok(undefined);\n }\n\n private allocate(\n options: RenderGraphCompileOptions,\n usageByResource: ReadonlyMap<number, number>,\n firstUseByResource: ReadonlyMap<number, number>,\n lastUseByResource: ReadonlyMap<number, number>,\n ): Result<\n {\n readonly resources: ReadonlyMap<number, CompiledResource<FrameCtx>>;\n readonly views: ReadonlyMap<number, CompiledView<FrameCtx>>;\n },\n RenderGraphError\n > {\n const compiledResources = new Map<number, CompiledResource<FrameCtx>>();\n const compiledViews = new Map<number, CompiledView<FrameCtx>>();\n const createdTextures: Texture[] = [];\n const createdBuffers: Buffer[] = [];\n const discard = (): void => {\n for (const texture of createdTextures) options.device.destroyTexture(texture);\n for (const buffer of createdBuffers) options.device.destroyBuffer(buffer);\n };\n\n for (const resource of this.resources.values()) {\n const usage = usageByResource.get(resource.id) ?? 0;\n let texture: Texture | undefined;\n let buffer: Buffer | undefined;\n if (resource.origin === 'created' && usage !== 0) {\n if (resource.kind === 'texture') {\n const extent = this.resolveExtent(resource.descriptor.size, options.surfaceSize);\n const created = options.device.createTexture({\n label: resource.label,\n size: extent,\n mipLevelCount: resource.descriptor.mipLevelCount ?? 1,\n sampleCount: resource.descriptor.sampleCount ?? 1,\n dimension: resource.descriptor.dimension ?? '2d',\n format: resource.descriptor.format,\n usage,\n viewFormats: [...(resource.descriptor.viewFormats ?? [])],\n });\n if (!created.ok) {\n discard();\n return err(\n new RenderGraphError({\n code: 'resource-allocation-failed',\n expected: `RHI creates graph texture '${resource.label}'`,\n hint: 'inspect detail.rhiCode and repair the descriptor/capability route',\n detail: { resourceKey: resource.label, rhiCode: created.error.code },\n }),\n );\n }\n texture = created.value;\n createdTextures.push(texture);\n } else {\n const created = options.device.createBuffer({\n label: resource.label,\n size: resource.descriptor.size,\n usage,\n mappedAtCreation: resource.descriptor.mappedAtCreation ?? false,\n });\n if (!created.ok) {\n discard();\n return err(\n new RenderGraphError({\n code: 'resource-allocation-failed',\n expected: `RHI creates graph buffer '${resource.label}'`,\n hint: 'inspect detail.rhiCode and repair the descriptor/capability route',\n detail: { resourceKey: resource.label, rhiCode: created.error.code },\n }),\n );\n }\n buffer = created.value;\n createdBuffers.push(buffer);\n }\n }\n compiledResources.set(resource.id, {\n record: resource,\n usage,\n firstUse: firstUseByResource.get(resource.id) ?? null,\n lastUse: lastUseByResource.get(resource.id) ?? null,\n ...(texture === undefined ? {} : { texture }),\n ...(buffer === undefined ? {} : { buffer }),\n });\n }\n\n for (const view of this.views.values()) {\n const resource = compiledResources.get(view.textureId);\n let physicalView: TextureView | undefined;\n if (resource?.record.origin === 'created' && resource.texture !== undefined) {\n const created = options.device.createTextureView(resource.texture, view.descriptor);\n if (!created.ok) {\n discard();\n return err(\n new RenderGraphError({\n code: 'resource-allocation-failed',\n expected: `RHI creates graph texture view '${view.label}'`,\n hint: 'inspect detail.rhiCode and repair the view descriptor',\n detail: { resourceKey: view.label, rhiCode: created.error.code },\n }),\n );\n }\n physicalView = created.value;\n }\n compiledViews.set(view.id, {\n record: view,\n ...(physicalView === undefined ? {} : { view: physicalView }),\n });\n }\n return ok({ resources: compiledResources, views: compiledViews });\n }\n\n private resolveExtent(\n extent: GraphExtent,\n surface: RenderGraphCompileOptions['surfaceSize'],\n ): { readonly width: number; readonly height: number; readonly depthOrArrayLayers: number } {\n if (extent === 'surface') return { ...surface, depthOrArrayLayers: 1 };\n if (extent === 'half-surface') {\n return {\n width: Math.ceil(surface.width / 2),\n height: Math.ceil(surface.height / 2),\n depthOrArrayLayers: 1,\n };\n }\n return {\n width: extent.width,\n height: extent.height,\n depthOrArrayLayers: extent.depthOrArrayLayers ?? 1,\n };\n }\n\n private ensureWritable(): Result<void, RenderGraphError> {\n return this.sealed\n ? err(\n new RenderGraphError({\n code: 'builder-sealed',\n expected: 'a RenderGraphBuilder accepts declarations only before compile()',\n hint: 'create a new builder for a changed topology',\n detail: {},\n }),\n )\n : ok(undefined);\n }\n\n private reserveLabel(label: string): Result<void, RenderGraphError> {\n if (this.labels.has(label)) {\n return err(\n new RenderGraphError({\n code: 'duplicate-resource-label',\n expected: `resource label '${label}' is unique within one builder`,\n hint: `rename the second '${label}' declaration`,\n detail: { resourceLabel: label },\n }),\n );\n }\n this.labels.add(label);\n return ok(undefined);\n }\n\n private foreignHandleError(passName?: string): RenderGraphError {\n return new RenderGraphError({\n code: 'foreign-resource-handle',\n expected: 'every graph resource handle belongs to this builder',\n hint: 'create/import/view the resource on the same builder that declares the pass',\n detail: { ...(passName === undefined ? {} : { passName }) },\n });\n }\n}\n","import type { Texture, TextureFormat } from '@forgeax/engine-rhi';\nimport { err, ok, RenderGraphError, type Result } from './errors.js';\n\nexport { RenderGraphError } from './errors.js';\n\nconst COPY_SRC = 0x01;\n\nexport interface ObservationSize {\n readonly width: number;\n readonly height: number;\n}\n\n/** Generic producer-owned metadata for one current-frame texture. */\nexport interface CurrentFrameObservationDescriptor {\n readonly texture: Texture;\n readonly format: TextureFormat;\n readonly size: ObservationSize;\n readonly usage: number;\n readonly frameId: number;\n}\n\nexport interface CurrentFrameObservationLifetime {\n readonly frameId: number;\n readonly state: 'active' | 'retired';\n}\n\n/** The only resource information a downstream copy consumer receives. */\nexport interface CurrentFrameObservationSource {\n readonly texture: Texture;\n readonly descriptor: CurrentFrameObservationDescriptor;\n readonly lifetime: CurrentFrameObservationLifetime;\n}\n\nexport interface CurrentFrameObservationLease {\n readonly descriptor: CurrentFrameObservationDescriptor;\n readonly lifetime: CurrentFrameObservationLifetime;\n readonly state: 'active' | 'retired';\n beginReadback(): Result<CurrentFrameObservationSource, RenderGraphError>;\n retire(): void;\n}\n\nfunction observationError(\n code:\n | 'observation-absent'\n | 'observation-invalid-format'\n | 'observation-invalid-size'\n | 'observation-missing-copy-src'\n | 'observation-stale',\n expected: string,\n hint: string,\n): Result<never, RenderGraphError> {\n return err(new RenderGraphError({ code, expected, hint }));\n}\n\n/**\n * Validate and lease a producer's current-frame texture without naming any\n * semantic, pipeline, backend policy, or graph resource key.\n */\nexport function createCurrentFrameObservationLease(\n descriptor: CurrentFrameObservationDescriptor,\n currentFrameId: number,\n): Result<CurrentFrameObservationLease, RenderGraphError> {\n if (descriptor.texture === undefined || descriptor.texture === null) {\n return observationError(\n 'observation-absent',\n 'a producer-owned texture handle',\n 'provide the current frame color texture before requesting an observation',\n );\n }\n if (descriptor.format !== 'rgba16float') {\n return observationError(\n 'observation-invalid-format',\n \"current-frame observation format 'rgba16float'\",\n 'use the producer target format without reinterpretation',\n );\n }\n if (\n !Number.isInteger(descriptor.size.width) ||\n !Number.isInteger(descriptor.size.height) ||\n descriptor.size.width <= 0 ||\n descriptor.size.height <= 0\n ) {\n return observationError(\n 'observation-invalid-size',\n 'positive integer observation width and height',\n 'capture a non-empty current-frame target',\n );\n }\n if ((descriptor.usage & COPY_SRC) === 0) {\n return observationError(\n 'observation-missing-copy-src',\n 'current-frame texture usage includes COPY_SRC',\n 'add COPY_SRC to the producer target before requesting readback',\n );\n }\n if (descriptor.frameId !== currentFrameId) {\n return observationError(\n 'observation-stale',\n `observation frame ${currentFrameId}`,\n `discard frame ${descriptor.frameId} and request the current producer target`,\n );\n }\n\n let state: 'active' | 'retired' = 'active';\n const lifetime: CurrentFrameObservationLifetime = {\n frameId: descriptor.frameId,\n get state() {\n return state;\n },\n };\n const lease: CurrentFrameObservationLease = {\n descriptor,\n lifetime,\n get state() {\n return state;\n },\n beginReadback() {\n if (state === 'retired') {\n return err(\n new RenderGraphError({\n code: 'observation-retired',\n expected: 'active current-frame observation lease',\n hint: 'submit the eager copy before the producer retires this frame',\n }),\n );\n }\n return ok({ texture: descriptor.texture, descriptor, lifetime });\n },\n retire() {\n state = 'retired';\n },\n };\n return ok(lease);\n}\n","// @forgeax/engine-render-graph/src/pass-registry.ts — pass declaration\n// registry (plan-strategy 3.1).\n//\n// Shape (D-5):\n// - name -> reads/writes declaration + optional execute closure\n// - supports listPasses enumeration\n\nimport { RenderGraphError } from './errors.js';\nimport type { PassDescriptor } from './graph.js';\n\nexport interface PassEntry<Ctx = unknown> {\n readonly name: string;\n readonly descriptor: PassDescriptor<Ctx>;\n}\n\nexport class PassRegistry<Ctx = unknown> {\n private readonly passes: PassEntry<Ctx>[] = [];\n\n add(name: string, descriptor: PassDescriptor<Ctx>, before?: string): PassEntry<Ctx> {\n if (this.passes.some((pass) => pass.name === name)) {\n throw new RenderGraphError({\n code: 'duplicate-pass-name',\n expected: `pass name '${name}' is unique within one graph`,\n hint: `rename the second '${name}' pass; labels are diagnostics, not identity`,\n detail: { passName: name },\n });\n }\n const entry: PassEntry<Ctx> = { name, descriptor };\n const beforeIndex =\n before === undefined ? -1 : this.passes.findIndex((pass) => pass.name === before);\n if (beforeIndex < 0) this.passes.push(entry);\n else this.passes.splice(beforeIndex, 0, entry);\n return entry;\n }\n\n list(): readonly PassEntry<Ctx>[] {\n return this.passes;\n }\n\n count(): number {\n return this.passes.length;\n }\n}\n","import { err, ok, RenderGraphError, type Result } from '../errors.js';\n\nexport const COLOR_VALUE_DOMAINS = ['linear-hdr', 'linear-ldr', 'display-encoded'] as const;\n\nexport type ColorValueDomain = (typeof COLOR_VALUE_DOMAINS)[number];\n\nexport type ColorDomainConversion =\n | { readonly kind: 'encode-srgb' }\n | { readonly kind: 'decode-srgb' }\n | { readonly kind: 'tone-map' };\n\nexport interface ColorResourceDescriptor {\n readonly domain: ColorValueDomain;\n readonly format: string;\n}\n\nexport interface ColorDomainConnection {\n readonly source: string;\n readonly destination: string;\n readonly conversion?: ColorDomainConversion | undefined;\n}\n\nexport type ColorDomainValidation =\n | { readonly ok: true }\n | { readonly ok: false; readonly error: RenderGraphError };\n\nexport function isColorValueDomain(value: unknown): value is ColorValueDomain {\n return typeof value === 'string' && COLOR_VALUE_DOMAINS.includes(value as ColorValueDomain);\n}\n\nfunction invalidDomain(value: unknown): RenderGraphError {\n return new RenderGraphError({\n code: 'invalid-color-domain',\n expected: `domain is one of ${COLOR_VALUE_DOMAINS.join(', ')}`,\n hint: 'set an explicit color domain; do not infer it from the attachment format',\n detail: { value: String(value) },\n });\n}\n\nfunction missingDomain(resourceKey?: string): RenderGraphError {\n return new RenderGraphError({\n code: 'missing-color-domain',\n expected: 'every connected color resource has an explicit domain',\n hint: `add domain to the color resource descriptor${resourceKey === undefined ? '' : ` '${resourceKey}'`}`,\n detail: { resourceKey: resourceKey ?? '<descriptor>' },\n });\n}\n\nexport function serializeColorValueDomain(domain: ColorValueDomain): string {\n if (!isColorValueDomain(domain)) throw invalidDomain(domain);\n return JSON.stringify(domain);\n}\n\nexport function deserializeColorValueDomain(\n value: unknown,\n): Result<ColorValueDomain, RenderGraphError> {\n let candidate = value;\n if (typeof value === 'string') {\n try {\n candidate = JSON.parse(value) as unknown;\n } catch {\n candidate = value;\n }\n }\n return isColorValueDomain(candidate) ? ok(candidate) : err(invalidDomain(candidate));\n}\n\nexport function serializeColorResourceDescriptor(descriptor: ColorResourceDescriptor): string {\n if (!isColorValueDomain(descriptor.domain)) throw invalidDomain(descriptor.domain);\n return JSON.stringify(descriptor);\n}\n\nexport function deserializeColorResourceDescriptor(\n value: unknown,\n): Result<ColorResourceDescriptor, RenderGraphError> {\n if (typeof value !== 'object' || value === null) return err(missingDomain());\n const candidate = value as { domain?: unknown; format?: unknown };\n if (candidate.domain === undefined) return err(missingDomain());\n if (!isColorValueDomain(candidate.domain)) return err(invalidDomain(candidate.domain));\n if (typeof candidate.format !== 'string' || candidate.format.length === 0) {\n return err(\n new RenderGraphError({\n code: 'invalid-color-domain',\n expected: 'color resource descriptor includes a non-empty format',\n hint: 'set format separately from the explicit color domain',\n detail: { value: String(candidate.format) },\n }),\n );\n }\n return ok({ domain: candidate.domain, format: candidate.format });\n}\n\nfunction conversionMatches(\n source: ColorValueDomain,\n destination: ColorValueDomain,\n conversion: ColorDomainConversion,\n): boolean {\n if (conversion.kind === 'encode-srgb') {\n return (\n (source === 'linear-hdr' || source === 'linear-ldr') && destination === 'display-encoded'\n );\n }\n if (conversion.kind === 'decode-srgb') {\n return (\n source === 'display-encoded' && (destination === 'linear-hdr' || destination === 'linear-ldr')\n );\n }\n return (\n source === 'linear-hdr' && (destination === 'linear-ldr' || destination === 'display-encoded')\n );\n}\n\nexport function validateColorDomainConnection(\n source: unknown,\n destination: unknown,\n conversion?: ColorDomainConversion,\n): ColorDomainValidation {\n if (source === undefined || source === null) return { ok: false, error: missingDomain('source') };\n if (destination === undefined || destination === null) {\n return { ok: false, error: missingDomain('destination') };\n }\n if (!isColorValueDomain(source)) return { ok: false, error: invalidDomain(source) };\n if (!isColorValueDomain(destination)) return { ok: false, error: invalidDomain(destination) };\n if (source === destination) return { ok: true };\n if (conversion !== undefined && conversionMatches(source, destination, conversion)) {\n return { ok: true };\n }\n return {\n ok: false,\n error: new RenderGraphError({\n code: 'color-domain-mismatch',\n expected: `source and destination share a domain or use an explicit valid conversion (${source} -> ${destination})`,\n hint: 'insert an explicit linear blend or output encoding pass; never mix into an encoded destination',\n detail: { sourceDomain: source, destinationDomain: destination },\n }),\n };\n}\n\nexport { invalidDomain, missingDomain };\n","// @forgeax/engine-render-graph/src/graph.ts — RenderGraph core primitives.\n//\n// Shape (plan-strategy D-1/D-4/D-5/D-6.1):\n// - ResourceDescriptor / PassDescriptor — declaration types\n// - RenderGraph — main class: addResource / addPass / compile / execute\n// - PassInfo / ResourceInfo — query interfaces (D-5)\n\nimport type {\n RhiCaps,\n ComputePassDescriptor as RhiComputePassDescriptor,\n RhiComputePassEncoder,\n RhiDevice,\n Texture,\n TextureFormat,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport {\n type AliasSourceDetail,\n type CapMissingDetail,\n type DanglingReadDetail,\n err,\n ok,\n RenderGraphError,\n type Result,\n} from './errors.js';\nimport {\n type CurrentFrameObservationDescriptor,\n type CurrentFrameObservationLease,\n createCurrentFrameObservationLease,\n} from './observation.js';\nimport type { PassEntry } from './pass-registry.js';\nimport { PassRegistry } from './pass-registry.js';\nimport {\n type ColorDomainConnection,\n type ColorValueDomain,\n validateColorDomainConnection,\n} from './pipeline/color-value-domain.js';\nimport type { ResourceEntry } from './resource-registry.js';\nimport { ResourceRegistry } from './resource-registry.js';\n\n// ── Declaration types ────────────────────────────────────────────\n\nexport type ResourceKind = 'texture' | 'buffer';\n\nexport type ResourceLifetime = 'transient' | 'persistent';\n\nexport type BufferRole = 'auto-storage-or-uniform' | 'uniform';\n\n/**\n * Three-state size for addColorTarget (D-8):\n * - 'swapchain' — matches the output canvas size\n * - 'half-swapchain' — 1/2 the output canvas size (bloom downscale)\n * - { w, h } — fixed pixel dimensions (shadow maps, etc.)\n */\nexport type ColorTargetSize =\n | 'swapchain'\n | 'half-swapchain'\n | { readonly w: number; readonly h: number };\n\n/**\n * Color target descriptor for addColorTarget (D-8).\n *\n * format: GPU texture format (e.g. 'rgba16float', 'bgra8unorm').\n * size: target dimensions relative to swap-chain or absolute.\n * lifetime: allocation lifetime (default 'transient'); persistent targets keep\n * their physical texture across unchanged compiles and replace it on descriptor drift.\n * sample: multisample count (default 1; MSAA count=4 via #301).\n * usage: GPU texture usage flags (default RENDER_ATTACHMENT | TEXTURE_BINDING).\n * viewFormats: extra GPU texture formats viewable via createTextureView from this\n * texture; mirrors GPUTextureDescriptor.viewFormats. The LDR MSAA path needs\n * `bgra8unorm` storage + `bgra8unorm-srgb` view (hardware sRGB encoding on\n * store), so the consumer pre-declares the alternate format here.\n */\nexport interface ColorTargetDescriptor {\n readonly format: TextureFormat;\n readonly size: ColorTargetSize;\n readonly lifetime?: ResourceLifetime | undefined;\n readonly sample?: number | undefined;\n readonly usage?: number | undefined;\n readonly viewFormats?: readonly TextureFormat[] | undefined;\n /** Semantic color domain. Omitted only for legacy graphs without domain connections. */\n readonly domain?: ColorValueDomain | undefined;\n}\n\nexport interface ResolvedColorTargetDescriptor {\n readonly texture: Texture;\n readonly format: TextureFormat;\n readonly size: { readonly width: number; readonly height: number };\n readonly usage: number;\n readonly sample: number;\n}\n\nexport interface ResourceDescriptor {\n readonly kind: ResourceKind;\n readonly lifetime: ResourceLifetime;\n readonly bufferRole?: BufferRole;\n}\n\n/**\n * Opaque handle returned by addColorTarget. Resolved to a TextureView after\n * compile by calling resolve(name) in a pass execute closure.\n */\nexport type ColorTargetHandle = string;\n\n/**\n * Per-pass resolve context: maps color target names to compiled TextureViews.\n * A pass execute closure receives this alongside the user-provided Ctx.\n */\nexport interface ResolveContext {\n /** Resolve a color target name to its compiled TextureView, or undefined if not compiled. */\n readonly resolve: (name: string) => unknown;\n}\n\nexport interface PassDescriptor<Ctx = unknown> {\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n readonly execute?: ((ctx: Ctx) => void) | ((ctx: Ctx, resolve: ResolveContext) => void);\n readonly compute?: boolean;\n readonly storageBuffer?: boolean;\n /** Explicit resource-to-resource color-domain edges validated at compile time. */\n readonly colorConnections?: readonly ColorDomainConnection[] | undefined;\n}\n\nexport interface ComputePassDescriptor<Ctx> {\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n readonly storageBuffer?: boolean | undefined;\n readonly begin?: ((frame: Ctx) => RhiComputePassDescriptor) | undefined;\n readonly onBeginError?: ((frame: Ctx, cause: unknown) => void) | undefined;\n readonly after?: ((frame: Ctx) => void) | undefined;\n encode(context: {\n readonly pass: RhiComputePassEncoder;\n readonly frame: Ctx;\n readonly resources: ResolveContext;\n }): void;\n}\n\n/** Optional nested observer for per-pass execution attribution. */\nexport type PassExecuteRunner = (passName: string, action: () => void) => void;\n\n// ── Query types (D-5) ────────────────────────────────────────────\n\nexport interface PassInfo {\n readonly name: string;\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n}\n\nexport interface ResourceInfo {\n readonly key: string;\n readonly kind: ResourceKind;\n readonly lifetime: ResourceLifetime;\n}\n\n// ── Internalized graph ───────────────────────────────────────────\n\nexport interface InternalizedPass {\n readonly name: string;\n readonly reads: readonly string[];\n readonly writes: readonly string[];\n}\n\n/**\n * RHI buffer binding type a buffer resource resolves to after compile.\n * Mirrors the `@webgpu/types` GPUBufferBindingType subset used by the\n * storage-vs-uniform cap switch (research Finding 7; runtime template\n * `pbr-pipeline.ts` `caps.storageBuffer ? 'read-only-storage' : 'uniform'`).\n */\nexport type ResolvedBufferType = 'read-only-storage' | 'uniform';\n\n/**\n * Resolved buffer binding for a registered `kind:'buffer'` resource.\n * Produced by compile() per AC-09 / D-6.1: the declarative graph picks the\n * concrete binding type from `caps.storageBuffer`, so a consumer building a\n * bind-group layout reads `resolvedBufferType` instead of duplicating the\n * cap switch.\n */\nexport interface ResolvedBuffer {\n readonly key: string;\n readonly resolvedBufferType: ResolvedBufferType;\n}\n\nexport interface InternalizedGraph {\n readonly passes: readonly InternalizedPass[];\n /**\n * Buffer resources resolved to a concrete RHI binding type (AC-09).\n * Empty when the graph declares no `kind:'buffer'` resources.\n */\n readonly resolvedBuffers: readonly ResolvedBuffer[];\n /**\n * Resolved TextureViews keyed by resource name.\n * Populated by the compile allocation phase for addColorTarget resources.\n * Empty when no color targets were declared.\n */\n readonly resolvedTextures: ReadonlyMap<string, TextureView>;\n}\n\n// ── Compile options ──────────────────────────────────────────────\n\nexport interface CompileOptions {\n // D-6: second independent literal union (NOT derived from RhiCaps['backendKind']);\n // add-only '|null' member so passthrough callers forwarding\n // device.caps.backendKind type-check. Deriving from RhiCaps to collapse the\n // duplicate is a known OOS follow-on (architecture-principles #2 Derive).\n readonly backendKind: 'webgpu' | 'wgpu-native' | 'wgpu-webgl2' | 'null';\n readonly caps: RhiCaps;\n /**\n * RHI device interface handle for real GPU texture allocation (D-1).\n * Required when the graph has addColorTarget resources; the compile phase\n * calls device.createTexture/createTextureView for each color target.\n */\n readonly device?: RhiDevice | undefined;\n}\n\n// ── RenderGraph ──────────────────────────────────────────────────\n\n/**\n * Descriptor key for texture pool lookups (D-2 / D-8 / KB-2).\n * Transient resources with identical descriptors share the same physical\n * texture; drift in any field triggers rebuild.\n * NOTE: stringified form is used as Map key; the interface is for doc only.\n */\n// interface _TexturePoolKey { format:string; width:number; height:number; usage:number; sample:number; viewFormats:string[]; }\n\n/** Pooled texture entry shared by transient and persistent allocation paths. */\ninterface PooledTexture {\n readonly texture: unknown; // opaque RHI Texture handle\n readonly view: unknown; // opaque RHI TextureView handle\n readonly descriptorKey: string;\n}\n\ninterface StagedColorTargetAllocation {\n readonly resolvedTextures: Map<string, TextureView>;\n readonly transient: ReadonlyMap<string, PooledTexture>;\n readonly persistent: ReadonlyMap<string, PooledTexture>;\n}\n\n/** A subset of RhiDevice surface needed by drain() and reclaim to release pooled textures. */\ntype DrainDevice = Pick<RhiDevice, 'destroyTexture' | 'queue'>;\n\nfunction poolKey(meta: {\n format: TextureFormat;\n width: number;\n height: number;\n usage: number;\n sample: number;\n viewFormats: readonly TextureFormat[];\n}): string {\n return `${meta.format}:${meta.width}x${meta.height}:${meta.usage}:${meta.sample}:${JSON.stringify(meta.viewFormats)}`;\n}\n\n/**\n * Runtime projection of the type-only WebGPU GPUTextureFormat union.\n *\n * `TextureFormat` is erased at runtime, but RenderGraph must reject malformed\n * declarations before it calls an RHI device. Keep this ordered vocabulary as\n * the single runtime validation authority; backend capability or usage refusal\n * remains a `resource-alloc-failed` result after this syntax gate.\n */\nconst VALID_GPU_TEXTURE_FORMATS = [\n 'r8unorm',\n 'r8snorm',\n 'r8uint',\n 'r8sint',\n 'r16unorm',\n 'r16snorm',\n 'r16uint',\n 'r16sint',\n 'r16float',\n 'rg8unorm',\n 'rg8snorm',\n 'rg8uint',\n 'rg8sint',\n 'r32uint',\n 'r32sint',\n 'r32float',\n 'rg16unorm',\n 'rg16snorm',\n 'rg16uint',\n 'rg16sint',\n 'rg16float',\n 'rgba8unorm',\n 'rgba8unorm-srgb',\n 'rgba8snorm',\n 'rgba8uint',\n 'rgba8sint',\n 'bgra8unorm',\n 'bgra8unorm-srgb',\n 'rgb9e5ufloat',\n 'rgb10a2uint',\n 'rgb10a2unorm',\n 'rg11b10ufloat',\n 'rg32uint',\n 'rg32sint',\n 'rg32float',\n 'rgba16unorm',\n 'rgba16snorm',\n 'rgba16uint',\n 'rgba16sint',\n 'rgba16float',\n 'rgba32uint',\n 'rgba32sint',\n 'rgba32float',\n 'stencil8',\n 'depth16unorm',\n 'depth24plus',\n 'depth24plus-stencil8',\n 'depth32float',\n 'depth32float-stencil8',\n 'bc1-rgba-unorm',\n 'bc1-rgba-unorm-srgb',\n 'bc2-rgba-unorm',\n 'bc2-rgba-unorm-srgb',\n 'bc3-rgba-unorm',\n 'bc3-rgba-unorm-srgb',\n 'bc4-r-unorm',\n 'bc4-r-snorm',\n 'bc5-rg-unorm',\n 'bc5-rg-snorm',\n 'bc6h-rgb-ufloat',\n 'bc6h-rgb-float',\n 'bc7-rgba-unorm',\n 'bc7-rgba-unorm-srgb',\n 'etc2-rgb8unorm',\n 'etc2-rgb8unorm-srgb',\n 'etc2-rgb8a1unorm',\n 'etc2-rgb8a1unorm-srgb',\n 'etc2-rgba8unorm',\n 'etc2-rgba8unorm-srgb',\n 'eac-r11unorm',\n 'eac-r11snorm',\n 'eac-rg11unorm',\n 'eac-rg11snorm',\n 'astc-4x4-unorm',\n 'astc-4x4-unorm-srgb',\n 'astc-5x4-unorm',\n 'astc-5x4-unorm-srgb',\n 'astc-5x5-unorm',\n 'astc-5x5-unorm-srgb',\n 'astc-6x5-unorm',\n 'astc-6x5-unorm-srgb',\n 'astc-6x6-unorm',\n 'astc-6x6-unorm-srgb',\n 'astc-8x5-unorm',\n 'astc-8x5-unorm-srgb',\n 'astc-8x6-unorm',\n 'astc-8x6-unorm-srgb',\n 'astc-8x8-unorm',\n 'astc-8x8-unorm-srgb',\n 'astc-10x5-unorm',\n 'astc-10x5-unorm-srgb',\n 'astc-10x6-unorm',\n 'astc-10x6-unorm-srgb',\n 'astc-10x8-unorm',\n 'astc-10x8-unorm-srgb',\n 'astc-10x10-unorm',\n 'astc-10x10-unorm-srgb',\n 'astc-12x10-unorm',\n 'astc-12x10-unorm-srgb',\n 'astc-12x12-unorm',\n 'astc-12x12-unorm-srgb',\n] as const satisfies readonly TextureFormat[];\n\nconst VALID_GPU_TEXTURE_FORMAT_SET: ReadonlySet<string> = new Set(VALID_GPU_TEXTURE_FORMATS);\n\nexport class RenderGraph<Ctx = unknown> {\n private readonly resources = new ResourceRegistry();\n private readonly passes = new PassRegistry<Ctx>();\n private compiled: InternalizedGraph | null = null;\n\n /** Transient texture pool: keyed by descriptor, reused across compiles (D-2). */\n private readonly transientPool = new Map<string, PooledTexture>();\n /**\n * Pending-destroy queue (bug-20260622): replaced textures awaiting GPU\n * retirement before actual device.destroyTexture. drainTransient(),\n * setTransientEntry(), and setPersistentEntry() push here instead of destroying immediately;\n * reclaimRetiredTransients() (called post-queue.submit in recordFrame) drains\n * the queue when the GPU signals onSubmittedWorkDone.\n */\n private readonly pendingDestroy: PooledTexture[] = [];\n /** Persistent textures: keyed by resource name, kept across compiles. */\n private readonly persistentTextures = new Map<string, PooledTexture>();\n /** Swap-chain size for resolving 'swapchain' / 'half-swapchain' sizes. */\n private swapChainWidth = 800;\n private swapChainHeight = 600;\n /** Last compile-time swap-chain size; diff triggers recompile-invalidation. */\n private compiledWidth = 800;\n private compiledHeight = 600;\n /**\n * feat-20260612 M-4 / w15: device reference stashed at compile-time so\n * drain() can release pooled textures via device.destroyTexture without\n * a separate parameter. Set by compile(); null until the first compile.\n * Render-graph stays RHI-pure (no runtime dep): the destroy bookkeeping\n * SSOT is the RHI shim, exactly as GpuTexture.destroy() routes through it.\n */\n private lastDevice: DrainDevice | null = null;\n\n /**\n * Set the current swap-chain dimensions (w7).\n * The compile allocation phase uses this to resolve 'swapchain' and\n * 'half-swapchain' size specifiers. Returns true when dimensions differ\n * from the last compile, signalling that a recompile is needed.\n */\n setSwapChainSize(width: number, height: number): boolean {\n this.swapChainWidth = width;\n this.swapChainHeight = height;\n if (width !== this.compiledWidth || height !== this.compiledHeight) {\n return true;\n }\n return false;\n }\n\n /**\n * w7: resolve a color-target name to its compiled TextureView.\n * Returns the GPU view after compile, or undefined if not yet compiled\n * or the name was not registered via addColorTarget.\n */\n getColorTargetView(name: string): unknown {\n return this.compiled?.resolvedTextures.get(name);\n }\n\n /**\n * w7: resolve a color-target name to its compiled GPU Texture handle.\n * Returns the texture after compile, or undefined if not yet compiled.\n */\n getColorTargetTexture(name: string): unknown {\n return this.compiled?.resolvedTextures.get(`${name}::tex`);\n }\n\n getColorTargetDescriptor(name: string): ResolvedColorTargetDescriptor | undefined {\n const meta = this.resources.getColorTargetMeta(name);\n const texture = this.compiled?.resolvedTextures.get(`${name}::tex`);\n if (meta === undefined || texture === undefined) return undefined;\n return {\n texture: texture as unknown as Texture,\n format: meta.format,\n size: {\n width: this.resolveWidth(meta.size),\n height: this.resolveHeight(meta.size),\n },\n usage: meta.usage,\n sample: meta.sample,\n };\n }\n\n /**\n * Declare a color target alias: both names share the same physical texture.\n * The source must already be registered via addColorTarget.\n * Used for hdrComposited -> hdrColor folding (KB-1 / D-2). The returned\n * Result contains the opaque alias handle or a duplicate-resource error.\n */\n addColorTargetAlias(name: string, source: string): Result<ColorTargetHandle, RenderGraphError> {\n const result = this.resources.addColorTargetAlias(name, source);\n if (!result.ok) return result;\n return ok(name);\n }\n\n addResource(\n key: string,\n descriptor: ResourceDescriptor,\n ): Result<ResourceEntry, RenderGraphError> {\n return this.resources.add(key, descriptor);\n }\n\n /**\n * Declare a color target resource that the compiler will allocate as a\n * transient or persistent GPU texture (D-1 / D-8). A successful Result\n * contains an opaque string handle that can be referenced in pass read/write\n * arrays and resolved to a TextureView via resolve(name) inside a pass\n * execute closure. A duplicate key is rejected before registry publication.\n *\n * Omitted lifetime preserves the default `transient`; `persistent` retains\n * identity across unchanged compiles and replaces on descriptor drift.\n * format/size/sample/usage are stored on the resource entry for the compile\n * allocation phase (w6).\n */\n addColorTarget(\n name: string,\n desc: ColorTargetDescriptor,\n ): Result<ColorTargetHandle, RenderGraphError> {\n const result = this.resources.addColorTarget(name, desc);\n if (!result.ok) return result;\n return ok(name);\n }\n\n addPass(name: string, descriptor: PassDescriptor<Ctx>): PassEntry<Ctx> {\n return this.passes.add(name, descriptor);\n }\n\n /** @internal Renderer composition seam for declaring feature work at its semantic target. */\n _addPassBefore(name: string, before: string, descriptor: PassDescriptor<Ctx>): PassEntry<Ctx> {\n return this.passes.add(name, descriptor, before);\n }\n\n addComputePass(name: string, descriptor: ComputePassDescriptor<Ctx>): PassEntry<Ctx> {\n return this.addComputePassAt(name, descriptor);\n }\n\n /** @internal Renderer composition seam for declaring feature work at its semantic target. */\n _addComputePassBefore(\n name: string,\n before: string,\n descriptor: ComputePassDescriptor<Ctx>,\n ): PassEntry<Ctx> {\n return this.addComputePassAt(name, descriptor, before);\n }\n\n private addComputePassAt(\n name: string,\n descriptor: ComputePassDescriptor<Ctx>,\n before?: string,\n ): PassEntry<Ctx> {\n return this.passes.add(\n name,\n {\n reads: descriptor.reads,\n writes: descriptor.writes,\n compute: true,\n storageBuffer: descriptor.storageBuffer ?? true,\n execute: (frame: Ctx, resources: ResolveContext) => {\n const encoder = (\n frame as Ctx & { readonly encoder: import('@forgeax/engine-rhi').RhiCommandEncoder }\n ).encoder;\n const begin = descriptor.begin?.(frame);\n let pass: RhiComputePassEncoder;\n try {\n pass = encoder.beginComputePass({\n label: name,\n ...(begin?.timestampWrites === undefined\n ? {}\n : { timestampWrites: begin.timestampWrites }),\n });\n } catch (cause) {\n descriptor.onBeginError?.(frame, cause);\n return;\n }\n try {\n descriptor.encode({ pass, frame, resources });\n } finally {\n pass.end();\n }\n descriptor.after?.(frame);\n },\n },\n before,\n );\n }\n\n /**\n * Validate a producer-scoped current-frame texture without exposing graph\n * resource names through the observation lease.\n */\n createCurrentFrameObservationLease(\n descriptor: CurrentFrameObservationDescriptor,\n currentFrameId: number,\n ): Result<CurrentFrameObservationLease, RenderGraphError> {\n return createCurrentFrameObservationLease(descriptor, currentFrameId);\n }\n\n /**\n * Compile the graph into an internalized form.\n *\n * Phases (plan-strategy 3.1):\n * 1. Cap-gate fail-fast\n * 2. Unknown-resource fail-fast (every pass read/write key is registered)\n * 3. Dangling-read fail-fast\n * 4. Preserve declaration order as the temporal authority\n * 5. Buffer-role resolution (AC-09 / D-6.1)\n * 6. GPU allocation for color targets (D-1) — when device is provided and the\n * graph has addColorTarget resources, allocate textures via\n * device.createTexture/createTextureView. Errors surface as\n * 'resource-alloc-failed' or 'invalid-format'.\n */\n compile(opts: CompileOptions): Result<InternalizedGraph, RenderGraphError> {\n const passList = this.passes.list();\n const { caps, device } = opts;\n\n const capErr = this.validateCaps(passList, caps);\n if (capErr) return capErr;\n\n const colorDomainErr = this.validateColorDomains(passList);\n if (colorDomainErr) return colorDomainErr;\n\n const unknownErr = this.validateNoUnknownResource(passList);\n if (unknownErr) return unknownErr;\n\n const danglingErr = this.validateNoDanglingRead(passList);\n if (danglingErr) return danglingErr;\n\n const formatErr = this.validateColorTargetFormats();\n if (!formatErr.ok) return formatErr;\n\n const internalizedPasses: InternalizedPass[] = passList.map((pass) => {\n return {\n name: pass.name,\n reads: pass.descriptor.reads,\n writes: pass.descriptor.writes,\n };\n });\n\n const resolvedBuffers = this.resolveBuffers(caps);\n\n // Phase 7: GPU allocation for color targets (D-1).\n const resizeDetected =\n this.swapChainWidth !== this.compiledWidth || this.swapChainHeight !== this.compiledHeight;\n const allocatedTextures = this.allocateColorTargets(device, resizeDetected);\n if (!allocatedTextures.ok) return allocatedTextures;\n\n // Phase 6.5: resize drain (AC-09, plan-strategy D-4). Defer the drain\n // until allocation succeeds so a refused compile leaves the active graph\n // and its pool untouched for a retry.\n if (resizeDetected) {\n this.drainTransient();\n }\n\n for (const [key, pooled] of allocatedTextures.value.transient) {\n this.setTransientEntry(key, pooled);\n }\n for (const [key, pooled] of allocatedTextures.value.persistent) {\n this.setPersistentEntry(key, pooled);\n }\n\n this.compiled = {\n passes: internalizedPasses,\n resolvedBuffers,\n resolvedTextures: allocatedTextures.value.resolvedTextures,\n };\n this.compiledWidth = this.swapChainWidth;\n this.compiledHeight = this.swapChainHeight;\n if (device !== undefined) {\n this.lastDevice = device;\n }\n return ok(this.compiled);\n }\n\n /**\n * feat-20260612 M-4 / w15: release every pooled GPU texture and clear\n * the pools.\n *\n * Walks `transientPool` + `persistentTextures`, forwarding each\n * `PooledTexture.texture` opaque handle to `device.destroyTexture(...)`,\n * then clears both Maps. The destroy bookkeeping SSOT is the RHI shim\n * (architecture-principles §1 SSOT: same path GpuTexture.destroy()\n * uses); render-graph stays RHI-pure (no runtime dep).\n *\n * Plan-strategy D-7: drain covers the dispose exit path (`Renderer.dispose()`);\n * descriptor-drift replacement during compile is fenced through\n * `pendingDestroy` and `reclaimRetiredTransients()`.\n *\n * Idempotent (architecture-principles §6): a second drain on cleared\n * Maps is a no-op. drain() before any compile is also a safe no-op.\n * Per-handle errors from the RHI shim (e.g. 'destroy-after-destroy'\n * on a stale handle) are tolerated so the dispose chain can make\n * progress (mirrors gpuStore.destroyAll's swallow-and-continue\n * policy; plan-strategy D-3 / D-8). The structured error stays\n * available on the device handle for future inspector hooks.\n */\n drain(): void {\n const device = this.lastDevice;\n if (device === null) {\n this.transientPool.clear();\n this.persistentTextures.clear();\n this.pendingDestroy.length = 0;\n return;\n }\n for (const pooled of this.transientPool.values()) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy failures do not\n // interrupt the drain chain (docstring tolerance contract).\n }\n }\n this.transientPool.clear();\n // bug-20260622 D-6: drain teardown path — destroy any pendingDestroy\n // items left over (Renderer.dispose() has no in-flight frames).\n for (const pooled of this.pendingDestroy) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy failures do not\n // interrupt the drain chain (docstring tolerance contract).\n }\n }\n this.pendingDestroy.length = 0;\n for (const pooled of this.persistentTextures.values()) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy failures do not\n // interrupt the drain chain (docstring tolerance contract).\n }\n }\n this.persistentTextures.clear();\n }\n\n /**\n * Relinquish every texture owned by this graph after its last frame has\n * been submitted. Unlike {@link drain}, this does not synchronously destroy\n * GPU resources: they join `pendingDestroy` and are released by\n * `reclaimRetiredTransients()` only after `onSubmittedWorkDone` resolves.\n *\n * A retired graph is no longer executable. Runtime replaces a memoized\n * per-frame graph through this entry when topology changes (rather than\n * dropping the graph and its pools), while `drain()` remains the teardown\n * path where immediate destruction is safe.\n */\n retire(): void {\n const device = this.lastDevice;\n if (device === null) {\n this.transientPool.clear();\n this.persistentTextures.clear();\n this.pendingDestroy.length = 0;\n this.compiled = null;\n return;\n }\n for (const pooled of this.transientPool.values()) {\n this.pendingDestroy.push(pooled);\n }\n this.transientPool.clear();\n for (const pooled of this.persistentTextures.values()) {\n this.pendingDestroy.push(pooled);\n }\n this.persistentTextures.clear();\n this.compiled = null;\n }\n\n /**\n * Release every transient-pool texture while keeping persistentTextures\n * intact (AC-09: resize drain, plan-strategy D-4).\n *\n * Walks `transientPool` values and forwards each `PooledTexture.texture`\n * opaque handle to `device.destroyTexture(...)`, then clears the transient\n * pool. Mirror of `drain()` but scoped to the transient pool only.\n *\n * Persistent textures survive `drainTransient` — they are only released by\n * the full `drain()` on teardown. `drainTransient` is an internal helper\n * called by `compile()` when swap-chain size changes; it is NOT a public API\n * (callers should use `drain()` for teardown).\n *\n * Idempotent (architecture-principles §6): a second drainTransient on an\n * already-cleared transient pool is a no-op.\n */\n private drainTransient(): void {\n const device = this.lastDevice;\n if (device === null) {\n this.transientPool.clear();\n return;\n }\n // bug-20260622 D-1: push old transient textures into pendingDestroy\n // queue instead of destroying immediately. The GPU may still hold\n // references from a prior in-flight command buffer.\n for (const pooled of this.transientPool.values()) {\n this.pendingDestroy.push(pooled);\n }\n this.transientPool.clear();\n }\n\n /**\n * Guarded transient pool insert (AC-08, plan-strategy D-4).\n *\n * Before overwriting a key in the transient pool, destroys the old pooled\n * texture via `device.destroyTexture(...)` to prevent stranded GPU textures.\n * The guard is defensive: in current production code flow this code path is\n * unreachable (set() only follows a get() miss inside allocateColorTargets),\n * but the single-line guard costs almost nothing and closes the symmetry gap\n * (every GPU resource allocation has a paired destroy).\n *\n * When `lastDevice` is null (no device ever stashed), the old entry is\n * silently dropped without destroy (mirrors drainTransient's null-device\n * fast path).\n */\n private setTransientEntry(key: string, pooled: PooledTexture): void {\n const old = this.transientPool.get(key);\n if (old) {\n // bug-20260622 D-1: push into pendingDestroy queue instead of\n // destroying immediately — the old texture may still be referenced\n // by an in-flight command buffer.\n this.pendingDestroy.push(old);\n }\n this.transientPool.set(key, pooled);\n }\n\n /**\n * Publish a persistent replacement only after a complete allocation succeeds.\n * The old handle remains fenced until the GPU retires work that may still\n * reference it, just like a transient replacement.\n */\n private setPersistentEntry(key: string, pooled: PooledTexture): void {\n const old = this.persistentTextures.get(key);\n if (old && old.texture !== pooled.texture) {\n this.pendingDestroy.push(old);\n }\n this.persistentTextures.set(key, pooled);\n }\n\n /**\n * bug-20260622 D-2: reclaim pool textures queued in pendingDestroy after\n * the GPU has retired all prior command buffers.\n *\n * Takes a snapshot of pendingDestroy, then calls\n * `lastDevice.queue.onSubmittedWorkDone()`. When the promise resolves,\n * the snapshot items are actually destroyed via\n * `device.destroyTexture(...)` and removed from the queue.\n *\n * Idempotent (architecture-principles D-4): a second reclaim on an\n * already-drained pendingDestroy is a no-op. When lastDevice is null\n * (no device ever stashed), pendingDestroy is cleared directly.\n *\n * Per-handle destroy errors are tolerated (swallow-and-continue,\n * plan-strategy D-5) — a stale-handle destroy-after-destroy does not\n * interrupt the reclaim chain.\n */\n async reclaimRetiredTransients(): Promise<void> {\n const device = this.lastDevice;\n if (device === null) {\n this.pendingDestroy.length = 0;\n return;\n }\n if (this.pendingDestroy.length === 0) return;\n\n // Snapshot the queue; items added after this point are handled by the\n // next reclaim call (D-4: no race with concurrent push from same-frame\n // drainTransient).\n const snapshot = this.pendingDestroy.splice(0);\n\n // Wait for all prior GPU work to complete.\n await device.queue.onSubmittedWorkDone();\n\n // Destroy snapshot items.\n for (const pooled of snapshot) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // swallow-and-continue: per-handle destroy errors are tolerated\n // (docstring contract) — a stale handle does not interrupt the\n // reclaim chain for subsequent items.\n }\n }\n }\n\n /**\n * Drop the pendingDestroy queue WITHOUT calling device.destroyTexture\n * (feat-20260622-s5 M3 / B-2 / B-AC-02).\n *\n * Used on the device-lost recover() rebuild path: the queue holds\n * PooledTexture handles minted against the now-lost device, so calling\n * destroyTexture on them against the freshly-rebuilt device is meaningless\n * (the old GPUDevice owns them; spec retires its resources implicitly when\n * it is lost). recover() calls this after `gpuStore.destroyAll()` and before\n * `tryCreateWebGPURenderer` so no stale handle reaches the new device.\n *\n * device-lost is an upstream judgement (createRenderer's health state); the\n * graph stays RHI-pure and takes no device parameter — it only exposes the\n * clear entry. Same effect as the existing null-device fast paths in drain()\n * / reclaimRetiredTransients() (`pendingDestroy.length = 0`), surfaced as a\n * method recover() can call directly. Idempotent: a second call on an\n * already-empty queue is a no-op.\n */\n clearPendingDestroy(): void {\n this.pendingDestroy.length = 0;\n }\n\n /**\n * Execute the compiled graph in declaration order, calling\n * each pass's execute closure with the provided context. Passes without an\n * execute closure are silently skipped.\n */\n execute(ctx: Ctx, runPass?: PassExecuteRunner): void {\n const compiled = this.compiled;\n if (!compiled) return;\n const resolvedTextures: ReadonlyMap<string, unknown> = compiled.resolvedTextures;\n const resolveCtx: ResolveContext = {\n resolve: (name: string) => resolvedTextures.get(name),\n };\n const passList = this.passes.list();\n const passByName = new Map<string, PassEntry<Ctx>>(passList.map((p) => [p.name, p]));\n for (const internalPass of compiled.passes) {\n const entry = passByName.get(internalPass.name);\n const execute = entry?.descriptor.execute;\n if (execute) {\n if (runPass === undefined) {\n (execute as (ctx: Ctx, resolve: ResolveContext) => void)(ctx, resolveCtx);\n } else {\n runPass(internalPass.name, () =>\n (execute as (ctx: Ctx, resolve: ResolveContext) => void)(ctx, resolveCtx),\n );\n }\n }\n }\n }\n\n listPasses(): readonly PassInfo[] {\n return this.passes.list().map((p) => ({\n name: p.name,\n reads: p.descriptor.reads,\n writes: p.descriptor.writes,\n }));\n }\n\n listResources(): readonly ResourceInfo[] {\n const result: ResourceInfo[] = [];\n for (const entry of this.resources.entries()) {\n result.push({\n key: entry.key,\n kind: entry.descriptor.kind,\n lifetime: entry.descriptor.lifetime,\n });\n }\n return result;\n }\n\n // ── Private helpers ────────────────────────────────────────────\n\n private validateCaps(\n passList: readonly PassEntry<Ctx>[],\n caps: RhiCaps,\n ): Result<never, RenderGraphError> | null {\n for (const pass of passList) {\n const { name, descriptor } = pass;\n\n if (descriptor.compute && !caps.compute) {\n return err(\n new RenderGraphError({\n code: 'cap-missing',\n expected: `pass '${name}' is a compute pass but caps.compute is false`,\n hint: 'use a render pass path or enable compute on the backend',\n detail: { cap: 'compute', passName: name } satisfies CapMissingDetail,\n }),\n );\n }\n\n if (descriptor.storageBuffer && !caps.storageBuffer) {\n return err(\n new RenderGraphError({\n code: 'cap-missing',\n expected: `pass '${name}' requires storage buffer but caps.storageBuffer is false`,\n hint: 'switch to uniform buffer or enable storageBuffer on the backend',\n detail: {\n cap: 'storageBuffer',\n passName: name,\n } satisfies CapMissingDetail,\n }),\n );\n }\n }\n return null;\n }\n\n private validateColorDomains(\n passList: readonly PassEntry<Ctx>[],\n ): Result<never, RenderGraphError> | null {\n for (const pass of passList) {\n for (const connection of pass.descriptor.colorConnections ?? []) {\n const source = this.resources.get(connection.source)?.colorTarget?.domain;\n const destination = this.resources.get(connection.destination)?.colorTarget?.domain;\n const validation = validateColorDomainConnection(\n source,\n destination,\n connection.conversion,\n );\n if (!validation.ok) return err(validation.error);\n }\n }\n return null;\n }\n\n private validateNoUnknownResource(\n passList: readonly PassEntry<Ctx>[],\n ): Result<never, RenderGraphError> | null {\n for (const pass of passList) {\n for (const key of [...pass.descriptor.reads, ...pass.descriptor.writes]) {\n // Built-in reserved key 'swapchain' (feat-20260609 framebuffers demo\n // M5 / T-12-a): the swap-chain output is not a graph-allocated\n // resource; passes that write to 'swapchain' surface their writeView\n // through the resolveCtx fallback (`resolveCtx.resolve('swapchain')`\n // returns undefined -> the dispatcher falls back to `ctx.view`, the\n // current swap-chain view). Allowed in `writes` (a fullscreen pass\n // outputs to the swap-chain) and in `reads` (a future pass that\n // samples the swap-chain via copyTextureToTexture). The graph never\n // allocates, owns, or aliases this resource — it is purely an\n // ordering/contract token.\n if (key === 'swapchain') continue;\n if (!this.resources.has(key)) {\n return err(\n new RenderGraphError({\n code: 'unknown-resource',\n expected: `pass '${pass.name}' references resource key '${key}' but it is not registered`,\n hint: `call addResource('${key}', ...) before compile, or remove '${key}' from pass '${pass.name}'`,\n detail: {\n resourceKey: key,\n passName: pass.name,\n } satisfies DanglingReadDetail,\n }),\n );\n }\n }\n }\n return null;\n }\n\n /**\n * Resolve every registered `kind:'buffer'` resource to a concrete RHI\n * binding type (AC-09 / D-6.1). `bufferRole='auto-storage-or-uniform'`\n * (the default when unset) picks `'read-only-storage'` when the backend\n * advertises `caps.storageBuffer`, else falls back to `'uniform'`;\n * `bufferRole='uniform'` is always `'uniform'`. Mirrors the runtime\n * `pbr-pipeline.ts` cap switch (research Finding 7), expressed here in the\n * RHI-pure graph layer so consumers never duplicate the branch.\n */\n private resolveBuffers(caps: RhiCaps): ResolvedBuffer[] {\n const resolved: ResolvedBuffer[] = [];\n for (const entry of this.resources.entries()) {\n if (entry.descriptor.kind !== 'buffer') continue;\n const role = entry.descriptor.bufferRole ?? 'auto-storage-or-uniform';\n const resolvedBufferType: ResolvedBufferType =\n role === 'uniform' ? 'uniform' : caps.storageBuffer ? 'read-only-storage' : 'uniform';\n resolved.push({ key: entry.key, resolvedBufferType });\n }\n return resolved;\n }\n\n private validateColorTargetFormats(): Result<undefined, RenderGraphError> {\n for (const entry of this.resources.entries()) {\n const meta = entry.colorTarget;\n if (!meta || VALID_GPU_TEXTURE_FORMAT_SET.has(meta.format)) continue;\n\n return err(\n new RenderGraphError({\n code: 'invalid-format',\n expected: `addColorTarget format must be a valid GPU texture format; received '${meta.format}'`,\n hint: `replace '${meta.format}' with one of detail.expected before recompiling`,\n detail: {\n resourceKey: entry.key,\n format: meta.format,\n expected: VALID_GPU_TEXTURE_FORMATS,\n },\n }),\n );\n }\n return ok(undefined);\n }\n\n /**\n * Phase 7: allocate GPU textures for registered color targets (D-1 / D-2).\n *\n * For each addColorTarget resource, resolves the concrete size from the\n * ColorTargetSize descriptor and swapChainSize, then looks up the transient\n * pool by descriptor key. Pool hit reuses the same physical texture/view;\n * pool miss (drift) triggers device.createTexture/createTextureView rebuild.\n *\n * Alias targets (addColorTargetAlias) fold into the source's physical texture\n * (KB-1 MoveNode pattern). Persistent targets are retained across compiles\n * with size-drift rebuild.\n *\n * device === undefined is a no-op (returns an empty map).\n * Allocation is transactional: newly created textures are destroyed on any\n * failure, and pool mutations are committed only after every target succeeds.\n */\n private allocateColorTargets(\n device: RhiDevice | undefined,\n invalidateTransientPool = false,\n ): Result<StagedColorTargetAllocation, RenderGraphError> {\n const result = new Map<string, TextureView>();\n if (\n !device ||\n typeof (device as unknown as Record<string, unknown>).createTexture !== 'function'\n )\n return ok({ resolvedTextures: result, transient: new Map(), persistent: new Map() });\n\n const stagedTransient = new Map<string, PooledTexture>();\n const stagedPersistent = new Map<string, PooledTexture>();\n const stagedAllocations: PooledTexture[] = [];\n const discardStaged = (): void => {\n for (const pooled of stagedAllocations) {\n try {\n device.destroyTexture(pooled.texture as Texture);\n } catch {\n // A cleanup failure must not hide the allocation error.\n }\n }\n };\n\n for (const entry of this.resources.entries()) {\n const meta = entry.colorTarget;\n if (!meta) continue;\n\n // Resolve alias: fold to source physical texture.\n if (meta.aliasedFrom !== undefined) {\n const sourceView = result.get(meta.aliasedFrom);\n const sourceTexture = result.get(`${meta.aliasedFrom}::tex`);\n if (sourceView === undefined || sourceTexture === undefined) {\n discardStaged();\n return err(\n new RenderGraphError({\n code: 'alias-source-missing',\n expected: `alias '${entry.key}' source '${meta.aliasedFrom}' must resolve to a compiled color target`,\n hint: `register color target '${meta.aliasedFrom}' before compiling alias '${entry.key}'`,\n detail: {\n aliasKey: entry.key,\n sourceKey: meta.aliasedFrom,\n } satisfies AliasSourceDetail,\n }),\n );\n }\n result.set(entry.key, sourceView);\n result.set(`${entry.key}::tex`, sourceTexture);\n continue;\n }\n\n const width = this.resolveWidth(meta.size);\n const height = this.resolveHeight(meta.size);\n const lifetime = entry.lifetime;\n\n // feat-20260612-hdrp-ssao M9 scope-amendment (M8 graph barrier):\n // Include the resource name in the transient pool key. Without this,\n // two simultaneously-active transient color targets with identical\n // descriptors (e.g. ssaoRaw / ssaoBlurred — both r8unorm half-swapchain\n // RENDER_ATTACHMENT|TEXTURE_BINDING) share the same GPU texture. When\n // one pass writes and the next pass both writes (color attachment) and\n // reads (texture binding from the same view), WebGPU rejects the command\n // buffer: \"TextureBinding|RenderAttachment in the same synchronization\n // scope.\"\n const descriptorKey = poolKey({\n format: meta.format,\n width,\n height,\n usage: meta.usage,\n sample: meta.sample,\n viewFormats: meta.viewFormats ?? [],\n });\n const key = `${entry.key}:${descriptorKey}`;\n\n if (lifetime === 'transient') {\n const pooled = invalidateTransientPool ? undefined : this.transientPool.get(key);\n if (pooled) {\n result.set(entry.key, pooled.view as TextureView);\n // w7-fix (round 3): re-publish the GPU Texture handle on every\n // compile, not only on pool-miss. Without this the second compile\n // (the recompile-on-resize path) leaves `${entry.key}::tex` empty,\n // breaking consumers that read `getColorTargetTexture` (shadow\n // debugReadback, fxaa copyTextureToTexture, MSAA srgb-view creation).\n // biome-ignore lint/suspicious/noExplicitAny: opaque RHI texture handle\n result.set(`${entry.key}::tex`, pooled.texture as any);\n continue;\n }\n } else if (lifetime === 'persistent') {\n const persisted = this.persistentTextures.get(entry.key);\n if (persisted?.descriptorKey === descriptorKey) {\n result.set(entry.key, persisted.view as TextureView);\n // biome-ignore lint/suspicious/noExplicitAny: opaque RHI texture handle\n result.set(`${entry.key}::tex`, persisted.texture as any);\n continue;\n }\n }\n\n // Pool miss or persistent fresh allocation: create new texture.\n const texResult = device.createTexture({\n label: entry.key,\n size: { width, height, depthOrArrayLayers: 1 },\n mipLevelCount: 1,\n sampleCount: meta.sample,\n dimension: '2d',\n format: meta.format,\n usage: meta.usage,\n viewFormats: meta.viewFormats ?? [],\n } as never);\n\n if (!texResult.ok) {\n discardStaged();\n return err(\n new RenderGraphError({\n code: 'resource-alloc-failed',\n expected: `device.createTexture must succeed for color target '${entry.key}'`,\n hint: `retry after recovering the RHI allocation failure for '${entry.key}'`,\n detail: {\n resourceKey: entry.key,\n rhiCode: texResult.error.code,\n },\n }),\n );\n }\n\n const viewResult = device.createTextureView(texResult.value, {});\n if (!viewResult.ok) {\n try {\n device.destroyTexture(texResult.value);\n } catch {\n // A cleanup failure must not hide the allocation error.\n }\n discardStaged();\n return err(\n new RenderGraphError({\n code: 'resource-alloc-failed',\n expected: `device.createTextureView must succeed for color target '${entry.key}'`,\n hint: `retry after recovering the RHI view allocation failure for '${entry.key}'`,\n detail: {\n resourceKey: entry.key,\n rhiCode: viewResult.error.code,\n },\n }),\n );\n }\n\n const pooled: PooledTexture = {\n texture: texResult.value,\n view: viewResult.value,\n descriptorKey,\n };\n stagedAllocations.push(pooled);\n\n if (lifetime === 'transient') {\n stagedTransient.set(key, pooled);\n } else {\n stagedPersistent.set(entry.key, pooled);\n }\n\n result.set(entry.key, viewResult.value);\n // biome-ignore lint/suspicious/noExplicitAny: store Texture alongside TextureView\n result.set(`${entry.key}::tex`, texResult.value as any);\n }\n\n return ok({\n resolvedTextures: result,\n transient: stagedTransient,\n persistent: stagedPersistent,\n });\n }\n\n private resolveWidth(size: ColorTargetDescriptor['size']): number {\n if (typeof size === 'string') {\n return size === 'half-swapchain' ? Math.ceil(this.swapChainWidth / 2) : this.swapChainWidth;\n }\n return size.w;\n }\n\n private resolveHeight(size: ColorTargetDescriptor['size']): number {\n if (typeof size === 'string') {\n return size === 'half-swapchain' ? Math.ceil(this.swapChainHeight / 2) : this.swapChainHeight;\n }\n return size.h;\n }\n\n private validateNoDanglingRead(\n passList: readonly PassEntry<Ctx>[],\n ): Result<never, RenderGraphError> | null {\n const writers = new Set<string>();\n for (const pass of passList) {\n for (const key of pass.descriptor.reads) {\n const imported = this.resources.get(key)?.descriptor.lifetime === 'persistent';\n if (key !== 'swapchain' && !imported && !writers.has(key)) {\n return err(\n new RenderGraphError({\n code: 'dangling-read',\n expected: `pass '${pass.name}' reads key '${key}' but no pass writes it`,\n hint: `add a pass that writes '${key}', or remove '${key}' from pass '${pass.name}' reads`,\n detail: {\n resourceKey: key,\n passName: pass.name,\n } satisfies DanglingReadDetail,\n }),\n );\n }\n }\n for (const key of pass.descriptor.writes) writers.add(key);\n }\n return null;\n }\n}\n"]}
|