@sixb/core 0.1.6 → 0.1.8
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/dist/actions/delegated-admission.d.ts +24 -0
- package/dist/actions/delegated-admission.d.ts.map +1 -0
- package/dist/actions/descriptor.d.ts +29 -0
- package/dist/actions/descriptor.d.ts.map +1 -0
- package/dist/actions/execution.d.ts +5 -5
- package/dist/actions/execution.d.ts.map +1 -1
- package/dist/actions/index.js +50 -40
- package/dist/actions/index.js.map +1 -1
- package/dist/actions/request.d.ts.map +1 -1
- package/dist/actions/run-authorization.d.ts +20 -0
- package/dist/actions/run-authorization.d.ts.map +1 -0
- package/dist/actions/run-dispatch.d.ts +3 -1
- package/dist/actions/run-dispatch.d.ts.map +1 -1
- package/dist/actions/worker.js +5 -5
- package/dist/actions/worker.js.map +1 -1
- package/dist/agents/adapters.d.ts +6 -166
- package/dist/agents/adapters.d.ts.map +1 -1
- package/dist/agents/authority.d.ts +22 -6
- package/dist/agents/authority.d.ts.map +1 -1
- package/dist/agents/builders.d.ts +3 -11
- package/dist/agents/builders.d.ts.map +1 -1
- package/dist/agents/context-resolution.d.ts.map +1 -1
- package/dist/agents/context.js +2 -2
- package/dist/agents/dispatch.d.ts +9 -1
- package/dist/agents/dispatch.d.ts.map +1 -1
- package/dist/agents/errors.d.ts +1 -10
- package/dist/agents/errors.d.ts.map +1 -1
- package/dist/agents/execution.d.ts +9 -10
- package/dist/agents/execution.d.ts.map +1 -1
- package/dist/agents/identity.d.ts +3 -0
- package/dist/agents/identity.d.ts.map +1 -0
- package/dist/agents/ids.d.ts +4 -0
- package/dist/agents/ids.d.ts.map +1 -1
- package/dist/agents/index.d.ts +15 -11
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +90 -78
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/message.d.ts +19 -13
- package/dist/agents/message.d.ts.map +1 -1
- package/dist/agents/model-loop.d.ts +58 -0
- package/dist/agents/model-loop.d.ts.map +1 -0
- package/dist/agents/reference.d.ts +4 -0
- package/dist/agents/reference.d.ts.map +1 -0
- package/dist/agents/request.d.ts +10 -8
- package/dist/agents/request.d.ts.map +1 -1
- package/dist/agents/retired-config.d.ts +4 -0
- package/dist/agents/retired-config.d.ts.map +1 -0
- package/dist/agents/streams.d.ts +13 -8
- package/dist/agents/streams.d.ts.map +1 -1
- package/dist/agents/streams.js +7 -5
- package/dist/agents/streams.js.map +1 -1
- package/dist/agents/tool-catalog.d.ts +9 -0
- package/dist/agents/tool-catalog.d.ts.map +1 -0
- package/dist/agents/tool-definition.d.ts +1 -1
- package/dist/agents/tool-definition.d.ts.map +1 -1
- package/dist/agents/types.d.ts +31 -68
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/validation.d.ts +3 -13
- package/dist/agents/validation.d.ts.map +1 -1
- package/dist/ai-usage/execution.d.ts +53 -0
- package/dist/ai-usage/execution.d.ts.map +1 -0
- package/dist/ai-usage/index.d.ts +3 -0
- package/dist/ai-usage/index.d.ts.map +1 -0
- package/dist/auth/index.js +12 -9
- package/dist/auth/index.js.map +1 -1
- package/dist/authorization/decision.d.ts +14 -3
- package/dist/authorization/decision.d.ts.map +1 -1
- package/dist/authorization/grant-kinds.d.ts +25 -8
- package/dist/authorization/grant-kinds.d.ts.map +1 -1
- package/dist/authorization/index.d.ts +1 -1
- package/dist/authorization/index.d.ts.map +1 -1
- package/dist/authorization/index.js +12 -7
- package/dist/authorization/index.js.map +1 -1
- package/dist/authorization/resolve.d.ts +3 -3
- package/dist/authorization/resolve.d.ts.map +1 -1
- package/dist/authorization/types.d.ts +7 -5
- package/dist/authorization/types.d.ts.map +1 -1
- package/dist/blob-storage/browser.js +2 -2
- package/dist/blob-storage/index.js +3 -3
- package/dist/bootstrap/discovery.d.ts +6 -6
- package/dist/bootstrap/discovery.d.ts.map +1 -1
- package/dist/bootstrap/index.js +62 -51
- package/dist/bootstrap/index.js.map +1 -1
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
- package/dist/broker/index.js +2 -2
- package/dist/{chunk-zqysyfjt.js → chunk-08m3b6w8.js} +1 -1
- package/dist/chunk-19jp6g9d.js +131 -0
- package/dist/chunk-19jp6g9d.js.map +11 -0
- package/dist/{chunk-3j7573mj.js → chunk-2dw777qw.js} +50 -5
- package/dist/{chunk-3j7573mj.js.map → chunk-2dw777qw.js.map} +4 -3
- package/dist/{chunk-0172wgm9.js → chunk-2xns679x.js} +10 -2
- package/dist/{chunk-0172wgm9.js.map → chunk-2xns679x.js.map} +3 -3
- package/dist/chunk-359jm1jw.js +147 -0
- package/dist/chunk-359jm1jw.js.map +10 -0
- package/dist/{chunk-dy311asx.js → chunk-3xep5cjx.js} +58 -23
- package/dist/chunk-3xep5cjx.js.map +15 -0
- package/dist/{chunk-n4spznws.js → chunk-3z1qec12.js} +83 -12
- package/dist/chunk-3z1qec12.js.map +12 -0
- package/dist/{chunk-z3zp0bj1.js → chunk-407j3msh.js} +1 -1
- package/dist/{chunk-rhrbz7d4.js → chunk-4a849fr1.js} +1 -1
- package/dist/{chunk-cy0n5dms.js → chunk-4jjp5k14.js} +1 -1
- package/dist/chunk-4qfkag59.js +1568 -0
- package/dist/chunk-4qfkag59.js.map +20 -0
- package/dist/{chunk-1e8m6yn3.js → chunk-4sm0aznx.js} +685 -86
- package/dist/chunk-4sm0aznx.js.map +43 -0
- package/dist/chunk-4yqmp43v.js +159 -0
- package/dist/chunk-4yqmp43v.js.map +11 -0
- package/dist/{chunk-rdeagz6b.js → chunk-5e3pq99w.js} +3 -7
- package/dist/{chunk-rdeagz6b.js.map → chunk-5e3pq99w.js.map} +3 -3
- package/dist/{chunk-ezake7g1.js → chunk-5ntny1qx.js} +1 -1
- package/dist/{chunk-dm72y8wt.js → chunk-7y0f6rf1.js} +29 -16
- package/dist/chunk-7y0f6rf1.js.map +10 -0
- package/dist/{chunk-72q2y8hn.js → chunk-8tsf6dmc.js} +2 -2
- package/dist/{chunk-qewtks41.js → chunk-9nbmsvn5.js} +123 -20
- package/dist/chunk-9nbmsvn5.js.map +11 -0
- package/dist/{chunk-5sxb1168.js → chunk-aa2pen2v.js} +256 -82
- package/dist/chunk-aa2pen2v.js.map +34 -0
- package/dist/{chunk-819wnjz8.js → chunk-ajnan18g.js} +13 -10
- package/dist/chunk-ajnan18g.js.map +12 -0
- package/dist/chunk-c15dr03f.js +43 -0
- package/dist/chunk-c15dr03f.js.map +10 -0
- package/dist/{chunk-t0jjkep3.js → chunk-d8qkxt2v.js} +4 -2
- package/dist/chunk-d8qkxt2v.js.map +10 -0
- package/dist/{chunk-vybf6pkp.js → chunk-dbc80ad7.js} +1 -1
- package/dist/{chunk-nkbfrt0c.js → chunk-f26bck4t.js} +7 -7
- package/dist/{chunk-x2yw73hy.js → chunk-fvt9rjsa.js} +23 -7
- package/dist/chunk-fvt9rjsa.js.map +10 -0
- package/dist/{chunk-znagycq7.js → chunk-gbejpkex.js} +5 -5
- package/dist/{chunk-znagycq7.js.map → chunk-gbejpkex.js.map} +1 -1
- package/dist/{chunk-e42bc6m3.js → chunk-gzasd5b6.js} +5 -5
- package/dist/{chunk-e42bc6m3.js.map → chunk-gzasd5b6.js.map} +3 -3
- package/dist/{chunk-rnshztfq.js → chunk-h0k55pc7.js} +6 -6
- package/dist/{chunk-rnshztfq.js.map → chunk-h0k55pc7.js.map} +1 -1
- package/dist/chunk-h5vqbfmd.js +1537 -0
- package/dist/chunk-h5vqbfmd.js.map +19 -0
- package/dist/chunk-j1sbhm7p.js +45 -0
- package/dist/chunk-j1sbhm7p.js.map +10 -0
- package/dist/chunk-jecn6t54.js +307 -0
- package/dist/chunk-jecn6t54.js.map +12 -0
- package/dist/{chunk-dsrkgtnh.js → chunk-jq43kdvk.js} +1 -1
- package/dist/{chunk-wtmzkcht.js → chunk-k34z5rvh.js} +1 -1
- package/dist/{chunk-f6erf2vv.js → chunk-k522z7v6.js} +10 -5
- package/dist/chunk-k522z7v6.js.map +10 -0
- package/dist/{chunk-htq0qh7z.js → chunk-ka3a2ft3.js} +2 -2
- package/dist/{chunk-ckxfnx7f.js → chunk-mth82m8t.js} +129 -95
- package/dist/chunk-mth82m8t.js.map +14 -0
- package/dist/{chunk-5gynx4xn.js → chunk-mwsxn98e.js} +79 -77
- package/dist/{chunk-5gynx4xn.js.map → chunk-mwsxn98e.js.map} +8 -8
- package/dist/{chunk-f2rt4vkh.js → chunk-n2w475r0.js} +3 -3
- package/dist/chunk-n4khvw9n.js +111 -0
- package/dist/chunk-n4khvw9n.js.map +11 -0
- package/dist/{chunk-t8t39h7v.js → chunk-n6jxh8sw.js} +10 -2
- package/dist/chunk-n6jxh8sw.js.map +10 -0
- package/dist/chunk-nn0tekr1.js +284 -0
- package/dist/chunk-nn0tekr1.js.map +12 -0
- package/dist/chunk-nx7k8tpr.js +436 -0
- package/dist/chunk-nx7k8tpr.js.map +12 -0
- package/dist/{chunk-drjqm1aa.js → chunk-p03r0h5s.js} +310 -28
- package/dist/chunk-p03r0h5s.js.map +16 -0
- package/dist/{chunk-1g8negke.js → chunk-p1rzczbt.js} +93 -8
- package/dist/chunk-p1rzczbt.js.map +12 -0
- package/dist/{chunk-f83ka50g.js → chunk-p1x242ad.js} +652 -77
- package/dist/chunk-p1x242ad.js.map +25 -0
- package/dist/chunk-p2vqaxkc.js +528 -0
- package/dist/chunk-p2vqaxkc.js.map +15 -0
- package/dist/{chunk-a31h57d5.js → chunk-pc7ys28c.js} +70 -7
- package/dist/chunk-pc7ys28c.js.map +14 -0
- package/dist/{chunk-md8k0r54.js → chunk-q0k9nc5a.js} +281 -89
- package/dist/chunk-q0k9nc5a.js.map +14 -0
- package/dist/{chunk-bhxaq2nn.js → chunk-qw9gvjv5.js} +1 -1
- package/dist/chunk-r8jrnexe.js +403 -0
- package/dist/chunk-r8jrnexe.js.map +10 -0
- package/dist/{chunk-h9kxd41f.js → chunk-rafagrwr.js} +48 -7
- package/dist/chunk-rafagrwr.js.map +11 -0
- package/dist/{chunk-dysw7nsm.js → chunk-rv2hkwwa.js} +2 -2
- package/dist/{chunk-ghteq96b.js → chunk-s5y30bc9.js} +2 -2
- package/dist/{chunk-t624af60.js → chunk-sbzzr4kx.js} +1848 -757
- package/dist/chunk-sbzzr4kx.js.map +63 -0
- package/dist/{chunk-6gjqgd3d.js → chunk-tpnd31c1.js} +2 -1
- package/dist/chunk-tpnd31c1.js.map +11 -0
- package/dist/chunk-trxxmgnf.js +68 -0
- package/dist/chunk-trxxmgnf.js.map +11 -0
- package/dist/{chunk-0hc5j867.js → chunk-v1xppd0y.js} +17 -13
- package/dist/{chunk-0hc5j867.js.map → chunk-v1xppd0y.js.map} +2 -2
- package/dist/chunk-v4en4jc2.js +252 -0
- package/dist/chunk-v4en4jc2.js.map +10 -0
- package/dist/{chunk-xkthy56g.js → chunk-w1tvjszy.js} +1 -1
- package/dist/{chunk-8b55ygje.js → chunk-w3e09qqk.js} +1 -1
- package/dist/{chunk-8gv5z0zm.js → chunk-w9tg6yyb.js} +13 -8
- package/dist/{chunk-8gv5z0zm.js.map → chunk-w9tg6yyb.js.map} +3 -3
- package/dist/{chunk-62c7t4jc.js → chunk-wdage1eb.js} +1 -1
- package/dist/{chunk-tg5mee00.js → chunk-wtf06et8.js} +11 -7
- package/dist/{chunk-tg5mee00.js.map → chunk-wtf06et8.js.map} +3 -3
- package/dist/{chunk-nva1xkjz.js → chunk-xajtptbw.js} +1237 -1434
- package/dist/chunk-xajtptbw.js.map +40 -0
- package/dist/{chunk-xc7hq65b.js → chunk-yp8ee62z.js} +49 -2
- package/dist/chunk-yp8ee62z.js.map +11 -0
- package/dist/chunk-z4ccwbkz.js +139 -0
- package/dist/chunk-z4ccwbkz.js.map +10 -0
- package/dist/datasets/builders.d.ts +11 -2
- package/dist/datasets/builders.d.ts.map +1 -1
- package/dist/datasets/changes.d.ts +14 -4
- package/dist/datasets/changes.d.ts.map +1 -1
- package/dist/datasets/execution.d.ts +15 -1
- package/dist/datasets/execution.d.ts.map +1 -1
- package/dist/datasets/index.d.ts +1 -0
- package/dist/datasets/index.d.ts.map +1 -1
- package/dist/datasets/sequence.d.ts +7 -0
- package/dist/datasets/sequence.d.ts.map +1 -0
- package/dist/datasets/types.d.ts +1 -0
- package/dist/datasets/types.d.ts.map +1 -1
- package/dist/datasets/validation.d.ts.map +1 -1
- package/dist/datasets/write.d.ts +37 -0
- package/dist/datasets/write.d.ts.map +1 -0
- package/dist/datasets/write.js +17 -0
- package/dist/datasets/write.js.map +9 -0
- package/dist/error-reporting/internal.js +4 -4
- package/dist/error-reporting/types.d.ts +7 -2
- package/dist/error-reporting/types.d.ts.map +1 -1
- package/dist/errors/catalog.d.ts +8 -0
- package/dist/errors/catalog.d.ts.map +1 -1
- package/dist/errors/internal.js +2 -2
- package/dist/events/execution.d.ts.map +1 -1
- package/dist/events/index.js +4 -4
- package/dist/events/types/datasets.d.ts +2 -6
- package/dist/events/types/datasets.d.ts.map +1 -1
- package/dist/execution/agent.d.ts +18 -9
- package/dist/execution/agent.d.ts.map +1 -1
- package/dist/execution/agent.js +62 -46
- package/dist/execution/agent.js.map +1 -1
- package/dist/execution/authorization.d.ts +68 -20
- package/dist/execution/authorization.d.ts.map +1 -1
- package/dist/execution/authorized-object-reader.d.ts +69 -0
- package/dist/execution/authorized-object-reader.d.ts.map +1 -0
- package/dist/execution/durable.d.ts.map +1 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/primitive.js +55 -46
- package/dist/execution/primitive.js.map +2 -2
- package/dist/execution/request.d.ts +14 -1
- package/dist/execution/request.d.ts.map +1 -1
- package/dist/execution/request.js +92 -54
- package/dist/execution/request.js.map +3 -3
- package/dist/execution/scopes.d.ts +16 -0
- package/dist/execution/scopes.d.ts.map +1 -1
- package/dist/execution/types.d.ts +10 -1
- package/dist/execution/types.d.ts.map +1 -1
- package/dist/http/api-routes.d.ts +2 -0
- package/dist/http/api-routes.d.ts.map +1 -1
- package/dist/http/index.js +1 -1
- package/dist/index.d.ts +15 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +128 -109
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +2 -0
- package/dist/json.d.ts.map +1 -1
- package/dist/lake-storage/definition-updates.d.ts.map +1 -1
- package/dist/lake-storage/errors.d.ts +5 -1
- package/dist/lake-storage/errors.d.ts.map +1 -1
- package/dist/lake-storage/in-memory.d.ts +1 -0
- package/dist/lake-storage/in-memory.d.ts.map +1 -1
- package/dist/lake-storage/index.d.ts +6 -1
- package/dist/lake-storage/index.d.ts.map +1 -1
- package/dist/lake-storage/index.js +27 -10
- package/dist/lake-storage/index.js.map +1 -1
- package/dist/lake-storage/merge-validation.d.ts.map +1 -1
- package/dist/lake-storage/merge.d.ts +13 -2
- package/dist/lake-storage/merge.d.ts.map +1 -1
- package/dist/lake-storage/source-ordering.d.ts +19 -0
- package/dist/lake-storage/source-ordering.d.ts.map +1 -0
- package/dist/lake-storage/sql-transforms.d.ts +2 -1
- package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
- package/dist/lake-storage/types.d.ts +10 -5
- package/dist/lake-storage/types.d.ts.map +1 -1
- package/dist/lake-storage/version-inputs.d.ts +4 -0
- package/dist/lake-storage/version-inputs.d.ts.map +1 -0
- package/dist/logging/index.js +3 -3
- package/dist/logging/types.js +2 -2
- package/dist/materialization/index.js +2 -2
- package/dist/materializer/index.js +38 -31
- package/dist/materializer/index.js.map +1 -1
- package/dist/models/catalog.d.ts +40 -0
- package/dist/models/catalog.d.ts.map +1 -0
- package/dist/models/definitions.d.ts +25 -0
- package/dist/models/definitions.d.ts.map +1 -0
- package/dist/models/errors.d.ts +52 -0
- package/dist/models/errors.d.ts.map +1 -0
- package/dist/models/events.d.ts +192 -0
- package/dist/models/events.d.ts.map +1 -0
- package/dist/models/index.d.ts +17 -39
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +50 -0
- package/dist/models/index.js.map +9 -0
- package/dist/models/language-model.d.ts +90 -0
- package/dist/models/language-model.d.ts.map +1 -0
- package/dist/models/messages.d.ts +74 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/pricing.d.ts +69 -0
- package/dist/models/pricing.d.ts.map +1 -0
- package/dist/models/rate-card.d.ts +24 -0
- package/dist/models/rate-card.d.ts.map +1 -0
- package/dist/models/tools.d.ts +24 -0
- package/dist/models/tools.d.ts.map +1 -0
- package/dist/objects/authorized-ontology-view.d.ts +25 -0
- package/dist/objects/authorized-ontology-view.d.ts.map +1 -0
- package/dist/objects/execution.d.ts +1 -1
- package/dist/objects/execution.d.ts.map +1 -1
- package/dist/objects/index.js +43 -36
- package/dist/objects/index.js.map +1 -1
- package/dist/objects/link/authorization.d.ts +2 -7
- package/dist/objects/link/authorization.d.ts.map +1 -1
- package/dist/objects/query/executor.d.ts +4 -2
- package/dist/objects/query/executor.d.ts.map +1 -1
- package/dist/objects/query/index.js +36 -29
- package/dist/objects/query/index.js.map +1 -1
- package/dist/objects/query/links.d.ts +22 -1
- package/dist/objects/query/links.d.ts.map +1 -1
- package/dist/objects/query/selected-read-admission.d.ts +27 -0
- package/dist/objects/query/selected-read-admission.d.ts.map +1 -0
- package/dist/objects/query/validate.d.ts +60 -2
- package/dist/objects/query/validate.d.ts.map +1 -1
- package/dist/objects/sdk/object-handle.d.ts.map +1 -1
- package/dist/objects/sdk/object-set.d.ts.map +1 -1
- package/dist/objects/sdk/runtime-query-executor.d.ts +2 -7
- package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
- package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
- package/dist/objects/service/list-service.d.ts +2 -3
- package/dist/objects/service/list-service.d.ts.map +1 -1
- package/dist/objects/telemetry/history.d.ts +8 -6
- package/dist/objects/telemetry/history.d.ts.map +1 -1
- package/dist/objects/telemetry/index.d.ts +2 -2
- package/dist/objects/telemetry/index.d.ts.map +1 -1
- package/dist/objects/telemetry/workload.d.ts +11 -0
- package/dist/objects/telemetry/workload.d.ts.map +1 -0
- package/dist/ontology/index.d.ts +2 -1
- package/dist/ontology/index.d.ts.map +1 -1
- package/dist/ontology/index.js +15 -14
- package/dist/ontology/index.js.map +1 -1
- package/dist/ontology/inference/index.d.ts +2 -1
- package/dist/ontology/inference/index.d.ts.map +1 -1
- package/dist/ontology/internal.d.ts +0 -1
- package/dist/ontology/internal.d.ts.map +1 -1
- package/dist/ontology/internal.js +5 -10
- package/dist/ontology/internal.js.map +3 -3
- package/dist/ontology/json-schema.d.ts +10 -6
- package/dist/ontology/json-schema.d.ts.map +1 -1
- package/dist/ontology/link-path-selection.d.ts +35 -0
- package/dist/ontology/link-path-selection.d.ts.map +1 -0
- package/dist/ontology/refs.d.ts +2 -0
- package/dist/ontology/refs.d.ts.map +1 -1
- package/dist/ontology/tokens.d.ts +2 -1
- package/dist/ontology/tokens.d.ts.map +1 -1
- package/dist/pipelines/execution.d.ts.map +1 -1
- package/dist/pipelines/index.js +41 -36
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/request.d.ts.map +1 -1
- package/dist/projections/execution.d.ts.map +1 -1
- package/dist/projections/internal.js +39 -32
- package/dist/projections/internal.js.map +1 -1
- package/dist/projections/run-dispatch.d.ts.map +1 -1
- package/dist/queues/in-memory.d.ts +3 -2
- package/dist/queues/in-memory.d.ts.map +1 -1
- package/dist/queues/index.d.ts +3 -1
- package/dist/queues/index.d.ts.map +1 -1
- package/dist/queues/index.js +1 -1
- package/dist/queues/types.d.ts +15 -3
- package/dist/queues/types.d.ts.map +1 -1
- package/dist/rules/execution.d.ts.map +1 -1
- package/dist/runtime/create.d.ts +7 -4
- package/dist/runtime/create.d.ts.map +1 -1
- package/dist/runtime/definitions.d.ts +4 -2
- package/dist/runtime/definitions.d.ts.map +1 -1
- package/dist/runtime/host.d.ts +5 -2
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/internal.d.ts +1 -0
- package/dist/runtime/internal.d.ts.map +1 -1
- package/dist/runtime/resolve-definitions.d.ts +4 -2
- package/dist/runtime/resolve-definitions.d.ts.map +1 -1
- package/dist/runtime/sixb.d.ts +8 -2
- package/dist/runtime/sixb.d.ts.map +1 -1
- package/dist/runtime/types.d.ts +3 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/schedules/execution.d.ts +2 -1
- package/dist/schedules/execution.d.ts.map +1 -1
- package/dist/security/every.d.ts +4 -4
- package/dist/security/every.d.ts.map +1 -1
- package/dist/security/grants.d.ts +12 -6
- package/dist/security/grants.d.ts.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/registry.d.ts +2 -1
- package/dist/security/registry.d.ts.map +1 -1
- package/dist/security/types.d.ts +19 -5
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/validation.d.ts +6 -2
- package/dist/security/validation.d.ts.map +1 -1
- package/dist/shares/access-plan.d.ts +22 -0
- package/dist/shares/access-plan.d.ts.map +1 -0
- package/dist/shares/builders.d.ts +14 -0
- package/dist/shares/builders.d.ts.map +1 -0
- package/dist/shares/compiler.d.ts +14 -0
- package/dist/shares/compiler.d.ts.map +1 -0
- package/dist/shares/errors.d.ts +4 -0
- package/dist/shares/errors.d.ts.map +1 -0
- package/dist/shares/execution.d.ts +57 -0
- package/dist/shares/execution.d.ts.map +1 -0
- package/dist/shares/index.d.ts +10 -0
- package/dist/shares/index.d.ts.map +1 -0
- package/dist/shares/internal.d.ts +3 -0
- package/dist/shares/internal.d.ts.map +1 -0
- package/dist/shares/internal.js +239 -0
- package/dist/shares/internal.js.map +10 -0
- package/dist/shares/intersection.d.ts +9 -0
- package/dist/shares/intersection.d.ts.map +1 -0
- package/dist/shares/session-protocol.d.ts +41 -0
- package/dist/shares/session-protocol.d.ts.map +1 -0
- package/dist/shares/types.d.ts +51 -0
- package/dist/shares/types.d.ts.map +1 -0
- package/dist/shares/validation.d.ts +11 -0
- package/dist/shares/validation.d.ts.map +1 -0
- package/dist/storage/action-runs/failure.js +3 -3
- package/dist/storage/action-runs/provider.js +2 -2
- package/dist/storage/agents/errors.d.ts +1 -1
- package/dist/storage/agents/errors.d.ts.map +1 -1
- package/dist/storage/agents/in-memory.d.ts +3 -2
- package/dist/storage/agents/in-memory.d.ts.map +1 -1
- package/dist/storage/agents/index.d.ts +1 -1
- package/dist/storage/agents/index.d.ts.map +1 -1
- package/dist/storage/agents/provider.d.ts +11 -4
- package/dist/storage/agents/provider.d.ts.map +1 -1
- package/dist/storage/agents/provider.js +18 -15
- package/dist/storage/agents/provider.js.map +1 -1
- package/dist/storage/agents/types.d.ts +65 -17
- package/dist/storage/agents/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/analytics.d.ts +2 -1
- package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
- package/dist/storage/ai-cost/codec.d.ts +3 -2
- package/dist/storage/ai-cost/codec.d.ts.map +1 -1
- package/dist/storage/ai-cost/groups.d.ts +51 -0
- package/dist/storage/ai-cost/groups.d.ts.map +1 -0
- package/dist/storage/ai-cost/in-memory.d.ts +11 -1
- package/dist/storage/ai-cost/in-memory.d.ts.map +1 -1
- package/dist/storage/ai-cost/index.d.ts +1 -1
- package/dist/storage/ai-cost/index.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.d.ts +2 -0
- package/dist/storage/ai-cost/provider.d.ts.map +1 -1
- package/dist/storage/ai-cost/provider.js +29 -13
- package/dist/storage/ai-cost/provider.js.map +3 -3
- package/dist/storage/ai-cost/types.d.ts +64 -15
- package/dist/storage/ai-cost/types.d.ts.map +1 -1
- package/dist/storage/ai-cost/validation.d.ts +2 -1
- package/dist/storage/ai-cost/validation.d.ts.map +1 -1
- package/dist/storage/ai-limits/enforcement.d.ts +14 -0
- package/dist/storage/ai-limits/enforcement.d.ts.map +1 -0
- package/dist/storage/ai-limits/enforcement.js +21 -0
- package/dist/storage/ai-limits/enforcement.js.map +9 -0
- package/dist/storage/ai-limits/errors.d.ts +8 -0
- package/dist/storage/ai-limits/errors.d.ts.map +1 -0
- package/dist/storage/ai-limits/in-memory.d.ts +78 -0
- package/dist/storage/ai-limits/in-memory.d.ts.map +1 -0
- package/dist/storage/ai-limits/index.d.ts +7 -0
- package/dist/storage/ai-limits/index.d.ts.map +1 -0
- package/dist/storage/ai-limits/period.d.ts +4 -0
- package/dist/storage/ai-limits/period.d.ts.map +1 -0
- package/dist/storage/ai-limits/provider.d.ts +85 -0
- package/dist/storage/ai-limits/provider.d.ts.map +1 -0
- package/dist/storage/ai-limits/provider.js +62 -0
- package/dist/storage/ai-limits/provider.js.map +9 -0
- package/dist/storage/ai-limits/types.d.ts +175 -0
- package/dist/storage/ai-limits/types.d.ts.map +1 -0
- package/dist/storage/ai-usage/in-memory.d.ts +4 -0
- package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
- package/dist/storage/ai-usage/record.d.ts.map +1 -1
- package/dist/storage/ai-usage/types.d.ts +6 -2
- package/dist/storage/ai-usage/types.d.ts.map +1 -1
- package/dist/storage/auth/errors.d.ts +1 -1
- package/dist/storage/auth/errors.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/auth-storage.d.ts +4 -1
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
- package/dist/storage/auth/in-memory/device-authorizations.d.ts +29 -0
- package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/shared.d.ts +3 -1
- package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
- package/dist/storage/auth/index.d.ts +2 -1
- package/dist/storage/auth/index.d.ts.map +1 -1
- package/dist/storage/auth/types.d.ts +66 -0
- package/dist/storage/auth/types.d.ts.map +1 -1
- package/dist/storage/connector-connections/provider.js +2 -2
- package/dist/storage/executions/in-memory.d.ts +3 -0
- package/dist/storage/executions/in-memory.d.ts.map +1 -1
- package/dist/storage/executions/provider.d.ts +4 -1
- package/dist/storage/executions/provider.d.ts.map +1 -1
- package/dist/storage/executions/provider.js +23 -3
- package/dist/storage/executions/provider.js.map +3 -3
- package/dist/storage/executions/run-link.d.ts +14 -2
- package/dist/storage/executions/run-link.d.ts.map +1 -1
- package/dist/storage/executions/validation.d.ts +6 -0
- package/dist/storage/executions/validation.d.ts.map +1 -1
- package/dist/storage/in-memory/index.d.ts +12 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/index.d.ts +15 -6
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +78 -36
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/objects/execution-limits.d.ts +25 -0
- package/dist/storage/objects/execution-limits.d.ts.map +1 -0
- package/dist/storage/objects/guard.d.ts +16 -0
- package/dist/storage/objects/guard.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/index.d.ts +3 -0
- package/dist/storage/objects/in-memory/index.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/keys.d.ts +10 -0
- package/dist/storage/objects/in-memory/keys.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/query.d.ts +31 -0
- package/dist/storage/objects/in-memory/query.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/read-scope.d.ts +18 -0
- package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/read-source.d.ts +10 -0
- package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts +9 -0
- package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -0
- package/dist/storage/objects/{in-memory.d.ts → in-memory/storage.d.ts} +13 -10
- package/dist/storage/objects/in-memory/storage.d.ts.map +1 -0
- package/dist/storage/objects/index.d.ts +4 -1
- package/dist/storage/objects/index.d.ts.map +1 -1
- package/dist/storage/objects/keys.d.ts +1 -1
- package/dist/storage/objects/keys.d.ts.map +1 -1
- package/dist/storage/objects/read-scope.d.ts +25 -0
- package/dist/storage/objects/read-scope.d.ts.map +1 -0
- package/dist/storage/objects/types.d.ts +114 -22
- package/dist/storage/objects/types.d.ts.map +1 -1
- package/dist/storage/ontology/provider.js +3 -3
- package/dist/storage/operation-scope.d.ts +3 -0
- package/dist/storage/operation-scope.d.ts.map +1 -1
- package/dist/storage/operation-scope.js +4 -2
- package/dist/storage/operation-scope.js.map +1 -1
- package/dist/storage/pipeline-runs/provider.js +2 -2
- package/dist/storage/projection-runs/provider.js +4 -4
- package/dist/storage/share-grants/errors.d.ts +8 -0
- package/dist/storage/share-grants/errors.d.ts.map +1 -0
- package/dist/storage/share-grants/in-memory.d.ts +11 -0
- package/dist/storage/share-grants/in-memory.d.ts.map +1 -0
- package/dist/storage/share-grants/index.d.ts +5 -0
- package/dist/storage/share-grants/index.d.ts.map +1 -0
- package/dist/storage/share-grants/provider.d.ts +4 -0
- package/dist/storage/share-grants/provider.d.ts.map +1 -0
- package/dist/storage/share-grants/provider.js +24 -0
- package/dist/storage/share-grants/provider.js.map +9 -0
- package/dist/storage/share-grants/record.d.ts +11 -0
- package/dist/storage/share-grants/record.d.ts.map +1 -0
- package/dist/storage/share-grants/types.d.ts +97 -0
- package/dist/storage/share-grants/types.d.ts.map +1 -0
- package/dist/storage/share-sessions/errors.d.ts +8 -0
- package/dist/storage/share-sessions/errors.d.ts.map +1 -0
- package/dist/storage/share-sessions/in-memory.d.ts +14 -0
- package/dist/storage/share-sessions/in-memory.d.ts.map +1 -0
- package/dist/storage/share-sessions/index.d.ts +5 -0
- package/dist/storage/share-sessions/index.d.ts.map +1 -0
- package/dist/storage/share-sessions/provider.d.ts +3 -0
- package/dist/storage/share-sessions/provider.d.ts.map +1 -0
- package/dist/storage/share-sessions/provider.js +20 -0
- package/dist/storage/share-sessions/provider.js.map +9 -0
- package/dist/storage/share-sessions/record.d.ts +8 -0
- package/dist/storage/share-sessions/record.d.ts.map +1 -0
- package/dist/storage/share-sessions/types.d.ts +50 -0
- package/dist/storage/share-sessions/types.d.ts.map +1 -0
- package/dist/storage/sync-runs/provider.js +2 -2
- package/dist/storage/transaction.d.ts +2 -1
- package/dist/storage/transaction.d.ts.map +1 -1
- package/dist/storage/types.d.ts +13 -1
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/webhook-runs/provider.js +2 -2
- package/dist/storage/workflow-runs/provider.d.ts +1 -1
- package/dist/storage/workflow-runs/provider.js +14 -12
- package/dist/storage/workflow-runs/provider.js.map +1 -1
- package/dist/storage/workflow-runs/types.d.ts +5 -4
- package/dist/storage/workflow-runs/types.d.ts.map +1 -1
- package/dist/syncs/execution.d.ts.map +1 -1
- package/dist/syncs/index.js +41 -36
- package/dist/syncs/index.js.map +1 -1
- package/dist/syncs/request.d.ts.map +1 -1
- package/dist/testing/agent-execution.d.ts +3 -1
- package/dist/testing/agent-execution.d.ts.map +1 -1
- package/dist/testing/agent-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
- package/dist/testing/ai-limit-storage-contract.d.ts +18 -0
- package/dist/testing/ai-limit-storage-contract.d.ts.map +1 -0
- package/dist/testing/ai-model-call-groups-contract.d.ts +6 -0
- package/dist/testing/ai-model-call-groups-contract.d.ts.map +1 -0
- package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
- package/dist/testing/auth-storage-contract.d.ts.map +1 -1
- package/dist/testing/dataset-sequence-contract.d.ts +4 -0
- package/dist/testing/dataset-sequence-contract.d.ts.map +1 -0
- package/dist/testing/effective-storage-contract.d.ts.map +1 -1
- package/dist/testing/execution-storage-contract.d.ts +4 -0
- package/dist/testing/execution-storage-contract.d.ts.map +1 -1
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +5392 -2070
- package/dist/testing/index.js.map +21 -15
- package/dist/testing/lake-merge-storage-contract.d.ts +1 -0
- package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
- package/dist/testing/lake-storage-contract.d.ts.map +1 -1
- package/dist/testing/object-read-scope-contract.d.ts +22 -0
- package/dist/testing/object-read-scope-contract.d.ts.map +1 -0
- package/dist/testing/queues-contract.d.ts.map +1 -1
- package/dist/testing/share-grant-storage-contract.d.ts +10 -0
- package/dist/testing/share-grant-storage-contract.d.ts.map +1 -0
- package/dist/testing/share-session-storage-contract.d.ts +9 -0
- package/dist/testing/share-session-storage-contract.d.ts.map +1 -0
- package/dist/webhooks/internal.js +36 -29
- package/dist/webhooks/internal.js.map +2 -2
- package/dist/workers/index.js +2 -2
- package/dist/workflows/agent-step-identity.d.ts +3 -0
- package/dist/workflows/agent-step-identity.d.ts.map +1 -0
- package/dist/workflows/builders.d.ts +2 -3
- package/dist/workflows/builders.d.ts.map +1 -1
- package/dist/workflows/execution.d.ts +1 -1
- package/dist/workflows/execution.d.ts.map +1 -1
- package/dist/workflows/failure.d.ts +1 -1
- package/dist/workflows/failure.d.ts.map +1 -1
- package/dist/workflows/index.d.ts +3 -2
- package/dist/workflows/index.d.ts.map +1 -1
- package/dist/workflows/index.js +63 -48
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/request.d.ts.map +1 -1
- package/dist/workflows/types.d.ts +26 -11
- package/dist/workflows/types.d.ts.map +1 -1
- package/dist/workflows/validation.d.ts +7 -1
- package/dist/workflows/validation.d.ts.map +1 -1
- package/package.json +43 -4
- package/src/actions/delegated-admission.ts +72 -0
- package/src/actions/descriptor.ts +58 -0
- package/src/actions/execution.ts +99 -24
- package/src/actions/request.ts +136 -19
- package/src/actions/run-authorization.ts +53 -0
- package/src/actions/run-dispatch.ts +8 -1
- package/src/agents/adapters.ts +60 -456
- package/src/agents/authority.ts +215 -34
- package/src/agents/builders.ts +3 -50
- package/src/agents/context-compaction.ts +4 -0
- package/src/agents/context-resolution.ts +1 -4
- package/src/agents/dispatch.ts +59 -2
- package/src/agents/errors.ts +4 -11
- package/src/agents/execution.ts +65 -56
- package/src/agents/identity.ts +4 -0
- package/src/agents/ids.ts +16 -1
- package/src/agents/index.ts +23 -30
- package/src/agents/message.ts +20 -12
- package/src/agents/model-loop.ts +1071 -0
- package/src/agents/reference.ts +7 -0
- package/src/agents/request.ts +157 -77
- package/src/agents/retired-config.ts +20 -0
- package/src/agents/streams.ts +45 -19
- package/src/agents/tool-catalog.ts +21 -0
- package/src/agents/tool-definition.ts +9 -5
- package/src/agents/types.ts +39 -81
- package/src/agents/validation.ts +11 -216
- package/src/ai-usage/execution.ts +189 -0
- package/src/ai-usage/index.ts +15 -0
- package/src/authorization/decision.ts +54 -22
- package/src/authorization/grant-kinds.ts +72 -15
- package/src/authorization/index.ts +2 -0
- package/src/authorization/resolve.ts +12 -5
- package/src/authorization/types.ts +7 -5
- package/src/bootstrap/discovery.ts +3 -3
- package/src/bootstrap/ontology-type-manifest.ts +12 -6
- package/src/datasets/builders.ts +23 -2
- package/src/datasets/changes.ts +16 -4
- package/src/datasets/execution.ts +76 -5
- package/src/datasets/index.ts +1 -0
- package/src/datasets/sequence.ts +77 -0
- package/src/datasets/types.ts +1 -0
- package/src/datasets/validation.ts +26 -0
- package/src/datasets/write.ts +240 -0
- package/src/error-reporting/types.ts +4 -2
- package/src/errors/catalog.ts +8 -0
- package/src/events/execution.ts +57 -7
- package/src/events/types/datasets.ts +2 -6
- package/src/execution/agent.ts +129 -25
- package/src/execution/authorization.ts +493 -83
- package/src/execution/authorized-object-reader.ts +695 -0
- package/src/execution/durable.ts +10 -2
- package/src/execution/index.ts +1 -0
- package/src/execution/request.ts +67 -14
- package/src/execution/scopes.ts +36 -6
- package/src/execution/types.ts +9 -1
- package/src/http/api-routes.ts +108 -0
- package/src/index.ts +72 -22
- package/src/json.ts +9 -0
- package/src/lake-storage/definition-updates.ts +9 -0
- package/src/lake-storage/errors.ts +6 -1
- package/src/lake-storage/in-memory.ts +53 -17
- package/src/lake-storage/index.ts +10 -1
- package/src/lake-storage/merge-validation.ts +12 -2
- package/src/lake-storage/merge.ts +40 -2
- package/src/lake-storage/source-ordering.ts +95 -0
- package/src/lake-storage/sql-transforms.ts +2 -1
- package/src/lake-storage/types.ts +10 -5
- package/src/lake-storage/version-inputs.ts +14 -0
- package/src/models/catalog.ts +137 -0
- package/src/models/definitions.ts +202 -0
- package/src/models/errors.ts +83 -0
- package/src/models/events.ts +198 -0
- package/src/models/index.ts +89 -71
- package/src/models/language-model.ts +143 -0
- package/src/models/messages.ts +78 -0
- package/src/models/pricing.ts +390 -0
- package/src/models/rate-card.ts +101 -0
- package/src/models/tools.ts +29 -0
- package/src/objects/authorized-ontology-view.ts +512 -0
- package/src/objects/execution.ts +98 -143
- package/src/objects/link/authorization.ts +3 -2
- package/src/objects/query/executor.ts +45 -34
- package/src/objects/query/links.ts +84 -25
- package/src/objects/query/selected-read-admission.ts +310 -0
- package/src/objects/query/validate.ts +353 -36
- package/src/objects/sdk/object-handle.ts +2 -8
- package/src/objects/sdk/object-set.ts +10 -11
- package/src/objects/sdk/runtime-query-executor.ts +8 -28
- package/src/objects/sdk/telemetry-channel.ts +11 -7
- package/src/objects/service/list-service.ts +15 -29
- package/src/objects/telemetry/history.ts +297 -17
- package/src/objects/telemetry/index.ts +2 -2
- package/src/objects/telemetry/workload.ts +79 -0
- package/src/ontology/index.ts +7 -1
- package/src/ontology/inference/index.ts +4 -1
- package/src/ontology/internal.ts +0 -1
- package/src/ontology/json-schema.ts +13 -12
- package/src/ontology/link-path-selection.ts +193 -0
- package/src/ontology/refs.ts +19 -0
- package/src/ontology/tokens.ts +15 -8
- package/src/pipelines/execution.ts +30 -7
- package/src/pipelines/request.ts +5 -0
- package/src/projections/execution.ts +72 -11
- package/src/projections/run-dispatch.ts +6 -12
- package/src/queues/in-memory.ts +5 -0
- package/src/queues/index.ts +11 -0
- package/src/queues/types.ts +20 -3
- package/src/rules/execution.ts +20 -8
- package/src/runtime/create.ts +11 -5
- package/src/runtime/definitions.ts +4 -2
- package/src/runtime/host.ts +28 -8
- package/src/runtime/internal.ts +1 -0
- package/src/runtime/resolve-definitions.ts +22 -36
- package/src/runtime/sixb.ts +29 -10
- package/src/runtime/types.ts +3 -0
- package/src/schedules/execution.ts +24 -2
- package/src/security/every.ts +4 -4
- package/src/security/grants.ts +100 -14
- package/src/security/index.ts +3 -0
- package/src/security/registry.ts +9 -5
- package/src/security/types.ts +23 -4
- package/src/security/validation.ts +33 -9
- package/src/shares/access-plan.ts +225 -0
- package/src/shares/builders.ts +381 -0
- package/src/shares/compiler.ts +359 -0
- package/src/shares/errors.ts +3 -0
- package/src/shares/execution.ts +394 -0
- package/src/shares/index.ts +28 -0
- package/src/shares/internal.ts +9 -0
- package/src/shares/intersection.ts +178 -0
- package/src/shares/session-protocol.ts +258 -0
- package/src/shares/types.ts +76 -0
- package/src/shares/validation.ts +40 -0
- package/src/storage/agents/errors.ts +1 -0
- package/src/storage/agents/in-memory.ts +121 -11
- package/src/storage/agents/index.ts +7 -0
- package/src/storage/agents/provider.ts +150 -6
- package/src/storage/agents/types.ts +73 -16
- package/src/storage/ai-cost/analytics.ts +63 -6
- package/src/storage/ai-cost/codec.ts +37 -12
- package/src/storage/ai-cost/groups.ts +248 -0
- package/src/storage/ai-cost/in-memory.ts +42 -0
- package/src/storage/ai-cost/index.ts +6 -0
- package/src/storage/ai-cost/provider.ts +7 -0
- package/src/storage/ai-cost/types.ts +76 -14
- package/src/storage/ai-cost/validation.ts +147 -17
- package/src/storage/ai-limits/enforcement.ts +68 -0
- package/src/storage/ai-limits/errors.ts +23 -0
- package/src/storage/ai-limits/in-memory.ts +671 -0
- package/src/storage/ai-limits/index.ts +31 -0
- package/src/storage/ai-limits/period.ts +11 -0
- package/src/storage/ai-limits/provider.ts +430 -0
- package/src/storage/ai-limits/types.ts +195 -0
- package/src/storage/ai-usage/in-memory.ts +13 -0
- package/src/storage/ai-usage/record.ts +17 -0
- package/src/storage/ai-usage/types.ts +6 -2
- package/src/storage/auth/errors.ts +6 -0
- package/src/storage/auth/in-memory/auth-storage.ts +69 -0
- package/src/storage/auth/in-memory/device-authorizations.ts +145 -0
- package/src/storage/auth/in-memory/shared.ts +7 -0
- package/src/storage/auth/index.ts +7 -0
- package/src/storage/auth/types.ts +73 -0
- package/src/storage/executions/in-memory.ts +9 -1
- package/src/storage/executions/provider.ts +30 -1
- package/src/storage/executions/run-link.ts +45 -6
- package/src/storage/executions/validation.ts +82 -7
- package/src/storage/in-memory/index.ts +69 -6
- package/src/storage/index.ts +102 -1
- package/src/storage/objects/execution-limits.ts +283 -0
- package/src/storage/objects/guard.ts +55 -0
- package/src/storage/objects/in-memory/index.ts +2 -0
- package/src/storage/objects/in-memory/keys.ts +46 -0
- package/src/storage/objects/in-memory/query.ts +754 -0
- package/src/storage/objects/in-memory/read-scope.ts +211 -0
- package/src/storage/objects/in-memory/read-source.ts +10 -0
- package/src/storage/objects/in-memory/selected-reader.ts +252 -0
- package/src/storage/objects/in-memory/storage.ts +589 -0
- package/src/storage/objects/index.ts +21 -0
- package/src/storage/objects/keys.ts +1 -1
- package/src/storage/objects/read-scope.ts +672 -0
- package/src/storage/objects/types.ts +123 -19
- package/src/storage/operation-scope.ts +16 -0
- package/src/storage/share-grants/errors.ts +14 -0
- package/src/storage/share-grants/in-memory.ts +107 -0
- package/src/storage/share-grants/index.ts +14 -0
- package/src/storage/share-grants/provider.ts +11 -0
- package/src/storage/share-grants/record.ts +347 -0
- package/src/storage/share-grants/types.ts +112 -0
- package/src/storage/share-sessions/errors.ts +14 -0
- package/src/storage/share-sessions/in-memory.ts +105 -0
- package/src/storage/share-sessions/index.ts +11 -0
- package/src/storage/share-sessions/provider.ts +9 -0
- package/src/storage/share-sessions/record.ts +176 -0
- package/src/storage/share-sessions/types.ts +57 -0
- package/src/storage/transaction.ts +14 -2
- package/src/storage/types.ts +64 -0
- package/src/storage/workflow-runs/in-memory.ts +3 -3
- package/src/storage/workflow-runs/provider.ts +2 -2
- package/src/storage/workflow-runs/types.ts +6 -3
- package/src/syncs/execution.ts +25 -5
- package/src/syncs/request.ts +5 -0
- package/src/testing/agent-execution.ts +40 -28
- package/src/testing/agent-storage-contract.ts +249 -28
- package/src/testing/ai-cost-storage-contract.ts +96 -8
- package/src/testing/ai-limit-storage-contract.ts +1134 -0
- package/src/testing/ai-model-call-groups-contract.ts +353 -0
- package/src/testing/ai-usage-storage-contract.ts +31 -0
- package/src/testing/auth-storage-contract.ts +85 -0
- package/src/testing/dataset-sequence-contract.ts +373 -0
- package/src/testing/effective-storage-contract.ts +34 -0
- package/src/testing/execution-storage-contract.ts +81 -2
- package/src/testing/index.ts +26 -0
- package/src/testing/lake-merge-storage-contract.ts +3 -0
- package/src/testing/lake-storage-contract.ts +58 -0
- package/src/testing/object-read-scope-contract.ts +939 -0
- package/src/testing/queues-contract.ts +36 -1
- package/src/testing/share-grant-storage-contract.ts +325 -0
- package/src/testing/share-session-storage-contract.ts +235 -0
- package/src/workflows/agent-step-identity.ts +4 -0
- package/src/workflows/builders.ts +95 -9
- package/src/workflows/execution.ts +55 -16
- package/src/workflows/failure.ts +2 -2
- package/src/workflows/index.ts +3 -0
- package/src/workflows/request.ts +5 -0
- package/src/workflows/types.ts +23 -11
- package/src/workflows/validation.ts +100 -7
- package/dist/chunk-1e8m6yn3.js.map +0 -37
- package/dist/chunk-1g8negke.js.map +0 -11
- package/dist/chunk-4gz41why.js +0 -72
- package/dist/chunk-4gz41why.js.map +0 -11
- package/dist/chunk-5sxb1168.js.map +0 -34
- package/dist/chunk-6gjqgd3d.js.map +0 -11
- package/dist/chunk-819wnjz8.js.map +0 -12
- package/dist/chunk-a31h57d5.js.map +0 -13
- package/dist/chunk-a44d5zgd.js +0 -556
- package/dist/chunk-a44d5zgd.js.map +0 -16
- package/dist/chunk-ckxfnx7f.js.map +0 -13
- package/dist/chunk-dm72y8wt.js.map +0 -10
- package/dist/chunk-drjqm1aa.js.map +0 -15
- package/dist/chunk-dy311asx.js.map +0 -14
- package/dist/chunk-f6erf2vv.js.map +0 -10
- package/dist/chunk-f83ka50g.js.map +0 -23
- package/dist/chunk-fe5ev6mr.js +0 -55
- package/dist/chunk-fe5ev6mr.js.map +0 -11
- package/dist/chunk-h9kxd41f.js.map +0 -11
- package/dist/chunk-hceck7dq.js +0 -137
- package/dist/chunk-hceck7dq.js.map +0 -10
- package/dist/chunk-md8k0r54.js.map +0 -14
- package/dist/chunk-n4spznws.js.map +0 -11
- package/dist/chunk-nva1xkjz.js.map +0 -46
- package/dist/chunk-qewtks41.js.map +0 -11
- package/dist/chunk-t0jjkep3.js.map +0 -10
- package/dist/chunk-t624af60.js.map +0 -56
- package/dist/chunk-t8t39h7v.js.map +0 -10
- package/dist/chunk-t9xghkva.js +0 -28
- package/dist/chunk-t9xghkva.js.map +0 -10
- package/dist/chunk-x2yw73hy.js.map +0 -10
- package/dist/chunk-xc7hq65b.js.map +0 -10
- package/dist/storage/objects/in-memory.d.ts.map +0 -1
- package/src/storage/objects/in-memory.ts +0 -1241
- /package/dist/{chunk-zqysyfjt.js.map → chunk-08m3b6w8.js.map} +0 -0
- /package/dist/{chunk-z3zp0bj1.js.map → chunk-407j3msh.js.map} +0 -0
- /package/dist/{chunk-rhrbz7d4.js.map → chunk-4a849fr1.js.map} +0 -0
- /package/dist/{chunk-cy0n5dms.js.map → chunk-4jjp5k14.js.map} +0 -0
- /package/dist/{chunk-ezake7g1.js.map → chunk-5ntny1qx.js.map} +0 -0
- /package/dist/{chunk-72q2y8hn.js.map → chunk-8tsf6dmc.js.map} +0 -0
- /package/dist/{chunk-vybf6pkp.js.map → chunk-dbc80ad7.js.map} +0 -0
- /package/dist/{chunk-nkbfrt0c.js.map → chunk-f26bck4t.js.map} +0 -0
- /package/dist/{chunk-dsrkgtnh.js.map → chunk-jq43kdvk.js.map} +0 -0
- /package/dist/{chunk-wtmzkcht.js.map → chunk-k34z5rvh.js.map} +0 -0
- /package/dist/{chunk-htq0qh7z.js.map → chunk-ka3a2ft3.js.map} +0 -0
- /package/dist/{chunk-f2rt4vkh.js.map → chunk-n2w475r0.js.map} +0 -0
- /package/dist/{chunk-bhxaq2nn.js.map → chunk-qw9gvjv5.js.map} +0 -0
- /package/dist/{chunk-dysw7nsm.js.map → chunk-rv2hkwwa.js.map} +0 -0
- /package/dist/{chunk-ghteq96b.js.map → chunk-s5y30bc9.js.map} +0 -0
- /package/dist/{chunk-xkthy56g.js.map → chunk-w1tvjszy.js.map} +0 -0
- /package/dist/{chunk-8b55ygje.js.map → chunk-w3e09qqk.js.map} +0 -0
- /package/dist/{chunk-62c7t4jc.js.map → chunk-wdage1eb.js.map} +0 -0
|
@@ -1,38 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/testing/action-execution.ts", "../src/testing/agent-execution.ts", "../src/testing/agent-storage-contract.ts", "../src/testing/ai-cost-storage-contract.ts", "../src/testing/ai-usage-storage-contract.ts", "../src/testing/auth-storage-contract.ts", "../src/testing/blob-storage-contract.ts", "../src/testing/broker-contract.ts", "../src/testing/connector-connection-storage-contract.ts", "../src/testing/effective-storage-contract.ts", "../src/testing/materializer-fixture.ts", "../src/testing/execution.ts", "../src/testing/execution-storage-contract.ts", "../src/testing/lake-merge-storage-contract.ts", "../src/testing/lake-storage-contract.ts", "../src/testing/materialization-failure-contract.ts", "../src/testing/ontology-contract-fixture.ts", "../src/testing/materializer-storage-contract.ts", "../src/testing/projection-execution.ts", "../src/testing/object-query-contract.ts", "../src/testing/ontology-storage-contract.ts", "../src/testing/pipeline-execution.ts", "../src/testing/projection-run-storage-contract.ts", "../src/testing/queues-contract.ts", "../src/testing/sandboxes-contract.ts", "../src/testing/
|
|
3
|
+
"sources": ["../src/testing/action-execution.ts", "../src/testing/agent-execution.ts", "../src/testing/agent-storage-contract.ts", "../src/testing/ai-cost-storage-contract.ts", "../src/testing/ai-limit-storage-contract.ts", "../src/testing/ai-model-call-groups-contract.ts", "../src/testing/workflow-execution.ts", "../src/testing/ai-usage-storage-contract.ts", "../src/testing/auth-storage-contract.ts", "../src/testing/blob-storage-contract.ts", "../src/testing/broker-contract.ts", "../src/testing/connector-connection-storage-contract.ts", "../src/testing/effective-storage-contract.ts", "../src/testing/materializer-fixture.ts", "../src/testing/execution.ts", "../src/testing/execution-storage-contract.ts", "../src/testing/lake-merge-storage-contract.ts", "../src/testing/dataset-sequence-contract.ts", "../src/testing/lake-storage-contract.ts", "../src/testing/materialization-failure-contract.ts", "../src/testing/ontology-contract-fixture.ts", "../src/testing/materializer-storage-contract.ts", "../src/testing/projection-execution.ts", "../src/testing/object-query-contract.ts", "../src/testing/object-read-scope-contract.ts", "../src/testing/ontology-storage-contract.ts", "../src/testing/pipeline-execution.ts", "../src/testing/projection-run-storage-contract.ts", "../src/testing/queues-contract.ts", "../src/testing/sandboxes-contract.ts", "../src/testing/share-grant-storage-contract.ts", "../src/testing/share-session-storage-contract.ts", "../src/testing/sync-execution.ts", "../src/testing/webhook-execution.ts", "../src/testing/webhook-run-storage-contract.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import type { TrustedPrimitiveRef } from \"../execution\"\nimport type { ActionRunRecord, QueueActionRunInput, Storage } from \"../storage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution chain required by an Action-run storage fixture. */\nexport async function createTestActionExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly actionId: string\n readonly runId: string\n readonly executionId?: string\n }\n): Promise<string> {\n const parentExecutionId = `test_request_execution:${input.runId}`\n const executionId = input.executionId ?? `test_action_execution:${input.runId}`\n const primitive: TrustedPrimitiveRef = {\n kind: \"action\",\n id: input.actionId,\n runId: input.runId,\n }\n\n const existing = await executions.getById({ projectId: input.projectId, id: executionId })\n if (existing) return executionId\n\n const parent = await executions.getById({ projectId: input.projectId, id: parentExecutionId })\n if (!parent) {\n await executions.create({\n id: parentExecutionId,\n projectId: input.projectId,\n executor: { type: \"request\", requestId: `test_request:${input.runId}` },\n source: { type: \"http\", requestId: `test_request:${input.runId}` },\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"disabled\" },\n })\n }\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"execution\", executionId: parentExecutionId },\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n\n return executionId\n}\n\n/** Queue an Action run with the valid durable execution fixture required by every provider. */\nexport async function queueTestActionRun(\n storage: Pick<Storage, \"actionRuns\" | \"executions\">,\n input: Omit<QueueActionRunInput, \"executionId\">\n): Promise<ActionRunRecord> {\n if (!storage.actionRuns) throw new Error(\"Action run storage is not configured for this test.\")\n const executionId = await createTestActionExecution(storage.executions, {\n projectId: input.projectId,\n actionId: input.actionId,\n runId: input.id,\n })\n return storage.actionRuns.queue({ ...input, executionId })\n}\n",
|
|
6
|
-
"import { agentServiceAccountId } from \"../agents/authority\"\nimport type { AuthStorage } from \"../storage/auth\"\nimport { AuthStorageError } from \"../storage/auth\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution chain required by an Agent-run storage fixture. */\nexport async function createTestAgentExecution(\n storage: { readonly auth?: AuthStorage; readonly executions: ExecutionStorage },\n input: {\n readonly projectId: string\n readonly
|
|
7
|
-
"import { describe, expect, test } from \"bun:test\"\nimport { AGENT_MESSAGE_CONTENT_VERSION } from \"../agents/message\"\nimport type { Principal } from \"../auth\"\nimport type { SixbFailure } from \"../errors/types\"\nimport {\n type AgentRunExecution,\n type AgentRunFailureCode,\n type AgentStorage,\n AgentStorageError,\n type AgentStorageErrorCode,\n type CreateAgentContextCheckpointInput,\n type CreateAgentRunInput,\n type CreateAgentThreadInput,\n type StartAgentRunInput,\n} from \"../storage/agents\"\nimport type { AuthStorage } from \"../storage/auth\"\nimport type { ExecutionStorage } from \"../storage/executions\"\nimport type { Storage } from \"../storage/types\"\nimport { createTestAgentExecution } from \"./agent-execution\"\n\nexport interface AgentStorageContractStorage extends Pick<Storage, \"transaction\"> {\n readonly agents: AgentStorage\n readonly auth: AuthStorage\n readonly executions: ExecutionStorage\n}\n\nexport interface AgentStorageContractSuiteOptions<\n TStorage extends AgentStorageContractStorage = AgentStorageContractStorage,\n> {\n /** Factory that produces a fresh storage bundle for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"project-a\"\nconst otherProjectId = \"project-b\"\nconst owner: Principal = { type: \"user\", id: \"usr_1\" }\nconst serviceAccount: Extract<Principal, { readonly type: \"serviceAccount\" }> = {\n type: \"serviceAccount\",\n id: \"svc_agent_sales\",\n}\n\nfunction failure(\n message: string,\n at: string,\n code: AgentRunFailureCode = \"internal.unexpected\"\n): SixbFailure<AgentRunFailureCode> {\n return { code, message, retryable: false, at }\n}\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nasync function expectAgentError(\n promise: Promise<unknown>,\n code: AgentStorageErrorCode\n): Promise<void> {\n await expect(promise).rejects.toBeInstanceOf(AgentStorageError)\n await expect(promise).rejects.toMatchObject({ code })\n}\n\nfunction threadInput(overrides: Partial<CreateAgentThreadInput> = {}): CreateAgentThreadInput {\n return {\n id: \"thr_1\",\n projectId,\n agentId: \"sales\",\n ownerPrincipal: owner,\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n ...overrides,\n }\n}\n\nfunction execution(\n token: string,\n queueLeaseExpiresAt = at(\"2026-06-23T10:05:00.000Z\")\n): AgentRunExecution {\n return { token, queueLeaseExpiresAt }\n}\n\ntype TestRunInput = CreateAgentRunInput &\n Omit<StartAgentRunInput, \"id\" | \"projectId\"> & {\n readonly id: string\n readonly projectId: string\n }\n\nfunction runInput(overrides: Partial<TestRunInput> = {}): TestRunInput {\n const input = {\n id: \"run_1\",\n projectId,\n threadId: \"thr_1\",\n agentId: \"sales\",\n triggerMessageId: \"msg_user_1\",\n executionId: \"test_agent_execution:run_1\",\n requesterGroupIds: [\"support\", \"engineering\", \"support\"],\n execution: execution(\"exec_1\"),\n createdAt: at(\"2026-06-23T10:00:10.000Z\"),\n ...overrides,\n }\n return {\n ...input,\n executionId: overrides.executionId ?? `test_agent_execution:${input.id}`,\n }\n}\n\nfunction checkpointInput(\n overrides: Partial<CreateAgentContextCheckpointInput> = {}\n): CreateAgentContextCheckpointInput {\n return {\n id: \"checkpoint_1\",\n projectId,\n threadId: \"thr_1\",\n createdByRunId: \"run_2\",\n expectedPreviousCheckpointId: null,\n expectedHeadSeq: 3,\n executionToken: \"exec_2\",\n reason: \"threshold\",\n summary: \"The user asked for one and the agent answered two.\",\n summaryFormatVersion: 1,\n summarizedThroughSeq: 2,\n observedHeadSeq: 3,\n estimatedInputTokensBefore: 1_000,\n estimatedInputTokensAfter: 300,\n summaryModelId: \"test-model\",\n createdAt: at(\"2026-06-23T10:03:00.000Z\"),\n ...overrides,\n }\n}\n\nasync function createAndStartRun(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage,\n input: TestRunInput\n): Promise<Awaited<ReturnType<AgentStorage[\"runs\"][\"start\"]>>> {\n await createRun(storage, fixture, input)\n return storage.runs.start({\n id: input.id,\n projectId: input.projectId,\n modelId: input.modelId,\n execution: input.execution,\n startedAt: input.startedAt,\n })\n}\n\nasync function createRun(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage,\n input: CreateAgentRunInput\n) {\n await createTestAgentExecution(fixture, {\n projectId: input.projectId,\n agentId: input.agentId,\n runId: input.id,\n executionId: input.executionId,\n })\n return storage.runs.create(input)\n}\n\nasync function prepareCheckpointCandidate(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage\n): Promise<void> {\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"one\" }],\n })\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n await storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"two\" }],\n })\n await storage.runs.finish({\n id: \"run_1\",\n projectId,\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n await storage.messages.append({\n id: \"m3\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"three\" }],\n })\n await createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_2\", triggerMessageId: \"m3\", execution: execution(\"exec_2\") })\n )\n}\n\n/**\n * Runs the shared `AgentStorage` contract against any storage implementation.\n *\n * This is the storage-independent specification for Sixb agent persistence: thread lifecycle and\n * project isolation, single-flight run reservation, execution reclaim, run finalization with\n * execution metadata, message append with thread-stats bookkeeping, and fenced context checkpoints.\n */\nexport function runAgentStorageContractSuite<TStorage extends AgentStorageContractStorage>(\n label: string,\n options: AgentStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (\n body: (storage: AgentStorage, fixture: TStorage) => Promise<void>\n ): Promise<void> => {\n const fixture = await options.createStorage()\n try {\n await body(fixture.agents, fixture)\n } finally {\n await options.teardown?.(fixture)\n }\n }\n\n describe(label, () => {\n // ── threads ───────────────────────────────────────────────────────────────────────────────\n\n test(\"creates threads, isolates projects, and rejects duplicate ids\", async () => {\n await withStorage(async (storage) => {\n const thread = await storage.threads.create(threadInput({ title: \"Q3 pipeline\" }))\n expect(thread).toMatchObject({\n id: \"thr_1\",\n agentId: \"sales\",\n title: \"Q3 pipeline\",\n status: \"active\",\n activeRunId: null,\n messageCount: 0,\n })\n expect(thread.ownerPrincipal).toEqual(owner)\n\n await expectAgentError(storage.threads.create(threadInput()), \"duplicate_id\")\n\n // Same id under a different project is allowed and isolated.\n await expect(\n storage.threads.create(threadInput({ projectId: otherProjectId }))\n ).resolves.toMatchObject({ projectId: otherProjectId })\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n title: \"Q3 pipeline\",\n })\n await expect(\n storage.threads.getById({ projectId: \"nope\", id: \"thr_1\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"lists threads with filters, ordering, and pagination\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(\n threadInput({ id: \"thr_a\", agentId: \"sales\", createdAt: at(\"2026-06-23T10:00:00.000Z\") })\n )\n await storage.threads.create(\n threadInput({\n id: \"thr_b\",\n agentId: \"support\",\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n )\n await storage.threads.create(\n threadInput({\n id: \"thr_c\",\n agentId: \"sales\",\n status: \"archived\",\n createdAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n )\n await storage.threads.create(threadInput({ id: \"thr_other\", projectId: otherProjectId }))\n\n const all = await storage.threads.list({ projectId, order: \"asc\" })\n expect(all.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\", \"thr_c\"])\n expect(all.total).toBe(3)\n expect(all.hasMore).toBe(false)\n\n const sales = await storage.threads.list({ projectId, agentId: \"sales\", order: \"asc\" })\n expect(sales.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_c\"])\n\n const visibleAgents = await storage.threads.list({\n projectId,\n agentIds: [\"support\"],\n order: \"asc\",\n })\n expect(visibleAgents.threads.map((thread) => thread.id)).toEqual([\"thr_b\"])\n\n const salesVisibleAgents = await storage.threads.list({\n projectId,\n agentId: \"sales\",\n agentIds: [\"support\"],\n order: \"asc\",\n })\n expect(salesVisibleAgents.threads).toEqual([])\n expect(salesVisibleAgents.total).toBe(0)\n\n const active = await storage.threads.list({ projectId, statuses: [\"active\"], order: \"asc\" })\n expect(active.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\"])\n\n const firstPage = await storage.threads.list({ projectId, order: \"asc\", limit: 2 })\n expect(firstPage.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\"])\n expect(firstPage.hasMore).toBe(true)\n expect(firstPage.total).toBe(3)\n\n const secondPage = await storage.threads.list({\n projectId,\n order: \"asc\",\n limit: 2,\n offset: 2,\n })\n expect(secondPage.threads.map((thread) => thread.id)).toEqual([\"thr_c\"])\n expect(secondPage.hasMore).toBe(false)\n })\n })\n\n // ── durable queued runs ────────────────────────────────────────────────────────────────────\n\n test(\"creates a queued run before execution and claims the thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const queued = await createRun(storage, fixture, runInput({ id: \"run_1\" }))\n expect(queued).toMatchObject({ status: \"queued\", attempt: 0, threadId: \"thr_1\" })\n expect(queued.execution).toBeUndefined()\n expect(queued.startedAt).toBeUndefined()\n await expect(storage.runs.list({ projectId, statuses: [\"queued\"] })).resolves.toMatchObject(\n {\n runs: [{ id: \"run_1\", status: \"queued\" }],\n total: 1,\n }\n )\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: \"run_1\",\n })\n\n const started = await storage.runs.start({\n projectId,\n id: \"run_1\",\n modelId: \"test-model\",\n execution: execution(\"exec_1\"),\n startedAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(started).toMatchObject({ status: \"running\", attempt: 1, modelId: \"test-model\" })\n expect(started.execution).toEqual(execution(\"exec_1\"))\n expect(started.executionId).toBe(\"test_agent_execution:run_1\")\n expect(started.startedAt?.toISOString()).toBe(\"2026-06-23T10:01:00.000Z\")\n })\n })\n\n test(\"rejects a run whose durable execution does not match its Agent authority\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n const executionId = await createTestAgentExecution(fixture, {\n projectId,\n agentId: \"support\",\n runId: \"run_1\",\n })\n\n await expectAgentError(\n storage.runs.create(runInput({ id: \"run_1\", executionId })),\n \"invalid_input\"\n )\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n })\n })\n\n test(\"finishes a queued run and releases the thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const cancelled = await storage.runs.finishQueued({\n projectId,\n id: \"run_1\",\n status: \"cancelled\",\n error: failure(\n \"Cancelled before execution\",\n \"2026-06-23T10:01:00.000Z\",\n \"runtime.cancelled\"\n ),\n completedAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(cancelled).toMatchObject({\n status: \"cancelled\",\n attempt: 0,\n error: failure(\n \"Cancelled before execution\",\n \"2026-06-23T10:01:00.000Z\",\n \"runtime.cancelled\"\n ),\n })\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n await expectAgentError(\n storage.runs.start({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_1\"),\n }),\n \"invalid_state\"\n )\n\n await createRun(storage, fixture, runInput({ id: \"run_2\" }))\n await expect(\n storage.runs.finishQueued({\n projectId,\n id: \"run_2\",\n status: \"failed\",\n error: failure(\"Agent is unavailable\", \"2026-06-23T10:02:00.000Z\"),\n completedAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n status: \"failed\",\n attempt: 0,\n error: failure(\"Agent is unavailable\", \"2026-06-23T10:02:00.000Z\"),\n })\n })\n })\n\n // ── single-flight execution ─────────────────────────────────────────────────────────────────\n\n test(\"allows a single active run per thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const run = await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n expect(run).toMatchObject({ status: \"running\", attempt: 1, threadId: \"thr_1\" })\n expect(run.executionId).toBe(\"test_agent_execution:run_1\")\n expect(run.requesterGroupIds).toEqual([\"engineering\", \"support\"])\n expect(run.execution?.token).toBe(\"exec_1\")\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: \"run_1\",\n })\n\n await expectAgentError(\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_2\", execution: execution(\"exec_2\") })\n ),\n \"active_run_exists\"\n )\n\n // Reservation against an unknown thread / duplicate run id.\n await expectAgentError(\n createAndStartRun(storage, fixture, runInput({ id: \"run_x\", threadId: \"ghost\" })),\n \"thread_not_found\"\n )\n })\n })\n\n test(\"never lets two concurrent queued runs both claim one thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const results = await Promise.allSettled([\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_a\", execution: execution(\"exec_a\") })\n ),\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_b\", execution: execution(\"exec_b\") })\n ),\n ])\n const fulfilled = results.filter((result) => result.status === \"fulfilled\")\n const rejected = results.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\"\n )\n expect(fulfilled).toHaveLength(1)\n expect(rejected).toHaveLength(1)\n expect(rejected[0].reason).toBeInstanceOf(AgentStorageError)\n expect(rejected[0].reason.code).toBe(\"active_run_exists\")\n })\n })\n\n // ── execution reclaim ───────────────────────────────────────────────────────────────────────\n\n test(\"reclaim rotates the execution token and bumps the attempt\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const reclaimed = await storage.runs.reclaim({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_2\"),\n })\n expect(reclaimed).toMatchObject({ status: \"running\", attempt: 2 })\n expect(reclaimed.execution?.token).toBe(\"exec_2\")\n\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n }),\n \"execution_lost\"\n )\n })\n })\n\n test(\"projects confirmed queue ownership monotonically and fences stale executions\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_1\",\n execution: execution(\"exec_1\", at(\"2026-06-23T10:02:00.000Z\")),\n })\n )\n\n const confirmed = await storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:03:00.000Z\"),\n })\n expect(confirmed.execution?.queueLeaseExpiresAt.toISOString()).toBe(\n \"2026-06-23T10:03:00.000Z\"\n )\n\n const older = await storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:02:30.000Z\"),\n })\n expect(older.execution?.queueLeaseExpiresAt.toISOString()).toBe(\"2026-06-23T10:03:00.000Z\")\n\n await storage.runs.reclaim({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_2\", at(\"2026-06-23T10:04:00.000Z\")),\n })\n await expectAgentError(\n storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:05:00.000Z\"),\n }),\n \"execution_lost\"\n )\n })\n })\n\n test(\"does not alias stored run records to callers\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n const run = await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const mutableExecution = run.execution as\n | { token: string; queueLeaseExpiresAt: Date }\n | undefined\n if (mutableExecution) {\n mutableExecution.token = \"mutated\"\n mutableExecution.queueLeaseExpiresAt.setTime(0)\n }\n ;(run.requesterGroupIds as string[]).push(\"mutated\")\n const reread = await storage.runs.getById({ projectId, id: \"run_1\" })\n expect(reread?.execution?.token).toBe(\"exec_1\")\n expect(reread?.requesterGroupIds).toEqual([\"engineering\", \"support\"])\n })\n })\n\n // ── finalization ────────────────────────────────────────────────────────────────────────────\n\n test(\"releasing a run only clears its own thread's active pointer\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput({ id: \"thr_1\" }))\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\", threadId: \"thr_1\" }))\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_2\",\n threadId: \"thr_2\",\n execution: execution(\"exec_2\"),\n })\n )\n\n await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n // thr_2's pointer is untouched — the release is scoped to the run's own thread + matching id.\n await expect(storage.threads.getById({ projectId, id: \"thr_2\" })).resolves.toMatchObject({\n activeRunId: \"run_2\",\n })\n })\n })\n\n test(\"finishes a run, records execution metadata, and releases the thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const finished = await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n modelId: \"claude-haiku-4-5\",\n finishReason: \"stop\",\n diagnostics: [\n {\n code: \"output_file_too_large\",\n severity: \"warning\",\n scope: \"output\",\n path: \"reports/full.csv\",\n message: \"This generated file was skipped.\",\n },\n ],\n completedAt: at(\"2026-06-23T10:07:00.000Z\"),\n })\n expect(finished).toMatchObject({\n status: \"succeeded\",\n modelId: \"claude-haiku-4-5\",\n finishReason: \"stop\",\n })\n expect(finished.diagnostics).toEqual([\n {\n code: \"output_file_too_large\",\n severity: \"warning\",\n scope: \"output\",\n path: \"reports/full.csv\",\n message: \"This generated file was skipped.\",\n },\n ])\n await expect(\n storage.runs.getByIds({ projectId, ids: [\"run_1\", \"missing\", \"run_1\"] })\n ).resolves.toEqual([finished])\n expect(finished.execution).toBeUndefined()\n expect(finished.completedAt?.toISOString()).toBe(\"2026-06-23T10:07:00.000Z\")\n\n // The thread is released → a new queued run can be created and started.\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n await expect(\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_2\", execution: execution(\"exec_2\") })\n )\n ).resolves.toMatchObject({ status: \"running\" })\n })\n })\n\n test(\"records failure detail and rejects a non-running run or stale execution\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"wrong\",\n status: \"failed\",\n error: failure(\"boom\", \"2026-06-23T10:08:00.000Z\"),\n }),\n \"execution_lost\"\n )\n\n const failed = await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"failed\",\n error: failure(\"ProviderError: boom\", \"2026-06-23T10:08:00.000Z\"),\n completedAt: at(\"2026-06-23T10:08:00.000Z\"),\n })\n expect(failed.status).toBe(\"failed\")\n expect(failed.error).toEqual(failure(\"ProviderError: boom\", \"2026-06-23T10:08:00.000Z\"))\n\n // Already terminal → cannot finish again.\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n }),\n \"invalid_state\"\n )\n })\n })\n\n test(\"lists runs with thread, status, and ordering filters\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput({ id: \"thr_1\" }))\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_1\",\n threadId: \"thr_1\",\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n )\n await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_2\",\n threadId: \"thr_1\",\n execution: execution(\"exec_2\"),\n createdAt: at(\"2026-06-23T10:30:00.000Z\"),\n })\n )\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_3\",\n threadId: \"thr_2\",\n execution: execution(\"exec_3\"),\n createdAt: at(\"2026-06-23T10:45:00.000Z\"),\n })\n )\n\n const forThread1 = await storage.runs.list({ projectId, threadId: \"thr_1\", order: \"asc\" })\n expect(forThread1.runs.map((run) => run.id)).toEqual([\"run_1\", \"run_2\"])\n\n const running = await storage.runs.list({ projectId, statuses: [\"running\"], order: \"asc\" })\n expect(running.runs.map((run) => run.id)).toEqual([\"run_2\", \"run_3\"])\n\n const all = await storage.runs.list({ projectId, order: \"desc\" })\n expect(all.runs.map((run) => run.id)).toEqual([\"run_3\", \"run_2\", \"run_1\"])\n })\n })\n\n test(\"filters queued runs by their effective created timestamp\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput({ id: \"thr_before\" }))\n await storage.threads.create(threadInput({ id: \"thr_inside\" }))\n await storage.threads.create(threadInput({ id: \"thr_after\" }))\n\n await createRun(\n storage,\n fixture,\n runInput({\n id: \"run_before\",\n threadId: \"thr_before\",\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n )\n await createRun(\n storage,\n fixture,\n runInput({\n id: \"run_inside\",\n threadId: \"thr_inside\",\n createdAt: at(\"2026-06-23T11:00:00.000Z\"),\n })\n )\n await createRun(\n storage,\n fixture,\n runInput({\n id: \"run_after\",\n threadId: \"thr_after\",\n createdAt: at(\"2026-06-23T12:00:00.000Z\"),\n })\n )\n\n const result = await storage.runs.list({\n projectId,\n statuses: [\"queued\"],\n startedAfter: at(\"2026-06-23T10:30:00.000Z\"),\n startedBefore: at(\"2026-06-23T11:30:00.000Z\"),\n order: \"asc\",\n })\n expect(result.runs.map((run) => run.id)).toEqual([\"run_inside\"])\n expect(result.total).toBe(1)\n expect(result.hasMore).toBe(false)\n })\n })\n\n // ── messages ──────────────────────────────────────────────────────────────────────────────\n\n test(\"appends messages, assigns seq, and bumps thread stats\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const userMessage = await storage.messages.append({\n id: \"msg_user_1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"Hello agent\" }],\n authorPrincipal: owner,\n createdAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n expect(userMessage).toMatchObject({\n seq: 1,\n role: \"user\",\n runId: null,\n contentVersion: AGENT_MESSAGE_CONTENT_VERSION,\n })\n expect(userMessage.authorPrincipal).toEqual(owner)\n\n const run = await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n expect(run.executionId).toBe(\"test_agent_execution:run_1\")\n const assistantMessage = await storage.messages.append({\n id: \"msg_asst_1\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n authorPrincipal: serviceAccount,\n parts: [\n { type: \"reasoning\", text: \"thinking about it\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"bash\",\n input: { cmd: \"ls\" },\n state: \"output-available\",\n output: \"file.txt\",\n },\n { type: \"text\", text: \"Here is the result\" },\n ],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(assistantMessage).toMatchObject({ seq: 2, role: \"assistant\", runId: \"run_1\" })\n expect(assistantMessage.authorPrincipal).toEqual(serviceAccount)\n\n const thread = await storage.threads.getById({ projectId, id: \"thr_1\" })\n expect(thread).toMatchObject({ messageCount: 2 })\n expect(thread?.lastMessageAt?.toISOString()).toBe(\"2026-06-23T10:01:00.000Z\")\n\n // The message's `parts` are the canonical content and round-trip verbatim through storage.\n const stored = await storage.messages.getById({ projectId, id: \"msg_asst_1\" })\n expect(stored?.seq).toBe(2)\n expect(stored?.parts).toEqual([\n { type: \"reasoning\", text: \"thinking about it\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"bash\",\n input: { cmd: \"ls\" },\n state: \"output-available\",\n output: \"file.txt\",\n },\n { type: \"text\", text: \"Here is the result\" },\n ])\n })\n })\n\n test(\"deletes messages produced by a run and repairs thread stats\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"msg_user_1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"Try this\" }],\n createdAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n await storage.messages.append({\n id: \"msg_asst_1\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n parts: [\n { type: \"text\", text: \"Partial answer\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"search\",\n input: { query: \"sixb\" },\n state: \"output-available\",\n output: { matches: 1 },\n },\n ],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n\n await expect(\n storage.messages.deleteByRunId({ projectId, threadId: \"thr_1\", runId: \"run_1\" })\n ).resolves.toBe(1)\n await expect(storage.messages.getById({ projectId, id: \"msg_asst_1\" })).resolves.toBeNull()\n\n const messages = await storage.messages.list({ projectId, threadId: \"thr_1\" })\n expect(messages.messages.map((message) => message.id)).toEqual([\"msg_user_1\"])\n expect(messages.total).toBe(1)\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n messageCount: 1,\n lastMessageAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n\n await expect(\n storage.messages.deleteByRunId({ projectId, threadId: \"thr_1\", runId: \"run_1\" })\n ).resolves.toBe(0)\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n messageCount: 1,\n lastMessageAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n })\n })\n\n test(\"lists messages with role filter, ordering, and pagination\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"one\" }],\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n await storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"two\" }],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n await storage.messages.append({\n id: \"m3\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"three\" }],\n createdAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n\n const asc = await storage.messages.list({ projectId, threadId: \"thr_1\", order: \"asc\" })\n expect(asc.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\", \"m3\"])\n expect(asc.total).toBe(3)\n\n const desc = await storage.messages.list({ projectId, threadId: \"thr_1\", order: \"desc\" })\n expect(desc.messages.map((message) => message.id)).toEqual([\"m3\", \"m2\", \"m1\"])\n\n const users = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n roles: [\"user\"],\n order: \"asc\",\n })\n expect(users.messages.map((message) => message.id)).toEqual([\"m1\", \"m3\"])\n\n const retainedTail = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n afterSeq: 1,\n order: \"asc\",\n })\n expect(retainedTail.messages.map((message) => message.id)).toEqual([\"m2\", \"m3\"])\n expect(retainedTail.total).toBe(2)\n\n const firstPage = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n order: \"asc\",\n limit: 2,\n })\n expect(firstPage.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\"])\n expect(firstPage.hasMore).toBe(true)\n })\n })\n\n test(\"rejects appends to missing threads, duplicate messages, and unknown runs\", async () => {\n await withStorage(async (storage) => {\n await expectAgentError(\n storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"ghost\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"hi\" }],\n }),\n \"thread_not_found\"\n )\n\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"hi\" }],\n })\n await expectAgentError(\n storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"dup\" }],\n }),\n \"duplicate_id\"\n )\n await expectAgentError(\n storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"ghost-run\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"hi\" }],\n }),\n \"run_not_found\"\n )\n })\n })\n\n // ── context checkpoints ─────────────────────────────────────────────────────────────────\n\n test(\"creates an idempotent checkpoint without mutating the transcript\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n\n const threadBefore = await storage.threads.getById({ projectId, id: \"thr_1\" })\n const [created, replayed] = await Promise.all([\n storage.checkpoints.create(checkpointInput()),\n storage.checkpoints.create(checkpointInput()),\n ])\n\n expect(replayed).toEqual(created)\n expect(created).toMatchObject({\n id: \"checkpoint_1\",\n createdByRunId: \"run_2\",\n summarizedThroughSeq: 2,\n observedHeadSeq: 3,\n })\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toEqual(\n created\n )\n expect(\n await storage.checkpoints.getLatest({ projectId: otherProjectId, threadId: \"thr_1\" })\n ).toBeNull()\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_2\" })).toBeNull()\n await expect(\n storage.checkpoints.getByRunIds({\n projectId,\n runIds: [\"run_2\", \"missing\", \"run_2\"],\n })\n ).resolves.toEqual([created])\n await expect(\n storage.checkpoints.getByRunIds({\n projectId: otherProjectId,\n runIds: [\"run_2\"],\n })\n ).resolves.toEqual([])\n\n const retained = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n afterSeq: created.summarizedThroughSeq,\n order: \"asc\",\n })\n expect(retained.messages.map((message) => message.id)).toEqual([\"m3\"])\n\n const complete = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n order: \"asc\",\n })\n expect(complete.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\", \"m3\"])\n expect(await storage.threads.getById({ projectId, id: \"thr_1\" })).toEqual(threadBefore)\n })\n })\n\n test(\"rejects checkpoints from an inactive run or a different thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n\n await expectAgentError(\n storage.checkpoints.create(checkpointInput({ threadId: \"thr_2\" })),\n \"invalid_input\"\n )\n\n await storage.runs.finish({\n id: \"run_2\",\n projectId,\n executionToken: \"exec_2\",\n status: \"failed\",\n })\n await expectAgentError(storage.checkpoints.create(checkpointInput()), \"invalid_state\")\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toBeNull()\n })\n })\n\n test(\"rolls back a checkpoint with its containing storage transaction\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n const rollback = new Error(\"rollback checkpoint\")\n\n await expect(\n fixture.transaction(async (tx) => {\n if (!tx.agents) throw new Error(\"Expected agent storage in transaction.\")\n const created = await tx.agents.checkpoints.create(checkpointInput())\n expect(await tx.agents.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toEqual(\n created\n )\n throw rollback\n })\n ).rejects.toBe(rollback)\n\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toBeNull()\n })\n })\n\n test(\"fences checkpoint creation by execution, message head, and prior checkpoint\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n\n await expectAgentError(\n storage.checkpoints.create(checkpointInput({ executionToken: \"stale\" })),\n \"execution_lost\"\n )\n await expectAgentError(\n storage.checkpoints.create(\n checkpointInput({ expectedHeadSeq: 2, observedHeadSeq: 2, summarizedThroughSeq: 1 })\n ),\n \"invalid_state\"\n )\n await expectAgentError(\n storage.checkpoints.create(\n checkpointInput({ expectedPreviousCheckpointId: \"checkpoint_missing\" })\n ),\n \"invalid_state\"\n )\n await expectAgentError(\n storage.checkpoints.create(checkpointInput({ summarizedThroughSeq: 1 })),\n \"invalid_input\"\n )\n\n await storage.runs.reclaim({\n id: \"run_2\",\n projectId,\n execution: execution(\"exec_2_reclaimed\"),\n })\n await expectAgentError(storage.checkpoints.create(checkpointInput()), \"execution_lost\")\n\n const reclaimedInput = checkpointInput({ executionToken: \"exec_2_reclaimed\" })\n await storage.checkpoints.create(reclaimedInput)\n await expectAgentError(\n storage.checkpoints.create({ ...reclaimedInput, summary: \"different\" }),\n \"invalid_state\"\n )\n await expectAgentError(storage.checkpoints.create(checkpointInput()), \"execution_lost\")\n await storage.messages.append({\n id: \"m4\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_2\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"four\" }],\n })\n await expectAgentError(storage.checkpoints.create(reclaimedInput), \"invalid_state\")\n })\n })\n\n test(\"chains checkpoints only when the retained boundary advances\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n await storage.checkpoints.create(checkpointInput())\n await storage.messages.append({\n id: \"m4\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_2\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"four\" }],\n })\n await storage.runs.finish({\n id: \"run_2\",\n projectId,\n executionToken: \"exec_2\",\n status: \"succeeded\",\n })\n await storage.messages.append({\n id: \"m5\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"five\" }],\n })\n await createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_3\", triggerMessageId: \"m5\", execution: execution(\"exec_3\") })\n )\n\n await expectAgentError(\n storage.checkpoints.create(\n checkpointInput({\n id: \"checkpoint_2\",\n createdByRunId: \"run_3\",\n expectedPreviousCheckpointId: \"checkpoint_1\",\n expectedHeadSeq: 5,\n executionToken: \"exec_3\",\n summarizedThroughSeq: 2,\n observedHeadSeq: 5,\n })\n ),\n \"invalid_input\"\n )\n\n const second = await storage.checkpoints.create(\n checkpointInput({\n id: \"checkpoint_2\",\n createdByRunId: \"run_3\",\n expectedPreviousCheckpointId: \"checkpoint_1\",\n expectedHeadSeq: 5,\n executionToken: \"exec_3\",\n summary: \"The prior summary was extended through the fourth message.\",\n summarizedThroughSeq: 4,\n observedHeadSeq: 5,\n createdAt: at(\"2026-06-23T10:05:00.000Z\"),\n })\n )\n expect(second.previousCheckpointId).toBe(\"checkpoint_1\")\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toEqual(\n second\n )\n })\n })\n })\n}\n",
|
|
8
|
-
"import { describe, expect, test } from \"bun:test\"\nimport type { AiCostStorage, AiModelCallCostRecord } from \"../storage/ai-cost\"\nimport { AiCostStorageError } from \"../storage/ai-cost\"\nimport type { AiUsageStorage } from \"../storage/ai-usage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\nexport interface AiStorageContractSuiteOptions<TStorage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly setup?: (storage: TStorage) => void | Promise<void>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"cost-contract-project\"\nconst executionId = \"exec_cost_1\"\nconst otherExecutionId = \"exec_cost_2\"\n\nfunction priceSource(entry: string) {\n return {\n sourceId: \"test-catalog\",\n sourceEntryId: entry,\n sourceVersion: \"test-catalog-v1\",\n sourceUrl: \"https://example.test/ai-pricing.json\",\n observedAt: new Date(\"2026-08-01T00:00:00.000Z\"),\n }\n}\n\nfunction ratedCost(\n usageRecordId = \"usage_1\",\n overrides: Partial<Extract<AiModelCallCostRecord, { status: \"rated\" }>> = {}\n): Extract<AiModelCallCostRecord, { status: \"rated\" }> {\n return {\n projectId,\n usageRecordId,\n status: \"rated\",\n billingIdentity: { providerId: \"vercel\", modelId: \"openai/gpt-5\" },\n pricingContext: {},\n priceSource: priceSource(\"vercel/openai/gpt-5\"),\n money: { currency: \"USD\", amountNanos: \"95000\" },\n components: [\n {\n meter: \"tokens.input.uncached\",\n quantity: \"12\",\n rateAmountNanosPerMillion: \"1250000000\",\n chargeAmountNanos: \"15000\",\n },\n {\n meter: \"tokens.input.cacheRead\",\n quantity: \"0\",\n rateAmountNanosPerMillion: \"125000000\",\n chargeAmountNanos: \"0\",\n },\n {\n meter: \"tokens.output.total\",\n quantity: \"8\",\n rateAmountNanosPerMillion: \"10000000000\",\n chargeAmountNanos: \"80000\",\n },\n ],\n ratedAt: new Date(\"2026-08-01T12:00:00.200Z\"),\n ...overrides,\n }\n}\n\nfunction unpriceableCost(): Extract<AiModelCallCostRecord, { status: \"unpriceable\" }> {\n return {\n projectId,\n usageRecordId: \"usage_2\",\n status: \"unpriceable\",\n billingIdentity: { providerId: \"vercel\", modelId: \"unpriced/model\" },\n pricingContext: {},\n priceSource: priceSource(\"vercel/unpriced/model\"),\n reason: \"missingCatalogEntry\",\n ratedAt: new Date(\"2026-08-01T12:00:00.200Z\"),\n }\n}\n\nexport function runAiCostStorageContractSuite<TStorage extends AiCostStorage>(\n name: string,\n options: AiStorageContractSuiteOptions<TStorage>\n): void {\n describe(name, () => {\n async function fixture(): Promise<TStorage> {\n const storage = await options.createStorage()\n await options.setup?.(storage)\n return storage\n }\n\n test(\"records model-call costs idempotently\", async () => {\n const storage = await fixture()\n try {\n await expect(storage.recordModelCallCost(ratedCost())).resolves.toBeUndefined()\n await expect(storage.recordModelCallCost(ratedCost())).resolves.toBeUndefined()\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n valuationStatus: \"rated\",\n })\n ).resolves.toMatchObject({\n total: 1,\n items: [{ usage: { id: \"usage_1\" }, cost: ratedCost(), valuationStatus: \"rated\" }],\n })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"stores explicit unpriceable results and pricing context\", async () => {\n const storage = await fixture()\n try {\n const deploymentCost: AiModelCallCostRecord = {\n projectId,\n usageRecordId: \"usage_deployment\",\n status: \"unpriceable\",\n billingIdentity: { providerId: \"openai\", modelId: \"gpt-5\" },\n pricingContext: { deploymentId: \"production\" },\n priceSource: priceSource(\"openai/gpt-5\"),\n reason: \"unsupportedPricingDimension\",\n ratedAt: new Date(\"2026-08-03T12:00:00.200Z\"),\n }\n await storage.recordModelCallCost(unpriceableCost())\n await storage.recordModelCallCost(deploymentCost)\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-03T00:00:00.000Z\"),\n to: new Date(\"2026-08-04T00:00:00.000Z\"),\n valuationStatus: \"unpriceable\",\n })\n ).resolves.toMatchObject({\n total: 1,\n items: [{ cost: deploymentCost, valuationStatus: \"unpriceable\" }],\n })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"summarizes and queries accounting without inventing missing costs\", async () => {\n const storage = await fixture()\n try {\n await storage.recordModelCallCost(ratedCost())\n await storage.recordModelCallCost(unpriceableCost())\n await expect(\n storage.summarizeExecutions({ projectId, executionIds: [executionId] })\n ).resolves.toEqual([\n {\n amounts: [{ currency: \"USD\", amountNanos: \"95000\" }],\n ratedCallCount: 1,\n unpriceableCallCount: 1,\n unvaluedCallCount: 1,\n },\n ])\n\n const overview = await storage.queryProjectOverview({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n bucket: \"day\",\n })\n expect(overview.totals).toEqual({\n modelCallCount: 3,\n usage: {\n inputTokens: 15,\n outputTokens: 12,\n totalTokens: 27,\n reportingStatus: \"complete\",\n },\n costs: {\n amounts: [{ currency: \"USD\", amountNanos: \"95000\" }],\n ratedCallCount: 1,\n unpriceableCallCount: 1,\n unvaluedCallCount: 1,\n },\n })\n expect(overview.series).toMatchObject([{ modelCallCount: 3 }])\n expect(overview.models).toMatchObject([\n { providerId: \"gateway\", modelId: \"openai/gpt-5\", modelCallCount: 2 },\n { providerId: \"gateway\", modelId: \"unpriced/model\", modelCallCount: 1 },\n ])\n await expect(\n storage.queryProjectOverview({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n bucket: \"day\",\n providerId: \"gateway\",\n modelId: \"unpriced/model\",\n })\n ).resolves.toMatchObject({ totals: { modelCallCount: 1 } })\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n limit: 1,\n offset: 1,\n })\n ).resolves.toMatchObject({\n total: 3,\n hasMore: true,\n items: [{ usage: { id: \"usage_2\" } }],\n })\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n valuationStatus: \"unpriceable\",\n })\n ).resolves.toMatchObject({\n total: 1,\n hasMore: false,\n items: [{ usage: { id: \"usage_2\" }, valuationStatus: \"unpriceable\" }],\n })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"rejects missing usage and mismatched billed quantities\", async () => {\n const storage = await fixture()\n try {\n const missing = ratedCost(\"missing\")\n const missingError = await storage.recordModelCallCost(missing).catch((value) => value)\n expect(missingError).toBeInstanceOf(AiCostStorageError)\n expect((missingError as AiCostStorageError).code).toBe(\"missing_usage\")\n\n const base = ratedCost()\n const mismatch = ratedCost(\"usage_1\", {\n money: { currency: \"USD\", amountNanos: \"96250\" },\n components: [\n { ...base.components[0]!, quantity: \"13\", chargeAmountNanos: \"16250\" },\n ...base.components.slice(1),\n ],\n })\n const mismatchError = await storage.recordModelCallCost(mismatch).catch((value) => value)\n expect(mismatchError).toBeInstanceOf(AiCostStorageError)\n expect((mismatchError as AiCostStorageError).code).toBe(\"cost_mismatch\")\n } finally {\n await options.cleanup?.(storage)\n }\n })\n })\n}\n\n/** Seed immutable usage used by every cost-storage provider contract. */\nexport async function seedAiCostStorageContractUsage(\n executions: ExecutionStorage,\n usage: AiUsageStorage\n): Promise<void> {\n for (const fixture of [\n { projectId, executionId },\n { projectId, executionId: otherExecutionId },\n ]) {\n if (await executions.getById({ projectId: fixture.projectId, id: fixture.executionId }))\n continue\n const primitive = {\n kind: \"workflow\" as const,\n id: \"ai-cost-contract\",\n runId: fixture.executionId,\n }\n await executions.create({\n id: fixture.executionId,\n projectId: fixture.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${fixture.executionId}` },\n correlationId: `test_correlation:${fixture.executionId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n }\n\n for (const fixture of [\n { id: \"usage_1\", model: \"openai/gpt-5\", input: 12, output: 8 },\n { id: \"usage_2\", model: \"unpriced/model\", input: 1, output: 1 },\n { id: \"usage_3\", model: \"openai/gpt-5\", input: 2, output: 3 },\n ]) {\n await usage.recordModelCall({\n id: fixture.id,\n projectId,\n executionId,\n attempt: 1,\n callId: `call_${fixture.id}`,\n requesterGroupIds: [],\n providerId: \"gateway\",\n requestedModelId: fixture.model,\n responseId: `response_${projectId}_${fixture.id}`,\n usage: {\n inputTokens: fixture.input,\n outputTokens: fixture.output,\n ...(fixture.id === \"usage_1\"\n ? { uncachedInputTokens: fixture.input, cacheReadInputTokens: 0 }\n : {}),\n },\n occurredAt: new Date(\"2026-08-01T12:00:00.000Z\"),\n recordedAt: new Date(\"2026-08-01T12:00:00.100Z\"),\n })\n }\n\n await usage.recordModelCall({\n id: \"usage_deployment\",\n projectId,\n executionId: otherExecutionId,\n attempt: 1,\n callId: \"call_usage_deployment\",\n requesterGroupIds: [],\n providerId: \"openai.responses\",\n requestedModelId: \"gpt-5\",\n responseId: \"response_usage_deployment\",\n usage: {\n inputTokens: 2,\n outputTokens: 3,\n uncachedInputTokens: 2,\n cacheReadInputTokens: 0,\n },\n occurredAt: new Date(\"2026-08-03T12:00:00.000Z\"),\n recordedAt: new Date(\"2026-08-03T12:00:00.100Z\"),\n })\n}\n",
|
|
9
|
-
"import { describe, expect, test } from \"bun:test\"\nimport {\n type AiUsageStorage,\n AiUsageStorageError,\n type RecordAiModelCallInput,\n} from \"../storage/ai-usage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\nexport interface AiUsageStorageContractSuiteOptions<\n TStorage extends AiUsageStorage = AiUsageStorage,\n> {\n /** Factory that returns an isolated AI usage store for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly setup?: (storage: TStorage) => void | Promise<void>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"contract-project\"\nconst agentExecutionId = \"exec_agent_1\"\nconst otherAgentExecutionId = \"exec_agent_2\"\nconst workflowExecutionId = \"exec_workflow_1\"\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nfunction modelCallInput(overrides: Partial<RecordAiModelCallInput> = {}): RecordAiModelCallInput {\n return {\n id: \"usage_1\",\n projectId,\n executionId: agentExecutionId,\n attempt: 1,\n callId: \"call_1\",\n requesterGroupIds: [\"support\", \"engineering\"],\n providerId: \"gateway\",\n requestedModelId: \"openai/gpt-5\",\n responseModelId: \"gpt-5-2026-06-01\",\n responseId: \"response_1\",\n usage: {\n inputTokens: 12,\n outputTokens: 8,\n uncachedInputTokens: 9,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 1,\n textOutputTokens: 6,\n reasoningOutputTokens: 2,\n },\n rawUsage: { input_tokens: 12, output_tokens: 8 },\n occurredAt: at(\"2026-06-23T10:00:00.000Z\"),\n recordedAt: at(\"2026-06-23T10:00:01.000Z\"),\n ...overrides,\n }\n}\n\n/** Runs the provider-neutral model-call ledger contract against one storage implementation. */\nexport function runAiUsageStorageContractSuite<TStorage extends AiUsageStorage>(\n label: string,\n options: AiUsageStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"records normalized usage and one canonical row per requester group\", async () => {\n await withStorage(async (storage) => {\n const result = await storage.recordModelCall(\n modelCallInput({\n requesterGroupIds: [\"support\", \"engineering\", \"support\"],\n })\n )\n\n expect(result.created).toBe(true)\n expect(result.record).toEqual({\n ...modelCallInput(),\n requesterGroupIds: [\"engineering\", \"support\"],\n usage: {\n ...modelCallInput().usage,\n totalTokens: 20,\n reportingStatus: \"complete\",\n },\n recordedAt: at(\"2026-06-23T10:00:01.000Z\"),\n })\n })\n })\n\n test(\"returns the existing record when the idempotency key is replayed\", async () => {\n await withStorage(async (storage) => {\n const first = await storage.recordModelCall(modelCallInput())\n const replay = await storage.recordModelCall(\n modelCallInput({\n id: \"ignored_retry_id\",\n requesterGroupIds: [\"different-group\"],\n usage: { inputTokens: 999, outputTokens: 1 },\n })\n )\n\n expect(first.created).toBe(true)\n expect(replay.created).toBe(false)\n expect(replay.record).toEqual(first.record)\n })\n })\n\n test(\"allows one generation call id to contain multiple billable responses\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(modelCallInput())\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_2\",\n responseId: \"response_2\",\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n uncachedInputTokens: 4,\n cacheReadInputTokens: 0,\n cacheWriteInputTokens: 2,\n textOutputTokens: 5,\n reasoningOutputTokens: 1,\n },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 2,\n usage: {\n inputTokens: 16,\n outputTokens: 14,\n totalTokens: 30,\n uncachedInputTokens: 13,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 3,\n textOutputTokens: 11,\n reasoningOutputTokens: 3,\n reportingStatus: \"complete\",\n },\n })\n })\n })\n\n test(\"returns the latest completed call for one execution\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.getLatestForExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toBeNull()\n\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_later\",\n callId: \"call_later\",\n responseId: \"response_later\",\n occurredAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_earlier\",\n callId: \"call_earlier\",\n responseId: \"response_earlier\",\n occurredAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n )\n\n await expect(\n storage.getLatestForExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toMatchObject({ id: \"usage_later\", responseId: \"response_later\" })\n await expect(\n storage.getLatestForExecution({\n projectId: \"other-project\",\n executionId: agentExecutionId,\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"bills the same call and response IDs again on a later delivery attempt\", async () => {\n // Regression guard: remove `attempt` from a provider's idempotency key/query/index and the\n // second append collapses into the first, making the aggregate assertions fail.\n await withStorage(async (storage) => {\n await storage.recordModelCall(modelCallInput())\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_2\",\n attempt: 2,\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n uncachedInputTokens: 4,\n cacheReadInputTokens: 0,\n cacheWriteInputTokens: 2,\n textOutputTokens: 5,\n reasoningOutputTokens: 1,\n },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 2,\n usage: {\n inputTokens: 16,\n outputTokens: 14,\n totalTokens: 30,\n uncachedInputTokens: 13,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 3,\n textOutputTokens: 11,\n reasoningOutputTokens: 3,\n reportingStatus: \"complete\",\n },\n })\n })\n })\n\n test(\"does not count concurrent idempotent appends twice\", async () => {\n await withStorage(async (storage) => {\n const results = await Promise.all([\n storage.recordModelCall(modelCallInput()),\n storage.recordModelCall(modelCallInput({ id: \"usage_retry\" })),\n ])\n\n expect(results.map((result) => result.created).sort()).toEqual([false, true])\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 1,\n usage: {\n inputTokens: 12,\n outputTokens: 8,\n totalTokens: 20,\n uncachedInputTokens: 9,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 1,\n textOutputTokens: 6,\n reasoningOutputTokens: 2,\n reportingStatus: \"complete\",\n },\n })\n })\n })\n\n test(\"keeps projects and workflow executions isolated\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_workflow\",\n executionId: workflowExecutionId,\n usage: { inputTokens: 5, outputTokens: 3 },\n })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_other_project\",\n projectId: \"other-project\",\n executionId: workflowExecutionId,\n usage: { inputTokens: 100, outputTokens: 100 },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: workflowExecutionId })\n ).resolves.toEqual({\n modelCallCount: 1,\n usage: {\n inputTokens: 5,\n outputTokens: 3,\n totalTokens: 8,\n reportingStatus: \"complete\",\n },\n })\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n await expect(\n storage.summarizeExecution({\n projectId,\n executionId: \"exec_workflow_2\",\n })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n })\n })\n\n test(\"summarizes multiple executions in input order with one zero-call entry per miss\", async () => {\n await withStorage(async (storage) => {\n await expect(storage.summarizeExecutions({ projectId, executionIds: [] })).resolves.toEqual(\n []\n )\n\n await storage.recordModelCall(modelCallInput())\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_agent_2\",\n executionId: otherAgentExecutionId,\n callId: \"call_agent_2\",\n responseId: \"response_agent_2\",\n usage: { inputTokens: 4, outputTokens: 6 },\n })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_workflow\",\n executionId: workflowExecutionId,\n callId: \"call_workflow\",\n responseId: \"response_workflow\",\n usage: { inputTokens: 5, outputTokens: 3 },\n })\n )\n\n await expect(\n storage.summarizeExecutions({\n projectId,\n executionIds: [\n otherAgentExecutionId,\n \"missing\",\n workflowExecutionId,\n agentExecutionId,\n otherAgentExecutionId,\n ],\n })\n ).resolves.toEqual([\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n totalTokens: 10,\n reportingStatus: \"complete\",\n },\n },\n { modelCallCount: 0, usage: { reportingStatus: \"unavailable\" } },\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 5,\n outputTokens: 3,\n totalTokens: 8,\n reportingStatus: \"complete\",\n },\n },\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 12,\n outputTokens: 8,\n totalTokens: 20,\n uncachedInputTokens: 9,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 1,\n textOutputTokens: 6,\n reasoningOutputTokens: 2,\n reportingStatus: \"complete\",\n },\n },\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n totalTokens: 10,\n reportingStatus: \"complete\",\n },\n },\n ])\n })\n })\n\n test(\"distinguishes no model calls from a call without reported usage\", async () => {\n // Regression guard: coerce nullable SQL token columns with `Number(null)` and this becomes a\n // complete zero-token report instead of an unavailable one.\n await withStorage(async (storage) => {\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n\n const result = await storage.recordModelCall(\n modelCallInput({ usage: {}, rawUsage: undefined })\n )\n\n expect(result.record.usage).toEqual({ reportingStatus: \"unavailable\" })\n expect(result.record.rawUsage).toBeUndefined()\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 1,\n usage: { reportingStatus: \"unavailable\" },\n })\n })\n })\n\n test(\"normalizes offset timestamps to the same UTC instants\", async () => {\n // Regression guard: persist a timezone-naive SQL timestamp and these offset-derived instants\n // shift when read under a different database or process timezone.\n await withStorage(async (storage) => {\n const result = await storage.recordModelCall(\n modelCallInput({\n occurredAt: at(\"2026-06-23T03:04:05.678-07:00\"),\n recordedAt: at(\"2026-06-23T03:04:06.789-07:00\"),\n })\n )\n\n expect(result.record.occurredAt.toISOString()).toBe(\"2026-06-23T10:04:05.678Z\")\n expect(result.record.recordedAt.toISOString()).toBe(\"2026-06-23T10:04:06.789Z\")\n })\n })\n\n test(\"keeps incomplete execution totals partial instead of inventing zeroes\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(\n modelCallInput({ usage: { inputTokens: 10, outputTokens: 5 } })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_2\",\n callId: \"call_2\",\n responseId: \"response_2\",\n usage: { inputTokens: 0 },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 2,\n usage: {\n inputTokens: 10,\n reportingStatus: \"partial\",\n },\n })\n })\n })\n\n test(\"defensively snapshots inputs and returned records\", async () => {\n await withStorage(async (storage) => {\n const requesterGroupIds = [\"support\"]\n const rawUsage = { nested: { cached: 3 } }\n const occurredAt = at(\"2026-06-23T10:00:00.000Z\")\n const input = modelCallInput({ requesterGroupIds, rawUsage, occurredAt })\n const first = await storage.recordModelCall(input)\n\n requesterGroupIds.push(\"mutated-input\")\n rawUsage.nested.cached = 999\n occurredAt.setTime(0)\n\n const returnedGroups = first.record.requesterGroupIds as string[]\n returnedGroups.push(\"mutated-output\")\n const returnedRaw = first.record.rawUsage as { nested: { cached: number } }\n returnedRaw.nested.cached = 888\n first.record.occurredAt.setTime(1)\n\n const replay = await storage.recordModelCall(modelCallInput())\n expect(replay.record.requesterGroupIds).toEqual([\"support\"])\n expect(replay.record.rawUsage).toEqual({ nested: { cached: 3 } })\n expect(replay.record.occurredAt.toISOString()).toBe(\"2026-06-23T10:00:00.000Z\")\n })\n })\n\n test(\"rejects a reused record id with a different model-call identity\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(modelCallInput())\n\n const error = storage.recordModelCall(\n modelCallInput({ callId: \"call_2\", responseId: \"response_2\" })\n )\n await expect(error).rejects.toBeInstanceOf(AiUsageStorageError)\n await expect(error).rejects.toMatchObject({ code: \"duplicate_id\" })\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toMatchObject({\n modelCallCount: 1,\n usage: { inputTokens: 12, outputTokens: 8, totalTokens: 20 },\n })\n })\n })\n\n test(\"rejects a model call whose durable execution does not exist\", async () => {\n await withStorage(async (storage) => {\n const error = storage.recordModelCall(\n modelCallInput({ id: \"usage_missing\", executionId: \"exec_missing\" })\n )\n await expect(error).rejects.toBeInstanceOf(AiUsageStorageError)\n await expect(error).rejects.toMatchObject({ code: \"missing_execution\" })\n })\n })\n\n test(\"rejects invalid execution IDs, usage, dates, groups, and raw JSON\", async () => {\n await withStorage(async (storage) => {\n const invalidInputs: RecordAiModelCallInput[] = [\n modelCallInput({ attempt: 0 }),\n modelCallInput({ providerId: \" \" }),\n modelCallInput({ requesterGroupIds: [\"\"] }),\n modelCallInput({ usage: { inputTokens: -1 } }),\n modelCallInput({ occurredAt: new Date(Number.NaN) }),\n modelCallInput({ rawUsage: { invalid: undefined } as never }),\n modelCallInput({ executionId: \"\" }),\n ]\n\n for (const input of invalidInputs) {\n await expect(storage.recordModelCall(input)).rejects.toThrow()\n }\n await expect(\n storage.summarizeExecutions({\n projectId,\n executionIds: [\"\"],\n })\n ).rejects.toThrow()\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n })\n })\n })\n}\n\n/** Seed the immutable execution references used by the provider-neutral AI usage contract. */\nexport async function seedAiUsageStorageContractExecutions(\n executions: ExecutionStorage\n): Promise<void> {\n for (const fixture of [\n { projectId, executionId: agentExecutionId },\n { projectId, executionId: otherAgentExecutionId },\n { projectId, executionId: workflowExecutionId },\n { projectId: \"other-project\", executionId: workflowExecutionId },\n ]) {\n const existing = await executions.getById({\n projectId: fixture.projectId,\n id: fixture.executionId,\n })\n if (existing) continue\n const primitive = {\n kind: \"workflow\" as const,\n id: \"ai-usage-contract\",\n runId: fixture.executionId,\n }\n await executions.create({\n id: fixture.executionId,\n projectId: fixture.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${fixture.executionId}` },\n correlationId: `test_correlation:${fixture.executionId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n }\n}\n",
|
|
10
|
-
"import { describe, expect, test } from \"bun:test\"\nimport type {\n AuthStorage,\n AuthStorageErrorCode,\n CompleteAuthSessionInput,\n UserRecord,\n} from \"../storage/auth\"\nimport { AuthStorageError } from \"../storage/auth\"\n\nexport interface AuthStorageContractSuiteOptions<TStorage extends AuthStorage = AuthStorage> {\n /** Factory that produces a fresh `AuthStorage` instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"project-a\"\nconst otherProjectId = \"project-b\"\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nfunction sessionInput(\n id: string,\n tokenHash = `${id}-hash`,\n audience: CompleteAuthSessionInput[\"audience\"] = \"atlas\",\n absoluteExpiresAt?: Date\n): CompleteAuthSessionInput {\n return {\n id,\n audience,\n tokenHash,\n createdAt: at(\"2026-05-14T10:10:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:10:00.000Z\"),\n absoluteExpiresAt,\n }\n}\n\nasync function expectAuthError(\n promise: Promise<unknown>,\n code: AuthStorageErrorCode\n): Promise<void> {\n await expect(promise).rejects.toBeInstanceOf(AuthStorageError)\n await expect(promise).rejects.toMatchObject({ code })\n}\n\nasync function createUser(\n storage: AuthStorage,\n input: {\n readonly id?: string\n readonly email?: string\n readonly status?: UserRecord[\"status\"]\n readonly projectId?: string\n } = {}\n): Promise<UserRecord> {\n return storage.users.create({\n id: input.id ?? \"usr_1\",\n projectId: input.projectId ?? projectId,\n email: input.email ?? \"ava@acme.com\",\n status: input.status,\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n}\n\n/**\n * Runs the shared `AuthStorage` contract against any storage implementation.\n *\n * The suite is the storage-independent specification for Sixb auth state: users, identities,\n * sessions, invitations, group memberships, service accounts, access tokens,\n * magic links, OIDC attempts, and atomic sign-in completion.\n */\nexport function runAuthStorageContractSuite<TStorage extends AuthStorage>(\n label: string,\n options: AuthStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"creates users with normalized email and isolates projects\", async () => {\n await withStorage(async (storage) => {\n const user = await createUser(storage, {\n email: \" Ava@Acme.COM \",\n })\n\n expect(user.email).toBe(\"ava@acme.com\")\n await expectAuthError(\n storage.users.create({\n id: \"usr_duplicate\",\n projectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n }),\n \"duplicate_user\"\n )\n\n await expect(\n storage.users.create({\n id: \"usr_other\",\n projectId: otherProjectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n projectId: otherProjectId,\n email: \"ava@acme.com\",\n })\n\n const page = await storage.users.list({ projectId, statuses: [\"active\"] })\n expect(page.users.map((row) => row.id)).toEqual([\"usr_1\"])\n })\n })\n\n test(\"upserts identities without mutating canonical user email\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_oidc\", email: \"ava@acme.com\" })\n\n await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava@acme.com\" },\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n const updated = await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava.renamed@acme.com\" },\n updatedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n expect(updated.claims).toEqual({ email: \"ava.renamed@acme.com\" })\n await expect(storage.users.getById({ projectId, id: \"usr_oidc\" })).resolves.toMatchObject({\n email: \"ava@acme.com\",\n })\n })\n })\n\n test(\"keeps multiple concurrent sessions per user and never extends expiry on touch\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const first = await storage.sessions.create({\n id: \"ses_1\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n const second = await storage.sessions.create({\n id: \"ses_2\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n createdAt: at(\"2026-05-14T10:05:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:05:00.000Z\"),\n })\n\n // Creating a second session in the same audience no longer revokes the\n // first: both stay active and authenticate independently.\n expect(first.revokedAt).toBeUndefined()\n expect(second.revokedAt).toBeUndefined()\n const storedFirst = await storage.sessions.getById({ projectId, id: \"ses_1\" })\n expect(storedFirst?.revokedAt).toBeUndefined()\n\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_1\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_1\" })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"wrong\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n // getActiveByUserId returns the most recently created active session.\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n\n const touched = await storage.sessions.touch({\n projectId,\n id: second.id,\n lastSeenAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n expect(touched.lastSeenAt?.toISOString()).toBe(\"2026-05-15T10:00:00.000Z\")\n expect(touched.expiresAt.toISOString()).toBe(\"2026-05-21T10:05:00.000Z\")\n\n // A session in a different audience coexists and is cookie-scoped.\n const appSession = await storage.sessions.create({\n id: \"ses_app\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-app\",\n createdAt: at(\"2026-05-14T10:06:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:06:00.000Z\"),\n })\n expect(appSession.revokedAt).toBeUndefined()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_app\",\n audience: \"atlas\",\n tokenHash: \"hash-app\",\n now: at(\"2026-05-14T10:07:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n // Revoking a single session leaves the user's other sessions active.\n await storage.sessions.revoke({\n projectId,\n id: \"ses_1\",\n revokedAt: at(\"2026-05-14T10:08:00.000Z\"),\n })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_1\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n now: at(\"2026-05-14T10:09:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n now: at(\"2026-05-14T10:09:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n\n // \"Sign out everywhere\": revokeActiveForUser clears every remaining\n // active session for the user, across audiences.\n const revoked = await storage.sessions.revokeActiveForUser({\n projectId,\n userId: \"usr_1\",\n revokedAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n expect(revoked.map((entry) => entry.id).sort()).toEqual([\"ses_2\", \"ses_app\"])\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-14T10:11:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"persists and enforces an optional absolute session deadline\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n const capped = await storage.sessions.create({\n id: \"ses_capped\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n absoluteExpiresAt: at(\"2026-05-16T10:00:00.000Z\"),\n })\n const uncapped = await storage.sessions.create({\n id: \"ses-uncapped\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-uncapped\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n\n expect(capped.absoluteExpiresAt?.toISOString()).toBe(\"2026-05-16T10:00:00.000Z\")\n expect(uncapped.absoluteExpiresAt).toBeUndefined()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: capped.id,\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n now: at(\"2026-05-16T09:59:59.999Z\"),\n })\n ).resolves.toMatchObject({ id: capped.id })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: capped.id,\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n const active = await storage.sessions.listActiveByUserId({\n projectId,\n userId: \"usr_1\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n expect(active.map((session) => session.id)).toEqual([uncapped.id])\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.revokeActiveForUser({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n revokedAt: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toEqual([])\n })\n })\n\n test(\"atomically renews valid sessions without exceeding the absolute deadline\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_renew\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-15T10:00:00.000Z\"),\n absoluteExpiresAt: at(\"2026-05-20T10:00:00.000Z\"),\n })\n\n const renewed = await storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-25T10:00:00.000Z\"),\n })\n expect(renewed?.expiresAt.toISOString()).toBe(\"2026-05-20T10:00:00.000Z\")\n expect(renewed?.lastSeenAt?.toISOString()).toBe(\"2026-05-14T11:00:00.000Z\")\n\n const monotonic = await storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-14T12:00:00.000Z\"),\n expiresAt: at(\"2026-05-18T10:00:00.000Z\"),\n })\n expect(monotonic?.expiresAt.toISOString()).toBe(\"2026-05-20T10:00:00.000Z\")\n\n await expect(\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"wrong-hash\",\n now: at(\"2026-05-14T13:00:00.000Z\"),\n expiresAt: at(\"2026-05-19T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-20T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n await storage.sessions.create({\n id: \"ses_concurrent\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n await Promise.all([\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_concurrent\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-18T10:00:00.000Z\"),\n }),\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_concurrent\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-19T10:00:00.000Z\"),\n }),\n ])\n const concurrent = await storage.sessions.getById({ projectId, id: \"ses_concurrent\" })\n expect(concurrent?.expiresAt.toISOString()).toBe(\"2026-05-19T10:00:00.000Z\")\n })\n })\n\n test(\"persists best-effort device metadata on a session\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const withDevice = await storage.sessions.create({\n id: \"ses_device\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-device\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n userAgent: \"Mozilla/5.0 (iPhone)\",\n ipAddress: \"203.0.113.7\",\n })\n expect(withDevice.userAgent).toBe(\"Mozilla/5.0 (iPhone)\")\n expect(withDevice.ipAddress).toBe(\"203.0.113.7\")\n await expect(\n storage.sessions.getById({ projectId, id: \"ses_device\" })\n ).resolves.toMatchObject({\n userAgent: \"Mozilla/5.0 (iPhone)\",\n ipAddress: \"203.0.113.7\",\n })\n\n // Device metadata is optional; omitting it round-trips as undefined.\n const withoutDevice = await storage.sessions.create({\n id: \"ses_plain\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-plain\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n expect(withoutDevice.userAgent).toBeUndefined()\n expect(withoutDevice.ipAddress).toBeUndefined()\n })\n })\n\n test(\"lists a user's active sessions across audiences, newest activity first\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.sessions.create({\n id: \"ses_a\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-a\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_b\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-b\",\n createdAt: at(\"2026-05-14T10:05:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:05:00.000Z\"),\n })\n\n // Revoked sessions are excluded.\n await storage.sessions.create({\n id: \"ses_revoked\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-revoked\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n await storage.sessions.revoke({\n projectId,\n id: \"ses_revoked\",\n revokedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n // Another user's session must not leak in.\n await createUser(storage, { id: \"usr_2\", email: \"bo@acme.com\" })\n await storage.sessions.create({\n id: \"ses_other\",\n projectId,\n userId: \"usr_2\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-other\",\n createdAt: at(\"2026-05-14T10:03:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:03:00.000Z\"),\n })\n\n // ses_a is older than ses_b but has more recent activity, so it sorts first.\n await storage.sessions.touch({\n projectId,\n id: \"ses_a\",\n lastSeenAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n\n const active = await storage.sessions.listActiveByUserId({\n projectId,\n userId: \"usr_1\",\n now: at(\"2026-05-15T11:00:00.000Z\"),\n })\n expect(active.map((session) => session.id)).toEqual([\"ses_a\", \"ses_b\"])\n })\n })\n\n test(\"keeps one active invitation per normalized email\", async () => {\n await withStorage(async (storage) => {\n const first = await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \" Ava@Acme.COM \",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n const updated = await storage.invitations.createOrUpdateActive({\n id: \"inv_2\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"finance\"],\n updatedAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-22T10:00:00.000Z\"),\n })\n\n expect(updated.id).toBe(first.id)\n expect(updated.groupIds).toEqual([\"finance\"])\n await expect(\n storage.invitations.getActiveByEmail({\n projectId,\n email: \"ava@acme.com\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"inv_1\" })\n\n await storage.invitations.revoke({\n projectId,\n id: \"inv_1\",\n revokedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n await expect(\n storage.invitations.getActiveByEmail({\n projectId,\n email: \"ava@acme.com\",\n now: at(\"2026-05-14T10:04:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"upserts group memberships idempotently and preserves source\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"invitation\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n const repeated = await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n\n expect(repeated.source).toBe(\"invitation\")\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_1\" })\n ).resolves.toHaveLength(1)\n })\n })\n\n test(\"rejects group memberships for missing users\", async () => {\n await withStorage(async (storage) => {\n await expectAuthError(\n storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_missing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n }),\n \"missing_user\"\n )\n })\n })\n\n test(\"removes group memberships and is idempotent for missing rows\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n\n const removed = await storage.groupMemberships.remove({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n })\n expect(removed).toMatchObject({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_1\" })\n ).resolves.toHaveLength(0)\n\n // Removing an already-removed membership is a no-op that returns null.\n await expect(\n storage.groupMemberships.remove({ projectId, userId: \"usr_1\", groupId: \"commercial\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"returns null when removing a membership for a missing user\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.groupMemberships.remove({\n projectId,\n userId: \"usr_missing\",\n groupId: \"commercial\",\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"manages service accounts and their group memberships\", async () => {\n await withStorage(async (storage) => {\n const serviceAccount = await storage.serviceAccounts.create({\n id: \"svc_ingest\",\n projectId,\n name: \"Ingest worker\",\n description: \"Reads source data into Sixb.\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n expect(serviceAccount).toMatchObject({\n id: \"svc_ingest\",\n name: \"Ingest worker\",\n status: \"active\",\n })\n\n const membership = await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_ingest\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n expect(membership.groupId).toBe(\"commercial\")\n const repeated = await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_ingest\",\n groupId: \"commercial\",\n source: \"invitation\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n expect(repeated.source).toBe(\"manual\")\n\n await expect(\n storage.serviceAccountGroupMemberships.listForServiceAccount({\n projectId,\n serviceAccountId: \"svc_ingest\",\n })\n ).resolves.toHaveLength(1)\n await expect(\n storage.serviceAccountGroupMemberships.listForGroup({\n projectId,\n groupId: \"commercial\",\n })\n ).resolves.toMatchObject([{ serviceAccountId: \"svc_ingest\" }])\n\n const updated = await storage.serviceAccounts.update({\n projectId,\n id: \"svc_ingest\",\n name: \"Ingest worker v2\",\n status: \"suspended\",\n updatedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n expect(updated).toMatchObject({\n name: \"Ingest worker v2\",\n description: \"Reads source data into Sixb.\",\n status: \"suspended\",\n })\n await expect(\n storage.serviceAccounts.update({\n projectId,\n id: \"svc_ingest\",\n description: \"Imports source data into Sixb.\",\n updatedAt: at(\"2026-05-14T10:04:00.000Z\"),\n })\n ).resolves.toMatchObject({\n name: \"Ingest worker v2\",\n description: \"Imports source data into Sixb.\",\n status: \"suspended\",\n })\n await expect(\n storage.serviceAccounts.list({ projectId, statuses: [\"suspended\"] })\n ).resolves.toMatchObject({\n serviceAccounts: [{ id: \"svc_ingest\" }],\n total: 1,\n })\n })\n })\n\n test(\"rejects service account memberships for missing service accounts\", async () => {\n await withStorage(async (storage) => {\n await expectAuthError(\n storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_missing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n }),\n \"missing_service_account\"\n )\n })\n })\n\n test(\"reconciles agent-managed service account memberships\", async () => {\n await withStorage(async (storage) => {\n await storage.serviceAccounts.create({\n id: \"svc_agent_ops\",\n projectId,\n name: \"Ops agent\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupId: \"manual-extra\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupId: \"stale-agent\",\n source: \"agent\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n const first = await storage.serviceAccountGroupMemberships.reconcileForServiceAccount({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupIds: [\"agent-runtime\", \"agent-runtime\", \"ops\"],\n source: \"agent\",\n updatedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n expect(first.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"agent-runtime\", \"agent\"],\n [\"manual-extra\", \"manual\"],\n [\"ops\", \"agent\"],\n ])\n\n const second = await storage.serviceAccountGroupMemberships.reconcileForServiceAccount({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupIds: [\"ops\"],\n source: \"agent\",\n updatedAt: at(\"2026-05-14T10:04:00.000Z\"),\n })\n expect(second.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"manual-extra\", \"manual\"],\n [\"ops\", \"agent\"],\n ])\n })\n })\n\n test(\"creates, resolves, touches, lists, and revokes access tokens\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.serviceAccounts.create({\n id: \"svc_ingest\",\n projectId,\n name: \"Ingest worker\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n\n const personal = await storage.accessTokens.create({\n id: \"tok_personal\",\n projectId,\n name: \"Local CLI\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash-personal\",\n groupIds: [\"commercial\", \"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n expect(personal.groupIds).toEqual([\"commercial\", \"finance\"])\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"hash-personal\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"tok_personal\" })\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"wrong\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n const touched = await storage.accessTokens.touch({\n projectId,\n id: \"tok_personal\",\n lastUsedAt: at(\"2026-05-14T10:03:00.000Z\"),\n userAgent: \"sixb-cli/0.1\",\n ipAddress: \"203.0.113.10\",\n })\n expect(touched.lastUsedAt?.toISOString()).toBe(\"2026-05-14T10:03:00.000Z\")\n expect(touched.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n\n await storage.accessTokens.create({\n id: \"tok_service\",\n projectId,\n name: \"Sandbox agent\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"svc_ingest\",\n tokenHash: \"hash-service\",\n createdAt: at(\"2026-05-14T10:04:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:04:00.000Z\"),\n })\n await expect(\n storage.accessTokens.list({\n projectId,\n subjectType: \"serviceAccount\",\n subjectId: \"svc_ingest\",\n })\n ).resolves.toMatchObject({\n accessTokens: [{ id: \"tok_service\" }],\n total: 1,\n })\n\n await storage.accessTokens.revoke({\n projectId,\n id: \"tok_personal\",\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"hash-personal\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"round-trips the creator principal for service accounts and access tokens\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_creator\", email: \"creator@acme.com\" })\n await storage.serviceAccounts.create({\n id: \"svc_creator\",\n projectId,\n name: \"Creator service account\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_creator\",\n projectId,\n userId: \"usr_creator\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-creator\",\n createdAt: at(\"2026-05-14T10:00:30.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:30.000Z\"),\n })\n\n const principals = [\n { type: \"user\", id: \"usr_creator\" },\n { type: \"serviceAccount\", id: \"svc_creator\" },\n { type: \"system\", id: \"scheduler\" },\n ] as const\n\n for (const [index, principal] of principals.entries()) {\n const accountId = `svc_by_${principal.type}`\n const createdAccount = await storage.serviceAccounts.create({\n id: accountId,\n projectId,\n name: `Service account by ${principal.type}`,\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n createdAt: at(`2026-05-14T10:1${index}:00.000Z`),\n })\n expect(createdAccount.createdByPrincipal).toEqual(principal)\n expect(createdAccount.createdBySessionId).toBe(\"ses_creator\")\n await expect(\n storage.serviceAccounts.getById({ projectId, id: accountId })\n ).resolves.toMatchObject({\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n })\n\n const tokenId = `tok_by_${principal.type}`\n const createdToken = await storage.accessTokens.create({\n id: tokenId,\n projectId,\n name: `Token by ${principal.type}`,\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_creator\",\n tokenHash: `hash-${tokenId}`,\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n createdAt: at(`2026-05-14T10:2${index}:00.000Z`),\n expiresAt: at(`2026-05-21T10:2${index}:00.000Z`),\n })\n expect(createdToken.createdByPrincipal).toEqual(principal)\n expect(createdToken.createdBySessionId).toBe(\"ses_creator\")\n await expect(\n storage.accessTokens.getById({ projectId, id: tokenId })\n ).resolves.toMatchObject({\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n })\n }\n\n // Omitting the creator round-trips as undefined on every backend.\n const anonymous = await storage.serviceAccounts.create({\n id: \"svc_anonymous\",\n projectId,\n name: \"Anonymous service account\",\n createdAt: at(\"2026-05-14T10:30:00.000Z\"),\n })\n expect(anonymous.createdByPrincipal).toBeUndefined()\n expect(anonymous.createdBySessionId).toBeUndefined()\n await expect(\n storage.serviceAccounts.getById({ projectId, id: \"svc_anonymous\" })\n ).resolves.toMatchObject({ id: \"svc_anonymous\" })\n })\n })\n\n test(\"touch preserves prior access-token metadata when omitted\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.accessTokens.create({\n id: \"tok_touch\",\n projectId,\n name: \"Touch token\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash-touch\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n\n const first = await storage.accessTokens.touch({\n projectId,\n id: \"tok_touch\",\n lastUsedAt: at(\"2026-05-14T10:01:00.000Z\"),\n userAgent: \"sixb-cli/0.1\",\n ipAddress: \"203.0.113.10\",\n })\n expect(first.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n expect(first.lastUsedIpAddress).toBe(\"203.0.113.10\")\n\n // A later touch without metadata advances lastUsedAt but keeps the\n // previously captured user agent and IP address.\n const second = await storage.accessTokens.touch({\n projectId,\n id: \"tok_touch\",\n lastUsedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n expect(second.lastUsedAt?.toISOString()).toBe(\"2026-05-14T10:05:00.000Z\")\n expect(second.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n expect(second.lastUsedIpAddress).toBe(\"203.0.113.10\")\n await expect(\n storage.accessTokens.getById({ projectId, id: \"tok_touch\" })\n ).resolves.toMatchObject({\n lastUsedUserAgent: \"sixb-cli/0.1\",\n lastUsedIpAddress: \"203.0.113.10\",\n })\n })\n })\n\n test(\"lists access tokens with revoked, order, and pagination parity\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const ids = [\"tok_a\", \"tok_b\", \"tok_c\", \"tok_d\"]\n for (const [index, id] of ids.entries()) {\n await storage.accessTokens.create({\n id,\n projectId,\n name: `Token ${id}`,\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: `hash-${id}`,\n createdAt: at(`2026-05-14T10:0${index}:00.000Z`),\n expiresAt: at(`2026-05-21T10:0${index}:00.000Z`),\n })\n }\n await storage.accessTokens.revoke({\n projectId,\n id: \"tok_b\",\n revokedAt: at(\"2026-05-14T11:00:00.000Z\"),\n })\n\n // includeRevoked defaults to false: the revoked token is hidden.\n const active = await storage.accessTokens.list({ projectId })\n expect(active.accessTokens.map((token) => token.id)).toEqual([\"tok_a\", \"tok_c\", \"tok_d\"])\n expect(active.total).toBe(3)\n expect(active.hasMore).toBe(false)\n\n // includeRevoked: true surfaces it again, default order is ascending.\n const all = await storage.accessTokens.list({ projectId, includeRevoked: true })\n expect(all.accessTokens.map((token) => token.id)).toEqual([\n \"tok_a\",\n \"tok_b\",\n \"tok_c\",\n \"tok_d\",\n ])\n expect(all.total).toBe(4)\n\n // order: \"desc\" reverses by createdAt.\n const descending = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n order: \"desc\",\n })\n expect(descending.accessTokens.map((token) => token.id)).toEqual([\n \"tok_d\",\n \"tok_c\",\n \"tok_b\",\n \"tok_a\",\n ])\n\n // First page reports hasMore at the page boundary.\n const firstPage = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 2,\n })\n expect(firstPage.accessTokens.map((token) => token.id)).toEqual([\"tok_a\", \"tok_b\"])\n expect(firstPage.total).toBe(4)\n expect(firstPage.hasMore).toBe(true)\n\n // Second page exhausts the result set.\n const secondPage = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 2,\n offset: 2,\n })\n expect(secondPage.accessTokens.map((token) => token.id)).toEqual([\"tok_c\", \"tok_d\"])\n expect(secondPage.hasMore).toBe(false)\n\n // A page that exactly consumes the remainder reports no more.\n const exactBoundary = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 4,\n })\n expect(exactBoundary.accessTokens.map((token) => token.id)).toEqual(ids)\n expect(exactBoundary.hasMore).toBe(false)\n })\n })\n\n test(\"lists service accounts with pagination parity\", async () => {\n await withStorage(async (storage) => {\n const ids = [\"svc_a\", \"svc_b\", \"svc_c\"]\n for (const [index, id] of ids.entries()) {\n await storage.serviceAccounts.create({\n id,\n projectId,\n name: `Service account ${id}`,\n createdAt: at(`2026-05-14T10:0${index}:00.000Z`),\n })\n }\n\n // Default order is ascending by createdAt across every backend.\n const all = await storage.serviceAccounts.list({ projectId })\n expect(all.serviceAccounts.map((account) => account.id)).toEqual(ids)\n expect(all.total).toBe(3)\n expect(all.hasMore).toBe(false)\n\n const firstPage = await storage.serviceAccounts.list({ projectId, limit: 2 })\n expect(firstPage.serviceAccounts.map((account) => account.id)).toEqual([\"svc_a\", \"svc_b\"])\n expect(firstPage.total).toBe(3)\n expect(firstPage.hasMore).toBe(true)\n\n const secondPage = await storage.serviceAccounts.list({\n projectId,\n limit: 2,\n offset: 2,\n })\n expect(secondPage.serviceAccounts.map((account) => account.id)).toEqual([\"svc_c\"])\n expect(secondPage.hasMore).toBe(false)\n })\n })\n\n test(\"rejects invalid access token subjects\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await expectAuthError(\n storage.accessTokens.create({\n id: \"tok_bad_kind\",\n projectId,\n name: \"Bad kind\",\n kind: \"serviceAccount\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n }),\n \"invalid_input\"\n )\n await expectAuthError(\n storage.accessTokens.create({\n id: \"tok_missing_subject\",\n projectId,\n name: \"Missing subject\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"svc_missing\",\n tokenHash: \"hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n }),\n \"missing_service_account\"\n )\n })\n })\n\n test(\"creates one active magic link per email and consumes it once\", async () => {\n await withStorage(async (storage) => {\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:15:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_2\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \" ava@acme.com \",\n tokenHash: \"hash-2\",\n returnTo: \"/dashboard\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n revokedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await expectAuthError(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"wrong\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n }),\n \"invalid_magic_link\"\n )\n\n await expect(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"hash-2\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n audience: \"atlas\",\n returnTo: \"/dashboard\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n await expectAuthError(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"hash-2\",\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n }),\n \"invalid_magic_link\"\n )\n })\n })\n\n test(\"stores OIDC attempts with one-time state consumption\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n returnTo: \"/objects\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"wrong\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n }),\n \"invalid_oidc_attempt\"\n )\n await expect(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"state-hash\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n ).resolves.toMatchObject({\n audience: \"atlas\",\n codeVerifier: \"verifier\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await expectAuthError(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"state-hash\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n }),\n \"invalid_oidc_attempt\"\n )\n })\n })\n\n test(\"completes magic-link sign-in for an existing user\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_old\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"old-hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_new\", \"session-hash\", \"atlas\", at(\"2026-06-21T10:10:00.000Z\")),\n })\n\n expect(result.user.id).toBe(\"usr_1\")\n expect(result.session).toMatchObject({\n id: \"ses_new\",\n strategyId: \"magic-link\",\n tokenHash: \"session-hash\",\n absoluteExpiresAt: at(\"2026-06-21T10:10:00.000Z\"),\n })\n // Signing in again keeps the user's existing session active; concurrent\n // sessions are allowed.\n const oldSession = await storage.sessions.getById({ projectId, id: \"ses_old\" })\n expect(oldSession?.revokedAt).toBeUndefined()\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_unused_2\",\n session: sessionInput(\"ses_replay\"),\n }),\n \"invalid_magic_link\"\n )\n })\n })\n\n test(\"creates invited users through magic-link completion and applies groups once\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:17:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_new\",\n manualGroupIds: [\"security-admins\"],\n session: sessionInput(\"ses_new\"),\n })\n\n expect(result.invitation).toMatchObject({\n id: \"inv_1\",\n status: \"accepted\",\n })\n const memberships = await storage.groupMemberships.listForUser({\n projectId,\n userId: \"usr_new\",\n })\n expect(memberships.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"commercial\", \"invitation\"],\n [\"finance\", \"invitation\"],\n [\"security-admins\", \"manual\"],\n ])\n })\n })\n\n test(\"preserves existing membership source when accepting an invitation\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_existing\", email: \"ava@acme.com\" })\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_existing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:17:00.000Z\"),\n })\n\n await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_existing\"),\n })\n\n const memberships = await storage.groupMemberships.listForUser({\n projectId,\n userId: \"usr_existing\",\n })\n expect(memberships.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"commercial\", \"manual\"],\n [\"finance\", \"invitation\"],\n ])\n })\n })\n\n test(\"does not create missing users when invitation eligibility disappeared\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n await storage.invitations.revoke({\n projectId,\n id: \"inv_1\",\n revokedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_new\",\n session: sessionInput(\"ses_new\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"ava@acme.com\" })\n ).resolves.toBeNull()\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n })\n })\n\n test(\"allows explicit bootstrap creation through magic-link completion\", async () => {\n await withStorage(async (storage) => {\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"founder@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_founder\",\n allowUserCreationWithoutInvitation: true,\n manualGroupIds: [\"security-admins\"],\n session: sessionInput(\"ses_founder\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_founder\",\n email: \"founder@acme.com\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_founder\" })\n ).resolves.toMatchObject([{ groupId: \"security-admins\", source: \"manual\" }])\n })\n })\n\n test(\"closes bootstrap user creation when an active user already exists\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, {\n id: \"usr_existing\",\n email: \"existing@acme.com\",\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"founder@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_founder\",\n allowUserCreationWithoutInvitation: true,\n requireNoActiveUsersForUserCreation: true,\n session: sessionInput(\"ses_founder\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"founder@acme.com\" })\n ).resolves.toBeNull()\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n })\n })\n\n test(\"does not apply the bootstrap closure guard to invited user creation\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, {\n id: \"usr_existing\",\n email: \"existing@acme.com\",\n })\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"invited@acme.com\",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"invited@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_invited\",\n requireNoActiveUsersForUserCreation: true,\n session: sessionInput(\"ses_invited\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_invited\",\n email: \"invited@acme.com\",\n })\n expect(result.invitation).toMatchObject({\n id: \"inv_1\",\n status: \"accepted\",\n })\n })\n })\n\n test(\"consumes valid magic links when an existing user is suspended\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { status: \"suspended\" })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_new\"),\n }),\n \"suspended_user\"\n )\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n })\n })\n\n test(\"completes OIDC sign-in through an existing identity\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_oidc\", email: \"ava@acme.com\" })\n await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava@acme.com\" },\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:11:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n subject: \"00u1\",\n email: \"renamed@acme.com\",\n emailVerified: true,\n claims: { email: \"renamed@acme.com\" },\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_oidc\"),\n })\n\n expect(result.identity).toMatchObject({\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"renamed@acme.com\" },\n })\n await expect(storage.users.getById({ projectId, id: \"usr_oidc\" })).resolves.toMatchObject({\n email: \"ava@acme.com\",\n })\n })\n })\n\n test(\"auto-links OIDC by verified email only when explicitly allowed\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_existing\", email: \"ava@acme.com\" })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_blocked\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"blocked-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_blocked\",\n stateHash: \"blocked-state\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: false,\n autoLinkByVerifiedEmail: true,\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_blocked\"),\n }),\n \"email_link_not_allowed\"\n )\n\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_allowed\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"allowed-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:12:00.000Z\"),\n })\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_allowed\",\n stateHash: \"allowed-state\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: true,\n autoLinkByVerifiedEmail: true,\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_allowed\"),\n })\n\n expect(result.user.id).toBe(\"usr_existing\")\n expect(result.identity).toMatchObject({\n userId: \"usr_existing\",\n })\n })\n })\n\n test(\"creates new OIDC users through active invitations and applies groups\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_oidc\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T09:59:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n displayName: \"Ava Chen\",\n emailVerified: true,\n newUserId: \"usr_oidc\",\n session: sessionInput(\"ses_oidc\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_oidc\",\n email: \"ava@acme.com\",\n displayName: \"Ava Chen\",\n })\n expect(result.invitation).toMatchObject({\n id: \"inv_oidc\",\n status: \"accepted\",\n })\n expect(result.identity).toMatchObject({\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_oidc\" })\n ).resolves.toMatchObject([{ groupId: \"commercial\", source: \"invitation\" }])\n })\n })\n\n test(\"does not create new OIDC users without invitation or bootstrap eligibility\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: true,\n newUserId: \"usr_oidc\",\n session: sessionInput(\"ses_oidc\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"ava@acme.com\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"allows first OIDC bootstrap user creation with manual groups\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_bootstrap\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"bootstrap-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_bootstrap\",\n stateHash: \"bootstrap-state\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"founder@acme.com\",\n emailVerified: true,\n allowUserCreationWithoutInvitation: true,\n requireNoActiveUsersForUserCreation: true,\n manualGroupIds: [\"security-admins\"],\n newUserId: \"usr_founder\",\n session: sessionInput(\"ses_oidc_bootstrap\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_founder\",\n email: \"founder@acme.com\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_founder\" })\n ).resolves.toMatchObject([{ groupId: \"security-admins\", source: \"manual\" }])\n })\n })\n\n test(\"suspends users and revokes active sessions immediately\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_1\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_app\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-app\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n\n const suspended = await storage.suspendUserAndRevokeSessions({\n projectId,\n userId: \"usr_1\",\n suspendedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n\n expect(suspended.status).toBe(\"suspended\")\n await expect(storage.sessions.getById({ projectId, id: \"ses_1\" })).resolves.toMatchObject({\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n await expect(storage.sessions.getById({ projectId, id: \"ses_app\" })).resolves.toMatchObject(\n {\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n }\n )\n })\n })\n })\n}\n",
|
|
6
|
+
"import { agentServiceAccountId } from \"../agents/authority\"\nimport { SYSTEM_PRINCIPAL } from \"../auth\"\nimport type { AuthStorage } from \"../storage/auth\"\nimport { AuthStorageError } from \"../storage/auth\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution chain required by an Agent-run storage fixture. */\nexport async function createTestAgentExecution(\n storage: { readonly auth?: AuthStorage; readonly executions: ExecutionStorage },\n input: {\n readonly projectId: string\n readonly actorId?: string\n readonly runId: string\n readonly executionId?: string\n readonly sourceExecutionId?: string\n /** Conversational runs inherit authority; workflow fixtures use managed authority. */\n readonly authority?: \"managed\" | \"inherited\"\n }\n): Promise<string> {\n const authority = input.authority ?? (input.actorId === undefined ? \"inherited\" : \"managed\")\n if (authority === \"managed\" && input.actorId === undefined) {\n throw new Error(\"Managed Agent execution fixtures require an agent id.\")\n }\n const serviceAccountId = input.actorId ? agentServiceAccountId(input.actorId) : undefined\n if (authority === \"managed\") {\n const auth = storage.auth\n if (!auth) throw new Error(\"Managed Agent execution fixtures require auth storage.\")\n const serviceAccount = await auth.serviceAccounts.getById({\n projectId: input.projectId,\n id: serviceAccountId!,\n })\n if (!serviceAccount) {\n const now = new Date()\n try {\n await auth.serviceAccounts.create({\n id: serviceAccountId!,\n projectId: input.projectId,\n name: `Test Agent ${input.actorId}`,\n description: `Test service account for Agent '${input.actorId}'.`,\n status: \"active\",\n createdByPrincipal: SYSTEM_PRINCIPAL,\n createdAt: now,\n updatedAt: now,\n })\n } catch (error) {\n if (!(error instanceof AuthStorageError) || error.code !== \"duplicate_service_account\") {\n throw error\n }\n }\n }\n }\n\n const sourceExecutionId = input.sourceExecutionId ?? `test_request_execution:${input.runId}`\n const executionId = input.executionId ?? `test_agent_execution:${input.runId}`\n const existing = await storage.executions.getById({\n projectId: input.projectId,\n id: executionId,\n })\n if (existing) return executionId\n\n let parent = await storage.executions.getById({\n projectId: input.projectId,\n id: sourceExecutionId,\n })\n if (!parent) {\n parent = await storage.executions.create({\n id: sourceExecutionId,\n projectId: input.projectId,\n executor: { type: \"request\", requestId: `test_request:${input.runId}` },\n source: { type: \"http\", requestId: `test_request:${input.runId}` },\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"disabled\" },\n })\n }\n await storage.executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"agent\", runId: input.runId },\n source: { type: \"execution\", executionId: sourceExecutionId },\n ...(parent.requestedBy === undefined\n ? {}\n : { requestedBy: structuredClone(parent.requestedBy) }),\n correlationId: parent.correlationId,\n authorizationRef:\n authority === \"inherited\"\n ? structuredClone(parent.authorizationRef)\n : {\n type: \"principal\",\n principal: { type: \"serviceAccount\", id: serviceAccountId! },\n },\n })\n return executionId\n}\n",
|
|
7
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { AGENT_MESSAGE_CONTENT_VERSION } from \"../agents/message\"\nimport type { Principal } from \"../auth\"\nimport type { SixbFailure } from \"../errors/types\"\nimport {\n type AgentRunExecution,\n type AgentRunFailureCode,\n type AgentStorage,\n AgentStorageError,\n type AgentStorageErrorCode,\n type CreateAgentContextCheckpointInput,\n type CreateAgentRunInput,\n type CreateAgentThreadInput,\n type CreateSubagentRunInput,\n type StartAgentRunInput,\n} from \"../storage/agents\"\nimport type { AuthStorage } from \"../storage/auth\"\nimport type { ExecutionStorage } from \"../storage/executions\"\nimport type { Storage } from \"../storage/types\"\nimport { createTestAgentExecution } from \"./agent-execution\"\n\nexport interface AgentStorageContractStorage extends Pick<Storage, \"transaction\"> {\n readonly agents: AgentStorage\n readonly auth: AuthStorage\n readonly executions: ExecutionStorage\n}\n\nexport interface AgentStorageContractSuiteOptions<\n TStorage extends AgentStorageContractStorage = AgentStorageContractStorage,\n> {\n /** Factory that produces a fresh storage bundle for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"project-a\"\nconst otherProjectId = \"project-b\"\nconst owner: Principal = { type: \"user\", id: \"usr_1\" }\nconst serviceAccount: Extract<Principal, { readonly type: \"serviceAccount\" }> = {\n type: \"serviceAccount\",\n id: \"svc_agent_sales\",\n}\n\nfunction failure(\n message: string,\n at: string,\n code: AgentRunFailureCode = \"internal.unexpected\"\n): SixbFailure<AgentRunFailureCode> {\n return { code, message, retryable: false, at }\n}\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nasync function expectAgentError(\n promise: Promise<unknown>,\n code: AgentStorageErrorCode\n): Promise<void> {\n await expect(promise).rejects.toBeInstanceOf(AgentStorageError)\n await expect(promise).rejects.toMatchObject({ code })\n}\n\nfunction threadInput(overrides: Partial<CreateAgentThreadInput> = {}): CreateAgentThreadInput {\n return {\n id: \"thr_1\",\n projectId,\n ownerPrincipal: owner,\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n ...overrides,\n }\n}\n\nfunction execution(\n token: string,\n queueLeaseExpiresAt = at(\"2026-06-23T10:05:00.000Z\")\n): AgentRunExecution {\n return { token, queueLeaseExpiresAt }\n}\n\ntype TestRunInput = CreateAgentRunInput &\n Omit<StartAgentRunInput, \"id\" | \"projectId\"> & {\n readonly id: string\n readonly projectId: string\n }\n\nfunction runInput(overrides: Partial<TestRunInput> = {}): TestRunInput {\n const input = {\n id: \"run_1\",\n projectId,\n threadId: \"thr_1\",\n triggerMessageId: \"msg_user_1\",\n spec: { model: { provider: \"test\", modelId: \"large\" } },\n executionId: \"test_agent_execution:run_1\",\n requesterGroupIds: [\"support\", \"engineering\", \"support\"],\n execution: execution(\"exec_1\"),\n createdAt: at(\"2026-06-23T10:00:10.000Z\"),\n ...overrides,\n }\n return {\n ...input,\n executionId: overrides.executionId ?? `test_agent_execution:${input.id}`,\n }\n}\n\nfunction subagentInput(\n parentExecutionToken: string,\n overrides: Partial<CreateSubagentRunInput> = {}\n): CreateSubagentRunInput {\n const id = overrides.id ?? \"child_1\"\n return {\n id,\n projectId,\n executionId: overrides.executionId ?? `test_agent_execution:${id}`,\n parentRunId: \"parent_1\",\n parentExecutionToken,\n spawnKey: \"research-orders\",\n spec: {\n model: { provider: \"test\", modelId: \"small\" },\n reasoning: \"medium\",\n task: \"Research the open orders.\",\n toolNames: [\"search_orders\"],\n maxSteps: 25,\n },\n maxActiveChildren: 4,\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n ...overrides,\n }\n}\n\nasync function createRunningParent(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage\n): Promise<void> {\n await storage.threads.create(threadInput({ id: \"parent_thread\" }))\n const parent = runInput({\n id: \"parent_1\",\n threadId: \"parent_thread\",\n execution: execution(\"parent_token\"),\n })\n await createTestAgentExecution(fixture, {\n projectId,\n runId: parent.id,\n executionId: parent.executionId,\n authority: \"inherited\",\n })\n await storage.runs.create(parent)\n await storage.runs.start({\n projectId,\n id: parent.id,\n modelId: \"large\",\n execution: parent.execution,\n })\n}\n\nasync function createSubagent(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage,\n overrides: Partial<CreateSubagentRunInput> = {}\n) {\n const input = subagentInput(\"parent_token\", overrides)\n const parent = await storage.runs.getById({ projectId: input.projectId, id: input.parentRunId })\n if (!parent || parent.kind !== \"conversation\") throw new Error(\"Expected child parent fixture\")\n await createTestAgentExecution(fixture, {\n projectId: input.projectId,\n runId: input.id,\n executionId: input.executionId,\n sourceExecutionId: parent.executionId,\n authority: \"inherited\",\n })\n return storage.runs.createSubagent(input)\n}\n\nfunction checkpointInput(\n overrides: Partial<CreateAgentContextCheckpointInput> = {}\n): CreateAgentContextCheckpointInput {\n return {\n id: \"checkpoint_1\",\n projectId,\n threadId: \"thr_1\",\n createdByRunId: \"run_2\",\n expectedPreviousCheckpointId: null,\n expectedHeadSeq: 3,\n executionToken: \"exec_2\",\n reason: \"threshold\",\n summary: \"The user asked for one and the agent answered two.\",\n summaryFormatVersion: 1,\n summarizedThroughSeq: 2,\n observedHeadSeq: 3,\n estimatedInputTokensBefore: 1_000,\n estimatedInputTokensAfter: 300,\n summaryModelId: \"test-model\",\n createdAt: at(\"2026-06-23T10:03:00.000Z\"),\n ...overrides,\n }\n}\n\nasync function createAndStartRun(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage,\n input: TestRunInput\n): Promise<Awaited<ReturnType<AgentStorage[\"runs\"][\"start\"]>>> {\n await createRun(storage, fixture, input)\n return storage.runs.start({\n id: input.id,\n projectId: input.projectId,\n modelId: input.modelId,\n execution: input.execution,\n startedAt: input.startedAt,\n })\n}\n\nasync function createRun(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage,\n input: CreateAgentRunInput\n) {\n await createTestAgentExecution(fixture, {\n projectId: input.projectId,\n runId: input.id,\n executionId: input.executionId,\n authority: \"inherited\",\n })\n return storage.runs.create(input)\n}\n\nasync function prepareCheckpointCandidate(\n storage: AgentStorage,\n fixture: AgentStorageContractStorage\n): Promise<void> {\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"one\" }],\n })\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n await storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"two\" }],\n })\n await storage.runs.finish({\n id: \"run_1\",\n projectId,\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n await storage.messages.append({\n id: \"m3\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"three\" }],\n })\n await createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_2\", triggerMessageId: \"m3\", execution: execution(\"exec_2\") })\n )\n}\n\n/**\n * Runs the shared `AgentStorage` contract against any storage implementation.\n *\n * This is the storage-independent specification for Sixb agent persistence: thread lifecycle and\n * project isolation, single-flight run reservation, execution reclaim, run finalization with\n * execution metadata, message append with thread-stats bookkeeping, and fenced context checkpoints.\n */\nexport function runAgentStorageContractSuite<TStorage extends AgentStorageContractStorage>(\n label: string,\n options: AgentStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (\n body: (storage: AgentStorage, fixture: TStorage) => Promise<void>\n ): Promise<void> => {\n const fixture = await options.createStorage()\n try {\n await body(fixture.agents, fixture)\n } finally {\n await options.teardown?.(fixture)\n }\n }\n\n describe(label, () => {\n // ── threads ───────────────────────────────────────────────────────────────────────────────\n\n test(\"creates threads, isolates projects, and rejects duplicate ids\", async () => {\n await withStorage(async (storage) => {\n const thread = await storage.threads.create(threadInput({ title: \"Q3 pipeline\" }))\n expect(thread).toMatchObject({\n id: \"thr_1\",\n title: \"Q3 pipeline\",\n status: \"active\",\n activeRunId: null,\n messageCount: 0,\n })\n expect(thread.ownerPrincipal).toEqual(owner)\n\n await expectAgentError(storage.threads.create(threadInput()), \"duplicate_id\")\n\n // Same id under a different project is allowed and isolated.\n await expect(\n storage.threads.create(threadInput({ projectId: otherProjectId }))\n ).resolves.toMatchObject({ projectId: otherProjectId })\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n title: \"Q3 pipeline\",\n })\n await expect(\n storage.threads.getById({ projectId: \"nope\", id: \"thr_1\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"lists threads with filters, ordering, and pagination\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(\n threadInput({ id: \"thr_a\", createdAt: at(\"2026-06-23T10:00:00.000Z\") })\n )\n await storage.threads.create(\n threadInput({\n id: \"thr_b\",\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n )\n await storage.threads.create(\n threadInput({\n id: \"thr_c\",\n status: \"archived\",\n createdAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n )\n await storage.threads.create(threadInput({ id: \"thr_other\", projectId: otherProjectId }))\n\n const all = await storage.threads.list({ projectId, order: \"asc\" })\n expect(all.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\", \"thr_c\"])\n expect(all.total).toBe(3)\n expect(all.hasMore).toBe(false)\n\n const active = await storage.threads.list({ projectId, statuses: [\"active\"], order: \"asc\" })\n expect(active.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\"])\n\n const firstPage = await storage.threads.list({ projectId, order: \"asc\", limit: 2 })\n expect(firstPage.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\"])\n expect(firstPage.hasMore).toBe(true)\n expect(firstPage.total).toBe(3)\n\n const secondPage = await storage.threads.list({\n projectId,\n order: \"asc\",\n limit: 2,\n offset: 2,\n })\n expect(secondPage.threads.map((thread) => thread.id)).toEqual([\"thr_c\"])\n expect(secondPage.hasMore).toBe(false)\n })\n })\n\n // ── durable queued runs ────────────────────────────────────────────────────────────────────\n\n test(\"creates a queued run before execution and claims the thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const queued = await createRun(storage, fixture, runInput({ id: \"run_1\" }))\n expect(queued).toMatchObject({\n status: \"queued\",\n attempt: 0,\n threadId: \"thr_1\",\n spec: { model: { provider: \"test\", modelId: \"large\" } },\n })\n expect(queued.execution).toBeUndefined()\n expect(queued.startedAt).toBeUndefined()\n await expect(storage.runs.list({ projectId, statuses: [\"queued\"] })).resolves.toMatchObject(\n {\n runs: [{ id: \"run_1\", status: \"queued\" }],\n total: 1,\n }\n )\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: \"run_1\",\n })\n\n const started = await storage.runs.start({\n projectId,\n id: \"run_1\",\n modelId: \"test-model\",\n execution: execution(\"exec_1\"),\n startedAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(started).toMatchObject({ status: \"running\", attempt: 1, modelId: \"test-model\" })\n expect(started.execution).toEqual(execution(\"exec_1\"))\n expect(started.executionId).toBe(\"test_agent_execution:run_1\")\n expect(started.startedAt?.toISOString()).toBe(\"2026-06-23T10:01:00.000Z\")\n })\n })\n\n test(\"rejects a run whose durable execution does not match its Agent authority\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n const executionId = await createTestAgentExecution(fixture, {\n projectId,\n actorId: \"support\",\n runId: \"run_1\",\n })\n\n await expectAgentError(\n storage.runs.create(runInput({ id: \"run_1\", executionId })),\n \"invalid_input\"\n )\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n })\n })\n\n test(\"finishes a queued run and releases the thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const cancelled = await storage.runs.finishQueued({\n projectId,\n id: \"run_1\",\n status: \"cancelled\",\n error: failure(\n \"Cancelled before execution\",\n \"2026-06-23T10:01:00.000Z\",\n \"runtime.cancelled\"\n ),\n completedAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(cancelled).toMatchObject({\n status: \"cancelled\",\n attempt: 0,\n error: failure(\n \"Cancelled before execution\",\n \"2026-06-23T10:01:00.000Z\",\n \"runtime.cancelled\"\n ),\n })\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n await expectAgentError(\n storage.runs.start({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_1\"),\n }),\n \"invalid_state\"\n )\n\n await createRun(storage, fixture, runInput({ id: \"run_2\" }))\n await expect(\n storage.runs.finishQueued({\n projectId,\n id: \"run_2\",\n status: \"failed\",\n error: failure(\"Agent is unavailable\", \"2026-06-23T10:02:00.000Z\"),\n completedAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n status: \"failed\",\n attempt: 0,\n error: failure(\"Agent is unavailable\", \"2026-06-23T10:02:00.000Z\"),\n })\n })\n })\n\n // ── durable child runs ─────────────────────────────────────────────────────────────────────\n\n test(\"creates and exactly replays a child run without claiming a thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await createRunningParent(storage, fixture)\n const input = subagentInput(\"parent_token\")\n const child = await createSubagent(storage, fixture)\n\n expect(child).toMatchObject({\n kind: \"subagent\",\n id: \"child_1\",\n parentRunId: \"parent_1\",\n spawnKey: \"research-orders\",\n status: \"queued\",\n attempt: 0,\n requesterGroupIds: [\"engineering\", \"support\"],\n spec: input.spec,\n })\n expect(child).not.toHaveProperty(\"threadId\")\n await expect(storage.runs.createSubagent(input)).resolves.toEqual(child)\n await expectAgentError(\n storage.runs.createSubagent({\n ...input,\n spec: { ...input.spec, task: \"Research different orders.\" },\n }),\n \"duplicate_id\"\n )\n\n const listed = await storage.runs.list({\n projectId,\n kinds: [\"subagent\"],\n parentRunId: \"parent_1\",\n })\n expect(listed.runs.map((run) => run.id)).toEqual([\"child_1\"])\n await expect(\n storage.runs.list({ projectId, kinds: [\"conversation\"] })\n ).resolves.toMatchObject({ runs: [{ id: \"parent_1\" }], total: 1 })\n await expect(\n storage.threads.getById({ projectId, id: \"parent_thread\" })\n ).resolves.toMatchObject({ activeRunId: \"parent_1\" })\n })\n })\n\n test(\"fences child admission by the active parent execution\", async () => {\n await withStorage(async (storage, fixture) => {\n await createRunningParent(storage, fixture)\n const wrongLineage = subagentInput(\"parent_token\", {\n id: \"child_wrong_parent\",\n executionId: \"test_agent_execution:child_wrong_parent\",\n spawnKey: \"wrong-parent\",\n })\n await createTestAgentExecution(fixture, {\n projectId,\n runId: wrongLineage.id,\n executionId: wrongLineage.executionId,\n sourceExecutionId: \"unrelated_request_execution\",\n authority: \"inherited\",\n })\n await expectAgentError(storage.runs.createSubagent(wrongLineage), \"invalid_input\")\n\n const input = subagentInput(\"stale_parent_token\")\n await createTestAgentExecution(fixture, {\n projectId,\n runId: input.id,\n executionId: input.executionId,\n sourceExecutionId: \"test_agent_execution:parent_1\",\n authority: \"inherited\",\n })\n await expectAgentError(storage.runs.createSubagent(input), \"execution_lost\")\n\n await storage.runs.finish({\n projectId,\n id: \"parent_1\",\n executionToken: \"parent_token\",\n status: \"succeeded\",\n })\n await expectAgentError(\n storage.runs.createSubagent({ ...input, parentExecutionToken: \"parent_token\" }),\n \"invalid_state\"\n )\n })\n })\n\n test(\"enforces the active-child limit atomically\", async () => {\n await withStorage(async (storage, fixture) => {\n await createRunningParent(storage, fixture)\n const inputs = [\"child_a\", \"child_b\"].map((id) =>\n subagentInput(\"parent_token\", {\n id,\n executionId: `test_agent_execution:${id}`,\n spawnKey: id,\n maxActiveChildren: 1,\n })\n )\n for (const input of inputs) {\n await createTestAgentExecution(fixture, {\n projectId,\n runId: input.id,\n executionId: input.executionId,\n sourceExecutionId: \"test_agent_execution:parent_1\",\n authority: \"inherited\",\n })\n }\n\n const settled = await Promise.allSettled(\n inputs.map((input) => storage.runs.createSubagent(input))\n )\n expect(settled.filter((result) => result.status === \"fulfilled\")).toHaveLength(1)\n const rejected = settled.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\"\n )\n expect(rejected).toHaveLength(1)\n expect(rejected[0]?.reason).toMatchObject({ code: \"active_child_limit\" })\n })\n })\n\n test(\"requires and round-trips a successful child result\", async () => {\n await withStorage(async (storage, fixture) => {\n await createRunningParent(storage, fixture)\n await createSubagent(storage, fixture)\n await storage.runs.start({\n projectId,\n id: \"child_1\",\n modelId: \"small\",\n execution: execution(\"child_token\"),\n })\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"child_1\",\n executionToken: \"child_token\",\n status: \"succeeded\",\n }),\n \"invalid_input\"\n )\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"child_1\",\n executionToken: \"child_token\",\n status: \"succeeded\",\n result: {},\n }),\n \"invalid_input\"\n )\n\n const result = {\n text: \"Three open orders.\",\n files: [\n {\n blobId: `blob_${\"a\".repeat(64)}`,\n digest: `sha256:${\"a\".repeat(64)}` as const,\n fileName: \"orders.csv\",\n mediaType: \"text/csv\",\n sizeBytes: 42,\n },\n ],\n }\n const completed = await storage.runs.finish({\n projectId,\n id: \"child_1\",\n executionToken: \"child_token\",\n status: \"succeeded\",\n result,\n })\n expect(completed).toMatchObject({ status: \"succeeded\", result })\n await expect(storage.runs.getById({ projectId, id: \"child_1\" })).resolves.toEqual(completed)\n })\n })\n\n // ── single-flight execution ─────────────────────────────────────────────────────────────────\n\n test(\"allows a single active run per thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const run = await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n expect(run).toMatchObject({ status: \"running\", attempt: 1, threadId: \"thr_1\" })\n expect(run.executionId).toBe(\"test_agent_execution:run_1\")\n expect(run.requesterGroupIds).toEqual([\"engineering\", \"support\"])\n expect(run.execution?.token).toBe(\"exec_1\")\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: \"run_1\",\n })\n\n await expectAgentError(\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_2\", execution: execution(\"exec_2\") })\n ),\n \"active_run_exists\"\n )\n\n // Reservation against an unknown thread / duplicate run id.\n await expectAgentError(\n createAndStartRun(storage, fixture, runInput({ id: \"run_x\", threadId: \"ghost\" })),\n \"thread_not_found\"\n )\n })\n })\n\n test(\"never lets two concurrent queued runs both claim one thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const results = await Promise.allSettled([\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_a\", execution: execution(\"exec_a\") })\n ),\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_b\", execution: execution(\"exec_b\") })\n ),\n ])\n const fulfilled = results.filter((result) => result.status === \"fulfilled\")\n const rejected = results.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\"\n )\n expect(fulfilled).toHaveLength(1)\n expect(rejected).toHaveLength(1)\n expect(rejected[0].reason).toBeInstanceOf(AgentStorageError)\n expect(rejected[0].reason.code).toBe(\"active_run_exists\")\n })\n })\n\n // ── execution reclaim ───────────────────────────────────────────────────────────────────────\n\n test(\"reclaim rotates the execution token and bumps the attempt\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const reclaimed = await storage.runs.reclaim({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_2\"),\n })\n expect(reclaimed).toMatchObject({ status: \"running\", attempt: 2 })\n expect(reclaimed.execution?.token).toBe(\"exec_2\")\n\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n }),\n \"execution_lost\"\n )\n })\n })\n\n test(\"projects confirmed queue ownership monotonically and fences stale executions\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_1\",\n execution: execution(\"exec_1\", at(\"2026-06-23T10:02:00.000Z\")),\n })\n )\n\n const confirmed = await storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:03:00.000Z\"),\n })\n expect(confirmed.execution?.queueLeaseExpiresAt.toISOString()).toBe(\n \"2026-06-23T10:03:00.000Z\"\n )\n\n const older = await storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:02:30.000Z\"),\n })\n expect(older.execution?.queueLeaseExpiresAt.toISOString()).toBe(\"2026-06-23T10:03:00.000Z\")\n\n await storage.runs.reclaim({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_2\", at(\"2026-06-23T10:04:00.000Z\")),\n })\n await expectAgentError(\n storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:05:00.000Z\"),\n }),\n \"execution_lost\"\n )\n })\n })\n\n test(\"does not alias stored run records to callers\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n const run = await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const mutableExecution = run.execution as\n | { token: string; queueLeaseExpiresAt: Date }\n | undefined\n if (mutableExecution) {\n mutableExecution.token = \"mutated\"\n mutableExecution.queueLeaseExpiresAt.setTime(0)\n }\n ;(run.requesterGroupIds as string[]).push(\"mutated\")\n const reread = await storage.runs.getById({ projectId, id: \"run_1\" })\n expect(reread?.execution?.token).toBe(\"exec_1\")\n expect(reread?.requesterGroupIds).toEqual([\"engineering\", \"support\"])\n })\n })\n\n // ── finalization ────────────────────────────────────────────────────────────────────────────\n\n test(\"releasing a run only clears its own thread's active pointer\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput({ id: \"thr_1\" }))\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\", threadId: \"thr_1\" }))\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_2\",\n threadId: \"thr_2\",\n execution: execution(\"exec_2\"),\n })\n )\n\n await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n // thr_2's pointer is untouched — the release is scoped to the run's own thread + matching id.\n await expect(storage.threads.getById({ projectId, id: \"thr_2\" })).resolves.toMatchObject({\n activeRunId: \"run_2\",\n })\n })\n })\n\n test(\"finishes a run, records execution metadata, and releases the thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n const finished = await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n modelId: \"claude-haiku-4-5\",\n finishReason: \"stop\",\n diagnostics: [\n {\n code: \"output_file_too_large\",\n severity: \"warning\",\n scope: \"output\",\n path: \"reports/full.csv\",\n message: \"This generated file was skipped.\",\n },\n ],\n completedAt: at(\"2026-06-23T10:07:00.000Z\"),\n })\n expect(finished).toMatchObject({\n status: \"succeeded\",\n modelId: \"claude-haiku-4-5\",\n finishReason: \"stop\",\n })\n expect(finished.diagnostics).toEqual([\n {\n code: \"output_file_too_large\",\n severity: \"warning\",\n scope: \"output\",\n path: \"reports/full.csv\",\n message: \"This generated file was skipped.\",\n },\n ])\n await expect(\n storage.runs.getByIds({ projectId, ids: [\"run_1\", \"missing\", \"run_1\"] })\n ).resolves.toEqual([finished])\n expect(finished.execution).toBeUndefined()\n expect(finished.completedAt?.toISOString()).toBe(\"2026-06-23T10:07:00.000Z\")\n\n // The thread is released → a new queued run can be created and started.\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n await expect(\n createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_2\", execution: execution(\"exec_2\") })\n )\n ).resolves.toMatchObject({ status: \"running\" })\n })\n })\n\n test(\"records failure detail and rejects a non-running run or stale execution\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"wrong\",\n status: \"failed\",\n error: failure(\"boom\", \"2026-06-23T10:08:00.000Z\"),\n }),\n \"execution_lost\"\n )\n\n const failed = await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"failed\",\n error: failure(\"ProviderError: boom\", \"2026-06-23T10:08:00.000Z\"),\n completedAt: at(\"2026-06-23T10:08:00.000Z\"),\n })\n expect(failed.status).toBe(\"failed\")\n expect(failed.error).toEqual(failure(\"ProviderError: boom\", \"2026-06-23T10:08:00.000Z\"))\n\n // Already terminal → cannot finish again.\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n }),\n \"invalid_state\"\n )\n })\n })\n\n test(\"lists runs with thread, status, and ordering filters\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput({ id: \"thr_1\" }))\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_1\",\n threadId: \"thr_1\",\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n )\n await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_2\",\n threadId: \"thr_1\",\n execution: execution(\"exec_2\"),\n createdAt: at(\"2026-06-23T10:30:00.000Z\"),\n })\n )\n await createAndStartRun(\n storage,\n fixture,\n runInput({\n id: \"run_3\",\n threadId: \"thr_2\",\n execution: execution(\"exec_3\"),\n createdAt: at(\"2026-06-23T10:45:00.000Z\"),\n })\n )\n\n const forThread1 = await storage.runs.list({ projectId, threadId: \"thr_1\", order: \"asc\" })\n expect(forThread1.runs.map((run) => run.id)).toEqual([\"run_1\", \"run_2\"])\n\n const running = await storage.runs.list({ projectId, statuses: [\"running\"], order: \"asc\" })\n expect(running.runs.map((run) => run.id)).toEqual([\"run_2\", \"run_3\"])\n\n const all = await storage.runs.list({ projectId, order: \"desc\" })\n expect(all.runs.map((run) => run.id)).toEqual([\"run_3\", \"run_2\", \"run_1\"])\n })\n })\n\n test(\"filters queued runs by their effective created timestamp\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput({ id: \"thr_before\" }))\n await storage.threads.create(threadInput({ id: \"thr_inside\" }))\n await storage.threads.create(threadInput({ id: \"thr_after\" }))\n\n await createRun(\n storage,\n fixture,\n runInput({\n id: \"run_before\",\n threadId: \"thr_before\",\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n )\n await createRun(\n storage,\n fixture,\n runInput({\n id: \"run_inside\",\n threadId: \"thr_inside\",\n createdAt: at(\"2026-06-23T11:00:00.000Z\"),\n })\n )\n await createRun(\n storage,\n fixture,\n runInput({\n id: \"run_after\",\n threadId: \"thr_after\",\n createdAt: at(\"2026-06-23T12:00:00.000Z\"),\n })\n )\n\n const result = await storage.runs.list({\n projectId,\n statuses: [\"queued\"],\n startedAfter: at(\"2026-06-23T10:30:00.000Z\"),\n startedBefore: at(\"2026-06-23T11:30:00.000Z\"),\n order: \"asc\",\n })\n expect(result.runs.map((run) => run.id)).toEqual([\"run_inside\"])\n expect(result.total).toBe(1)\n expect(result.hasMore).toBe(false)\n })\n })\n\n // ── messages ──────────────────────────────────────────────────────────────────────────────\n\n test(\"appends messages, assigns seq, and bumps thread stats\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n\n const userMessage = await storage.messages.append({\n id: \"msg_user_1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"Hello agent\" }],\n authorPrincipal: owner,\n createdAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n expect(userMessage).toMatchObject({\n seq: 1,\n role: \"user\",\n runId: null,\n contentVersion: AGENT_MESSAGE_CONTENT_VERSION,\n })\n expect(userMessage.authorPrincipal).toEqual(owner)\n\n const run = await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n expect(run.executionId).toBe(\"test_agent_execution:run_1\")\n const assistantMessage = await storage.messages.append({\n id: \"msg_asst_1\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n authorPrincipal: serviceAccount,\n parts: [\n { type: \"reasoning\", text: \"thinking about it\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"bash\",\n input: { cmd: \"ls\" },\n state: \"output-available\",\n output: \"file.txt\",\n },\n { type: \"text\", text: \"Here is the result\" },\n ],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(assistantMessage).toMatchObject({ seq: 2, role: \"assistant\", runId: \"run_1\" })\n expect(assistantMessage.authorPrincipal).toEqual(serviceAccount)\n\n const thread = await storage.threads.getById({ projectId, id: \"thr_1\" })\n expect(thread).toMatchObject({ messageCount: 2 })\n expect(thread?.lastMessageAt?.toISOString()).toBe(\"2026-06-23T10:01:00.000Z\")\n\n // The message's `parts` are the canonical content and round-trip verbatim through storage.\n const stored = await storage.messages.getById({ projectId, id: \"msg_asst_1\" })\n expect(stored?.seq).toBe(2)\n expect(stored?.parts).toEqual([\n { type: \"reasoning\", text: \"thinking about it\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"bash\",\n input: { cmd: \"ls\" },\n state: \"output-available\",\n output: \"file.txt\",\n },\n { type: \"text\", text: \"Here is the result\" },\n ])\n })\n })\n\n test(\"deletes messages produced by a run and repairs thread stats\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"msg_user_1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"Try this\" }],\n createdAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n await storage.messages.append({\n id: \"msg_asst_1\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n parts: [\n { type: \"text\", text: \"Partial answer\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"search\",\n input: { query: \"sixb\" },\n state: \"output-available\",\n output: { matches: 1 },\n },\n ],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n\n await expect(\n storage.messages.deleteByRunId({ projectId, threadId: \"thr_1\", runId: \"run_1\" })\n ).resolves.toBe(1)\n await expect(storage.messages.getById({ projectId, id: \"msg_asst_1\" })).resolves.toBeNull()\n\n const messages = await storage.messages.list({ projectId, threadId: \"thr_1\" })\n expect(messages.messages.map((message) => message.id)).toEqual([\"msg_user_1\"])\n expect(messages.total).toBe(1)\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n messageCount: 1,\n lastMessageAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n\n await expect(\n storage.messages.deleteByRunId({ projectId, threadId: \"thr_1\", runId: \"run_1\" })\n ).resolves.toBe(0)\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n messageCount: 1,\n lastMessageAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n })\n })\n\n test(\"lists messages with role filter, ordering, and pagination\", async () => {\n await withStorage(async (storage, fixture) => {\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"one\" }],\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n await createAndStartRun(storage, fixture, runInput({ id: \"run_1\" }))\n await storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"two\" }],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n await storage.messages.append({\n id: \"m3\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"three\" }],\n createdAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n\n const asc = await storage.messages.list({ projectId, threadId: \"thr_1\", order: \"asc\" })\n expect(asc.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\", \"m3\"])\n expect(asc.total).toBe(3)\n\n const desc = await storage.messages.list({ projectId, threadId: \"thr_1\", order: \"desc\" })\n expect(desc.messages.map((message) => message.id)).toEqual([\"m3\", \"m2\", \"m1\"])\n\n const users = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n roles: [\"user\"],\n order: \"asc\",\n })\n expect(users.messages.map((message) => message.id)).toEqual([\"m1\", \"m3\"])\n\n const retainedTail = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n afterSeq: 1,\n order: \"asc\",\n })\n expect(retainedTail.messages.map((message) => message.id)).toEqual([\"m2\", \"m3\"])\n expect(retainedTail.total).toBe(2)\n\n const firstPage = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n order: \"asc\",\n limit: 2,\n })\n expect(firstPage.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\"])\n expect(firstPage.hasMore).toBe(true)\n })\n })\n\n test(\"rejects appends to missing threads, duplicate messages, and unknown runs\", async () => {\n await withStorage(async (storage) => {\n await expectAgentError(\n storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"ghost\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"hi\" }],\n }),\n \"thread_not_found\"\n )\n\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"hi\" }],\n })\n await expectAgentError(\n storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"dup\" }],\n }),\n \"duplicate_id\"\n )\n await expectAgentError(\n storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"ghost-run\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"hi\" }],\n }),\n \"run_not_found\"\n )\n })\n })\n\n // ── context checkpoints ─────────────────────────────────────────────────────────────────\n\n test(\"creates an idempotent checkpoint without mutating the transcript\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n\n const threadBefore = await storage.threads.getById({ projectId, id: \"thr_1\" })\n const [created, replayed] = await Promise.all([\n storage.checkpoints.create(checkpointInput()),\n storage.checkpoints.create(checkpointInput()),\n ])\n\n expect(replayed).toEqual(created)\n expect(created).toMatchObject({\n id: \"checkpoint_1\",\n createdByRunId: \"run_2\",\n summarizedThroughSeq: 2,\n observedHeadSeq: 3,\n })\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toEqual(\n created\n )\n expect(\n await storage.checkpoints.getLatest({ projectId: otherProjectId, threadId: \"thr_1\" })\n ).toBeNull()\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_2\" })).toBeNull()\n await expect(\n storage.checkpoints.getByRunIds({\n projectId,\n runIds: [\"run_2\", \"missing\", \"run_2\"],\n })\n ).resolves.toEqual([created])\n await expect(\n storage.checkpoints.getByRunIds({\n projectId: otherProjectId,\n runIds: [\"run_2\"],\n })\n ).resolves.toEqual([])\n\n const retained = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n afterSeq: created.summarizedThroughSeq,\n order: \"asc\",\n })\n expect(retained.messages.map((message) => message.id)).toEqual([\"m3\"])\n\n const complete = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n order: \"asc\",\n })\n expect(complete.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\", \"m3\"])\n expect(await storage.threads.getById({ projectId, id: \"thr_1\" })).toEqual(threadBefore)\n })\n })\n\n test(\"rejects checkpoints from an inactive run or a different thread\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n\n await expectAgentError(\n storage.checkpoints.create(checkpointInput({ threadId: \"thr_2\" })),\n \"invalid_input\"\n )\n\n await storage.runs.finish({\n id: \"run_2\",\n projectId,\n executionToken: \"exec_2\",\n status: \"failed\",\n })\n await expectAgentError(storage.checkpoints.create(checkpointInput()), \"invalid_state\")\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toBeNull()\n })\n })\n\n test(\"rolls back a checkpoint with its containing storage transaction\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n const rollback = new Error(\"rollback checkpoint\")\n\n await expect(\n fixture.transaction(async (tx) => {\n if (!tx.agents) throw new Error(\"Expected agent storage in transaction.\")\n const created = await tx.agents.checkpoints.create(checkpointInput())\n expect(await tx.agents.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toEqual(\n created\n )\n throw rollback\n })\n ).rejects.toBe(rollback)\n\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toBeNull()\n })\n })\n\n test(\"fences checkpoint creation by execution, message head, and prior checkpoint\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n\n await expectAgentError(\n storage.checkpoints.create(checkpointInput({ executionToken: \"stale\" })),\n \"execution_lost\"\n )\n await expectAgentError(\n storage.checkpoints.create(\n checkpointInput({ expectedHeadSeq: 2, observedHeadSeq: 2, summarizedThroughSeq: 1 })\n ),\n \"invalid_state\"\n )\n await expectAgentError(\n storage.checkpoints.create(\n checkpointInput({ expectedPreviousCheckpointId: \"checkpoint_missing\" })\n ),\n \"invalid_state\"\n )\n await expectAgentError(\n storage.checkpoints.create(checkpointInput({ summarizedThroughSeq: 1 })),\n \"invalid_input\"\n )\n\n await storage.runs.reclaim({\n id: \"run_2\",\n projectId,\n execution: execution(\"exec_2_reclaimed\"),\n })\n await expectAgentError(storage.checkpoints.create(checkpointInput()), \"execution_lost\")\n\n const reclaimedInput = checkpointInput({ executionToken: \"exec_2_reclaimed\" })\n await storage.checkpoints.create(reclaimedInput)\n await expectAgentError(\n storage.checkpoints.create({ ...reclaimedInput, summary: \"different\" }),\n \"invalid_state\"\n )\n await expectAgentError(storage.checkpoints.create(checkpointInput()), \"execution_lost\")\n await storage.messages.append({\n id: \"m4\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_2\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"four\" }],\n })\n await expectAgentError(storage.checkpoints.create(reclaimedInput), \"invalid_state\")\n })\n })\n\n test(\"chains checkpoints only when the retained boundary advances\", async () => {\n await withStorage(async (storage, fixture) => {\n await prepareCheckpointCandidate(storage, fixture)\n await storage.checkpoints.create(checkpointInput())\n await storage.messages.append({\n id: \"m4\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_2\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"four\" }],\n })\n await storage.runs.finish({\n id: \"run_2\",\n projectId,\n executionToken: \"exec_2\",\n status: \"succeeded\",\n })\n await storage.messages.append({\n id: \"m5\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"five\" }],\n })\n await createAndStartRun(\n storage,\n fixture,\n runInput({ id: \"run_3\", triggerMessageId: \"m5\", execution: execution(\"exec_3\") })\n )\n\n await expectAgentError(\n storage.checkpoints.create(\n checkpointInput({\n id: \"checkpoint_2\",\n createdByRunId: \"run_3\",\n expectedPreviousCheckpointId: \"checkpoint_1\",\n expectedHeadSeq: 5,\n executionToken: \"exec_3\",\n summarizedThroughSeq: 2,\n observedHeadSeq: 5,\n })\n ),\n \"invalid_input\"\n )\n\n const second = await storage.checkpoints.create(\n checkpointInput({\n id: \"checkpoint_2\",\n createdByRunId: \"run_3\",\n expectedPreviousCheckpointId: \"checkpoint_1\",\n expectedHeadSeq: 5,\n executionToken: \"exec_3\",\n summary: \"The prior summary was extended through the fourth message.\",\n summarizedThroughSeq: 4,\n observedHeadSeq: 5,\n createdAt: at(\"2026-06-23T10:05:00.000Z\"),\n })\n )\n expect(second.previousCheckpointId).toBe(\"checkpoint_1\")\n expect(await storage.checkpoints.getLatest({ projectId, threadId: \"thr_1\" })).toEqual(\n second\n )\n })\n })\n })\n}\n",
|
|
8
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { AiCostStorage, AiModelCallCostRecord } from \"../storage/ai-cost\"\nimport { AiCostStorageError } from \"../storage/ai-cost\"\nimport type { AiUsageStorage } from \"../storage/ai-usage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\nexport interface AiStorageContractSuiteOptions<TStorage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly setup?: (storage: TStorage) => void | Promise<void>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"cost-contract-project\"\nconst executionId = \"exec_cost_1\"\nconst otherExecutionId = \"exec_cost_2\"\n\nfunction priceSource(entry: string) {\n return {\n sourceId: \"test-catalog\",\n sourceEntryId: entry,\n sourceVersion: \"test-catalog-v1\",\n sourceUrl: \"https://example.test/ai-pricing.json\",\n observedAt: new Date(\"2026-08-01T00:00:00.000Z\"),\n }\n}\n\nfunction ratedCost(\n usageRecordId = \"usage_1\",\n overrides: Partial<Extract<AiModelCallCostRecord, { status: \"rated\" }>> = {}\n): Extract<AiModelCallCostRecord, { status: \"rated\" }> {\n return {\n projectId,\n usageRecordId,\n status: \"rated\",\n billingIdentity: { providerId: \"vercel\", modelId: \"openai/gpt-5\" },\n pricingContext: {},\n priceSource: priceSource(\"vercel/openai/gpt-5\"),\n money: { currency: \"USD\", amountNanos: \"95000\" },\n components: [\n {\n meter: \"tokens.input.uncached\",\n quantity: \"12\",\n rateAmountNanosPerMillion: \"1250000000\",\n chargeAmountNanos: \"15000\",\n },\n {\n meter: \"tokens.input.cacheRead\",\n quantity: \"0\",\n rateAmountNanosPerMillion: \"125000000\",\n chargeAmountNanos: \"0\",\n },\n {\n meter: \"tokens.output.total\",\n quantity: \"8\",\n rateAmountNanosPerMillion: \"10000000000\",\n chargeAmountNanos: \"80000\",\n },\n ],\n ratedAt: new Date(\"2026-08-01T12:00:00.200Z\"),\n ...overrides,\n }\n}\n\nfunction unpriceableCost(): Extract<AiModelCallCostRecord, { status: \"unpriceable\" }> {\n return {\n projectId,\n usageRecordId: \"usage_2\",\n status: \"unpriceable\",\n billingIdentity: { providerId: \"vercel\", modelId: \"unpriced/model\" },\n pricingContext: {},\n reason: \"missingRateCard\",\n ratedAt: new Date(\"2026-08-01T12:00:00.200Z\"),\n }\n}\n\nexport function runAiCostStorageContractSuite<TStorage extends AiCostStorage>(\n name: string,\n options: AiStorageContractSuiteOptions<TStorage>\n): void {\n describe(name, () => {\n async function fixture(): Promise<TStorage> {\n const storage = await options.createStorage()\n await options.setup?.(storage)\n return storage\n }\n\n test(\"records model-call costs idempotently\", async () => {\n const storage = await fixture()\n try {\n await expect(storage.recordModelCallCost(ratedCost())).resolves.toBeUndefined()\n await expect(storage.recordModelCallCost(ratedCost())).resolves.toBeUndefined()\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n valuationStatus: \"rated\",\n })\n ).resolves.toMatchObject({\n total: 1,\n items: [\n {\n usage: {\n id: \"usage_1\",\n },\n cost: ratedCost(),\n valuationStatus: \"rated\",\n },\n ],\n })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"retains named, budgeted, and absent reasoning in accounting listings\", async () => {\n // Regression proof: omit requested_reasoning in either SQL accounting usageFromRow decoder.\n const storage = await fixture()\n try {\n const page = await storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n })\n expect(page.items.map(({ usage }) => [usage.id, usage.requestedReasoning])).toEqual([\n [\"usage_1\", \"high\"],\n [\"usage_2\", { budgetTokens: 4_096 }],\n [\"usage_3\", undefined],\n ])\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"retains an estimate beside an inline provider cost without double counting\", async () => {\n // Removal proof: drop estimate from the cost codec/normalizer, or sum it into the selected cost.\n const storage = await fixture()\n try {\n const local = ratedCost()\n const estimate = {\n status: \"rated\" as const,\n money: local.money,\n components: local.components,\n }\n const report: AiModelCallCostRecord = {\n ...local,\n status: \"rated\",\n money: { currency: \"USD\", amountNanos: \"80000\" },\n components: [],\n priceSource: { ...priceSource(\"generation-1\"), sourceId: \"provider-reported\" },\n estimate,\n }\n await Promise.all([\n storage.recordModelCallCost(report),\n storage.recordModelCallCost(report),\n ])\n expect(\n (await storage.summarizeExecutions({ projectId, executionIds: [executionId] }))[0]\n ?.amounts\n ).toEqual([{ currency: \"USD\", amountNanos: \"80000\" }])\n const page = await storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01\"),\n to: new Date(\"2026-08-02\"),\n valuationStatus: \"rated\",\n })\n expect(page.items[0]?.cost).toMatchObject({\n money: { amountNanos: \"80000\" },\n estimate,\n })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"stores explicit unpriceable results and pricing context\", async () => {\n const storage = await fixture()\n try {\n const deploymentCost: AiModelCallCostRecord = {\n projectId,\n usageRecordId: \"usage_deployment\",\n status: \"unpriceable\",\n billingIdentity: { providerId: \"openai\", modelId: \"gpt-5\" },\n pricingContext: { deploymentId: \"production\" },\n reason: \"unsupportedPricingDimension\",\n ratedAt: new Date(\"2026-08-03T12:00:00.200Z\"),\n }\n // Historical API allowed a report source even when no charge was available. This is\n // ambiguous history, not a provider cost. Regression proof: classify solely by sourceId.\n await storage.recordModelCallCost({\n ...unpriceableCost(),\n priceSource: { ...priceSource(\"unavailable-report\"), sourceId: \"provider-reported\" },\n })\n await storage.recordModelCallCost(deploymentCost)\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-03T00:00:00.000Z\"),\n to: new Date(\"2026-08-04T00:00:00.000Z\"),\n valuationStatus: \"unpriceable\",\n })\n ).resolves.toMatchObject({\n total: 1,\n items: [{ cost: deploymentCost, valuationStatus: \"unpriceable\" }],\n })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"summarizes and queries accounting without inventing missing costs\", async () => {\n const storage = await fixture()\n try {\n await storage.recordModelCallCost(ratedCost())\n await storage.recordModelCallCost(unpriceableCost())\n await expect(\n storage.summarizeExecutions({ projectId, executionIds: [executionId] })\n ).resolves.toEqual([\n {\n amounts: [{ currency: \"USD\", amountNanos: \"95000\" }],\n ratedCallCount: 1,\n unpriceableCallCount: 1,\n unvaluedCallCount: 1,\n },\n ])\n\n const overview = await storage.queryProjectOverview({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n bucket: \"day\",\n })\n expect(overview.totals).toEqual({\n modelCallCount: 3,\n usage: {\n inputTokens: 15,\n outputTokens: 12,\n totalTokens: 27,\n reportingStatus: \"complete\",\n },\n costs: {\n amounts: [{ currency: \"USD\", amountNanos: \"95000\" }],\n ratedCallCount: 1,\n unpriceableCallCount: 1,\n unvaluedCallCount: 1,\n },\n })\n expect(overview.series).toMatchObject([{ modelCallCount: 3 }])\n expect(overview.models).toMatchObject([\n { providerId: \"gateway\", modelId: \"openai/gpt-5\", modelCallCount: 2 },\n { providerId: \"gateway\", modelId: \"unpriced/model\", modelCallCount: 1 },\n ])\n await expect(\n storage.queryProjectOverview({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n bucket: \"day\",\n providerId: \"gateway\",\n modelId: \"unpriced/model\",\n })\n ).resolves.toMatchObject({ totals: { modelCallCount: 1 } })\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n limit: 1,\n offset: 1,\n })\n ).resolves.toMatchObject({\n total: 3,\n hasMore: true,\n items: [{ usage: { id: \"usage_2\" } }],\n })\n await expect(\n storage.listModelCalls({\n projectId,\n from: new Date(\"2026-08-01T00:00:00.000Z\"),\n to: new Date(\"2026-08-02T00:00:00.000Z\"),\n valuationStatus: \"unpriceable\",\n })\n ).resolves.toMatchObject({\n total: 1,\n hasMore: false,\n items: [{ usage: { id: \"usage_2\" }, valuationStatus: \"unpriceable\" }],\n })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"rejects missing usage and mismatched billed quantities\", async () => {\n const storage = await fixture()\n try {\n const missing = ratedCost(\"missing\")\n const missingError = await storage.recordModelCallCost(missing).catch((value) => value)\n expect(missingError).toBeInstanceOf(AiCostStorageError)\n expect((missingError as AiCostStorageError).code).toBe(\"missing_usage\")\n\n const base = ratedCost()\n const mismatch = ratedCost(\"usage_1\", {\n money: { currency: \"USD\", amountNanos: \"96250\" },\n components: [\n { ...base.components[0]!, quantity: \"13\", chargeAmountNanos: \"16250\" },\n ...base.components.slice(1),\n ],\n })\n const mismatchError = await storage.recordModelCallCost(mismatch).catch((value) => value)\n expect(mismatchError).toBeInstanceOf(AiCostStorageError)\n expect((mismatchError as AiCostStorageError).code).toBe(\"cost_mismatch\")\n // Removal proof: skip the estimate check in aiModelCallCostMatchesUsage; this is accepted.\n await expect(\n storage.recordModelCallCost({\n ...base,\n money: { currency: \"USD\", amountNanos: \"1\" },\n components: [],\n priceSource: { ...base.priceSource, sourceId: \"provider-reported\" },\n estimate: { status: \"rated\", money: mismatch.money, components: mismatch.components },\n })\n ).rejects.toMatchObject({ code: \"cost_mismatch\" })\n } finally {\n await options.cleanup?.(storage)\n }\n })\n })\n}\n\n/** Seed immutable usage used by every cost-storage provider contract. */\nexport async function seedAiCostStorageContractUsage(\n executions: ExecutionStorage,\n usage: AiUsageStorage\n): Promise<void> {\n for (const fixture of [\n { projectId, executionId },\n { projectId, executionId: otherExecutionId },\n ]) {\n if (await executions.getById({ projectId: fixture.projectId, id: fixture.executionId }))\n continue\n const primitive = {\n kind: \"workflow\" as const,\n id: \"ai-cost-contract\",\n runId: fixture.executionId,\n }\n await executions.create({\n id: fixture.executionId,\n projectId: fixture.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${fixture.executionId}` },\n correlationId: `test_correlation:${fixture.executionId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n }\n\n for (const fixture of [\n { id: \"usage_1\", model: \"openai/gpt-5\", input: 12, output: 8, reasoning: \"high\" as const },\n {\n id: \"usage_2\",\n model: \"unpriced/model\",\n input: 1,\n output: 1,\n reasoning: { budgetTokens: 4_096 },\n },\n { id: \"usage_3\", model: \"openai/gpt-5\", input: 2, output: 3, reasoning: undefined },\n ]) {\n await usage.recordModelCall({\n id: fixture.id,\n projectId,\n executionId,\n attempt: 1,\n callId: `call_${fixture.id}`,\n requesterGroupIds: [],\n providerId: \"gateway\",\n requestedModelId: fixture.model,\n ...(fixture.reasoning === undefined ? {} : { requestedReasoning: fixture.reasoning }),\n responseId: `response_${projectId}_${fixture.id}`,\n usage: {\n inputTokens: fixture.input,\n outputTokens: fixture.output,\n ...(fixture.id === \"usage_1\"\n ? { uncachedInputTokens: fixture.input, cacheReadInputTokens: 0 }\n : {}),\n },\n occurredAt: new Date(\"2026-08-01T12:00:00.000Z\"),\n recordedAt: new Date(\"2026-08-01T12:00:00.100Z\"),\n })\n }\n\n await usage.recordModelCall({\n id: \"usage_deployment\",\n projectId,\n executionId: otherExecutionId,\n attempt: 1,\n callId: \"call_usage_deployment\",\n requesterGroupIds: [],\n providerId: \"openai.responses\",\n requestedModelId: \"gpt-5\",\n responseId: \"response_usage_deployment\",\n usage: {\n inputTokens: 2,\n outputTokens: 3,\n uncachedInputTokens: 2,\n cacheReadInputTokens: 0,\n },\n occurredAt: new Date(\"2026-08-03T12:00:00.000Z\"),\n recordedAt: new Date(\"2026-08-03T12:00:00.100Z\"),\n })\n}\n",
|
|
9
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type {\n AiCostStorage,\n AiLimitQuantity,\n AiLimitStorage,\n AiLimitSubject,\n AiModelCallCostRecord,\n AiModelCallUsageInput,\n AiUsageStorage,\n AuthStorage,\n ExecutionStorage,\n ReserveAiModelCallInput,\n Storage,\n} from \"../storage\"\nimport { aiLimitCalendarMonth } from \"../storage\"\n\nexport interface AiLimitStorageContractStorage {\n readonly aiLimits: AiLimitStorage\n readonly aiCosts: AiCostStorage\n readonly aiUsage: AiUsageStorage\n readonly auth: AuthStorage\n readonly executions: ExecutionStorage\n readonly transaction: Storage[\"transaction\"]\n}\n\nexport interface AiLimitStorageContractSuiteOptions<\n TStorage extends AiLimitStorageContractStorage = AiLimitStorageContractStorage,\n> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly setup?: (storage: TStorage) => void | Promise<void>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"ai-limit-contract\"\nconst executionId = \"exec_ai_limit_1\"\n\nconst project: AiLimitSubject = { type: \"project\" }\nconst support: AiLimitSubject = { type: \"group\", id: \"support\" }\nconst user = { type: \"user\" as const, id: \"user-1\" }\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nfunction reservation(\n callId: string,\n tokens: number,\n overrides: Partial<ReserveAiModelCallInput> = {}\n): ReserveAiModelCallInput {\n return {\n projectId,\n executionId,\n attempt: 1,\n callId,\n subjects: [support, user],\n estimates: [{ meter: \"tokens.total\", amount: tokens }],\n reservedAt: at(\"2026-08-15T12:00:00.000Z\"),\n ...overrides,\n }\n}\n\n/** Run the provider-neutral AI policy, period-state, and reservation contract. */\nexport function runAiLimitStorageContractSuite<TStorage extends AiLimitStorageContractStorage>(\n label: string,\n options: AiLimitStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await seedAiLimitStorageContractExecution(storage.auth, storage.executions)\n await options.setup?.(storage)\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"uses inclusive-start, exclusive-end UTC calendar months\", () => {\n expect(aiLimitCalendarMonth(at(\"2026-12-31T23:59:59.999-05:00\"))).toEqual({\n kind: \"calendarMonth\",\n start: at(\"2027-01-01T00:00:00.000Z\"),\n end: at(\"2027-02-01T00:00:00.000Z\"),\n resetAt: at(\"2027-02-01T00:00:00.000Z\"),\n })\n })\n\n test(\"creates, lists, edits, disables, and deletes policies without ambiguous dimensions\", async () => {\n await withStorage(async ({ aiLimits }) => {\n const created = await aiLimits.createPolicy({\n id: \"project-tokens\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 100 },\n createdAt: at(\"2026-08-10T00:00:00.000Z\"),\n })\n expect(created).toMatchObject({ enabled: true, period: \"calendarMonth\" })\n await expect(\n aiLimits.createPolicy({\n id: \"duplicate-dimension\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 200 },\n })\n ).rejects.toMatchObject({ code: \"duplicate_policy\" })\n\n await expect(\n aiLimits.updatePolicy({\n projectId,\n id: created.id,\n limit: { meter: \"tokens.total\", amount: 250 },\n enabled: false,\n updatedAt: at(\"2026-08-11T00:00:00.000Z\"),\n })\n ).resolves.toMatchObject({ limit: { amount: 250 }, enabled: false })\n await expect(aiLimits.listPolicies({ projectId })).resolves.toEqual([])\n await expect(\n aiLimits.listPolicies({ projectId, includeDisabled: true })\n ).resolves.toHaveLength(1)\n await expect(aiLimits.deletePolicy({ projectId, id: created.id })).resolves.toBe(true)\n await expect(aiLimits.deletePolicy({ projectId, id: created.id })).resolves.toBe(false)\n await expect(\n aiLimits.createPolicy({\n id: \"cost-out-of-range\",\n projectId,\n subject: project,\n limit: {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"9223372036854775808\" },\n },\n })\n ).rejects.toThrow(\"exceeds the supported range\")\n await expect(\n aiLimits.createPolicy({\n id: \"cost-unsupported-currency\",\n projectId,\n subject: { type: \"group\", id: \"europe\" },\n limit: {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"EUR\", amountNanos: \"100\" },\n } as unknown as AiLimitQuantity,\n })\n ).rejects.toThrow(\"catalog-estimated cost currency must be 'USD'\")\n })\n })\n\n test(\"returns every applicable exhausted policy and the earliest reset\", async () => {\n await withStorage(async ({ aiLimits }) => {\n for (const [id, subject, amount] of [\n [\"project\", project, 10],\n [\"support\", support, 8],\n [\"user\", user, 100],\n ] as const) {\n await aiLimits.createPolicy({\n id,\n projectId,\n subject,\n limit: { meter: \"tokens.total\", amount },\n })\n }\n const result = await aiLimits.reserveModelCall(reservation(\"denied\", 11))\n expect(result).toMatchObject({\n status: \"denied\",\n exhaustedPolicies: [{ policy: { id: \"project\" } }, { policy: { id: \"support\" } }],\n resetAt: at(\"2026-09-01T00:00:00.000Z\"),\n })\n const statuses = await aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-20T00:00:00.000Z\"),\n existingGroupIds: [],\n })\n expect(statuses.find((status) => status.policy.id === \"support\")?.orphaned).toBe(true)\n expect(statuses.every((status) => status.consumption.reserved.amount === 0)).toBe(true)\n })\n })\n\n test(\"atomically prevents concurrent reservations from oversubscribing\", async () => {\n await withStorage(async ({ aiLimits }) => {\n await aiLimits.createPolicy({\n id: \"project\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n const results = await Promise.all([\n aiLimits.reserveModelCall(reservation(\"call-a\", 6)),\n aiLimits.reserveModelCall(reservation(\"call-b\", 6)),\n ])\n expect(results.map((result) => result.status).sort()).toEqual([\"denied\", \"reserved\"])\n const [status] = await aiLimits.listPolicyStatuses({ projectId, at: at(\"2026-08-20Z\") })\n expect(status?.consumption).toMatchObject({\n actual: { amount: 0 },\n reserved: { amount: 6 },\n unknown: { amount: 0 },\n remaining: { amount: 4 },\n })\n })\n })\n\n // Regression check: remove the provider's local operation lock and run this suite. Database\n // locks do not serialize concurrent operations using the same transaction client.\n for (const initialized of [false, true]) {\n test(`serializes reservations within one transaction (initialized=${initialized})`, async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"project\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n if (initialized) {\n await storage.aiLimits.listPolicyStatuses({ projectId, at: at(\"2026-08-20Z\") })\n }\n await storage.transaction(async (tx) => {\n const limits = tx.aiLimits!\n const results = await Promise.all([\n limits.reserveModelCall(reservation(\"call-a\", 6)),\n limits.reserveModelCall(reservation(\"call-b\", 6)),\n ])\n expect(results.map((result) => result.status).sort()).toEqual([\"denied\", \"reserved\"])\n const [status] = await limits.listPolicyStatuses({ projectId, at: at(\"2026-08-20Z\") })\n expect(status?.consumption.reserved.amount).toBe(6)\n expect(status?.consumption.remaining.amount).toBe(4)\n })\n })\n })\n }\n\n test(\"serializes reservation replays and unknown transitions within one transaction\", async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"project\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n await storage.transaction(async (tx) => {\n const limits = tx.aiLimits!\n const identity = reservation(\"replay\", 6)\n const results = await Promise.all([\n limits.reserveModelCall(identity),\n limits.reserveModelCall(identity),\n ])\n expect(results).toMatchObject([\n { status: \"reserved\", created: true },\n { status: \"reserved\", created: false },\n ])\n await expect(limits.reserveModelCall(reservation(\"replay\", 7))).rejects.toMatchObject({\n code: \"reservation_conflict\",\n })\n await Promise.all([\n limits.markReservationUnknown(identity),\n limits.markReservationUnknown(identity),\n ])\n const [status] = await limits.listPolicyStatuses({ projectId, at: at(\"2026-08-20Z\") })\n expect(status?.consumption).toMatchObject({\n reserved: { amount: 0 },\n unknown: { amount: 6 },\n remaining: { amount: 4 },\n })\n })\n })\n })\n\n test(\"rolls back queued limit operations when a parallel operation rejects\", async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"project\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n await expect(\n storage.transaction(async (tx) => {\n await Promise.all([\n tx.aiLimits!.reserveModelCall(reservation(\"invalid\", 1, { attempt: 0 })),\n tx.aiLimits!.reserveModelCall(reservation(\"queued\", 6)),\n ])\n })\n ).rejects.toBeInstanceOf(TypeError)\n const [status] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-20Z\"),\n })\n expect(status?.consumption.reserved.amount).toBe(0)\n await expect(\n storage.aiLimits.reserveModelCall(reservation(\"queued\", 6))\n ).resolves.toMatchObject({\n status: \"reserved\",\n created: true,\n })\n })\n })\n\n test(\"reserves only exact subject-meter policy buckets\", async () => {\n await withStorage(async ({ aiLimits }) => {\n await aiLimits.createPolicy({\n id: \"project-tokens\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 100 },\n })\n await aiLimits.createPolicy({\n id: \"user-cost\",\n projectId,\n subject: user,\n limit: {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"100\" },\n },\n })\n const result = await aiLimits.reserveModelCall(\n reservation(\"exact-buckets\", 5, {\n estimates: [\n { meter: \"tokens.total\", amount: 5 },\n {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"7\" },\n },\n ],\n })\n )\n expect(result).toMatchObject({\n status: \"reserved\",\n reservation: {\n buckets: [\n { subject: project, estimate: { meter: \"tokens.total\", amount: 5 } },\n {\n subject: user,\n estimate: {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"7\" },\n },\n },\n ],\n },\n })\n })\n })\n\n test(\"replays an identical reservation and rejects a mismatched identity replay\", async () => {\n await withStorage(async ({ aiLimits }) => {\n await aiLimits.createPolicy({\n id: \"replay-policy\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 100 },\n })\n const first = await aiLimits.reserveModelCall(reservation(\"replay\", 5))\n const replay = await aiLimits.reserveModelCall(reservation(\"replay\", 5))\n expect(first).toMatchObject({ status: \"reserved\", created: true })\n expect(replay).toMatchObject({ status: \"reserved\", created: false })\n await expect(aiLimits.reserveModelCall(reservation(\"replay\", 6))).rejects.toMatchObject({\n code: \"reservation_conflict\",\n })\n })\n })\n\n test(\"does not authorize a terminal reservation replay\", async () => {\n await withStorage(async (storage) => {\n const { aiLimits } = storage\n await aiLimits.createPolicy({\n id: \"terminal-policy\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n const identity = reservation(\"terminal-replay\", 5)\n await aiLimits.reserveModelCall(identity)\n await recordUsage(storage.aiUsage, \"usage-terminal\", identity.callId, 3)\n await aiLimits.recordModelCallActuals({\n projectId,\n usageRecordId: \"usage-terminal\",\n })\n await aiLimits.reconcileModelCall({ ...identity, usageRecordId: \"usage-terminal\" })\n await expect(aiLimits.reserveModelCall(identity)).resolves.toMatchObject({\n status: \"terminal\",\n created: false,\n reservation: { state: \"reconciled\" },\n })\n })\n })\n\n test(\"fails closed when an applicable policy has no estimate\", async () => {\n await withStorage(async ({ aiLimits }) => {\n await aiLimits.createPolicy({\n id: \"tokens\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n const result = await aiLimits.reserveModelCall(\n reservation(\"missing-estimate\", 1, {\n estimates: [\n {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"1\" },\n },\n ],\n })\n )\n expect(result).toMatchObject({\n status: \"unavailable\",\n unavailablePolicies: [{ policy: { id: \"tokens\" } }],\n reasons: [\"missingEstimate\"],\n })\n })\n })\n\n test(\"reconciles estimates to actual usage exactly once\", async () => {\n await withStorage(async (storage) => {\n const { aiLimits } = storage\n await aiLimits.createPolicy({\n id: \"project\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 20 },\n })\n await aiLimits.reserveModelCall(reservation(\"reconcile\", 10))\n await recordUsage(storage.aiUsage, \"usage-reconcile\", \"reconcile\", 7)\n await aiLimits.recordModelCallActuals({\n projectId,\n usageRecordId: \"usage-reconcile\",\n })\n const input = {\n projectId,\n executionId,\n attempt: 1,\n callId: \"reconcile\",\n usageRecordId: \"usage-reconcile\",\n reconciledAt: at(\"2026-08-15T12:00:01.000Z\"),\n }\n await expect(aiLimits.reconcileModelCall(input)).resolves.toMatchObject({\n state: \"reconciled\",\n usageRecordId: \"usage-reconcile\",\n })\n await expect(aiLimits.reconcileModelCall(input)).resolves.toMatchObject({\n state: \"reconciled\",\n })\n await expect(\n aiLimits.reconcileModelCall({ ...input, usageRecordId: \"another-usage\" })\n ).rejects.toMatchObject({ code: \"reconciliation_conflict\" })\n const [status] = await aiLimits.listPolicyStatuses({ projectId, at: input.reconciledAt })\n expect(status?.consumption).toMatchObject({\n actual: { amount: 7 },\n reserved: { amount: 0 },\n unknown: { amount: 0 },\n remaining: { amount: 13 },\n })\n })\n })\n\n test(\"rejects a usage record that belongs to another provider call\", async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"usage-mismatch-policy\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 100 },\n })\n const identity = reservation(\"expected-call\", 5)\n await storage.aiLimits.reserveModelCall(identity)\n await recordUsage(storage.aiUsage, \"usage-wrong-call\", \"different-call\", 3)\n await expect(\n storage.aiLimits.reconcileModelCall({\n ...identity,\n usageRecordId: \"usage-wrong-call\",\n })\n ).rejects.toMatchObject({ code: \"usage_mismatch\" })\n })\n })\n\n test(\"conservatively converts a reservation to unknown when actuals are unavailable\", async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"tokens\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n const identity = reservation(\"partial-reconciliation\", 5)\n await storage.aiLimits.reserveModelCall(identity)\n await recordUsageInput(storage.aiUsage, {\n id: \"usage-partial-reconciliation\",\n callId: identity.callId,\n usage: { inputTokens: 3 },\n })\n await storage.aiLimits.recordModelCallActuals({\n projectId,\n usageRecordId: \"usage-partial-reconciliation\",\n })\n await expect(\n storage.aiLimits.reconcileModelCall({\n ...identity,\n usageRecordId: \"usage-partial-reconciliation\",\n })\n ).resolves.toMatchObject({ state: \"reconciled\" })\n const [status] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: identity.reservedAt,\n })\n expect(status).toMatchObject({\n accountingStatus: \"unavailable\",\n consumption: { reserved: { amount: 0 }, unknown: { amount: 5 } },\n })\n })\n })\n\n test(\"fails closed when historical token accounting is incomplete\", async () => {\n await withStorage(async (storage) => {\n await recordUsageInput(storage.aiUsage, {\n id: \"usage-partial\",\n callId: \"partial\",\n usage: { inputTokens: 3 },\n })\n await storage.aiLimits.createPolicy({\n id: \"tokens\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n const [status] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-15T12:00:01.000Z\"),\n })\n expect(status).toMatchObject({\n accountingStatus: \"unavailable\",\n consumption: { actual: { amount: 0 } },\n })\n await expect(\n storage.aiLimits.reserveModelCall(reservation(\"after-partial\", 1))\n ).resolves.toMatchObject({\n status: \"unavailable\",\n reasons: [\"incompleteAccounting\"],\n })\n })\n })\n\n test(\"charges actuals to the ledger occurrence month\", async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"tokens\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 20 },\n })\n const identity = reservation(\"month-boundary\", 10, {\n reservedAt: at(\"2026-08-31T23:59:59.000Z\"),\n })\n await storage.aiLimits.reserveModelCall(identity)\n await recordUsage(storage.aiUsage, \"usage-month-boundary\", \"month-boundary\", 7, {\n occurredAt: at(\"2026-09-01T00:00:00.000Z\"),\n })\n await storage.aiLimits.recordModelCallActuals({\n projectId,\n usageRecordId: \"usage-month-boundary\",\n })\n await expect(\n storage.aiLimits.reconcileModelCall({\n ...identity,\n usageRecordId: \"usage-month-boundary\",\n reconciledAt: at(\"2026-09-01T00:00:01.000Z\"),\n })\n ).resolves.toMatchObject({ state: \"reconciled\" })\n const [august] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-31T23:59:59.999Z\"),\n })\n const [september] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-09-01T00:00:00.000Z\"),\n })\n expect(august?.consumption).toMatchObject({\n actual: { amount: 0 },\n reserved: { amount: 0 },\n })\n expect(september?.consumption).toMatchObject({\n actual: { amount: 7 },\n remaining: { amount: 13 },\n })\n })\n })\n\n test(\"holds unknown capacity until it is reconciled\", async () => {\n await withStorage(async (storage) => {\n const { aiLimits } = storage\n await aiLimits.createPolicy({\n id: \"project\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n const identity = reservation(\"unknown\", 8)\n await aiLimits.reserveModelCall(identity)\n await aiLimits.markReservationUnknown({ ...identity, markedAt: at(\"2026-08-15T12:01Z\") })\n let [status] = await aiLimits.listPolicyStatuses({ projectId, at: identity.reservedAt })\n expect(status?.consumption).toMatchObject({\n reserved: { amount: 0 },\n unknown: { amount: 8 },\n remaining: { amount: 2 },\n })\n await recordUsage(storage.aiUsage, \"usage-unknown\", identity.callId, 3)\n await aiLimits.recordModelCallActuals({ projectId, usageRecordId: \"usage-unknown\" })\n await aiLimits.reconcileModelCall({\n ...identity,\n usageRecordId: \"usage-unknown\",\n reconciledAt: at(\"2026-08-15T12:02Z\"),\n })\n ;[status] = await aiLimits.listPolicyStatuses({ projectId, at: identity.reservedAt })\n expect(status?.consumption).toMatchObject({\n actual: { amount: 3 },\n unknown: { amount: 0 },\n remaining: { amount: 7 },\n })\n })\n })\n\n test(\"counts usage recorded before a policy is created and preserves it across recreation\", async () => {\n await withStorage(async (storage) => {\n const identity = reservation(\"before-policy\", 10)\n await recordUsage(storage.aiUsage, \"usage-before-policy\", \"before-policy\", 7)\n await storage.aiLimits.createPolicy({\n id: \"created-mid-month\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n let [status] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: identity.reservedAt,\n })\n expect(status?.consumption.actual).toEqual({ meter: \"tokens.total\", amount: 7 })\n await storage.aiLimits.updatePolicy({\n projectId,\n id: \"created-mid-month\",\n limit: { meter: \"tokens.total\", amount: 20 },\n })\n await storage.aiLimits.deletePolicy({ projectId, id: \"created-mid-month\" })\n await storage.aiLimits.createPolicy({\n id: \"recreated\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 30 },\n })\n ;[status] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: identity.reservedAt,\n })\n expect(status?.consumption).toMatchObject({\n actual: { amount: 7 },\n remaining: { amount: 23 },\n })\n })\n })\n\n test(\"derives each subject's actuals from immutable execution and usage attribution\", async () => {\n await withStorage(async (storage) => {\n const engineering = { type: \"group\" as const, id: \"engineering\" }\n const serviceAccount = { type: \"serviceAccount\" as const, id: \"automation\" }\n await recordUsage(storage.aiUsage, \"usage-all-subjects\", \"all-subjects\", 7, {\n requesterGroupIds: [\"support\", \"engineering\"],\n })\n\n const serviceExecutionId = \"exec_ai_limit_service\"\n await seedPrincipalExecution(\n storage.auth,\n storage.executions,\n serviceExecutionId,\n serviceAccount\n )\n await recordUsage(storage.aiUsage, \"usage-service-account\", \"service-account\", 3, {\n executionId: serviceExecutionId,\n requesterGroupIds: [],\n })\n\n for (const [id, subject] of [\n [\"project-subject\", project],\n [\"support-subject\", support],\n [\"engineering-subject\", engineering],\n [\"user-subject\", user],\n [\"service-account-subject\", serviceAccount],\n ] as const) {\n await storage.aiLimits.createPolicy({\n id,\n projectId,\n subject,\n limit: { meter: \"tokens.total\", amount: 20 },\n })\n }\n const august = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-31T23:59:59.999Z\"),\n })\n expect(\n Object.fromEntries(\n august.map((status) => [status.policy.id, status.consumption.actual.amount])\n )\n ).toEqual({\n \"engineering-subject\": 7,\n \"project-subject\": 10,\n \"service-account-subject\": 3,\n \"support-subject\": 7,\n \"user-subject\": 7,\n })\n const september = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-09-01T00:00:00.000Z\"),\n })\n expect(september.map((status) => status.consumption.actual.amount)).toEqual([0, 0, 0, 0, 0])\n })\n })\n\n test(\"derives catalog-estimated cost from the immutable valuation ledger\", async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"cost\",\n projectId,\n subject: project,\n limit: {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"1000000000\" },\n },\n })\n const identity = reservation(\"cost\", 1, {\n estimates: [\n {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"250000000\" },\n },\n ],\n })\n const result = await storage.aiLimits.reserveModelCall(identity)\n expect(result.status).toBe(\"reserved\")\n await recordUsage(storage.aiUsage, \"usage-cost\", \"cost\", 1)\n await storage.aiCosts.recordModelCallCost(ratedCost(\"usage-cost\", \"250000000\"))\n await storage.aiLimits.recordModelCallActuals({\n projectId,\n usageRecordId: \"usage-cost\",\n })\n await expect(\n storage.aiLimits.reconcileModelCall({\n ...identity,\n usageRecordId: \"usage-cost\",\n })\n ).resolves.toMatchObject({ state: \"reconciled\" })\n const [status] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-15T12:00:00.000Z\"),\n })\n expect(status).toMatchObject({\n accountingStatus: \"complete\",\n consumption: {\n actual: { amount: { currency: \"USD\", amountNanos: \"250000000\" } },\n reserved: { amount: { currency: \"USD\", amountNanos: \"0\" } },\n remaining: { amount: { currency: \"USD\", amountNanos: \"750000000\" } },\n },\n })\n })\n })\n\n // Regression check: remove the unavailable-period refresh in the provider's status\n // path and run this suite with --test-name-pattern \"refreshes repaired cost accounting\".\n for (const initialized of [false, true]) {\n for (const via of [\"status\", \"admission\"] as const) {\n test(`refreshes repaired cost accounting via ${via} (initialized=${initialized})`, async () => {\n await withStorage(async (storage) => {\n const cost = (amountNanos: string): AiLimitQuantity => ({\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos },\n })\n const request = (callId: string, amount: string) =>\n reservation(callId, 0, { estimates: [cost(amount)] })\n const statuses = () =>\n storage.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-15T12:00:00.000Z\"),\n })\n await storage.aiLimits.createPolicy({\n id: \"cost\",\n projectId,\n subject: support,\n limit: cost(\"1000\"),\n })\n if (initialized) {\n expect(\n (await storage.aiLimits.reserveModelCall(request(\"active\", \"100\"))).status\n ).toBe(\"reserved\")\n expect(\n (await storage.aiLimits.reserveModelCall(request(\"unknown\", \"200\"))).status\n ).toBe(\"reserved\")\n await storage.aiLimits.markReservationUnknown(request(\"unknown\", \"200\"))\n }\n for (const id of [\"missing-a\", \"missing-b\"]) {\n await recordUsage(storage.aiUsage, id, id, 1)\n if (initialized) {\n await storage.aiLimits.recordModelCallActuals({ projectId, usageRecordId: id })\n }\n }\n expect((await statuses())[0]?.accountingStatus).toBe(\"unavailable\")\n await storage.aiCosts.recordModelCallCost(ratedCost(\"missing-a\", \"150\"))\n expect((await statuses())[0]).toMatchObject({\n accountingStatus: \"unavailable\",\n consumption: { actual: cost(\"150\") },\n })\n await expect(\n storage.aiLimits.reserveModelCall(request(\"still-incomplete\", \"1\"))\n ).resolves.toMatchObject({ status: \"unavailable\", reasons: [\"incompleteAccounting\"] })\n\n await expect(\n storage.transaction(async (tx) => {\n if (!tx.aiCosts || !tx.aiLimits) throw new Error(\"Expected accounting storage\")\n await tx.aiCosts.recordModelCallCost(ratedCost(\"missing-b\", \"50\"))\n const [status] = await tx.aiLimits.listPolicyStatuses({\n projectId,\n at: at(\"2026-08-15T12:00:00.000Z\"),\n })\n expect(status?.accountingStatus).toBe(\"complete\")\n throw new Error(\"roll back accounting repair\")\n })\n ).rejects.toThrow(\"roll back accounting repair\")\n expect((await statuses())[0]?.accountingStatus).toBe(\"unavailable\")\n\n // Recovery appends the missing valuation, but replays an existing usage record:\n // recordModelCallActuals must not be called again or tokens would be double-counted.\n await storage.aiCosts.recordModelCallCost(ratedCost(\"missing-b\", \"50\"))\n if (via === \"admission\") {\n await expect(\n storage.aiLimits.reserveModelCall(request(\"too-large\", \"1001\"))\n ).resolves.toMatchObject({ status: \"denied\" })\n }\n for (let read = 0; read < 2; read++) {\n expect((await statuses())[0]).toMatchObject({\n accountingStatus: \"complete\",\n consumption: {\n actual: cost(\"200\"),\n reserved: cost(initialized ? \"100\" : \"0\"),\n unknown: cost(initialized ? \"200\" : \"0\"),\n remaining: cost(initialized ? \"500\" : \"800\"),\n },\n })\n }\n await recordUsage(storage.aiUsage, \"next-actual\", \"next-actual\", 1)\n await storage.aiCosts.recordModelCallCost(ratedCost(\"next-actual\", \"50\"))\n await storage.aiLimits.recordModelCallActuals({\n projectId,\n usageRecordId: \"next-actual\",\n })\n const remaining = initialized ? 450 : 750\n await expect(\n storage.aiLimits.reserveModelCall(request(\"over-budget\", String(remaining + 1)))\n ).resolves.toMatchObject({ status: \"denied\" })\n await expect(\n storage.aiLimits.reserveModelCall(request(\"fits\", String(remaining)))\n ).resolves.toMatchObject({ status: \"reserved\" })\n })\n })\n }\n }\n\n test(\"fails cost admission closed until every applicable call is valued\", async () => {\n await withStorage(async (storage) => {\n await recordUsage(storage.aiUsage, \"usage-unvalued\", \"unvalued\", 1)\n await storage.aiLimits.createPolicy({\n id: \"cost\",\n projectId,\n subject: project,\n limit: {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"1000000000\" },\n },\n })\n await expect(\n storage.aiLimits.reserveModelCall(\n reservation(\"after-unvalued\", 1, {\n estimates: [\n {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"1\" },\n },\n ],\n })\n )\n ).resolves.toMatchObject({\n status: \"unavailable\",\n reasons: [\"incompleteAccounting\"],\n })\n\n await storage.aiCosts.recordModelCallCost(unpriceableCost(\"usage-unvalued\"))\n await expect(\n storage.aiLimits.reserveModelCall(\n reservation(\"after-unpriceable\", 1, {\n estimates: [\n {\n meter: \"cost.catalogEstimated\",\n amount: { currency: \"USD\", amountNanos: \"1\" },\n },\n ],\n })\n )\n ).resolves.toMatchObject({\n status: \"unavailable\",\n reasons: [\"incompleteAccounting\"],\n })\n })\n })\n\n test(\"rolls policy and reservation state back with the root storage transaction\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.transaction(async (tx) => {\n const limits = tx.aiLimits\n if (!limits) throw new Error(\"Expected AI limit storage in transaction\")\n await limits.createPolicy({\n id: \"rolled-back\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n await limits.reserveModelCall(reservation(\"rolled-back\", 5))\n throw new Error(\"rollback\")\n })\n ).rejects.toThrow(\"rollback\")\n await expect(\n storage.aiLimits.getPolicy({ projectId, id: \"rolled-back\" })\n ).resolves.toBeNull()\n await expect(\n storage.aiLimits.reserveModelCall(reservation(\"after-rollback\", 10))\n ).resolves.toEqual({ status: \"notRequired\" })\n })\n })\n\n test(\"rolls ledger accounting and reconciliation back together\", async () => {\n await withStorage(async (storage) => {\n await storage.aiLimits.createPolicy({\n id: \"transactional-accounting\",\n projectId,\n subject: project,\n limit: { meter: \"tokens.total\", amount: 10 },\n })\n const identity = reservation(\"transactional-accounting\", 5)\n await storage.aiLimits.reserveModelCall(identity)\n\n await expect(\n storage.transaction(async (tx) => {\n if (!tx.aiUsage || !tx.aiLimits) {\n throw new Error(\"Expected AI accounting and limit storage in transaction\")\n }\n await recordUsage(tx.aiUsage, \"usage-transactional-accounting\", identity.callId, 3)\n await tx.aiLimits.recordModelCallActuals({\n projectId,\n usageRecordId: \"usage-transactional-accounting\",\n })\n await tx.aiLimits.reconcileModelCall({\n ...identity,\n usageRecordId: \"usage-transactional-accounting\",\n })\n throw new Error(\"rollback accounting\")\n })\n ).rejects.toThrow(\"rollback accounting\")\n\n await expect(\n storage.aiUsage.summarizeExecution({ projectId, executionId })\n ).resolves.toMatchObject({ modelCallCount: 0 })\n const [status] = await storage.aiLimits.listPolicyStatuses({\n projectId,\n at: identity.reservedAt,\n })\n expect(status?.consumption).toMatchObject({\n actual: { amount: 0 },\n reserved: { amount: 5 },\n remaining: { amount: 5 },\n })\n })\n })\n })\n}\n\nexport async function seedAiLimitStorageContractExecution(\n auth: AuthStorage,\n executions: ExecutionStorage\n): Promise<void> {\n if (!(await auth.users.getById({ projectId, id: user.id }))) {\n await auth.users.create({\n id: user.id,\n projectId,\n email: \"ai-limit-user@example.test\",\n createdAt: at(\"2026-08-01T00:00:00.000Z\"),\n updatedAt: at(\"2026-08-01T00:00:00.000Z\"),\n })\n }\n if (await executions.getById({ projectId, id: executionId })) return\n const primitive = { kind: \"workflow\" as const, id: \"ai-limit-contract\", runId: executionId }\n await executions.create({\n id: executionId,\n projectId,\n requestedBy: user,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${executionId}` },\n correlationId: `test_correlation:${executionId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n}\n\nasync function seedPrincipalExecution(\n auth: AuthStorage,\n executions: ExecutionStorage,\n id: string,\n principal:\n | { readonly type: \"user\"; readonly id: string }\n | { readonly type: \"serviceAccount\"; readonly id: string }\n): Promise<void> {\n if (principal.type === \"serviceAccount\") {\n if (!(await auth.serviceAccounts.getById({ projectId, id: principal.id }))) {\n await auth.serviceAccounts.create({\n id: principal.id,\n projectId,\n name: \"AI limit contract service account\",\n createdAt: at(\"2026-08-01T00:00:00.000Z\"),\n updatedAt: at(\"2026-08-01T00:00:00.000Z\"),\n })\n }\n }\n if (await executions.getById({ projectId, id })) return\n const primitive = { kind: \"workflow\" as const, id: \"ai-limit-contract\", runId: id }\n await executions.create({\n id,\n projectId,\n requestedBy: principal,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${id}` },\n correlationId: `test_correlation:${id}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n}\n\nasync function recordUsage(\n storage: AiUsageStorage,\n id: string,\n callId: string,\n totalTokens: number,\n overrides: {\n readonly executionId?: string\n readonly requesterGroupIds?: readonly string[]\n readonly occurredAt?: Date\n } = {}\n): Promise<void> {\n await recordUsageInput(storage, {\n id,\n callId,\n executionId: overrides.executionId,\n requesterGroupIds: overrides.requesterGroupIds,\n occurredAt: overrides.occurredAt,\n usage: { inputTokens: totalTokens, outputTokens: 0 },\n })\n}\n\nasync function recordUsageInput(\n storage: AiUsageStorage,\n input: {\n readonly id: string\n readonly callId: string\n readonly executionId?: string\n readonly requesterGroupIds?: readonly string[]\n readonly occurredAt?: Date\n readonly usage: AiModelCallUsageInput\n }\n): Promise<void> {\n await storage.recordModelCall({\n id: input.id,\n projectId,\n executionId: input.executionId ?? executionId,\n attempt: 1,\n callId: input.callId,\n requesterGroupIds: input.requesterGroupIds ?? [\"support\"],\n providerId: \"test\",\n requestedModelId: \"test/model\",\n responseId: `response:${input.callId}`,\n usage: input.usage,\n occurredAt: input.occurredAt ?? at(\"2026-08-15T12:00:00.500Z\"),\n recordedAt: at(\"2026-08-15T12:00:00.600Z\"),\n })\n}\n\nfunction ratedCost(usageRecordId: string, amountNanos: string): AiModelCallCostRecord {\n return {\n projectId,\n usageRecordId,\n status: \"rated\",\n billingIdentity: { providerId: \"test\", modelId: \"test/model\" },\n pricingContext: {},\n priceSource: {\n sourceId: \"test-catalog\",\n sourceEntryId: \"test/model\",\n sourceVersion: \"v1\",\n sourceUrl: \"https://example.test/catalog.json\",\n observedAt: at(\"2026-08-01T00:00:00.000Z\"),\n },\n money: { currency: \"USD\", amountNanos },\n components: [\n {\n meter: \"tokens.input.total\",\n quantity: \"1\",\n rateAmountNanosPerMillion: (BigInt(amountNanos) * 1_000_000n).toString(),\n chargeAmountNanos: amountNanos,\n },\n {\n meter: \"tokens.output.total\",\n quantity: \"0\",\n rateAmountNanosPerMillion: \"0\",\n chargeAmountNanos: \"0\",\n },\n ],\n ratedAt: at(\"2026-08-15T12:00:00.700Z\"),\n }\n}\n\nfunction unpriceableCost(usageRecordId: string): AiModelCallCostRecord {\n return {\n projectId,\n usageRecordId,\n status: \"unpriceable\",\n billingIdentity: { providerId: \"test\", modelId: \"test/model\" },\n pricingContext: {},\n priceSource: {\n sourceId: \"test-catalog\",\n sourceEntryId: \"test/model\",\n sourceVersion: \"v1\",\n sourceUrl: \"https://example.test/catalog.json\",\n observedAt: at(\"2026-08-01T00:00:00.000Z\"),\n },\n reason: \"unsupportedPricingDimension\",\n ratedAt: at(\"2026-08-15T12:00:00.700Z\"),\n }\n}\n",
|
|
10
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { Storage } from \"../storage/types\"\nimport { workflowAgentStepActorId } from \"../workflows/agent-step-identity\"\nimport { createTestAgentExecution } from \"./agent-execution\"\nimport type { AiStorageContractSuiteOptions } from \"./ai-cost-storage-contract\"\nimport { createTestWorkflowExecution } from \"./workflow-execution\"\n\nexport type AiModelCallGroupsContractStorage = Required<\n Pick<Storage, \"agents\" | \"aiUsage\" | \"aiCosts\" | \"executions\" | \"workflowRuns\">\n>\n\nconst projectId = \"model-call-groups\"\nconst range = {\n projectId,\n from: new Date(\"2026-09-01T00:00:00Z\"),\n to: new Date(\"2026-09-02T00:00:00Z\"),\n}\n\n/** Regression: grouping the raw-call page instead of the full filtered set breaks these totals. */\nexport function runAiModelCallGroupsContractSuite<T extends AiModelCallGroupsContractStorage>(\n name: string,\n options: AiStorageContractSuiteOptions<T>\n): void {\n describe(name, () => {\n test(\"attributes workflow usage to step references and keeps same-named steps separate\", async () => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n for (const [index, workflowId] of [\"billing\", \"billing\", \"shipping\"].entries()) {\n await seedWorkflowCall(storage, workflowId, `workflow-run-${index}`)\n }\n const overview = await storage.aiCosts.queryProjectOverview({ ...range, bucket: \"day\" })\n // Regression proof: grouping only by step id merges billing and shipping; exposing\n // the actor id instead of the step references fails these exact projections.\n expect(\n overview.agents.map((entry) => ({\n kind: entry.kind,\n modelCallCount: entry.modelCallCount,\n ...(entry.kind === \"workflowAgent\"\n ? { workflowId: entry.workflowId, agentStepId: entry.agentStepId }\n : {}),\n }))\n ).toEqual([\n {\n kind: \"workflowAgent\",\n workflowId: \"billing\",\n agentStepId: \"review\",\n modelCallCount: 2,\n },\n {\n kind: \"workflowAgent\",\n workflowId: \"shipping\",\n agentStepId: \"review\",\n modelCallCount: 1,\n },\n ])\n expect(overview.totals.costs.amounts).toEqual([{ currency: \"USD\", amountNanos: \"30\" }])\n const calls = await storage.aiCosts.listModelCalls(range)\n const groups = await storage.aiCosts.listModelCallGroups(range)\n expect(calls.total).toBe(3)\n expect(groups.total).toBe(3)\n for (const call of calls.items) {\n const runId = call.usage.callId\n const workflowId = runId === \"workflow-run-2\" ? \"shipping\" : \"billing\"\n const attribution = {\n kind: \"workflowAgent\" as const,\n workflowId,\n agentStepId: \"review\",\n workflowRunId: runId,\n nodeRunId: `${runId}:node:0`,\n }\n expect(call.attribution).toEqual(attribution)\n const group = groups.items.find((item) => item.executionId === call.usage.executionId)\n expect(group?.attribution).toEqual(attribution)\n expect(group?.executions[0]?.attribution).toEqual(attribution)\n }\n } finally {\n await options.cleanup?.(storage)\n }\n })\n\n test(\"paginates whole runs, keeps filtered parents, and preserves exact accounting\", async () => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n await seed(storage)\n const first = await storage.aiCosts.listModelCallGroups({ ...range, limit: 1 })\n expect(first).toMatchObject({\n total: 2,\n hasMore: true,\n items: [{ executionId: \"exec_second\", modelCallCount: 1 }],\n })\n const second = await storage.aiCosts.listModelCallGroups({ ...range, limit: 1, offset: 1 })\n expect(second).toMatchObject({\n total: 2,\n hasMore: false,\n items: [\n {\n executionId: \"exec_parent\",\n modelCallCount: 32,\n attribution: { kind: \"agent\", agentRunId: \"parent\", threadId: \"thread\" },\n costs: {\n amounts: [\n { currency: \"EUR\", amountNanos: \"0\" },\n { currency: \"USD\", amountNanos: \"300\" },\n ],\n ratedCallCount: 31,\n unvaluedCallCount: 1,\n },\n executions: [\n { executionId: \"exec_parent\", modelCallCount: 1, totalTokens: 3 },\n {\n executionId: \"exec_child\",\n modelCallCount: 31,\n attribution: { kind: \"subagent\", parentRunId: \"parent\", subagentRunId: \"child\" },\n },\n ],\n },\n ],\n })\n expect(second.items[0]?.totalTokens).toBeUndefined()\n const filtered = await storage.aiCosts.listModelCallGroups({\n ...range,\n providerId: \"child-provider\",\n modelId: \"small\",\n valuationStatus: \"rated\",\n })\n expect(filtered).toMatchObject({\n total: 1,\n items: [\n {\n executionId: \"exec_parent\",\n modelCallCount: 30,\n totalTokens: 90,\n costs: {\n amounts: [{ currency: \"USD\", amountNanos: \"300\" }],\n ratedCallCount: 30,\n unvaluedCallCount: 0,\n },\n executions: [{ executionId: \"exec_child\", modelCallCount: 30 }],\n },\n ],\n })\n expect(filtered.items[0]?.executions).toHaveLength(1)\n const late = await storage.aiCosts.listModelCallGroups({\n ...range,\n from: new Date(\"2026-09-01T12:00:01Z\"),\n to: new Date(\"2026-09-01T12:00:32Z\"),\n })\n expect(late).toMatchObject({\n total: 1,\n items: [{ executionId: \"exec_parent\", modelCallCount: 31 }],\n })\n const unknown = await storage.aiCosts.listModelCallGroups({\n ...range,\n valuationStatus: \"unvalued\",\n modelId: \"small\",\n })\n expect(unknown.items[0]?.costs.amounts).toEqual([])\n expect(unknown.items[0]?.totalTokens).toBeUndefined()\n expect(\n await storage.aiCosts.listModelCallGroups({ ...range, projectId: \"other-project\" })\n ).toEqual({ items: [], total: 0, hasMore: false })\n expect(await storage.aiCosts.listModelCallGroups({ ...range, offset: 20 })).toEqual({\n items: [],\n total: 2,\n hasMore: false,\n })\n await expect(\n storage.aiCosts.listModelCallGroups({ ...range, limit: 201 })\n ).rejects.toThrow()\n await expect(\n storage.aiCosts.listModelCallGroups({ ...range, to: range.from })\n ).rejects.toThrow()\n } finally {\n await options.cleanup?.(storage)\n }\n })\n })\n}\n\nasync function seedWorkflowCall(\n storage: AiModelCallGroupsContractStorage,\n workflowId: string,\n runId: string\n) {\n const sourceExecutionId = await createTestWorkflowExecution(storage.executions, {\n projectId,\n workflowId,\n runId,\n })\n await storage.workflowRuns.queue({\n projectId,\n id: runId,\n workflowId,\n executionId: sourceExecutionId,\n input: {},\n requesterGroupIds: [],\n })\n await storage.workflowRuns.start({ projectId, id: runId })\n const nodeRunId = `${runId}:node:0`\n await storage.workflowRuns.nodes.start({\n projectId,\n id: nodeRunId,\n workflowId,\n workflowRunId: runId,\n nodeIndex: 0,\n nodeType: \"agent\",\n nodeId: \"review\",\n nodeKey: \"review\",\n input: {},\n })\n const actorId = workflowAgentStepActorId(workflowId, \"review\")\n const executionId = await createTestAgentExecution(storage, {\n projectId,\n runId: nodeRunId,\n actorId,\n sourceExecutionId,\n })\n await storage.workflowRuns.agentNodes.create({\n projectId,\n nodeRunId,\n executionId,\n actorId,\n prompt: \"Review the task.\",\n })\n const { record } = await storage.aiUsage.recordModelCall({\n projectId,\n id: `usage:${runId}`,\n executionId,\n attempt: 1,\n callId: runId,\n requesterGroupIds: [],\n providerId: \"test\",\n requestedModelId: \"small\",\n responseId: runId,\n usage: { inputTokens: 10, outputTokens: 5 },\n occurredAt: new Date(\"2026-09-01T12:00:00Z\"),\n })\n await storage.aiCosts.recordModelCallCost({\n projectId,\n usageRecordId: record.id,\n status: \"rated\",\n pricingContext: {},\n priceSource: {\n sourceId: \"provider-reported\",\n sourceEntryId: runId,\n sourceVersion: \"1\",\n observedAt: new Date(\"2026-09-01T12:00:00Z\"),\n },\n components: [],\n billingIdentity: { providerId: \"test\", modelId: \"small\" },\n money: { currency: \"USD\", amountNanos: \"10\" },\n ratedAt: new Date(\"2026-09-01T12:00:00Z\"),\n })\n}\n\nasync function seed(storage: AiModelCallGroupsContractStorage) {\n await storage.agents.threads.create({\n id: \"thread\",\n projectId,\n ownerPrincipal: { type: \"user\", id: \"user\" },\n })\n for (const runId of [\"parent\", \"second\"]) {\n const executionId = await createTestAgentExecution(storage, {\n projectId,\n runId,\n executionId: `exec_${runId}`,\n authority: \"inherited\",\n })\n await storage.agents.runs.create({\n id: runId,\n projectId,\n executionId,\n threadId: \"thread\",\n triggerMessageId: `message_${runId}`,\n spec: { model: { provider: \"parent-provider\", modelId: \"large\" } },\n requesterGroupIds: [],\n })\n await storage.agents.runs.start({\n id: runId,\n projectId,\n execution: { token: runId, queueLeaseExpiresAt: new Date(\"2100-01-01T00:00:00Z\") },\n })\n if (runId === \"parent\") {\n const childExecution = await createTestAgentExecution(storage, {\n projectId,\n actorId: \"child\",\n runId: \"child\",\n executionId: \"exec_child\",\n sourceExecutionId: executionId,\n authority: \"inherited\",\n })\n await storage.agents.runs.createSubagent({\n id: \"child\",\n projectId,\n executionId: childExecution,\n parentRunId: runId,\n parentExecutionToken: runId,\n spawnKey: \"research\",\n spec: {\n model: { provider: \"child-provider\", modelId: \"small\" },\n task: \"Research\",\n toolNames: [],\n maxSteps: 25,\n },\n maxActiveChildren: 4,\n })\n }\n await storage.agents.runs.finish({\n id: runId,\n projectId,\n executionToken: runId,\n status: \"succeeded\",\n })\n }\n for (let index = 0; index < 33; index++) {\n const child = index > 0 && index < 32\n const result = await storage.aiUsage.recordModelCall({\n id: `usage_${index}`,\n projectId,\n executionId: index === 0 ? \"exec_parent\" : child ? \"exec_child\" : \"exec_second\",\n attempt: 1,\n callId: `call_${index}`,\n requesterGroupIds: [],\n providerId: child ? \"child-provider\" : \"parent-provider\",\n requestedModelId: child ? \"small\" : \"large\",\n responseId: `response_${index}`,\n usage: index === 31 ? {} : { inputTokens: 1, outputTokens: 2 },\n occurredAt: new Date(Date.parse(\"2026-09-01T12:00:00Z\") + index * 1000),\n })\n if (index >= 31) continue\n await storage.aiCosts.recordModelCallCost({\n projectId,\n usageRecordId: result.record.id,\n status: \"rated\",\n billingIdentity: {\n providerId: child ? \"child-provider\" : \"parent-provider\",\n modelId: child ? \"small\" : \"large\",\n },\n pricingContext: {},\n priceSource: {\n sourceId: \"provider-reported\",\n sourceEntryId: `cost_${index}`,\n sourceVersion: \"test\",\n observedAt: new Date(\"2026-09-01T12:05:00Z\"),\n },\n components: [],\n money: { currency: index === 0 ? \"EUR\" : \"USD\", amountNanos: index === 0 ? \"0\" : \"10\" },\n ratedAt: new Date(\"2026-09-01T12:05:00Z\"),\n })\n }\n}\n",
|
|
11
|
+
"import type { AuthorizablePrincipal, TrustedPrimitiveRef } from \"../execution\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution chain required by a workflow-run storage fixture. */\nexport async function createTestWorkflowExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly workflowId: string\n readonly runId: string\n readonly executionId?: string\n readonly requestedBy?: AuthorizablePrincipal\n }\n): Promise<string> {\n const parentExecutionId = `test_request_execution:${input.runId}`\n const executionId = input.executionId ?? `test_workflow_execution:${input.runId}`\n const primitive: TrustedPrimitiveRef = {\n kind: \"workflow\",\n id: input.workflowId,\n runId: input.runId,\n }\n\n await executions.create({\n id: parentExecutionId,\n projectId: input.projectId,\n executor: { type: \"request\", requestId: `test_request:${input.runId}` },\n source: { type: \"http\", requestId: `test_request:${input.runId}` },\n ...(input.requestedBy === undefined ? {} : { requestedBy: structuredClone(input.requestedBy) }),\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef:\n input.requestedBy === undefined\n ? { type: \"disabled\" }\n : { type: \"principal\", principal: structuredClone(input.requestedBy) },\n })\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"execution\", executionId: parentExecutionId },\n ...(input.requestedBy === undefined ? {} : { requestedBy: structuredClone(input.requestedBy) }),\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n\n return executionId\n}\n\n/** Create a root workflow execution as produced by an automatic trigger. */\nexport async function createTestAutomaticWorkflowExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly workflowId: string\n readonly runId: string\n readonly executionId?: string\n readonly source?: { readonly type: \"schedule\" | \"event\"; readonly eventId: string }\n readonly correlationId?: string\n }\n): Promise<string> {\n const executionId = input.executionId ?? `test_workflow_execution:${input.runId}`\n const primitive: TrustedPrimitiveRef = {\n kind: \"workflow\",\n id: input.workflowId,\n runId: input.runId,\n }\n\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: input.source ?? { type: \"event\", eventId: `test_event:${input.runId}` },\n correlationId: input.correlationId ?? `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n\n return executionId\n}\n",
|
|
12
|
+
"import { describe, expect, test } from \"bun:test\"\nimport {\n type AiUsageStorage,\n AiUsageStorageError,\n type RecordAiModelCallInput,\n} from \"../storage/ai-usage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\nexport interface AiUsageStorageContractSuiteOptions<\n TStorage extends AiUsageStorage = AiUsageStorage,\n> {\n /** Factory that returns an isolated AI usage store for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly setup?: (storage: TStorage) => void | Promise<void>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"contract-project\"\nconst agentExecutionId = \"exec_agent_1\"\nconst otherAgentExecutionId = \"exec_agent_2\"\nconst workflowExecutionId = \"exec_workflow_1\"\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nfunction modelCallInput(overrides: Partial<RecordAiModelCallInput> = {}): RecordAiModelCallInput {\n return {\n id: \"usage_1\",\n projectId,\n executionId: agentExecutionId,\n attempt: 1,\n callId: \"call_1\",\n requesterGroupIds: [\"support\", \"engineering\"],\n providerId: \"gateway\",\n requestedModelId: \"openai/gpt-5\",\n requestedReasoning: { budgetTokens: 4_096 },\n responseModelId: \"gpt-5-2026-06-01\",\n responseId: \"response_1\",\n usage: {\n inputTokens: 12,\n outputTokens: 8,\n uncachedInputTokens: 9,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 1,\n textOutputTokens: 6,\n reasoningOutputTokens: 2,\n },\n rawUsage: { input_tokens: 12, output_tokens: 8 },\n occurredAt: at(\"2026-06-23T10:00:00.000Z\"),\n recordedAt: at(\"2026-06-23T10:00:01.000Z\"),\n ...overrides,\n }\n}\n\n/** Runs the provider-neutral model-call ledger contract against one storage implementation. */\nexport function runAiUsageStorageContractSuite<TStorage extends AiUsageStorage>(\n label: string,\n options: AiUsageStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"retains native provider IDs across reads and replay\", async () => {\n // Regression proof: omit providerIds in normalization or a storage row codec.\n await withStorage(async (storage) => {\n const providerIds = {\n requestId: \"request-native\",\n responseId: \"response-native\",\n generationId: \"gen_native\",\n }\n await storage.recordModelCall(modelCallInput({ providerIds }))\n const latest = await storage.getLatestForExecution({\n projectId,\n executionId: agentExecutionId,\n })\n expect(latest?.providerIds).toEqual(providerIds)\n const replay = await storage.recordModelCall(modelCallInput())\n expect(replay.created).toBe(false)\n expect(replay.record.providerIds).toEqual(providerIds)\n await storage.recordModelCall(\n modelCallInput({ id: \"legacy\", callId: \"legacy\", occurredAt: at(\"2026-06-24T00:00:00Z\") })\n )\n expect(\n (await storage.getLatestForExecution({ projectId, executionId: agentExecutionId }))\n ?.providerIds\n ).toBeUndefined()\n await expect(\n storage.recordModelCall(modelCallInput({ providerIds: { requestId: \" \" } }))\n ).rejects.toThrow(\"requestId\")\n })\n })\n test(\"records normalized usage and one canonical row per requester group\", async () => {\n await withStorage(async (storage) => {\n const result = await storage.recordModelCall(\n modelCallInput({\n requesterGroupIds: [\"support\", \"engineering\", \"support\"],\n })\n )\n\n expect(result.created).toBe(true)\n expect(result.record).toEqual({\n ...modelCallInput(),\n requesterGroupIds: [\"engineering\", \"support\"],\n usage: {\n ...modelCallInput().usage,\n totalTokens: 20,\n reportingStatus: \"complete\",\n },\n recordedAt: at(\"2026-06-23T10:00:01.000Z\"),\n })\n })\n })\n\n test(\"returns the existing record when the idempotency key is replayed\", async () => {\n await withStorage(async (storage) => {\n const first = await storage.recordModelCall(modelCallInput())\n const replay = await storage.recordModelCall(\n modelCallInput({\n id: \"ignored_retry_id\",\n requesterGroupIds: [\"different-group\"],\n usage: { inputTokens: 999, outputTokens: 1 },\n })\n )\n\n expect(first.created).toBe(true)\n expect(replay.created).toBe(false)\n expect(replay.record).toEqual(first.record)\n })\n })\n\n test(\"allows one generation call id to contain multiple billable responses\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(modelCallInput())\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_2\",\n responseId: \"response_2\",\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n uncachedInputTokens: 4,\n cacheReadInputTokens: 0,\n cacheWriteInputTokens: 2,\n textOutputTokens: 5,\n reasoningOutputTokens: 1,\n },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 2,\n usage: {\n inputTokens: 16,\n outputTokens: 14,\n totalTokens: 30,\n uncachedInputTokens: 13,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 3,\n textOutputTokens: 11,\n reasoningOutputTokens: 3,\n reportingStatus: \"complete\",\n },\n })\n })\n })\n\n test(\"returns the latest completed call for one execution\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.getLatestForExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toBeNull()\n\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_later\",\n callId: \"call_later\",\n responseId: \"response_later\",\n occurredAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_earlier\",\n callId: \"call_earlier\",\n responseId: \"response_earlier\",\n occurredAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n )\n\n await expect(\n storage.getLatestForExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toMatchObject({ id: \"usage_later\", responseId: \"response_later\" })\n await expect(\n storage.getLatestForExecution({\n projectId: \"other-project\",\n executionId: agentExecutionId,\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"bills the same call and response IDs again on a later delivery attempt\", async () => {\n // Regression guard: remove `attempt` from a provider's idempotency key/query/index and the\n // second append collapses into the first, making the aggregate assertions fail.\n await withStorage(async (storage) => {\n await storage.recordModelCall(modelCallInput())\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_2\",\n attempt: 2,\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n uncachedInputTokens: 4,\n cacheReadInputTokens: 0,\n cacheWriteInputTokens: 2,\n textOutputTokens: 5,\n reasoningOutputTokens: 1,\n },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 2,\n usage: {\n inputTokens: 16,\n outputTokens: 14,\n totalTokens: 30,\n uncachedInputTokens: 13,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 3,\n textOutputTokens: 11,\n reasoningOutputTokens: 3,\n reportingStatus: \"complete\",\n },\n })\n })\n })\n\n test(\"does not count concurrent idempotent appends twice\", async () => {\n await withStorage(async (storage) => {\n const results = await Promise.all([\n storage.recordModelCall(modelCallInput()),\n storage.recordModelCall(modelCallInput({ id: \"usage_retry\" })),\n ])\n\n expect(results.map((result) => result.created).sort()).toEqual([false, true])\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 1,\n usage: {\n inputTokens: 12,\n outputTokens: 8,\n totalTokens: 20,\n uncachedInputTokens: 9,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 1,\n textOutputTokens: 6,\n reasoningOutputTokens: 2,\n reportingStatus: \"complete\",\n },\n })\n })\n })\n\n test(\"keeps projects and workflow executions isolated\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_workflow\",\n executionId: workflowExecutionId,\n usage: { inputTokens: 5, outputTokens: 3 },\n })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_other_project\",\n projectId: \"other-project\",\n executionId: workflowExecutionId,\n usage: { inputTokens: 100, outputTokens: 100 },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: workflowExecutionId })\n ).resolves.toEqual({\n modelCallCount: 1,\n usage: {\n inputTokens: 5,\n outputTokens: 3,\n totalTokens: 8,\n reportingStatus: \"complete\",\n },\n })\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n await expect(\n storage.summarizeExecution({\n projectId,\n executionId: \"exec_workflow_2\",\n })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n })\n })\n\n test(\"summarizes multiple executions in input order with one zero-call entry per miss\", async () => {\n await withStorage(async (storage) => {\n await expect(storage.summarizeExecutions({ projectId, executionIds: [] })).resolves.toEqual(\n []\n )\n\n await storage.recordModelCall(modelCallInput())\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_agent_2\",\n executionId: otherAgentExecutionId,\n callId: \"call_agent_2\",\n responseId: \"response_agent_2\",\n usage: { inputTokens: 4, outputTokens: 6 },\n })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_workflow\",\n executionId: workflowExecutionId,\n callId: \"call_workflow\",\n responseId: \"response_workflow\",\n usage: { inputTokens: 5, outputTokens: 3 },\n })\n )\n\n await expect(\n storage.summarizeExecutions({\n projectId,\n executionIds: [\n otherAgentExecutionId,\n \"missing\",\n workflowExecutionId,\n agentExecutionId,\n otherAgentExecutionId,\n ],\n })\n ).resolves.toEqual([\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n totalTokens: 10,\n reportingStatus: \"complete\",\n },\n },\n { modelCallCount: 0, usage: { reportingStatus: \"unavailable\" } },\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 5,\n outputTokens: 3,\n totalTokens: 8,\n reportingStatus: \"complete\",\n },\n },\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 12,\n outputTokens: 8,\n totalTokens: 20,\n uncachedInputTokens: 9,\n cacheReadInputTokens: 3,\n cacheWriteInputTokens: 1,\n textOutputTokens: 6,\n reasoningOutputTokens: 2,\n reportingStatus: \"complete\",\n },\n },\n {\n modelCallCount: 1,\n usage: {\n inputTokens: 4,\n outputTokens: 6,\n totalTokens: 10,\n reportingStatus: \"complete\",\n },\n },\n ])\n })\n })\n\n test(\"distinguishes no model calls from a call without reported usage\", async () => {\n // Regression guard: coerce nullable SQL token columns with `Number(null)` and this becomes a\n // complete zero-token report instead of an unavailable one.\n await withStorage(async (storage) => {\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n\n const result = await storage.recordModelCall(\n modelCallInput({ usage: {}, rawUsage: undefined })\n )\n\n expect(result.record.usage).toEqual({ reportingStatus: \"unavailable\" })\n expect(result.record.rawUsage).toBeUndefined()\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 1,\n usage: { reportingStatus: \"unavailable\" },\n })\n })\n })\n\n test(\"normalizes offset timestamps to the same UTC instants\", async () => {\n // Regression guard: persist a timezone-naive SQL timestamp and these offset-derived instants\n // shift when read under a different database or process timezone.\n await withStorage(async (storage) => {\n const result = await storage.recordModelCall(\n modelCallInput({\n occurredAt: at(\"2026-06-23T03:04:05.678-07:00\"),\n recordedAt: at(\"2026-06-23T03:04:06.789-07:00\"),\n })\n )\n\n expect(result.record.occurredAt.toISOString()).toBe(\"2026-06-23T10:04:05.678Z\")\n expect(result.record.recordedAt.toISOString()).toBe(\"2026-06-23T10:04:06.789Z\")\n })\n })\n\n test(\"keeps incomplete execution totals partial instead of inventing zeroes\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(\n modelCallInput({ usage: { inputTokens: 10, outputTokens: 5 } })\n )\n await storage.recordModelCall(\n modelCallInput({\n id: \"usage_2\",\n callId: \"call_2\",\n responseId: \"response_2\",\n usage: { inputTokens: 0 },\n })\n )\n\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 2,\n usage: {\n inputTokens: 10,\n reportingStatus: \"partial\",\n },\n })\n })\n })\n\n test(\"defensively snapshots inputs and returned records\", async () => {\n await withStorage(async (storage) => {\n const requesterGroupIds = [\"support\"]\n const rawUsage = { nested: { cached: 3 } }\n const occurredAt = at(\"2026-06-23T10:00:00.000Z\")\n const input = modelCallInput({ requesterGroupIds, rawUsage, occurredAt })\n const first = await storage.recordModelCall(input)\n\n requesterGroupIds.push(\"mutated-input\")\n rawUsage.nested.cached = 999\n occurredAt.setTime(0)\n\n const returnedGroups = first.record.requesterGroupIds as string[]\n returnedGroups.push(\"mutated-output\")\n const returnedRaw = first.record.rawUsage as { nested: { cached: number } }\n returnedRaw.nested.cached = 888\n first.record.occurredAt.setTime(1)\n\n const replay = await storage.recordModelCall(modelCallInput())\n expect(replay.record.requesterGroupIds).toEqual([\"support\"])\n expect(replay.record.rawUsage).toEqual({ nested: { cached: 3 } })\n expect(replay.record.occurredAt.toISOString()).toBe(\"2026-06-23T10:00:00.000Z\")\n })\n })\n\n test(\"rejects a reused record id with a different model-call identity\", async () => {\n await withStorage(async (storage) => {\n await storage.recordModelCall(modelCallInput())\n\n const error = storage.recordModelCall(\n modelCallInput({ callId: \"call_2\", responseId: \"response_2\" })\n )\n await expect(error).rejects.toBeInstanceOf(AiUsageStorageError)\n await expect(error).rejects.toMatchObject({ code: \"duplicate_id\" })\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toMatchObject({\n modelCallCount: 1,\n usage: { inputTokens: 12, outputTokens: 8, totalTokens: 20 },\n })\n })\n })\n\n test(\"rejects a model call whose durable execution does not exist\", async () => {\n await withStorage(async (storage) => {\n const error = storage.recordModelCall(\n modelCallInput({ id: \"usage_missing\", executionId: \"exec_missing\" })\n )\n await expect(error).rejects.toBeInstanceOf(AiUsageStorageError)\n await expect(error).rejects.toMatchObject({ code: \"missing_execution\" })\n })\n })\n\n test(\"rejects invalid execution IDs, usage, dates, groups, and raw JSON\", async () => {\n await withStorage(async (storage) => {\n const invalidInputs: RecordAiModelCallInput[] = [\n modelCallInput({ attempt: 0 }),\n modelCallInput({ providerId: \" \" }),\n modelCallInput({ requesterGroupIds: [\"\"] }),\n modelCallInput({ usage: { inputTokens: -1 } }),\n modelCallInput({ occurredAt: new Date(Number.NaN) }),\n modelCallInput({ rawUsage: { invalid: undefined } as never }),\n modelCallInput({ requestedReasoning: { budgetTokens: -1 } }),\n modelCallInput({ executionId: \"\" }),\n ]\n\n for (const input of invalidInputs) {\n await expect(storage.recordModelCall(input)).rejects.toThrow()\n }\n await expect(\n storage.summarizeExecutions({\n projectId,\n executionIds: [\"\"],\n })\n ).rejects.toThrow()\n await expect(\n storage.summarizeExecution({ projectId, executionId: agentExecutionId })\n ).resolves.toEqual({\n modelCallCount: 0,\n usage: { reportingStatus: \"unavailable\" },\n })\n })\n })\n })\n}\n\n/** Seed the immutable execution references used by the provider-neutral AI usage contract. */\nexport async function seedAiUsageStorageContractExecutions(\n executions: ExecutionStorage\n): Promise<void> {\n for (const fixture of [\n { projectId, executionId: agentExecutionId },\n { projectId, executionId: otherAgentExecutionId },\n { projectId, executionId: workflowExecutionId },\n { projectId: \"other-project\", executionId: workflowExecutionId },\n ]) {\n const existing = await executions.getById({\n projectId: fixture.projectId,\n id: fixture.executionId,\n })\n if (existing) continue\n const primitive = {\n kind: \"workflow\" as const,\n id: \"ai-usage-contract\",\n runId: fixture.executionId,\n }\n await executions.create({\n id: fixture.executionId,\n projectId: fixture.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${fixture.executionId}` },\n correlationId: `test_correlation:${fixture.executionId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n }\n}\n",
|
|
13
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type {\n AuthStorage,\n AuthStorageErrorCode,\n CompleteAuthSessionInput,\n UserRecord,\n} from \"../storage/auth\"\nimport { AuthStorageError } from \"../storage/auth\"\n\nexport interface AuthStorageContractSuiteOptions<TStorage extends AuthStorage = AuthStorage> {\n /** Factory that produces a fresh `AuthStorage` instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"project-a\"\nconst otherProjectId = \"project-b\"\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nfunction sessionInput(\n id: string,\n tokenHash = `${id}-hash`,\n audience: CompleteAuthSessionInput[\"audience\"] = \"atlas\",\n absoluteExpiresAt?: Date\n): CompleteAuthSessionInput {\n return {\n id,\n audience,\n tokenHash,\n createdAt: at(\"2026-05-14T10:10:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:10:00.000Z\"),\n absoluteExpiresAt,\n }\n}\n\nasync function expectAuthError(\n promise: Promise<unknown>,\n code: AuthStorageErrorCode\n): Promise<void> {\n await expect(promise).rejects.toBeInstanceOf(AuthStorageError)\n await expect(promise).rejects.toMatchObject({ code })\n}\n\nasync function createUser(\n storage: AuthStorage,\n input: {\n readonly id?: string\n readonly email?: string\n readonly status?: UserRecord[\"status\"]\n readonly projectId?: string\n } = {}\n): Promise<UserRecord> {\n return storage.users.create({\n id: input.id ?? \"usr_1\",\n projectId: input.projectId ?? projectId,\n email: input.email ?? \"ava@acme.com\",\n status: input.status,\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n}\n\n/**\n * Runs the shared `AuthStorage` contract against any storage implementation.\n *\n * The suite is the storage-independent specification for Sixb auth state: users, identities,\n * sessions, invitations, group memberships, service accounts, access tokens,\n * magic links, OIDC attempts, and atomic sign-in completion.\n */\nexport function runAuthStorageContractSuite<TStorage extends AuthStorage>(\n label: string,\n options: AuthStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"creates users with normalized email and isolates projects\", async () => {\n await withStorage(async (storage) => {\n const user = await createUser(storage, {\n email: \" Ava@Acme.COM \",\n })\n\n expect(user.email).toBe(\"ava@acme.com\")\n await expectAuthError(\n storage.users.create({\n id: \"usr_duplicate\",\n projectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n }),\n \"duplicate_user\"\n )\n\n await expect(\n storage.users.create({\n id: \"usr_other\",\n projectId: otherProjectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n projectId: otherProjectId,\n email: \"ava@acme.com\",\n })\n\n const page = await storage.users.list({ projectId, statuses: [\"active\"] })\n expect(page.users.map((row) => row.id)).toEqual([\"usr_1\"])\n })\n })\n\n test(\"upserts identities without mutating canonical user email\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_oidc\", email: \"ava@acme.com\" })\n\n await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava@acme.com\" },\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n const updated = await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava.renamed@acme.com\" },\n updatedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n expect(updated.claims).toEqual({ email: \"ava.renamed@acme.com\" })\n await expect(storage.users.getById({ projectId, id: \"usr_oidc\" })).resolves.toMatchObject({\n email: \"ava@acme.com\",\n })\n })\n })\n\n test(\"keeps multiple concurrent sessions per user and never extends expiry on touch\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const first = await storage.sessions.create({\n id: \"ses_1\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n const second = await storage.sessions.create({\n id: \"ses_2\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n createdAt: at(\"2026-05-14T10:05:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:05:00.000Z\"),\n })\n\n // Creating a second session in the same audience no longer revokes the\n // first: both stay active and authenticate independently.\n expect(first.revokedAt).toBeUndefined()\n expect(second.revokedAt).toBeUndefined()\n const storedFirst = await storage.sessions.getById({ projectId, id: \"ses_1\" })\n expect(storedFirst?.revokedAt).toBeUndefined()\n\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_1\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_1\" })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"wrong\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n // getActiveByUserId returns the most recently created active session.\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n\n const touched = await storage.sessions.touch({\n projectId,\n id: second.id,\n lastSeenAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n expect(touched.lastSeenAt?.toISOString()).toBe(\"2026-05-15T10:00:00.000Z\")\n expect(touched.expiresAt.toISOString()).toBe(\"2026-05-21T10:05:00.000Z\")\n\n // A session in a different audience coexists and is cookie-scoped.\n const appSession = await storage.sessions.create({\n id: \"ses_app\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-app\",\n createdAt: at(\"2026-05-14T10:06:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:06:00.000Z\"),\n })\n expect(appSession.revokedAt).toBeUndefined()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_app\",\n audience: \"atlas\",\n tokenHash: \"hash-app\",\n now: at(\"2026-05-14T10:07:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n // Revoking a single session leaves the user's other sessions active.\n await storage.sessions.revoke({\n projectId,\n id: \"ses_1\",\n revokedAt: at(\"2026-05-14T10:08:00.000Z\"),\n })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_1\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n now: at(\"2026-05-14T10:09:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n now: at(\"2026-05-14T10:09:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n\n // \"Sign out everywhere\": revokeActiveForUser clears every remaining\n // active session for the user, across audiences.\n const revoked = await storage.sessions.revokeActiveForUser({\n projectId,\n userId: \"usr_1\",\n revokedAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n expect(revoked.map((entry) => entry.id).sort()).toEqual([\"ses_2\", \"ses_app\"])\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-14T10:11:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"persists and enforces an optional absolute session deadline\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n const capped = await storage.sessions.create({\n id: \"ses_capped\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n absoluteExpiresAt: at(\"2026-05-16T10:00:00.000Z\"),\n })\n const uncapped = await storage.sessions.create({\n id: \"ses-uncapped\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-uncapped\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n\n expect(capped.absoluteExpiresAt?.toISOString()).toBe(\"2026-05-16T10:00:00.000Z\")\n expect(uncapped.absoluteExpiresAt).toBeUndefined()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: capped.id,\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n now: at(\"2026-05-16T09:59:59.999Z\"),\n })\n ).resolves.toMatchObject({ id: capped.id })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: capped.id,\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n const active = await storage.sessions.listActiveByUserId({\n projectId,\n userId: \"usr_1\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n expect(active.map((session) => session.id)).toEqual([uncapped.id])\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.revokeActiveForUser({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n revokedAt: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toEqual([])\n })\n })\n\n test(\"atomically renews valid sessions without exceeding the absolute deadline\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_renew\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-15T10:00:00.000Z\"),\n absoluteExpiresAt: at(\"2026-05-20T10:00:00.000Z\"),\n })\n\n const renewed = await storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-25T10:00:00.000Z\"),\n })\n expect(renewed?.expiresAt.toISOString()).toBe(\"2026-05-20T10:00:00.000Z\")\n expect(renewed?.lastSeenAt?.toISOString()).toBe(\"2026-05-14T11:00:00.000Z\")\n\n const monotonic = await storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-14T12:00:00.000Z\"),\n expiresAt: at(\"2026-05-18T10:00:00.000Z\"),\n })\n expect(monotonic?.expiresAt.toISOString()).toBe(\"2026-05-20T10:00:00.000Z\")\n\n await expect(\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"wrong-hash\",\n now: at(\"2026-05-14T13:00:00.000Z\"),\n expiresAt: at(\"2026-05-19T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-20T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n await storage.sessions.create({\n id: \"ses_concurrent\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n await Promise.all([\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_concurrent\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-18T10:00:00.000Z\"),\n }),\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_concurrent\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-19T10:00:00.000Z\"),\n }),\n ])\n const concurrent = await storage.sessions.getById({ projectId, id: \"ses_concurrent\" })\n expect(concurrent?.expiresAt.toISOString()).toBe(\"2026-05-19T10:00:00.000Z\")\n })\n })\n\n test(\"persists best-effort device metadata on a session\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const withDevice = await storage.sessions.create({\n id: \"ses_device\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-device\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n userAgent: \"Mozilla/5.0 (iPhone)\",\n ipAddress: \"203.0.113.7\",\n })\n expect(withDevice.userAgent).toBe(\"Mozilla/5.0 (iPhone)\")\n expect(withDevice.ipAddress).toBe(\"203.0.113.7\")\n await expect(\n storage.sessions.getById({ projectId, id: \"ses_device\" })\n ).resolves.toMatchObject({\n userAgent: \"Mozilla/5.0 (iPhone)\",\n ipAddress: \"203.0.113.7\",\n })\n\n // Device metadata is optional; omitting it round-trips as undefined.\n const withoutDevice = await storage.sessions.create({\n id: \"ses_plain\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-plain\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n expect(withoutDevice.userAgent).toBeUndefined()\n expect(withoutDevice.ipAddress).toBeUndefined()\n })\n })\n\n test(\"lists a user's active sessions across audiences, newest activity first\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.sessions.create({\n id: \"ses_a\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-a\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_b\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-b\",\n createdAt: at(\"2026-05-14T10:05:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:05:00.000Z\"),\n })\n\n // Revoked sessions are excluded.\n await storage.sessions.create({\n id: \"ses_revoked\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-revoked\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n await storage.sessions.revoke({\n projectId,\n id: \"ses_revoked\",\n revokedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n // Another user's session must not leak in.\n await createUser(storage, { id: \"usr_2\", email: \"bo@acme.com\" })\n await storage.sessions.create({\n id: \"ses_other\",\n projectId,\n userId: \"usr_2\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-other\",\n createdAt: at(\"2026-05-14T10:03:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:03:00.000Z\"),\n })\n\n // ses_a is older than ses_b but has more recent activity, so it sorts first.\n await storage.sessions.touch({\n projectId,\n id: \"ses_a\",\n lastSeenAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n\n const active = await storage.sessions.listActiveByUserId({\n projectId,\n userId: \"usr_1\",\n now: at(\"2026-05-15T11:00:00.000Z\"),\n })\n expect(active.map((session) => session.id)).toEqual([\"ses_a\", \"ses_b\"])\n })\n })\n\n test(\"keeps one active invitation per normalized email\", async () => {\n await withStorage(async (storage) => {\n const first = await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \" Ava@Acme.COM \",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n const updated = await storage.invitations.createOrUpdateActive({\n id: \"inv_2\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"finance\"],\n updatedAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-22T10:00:00.000Z\"),\n })\n\n expect(updated.id).toBe(first.id)\n expect(updated.groupIds).toEqual([\"finance\"])\n await expect(\n storage.invitations.getActiveByEmail({\n projectId,\n email: \"ava@acme.com\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"inv_1\" })\n\n await storage.invitations.revoke({\n projectId,\n id: \"inv_1\",\n revokedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n await expect(\n storage.invitations.getActiveByEmail({\n projectId,\n email: \"ava@acme.com\",\n now: at(\"2026-05-14T10:04:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"upserts group memberships idempotently and preserves source\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"invitation\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n const repeated = await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n\n expect(repeated.source).toBe(\"invitation\")\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_1\" })\n ).resolves.toHaveLength(1)\n })\n })\n\n test(\"rejects group memberships for missing users\", async () => {\n await withStorage(async (storage) => {\n await expectAuthError(\n storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_missing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n }),\n \"missing_user\"\n )\n })\n })\n\n test(\"removes group memberships and is idempotent for missing rows\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n\n const removed = await storage.groupMemberships.remove({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n })\n expect(removed).toMatchObject({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_1\" })\n ).resolves.toHaveLength(0)\n\n // Removing an already-removed membership is a no-op that returns null.\n await expect(\n storage.groupMemberships.remove({ projectId, userId: \"usr_1\", groupId: \"commercial\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"returns null when removing a membership for a missing user\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.groupMemberships.remove({\n projectId,\n userId: \"usr_missing\",\n groupId: \"commercial\",\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"manages service accounts and their group memberships\", async () => {\n await withStorage(async (storage) => {\n const serviceAccount = await storage.serviceAccounts.create({\n id: \"svc_ingest\",\n projectId,\n name: \"Ingest worker\",\n description: \"Reads source data into Sixb.\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n expect(serviceAccount).toMatchObject({\n id: \"svc_ingest\",\n name: \"Ingest worker\",\n status: \"active\",\n })\n\n const membership = await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_ingest\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n expect(membership.groupId).toBe(\"commercial\")\n const repeated = await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_ingest\",\n groupId: \"commercial\",\n source: \"invitation\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n expect(repeated.source).toBe(\"manual\")\n\n await expect(\n storage.serviceAccountGroupMemberships.listForServiceAccount({\n projectId,\n serviceAccountId: \"svc_ingest\",\n })\n ).resolves.toHaveLength(1)\n await expect(\n storage.serviceAccountGroupMemberships.listForGroup({\n projectId,\n groupId: \"commercial\",\n })\n ).resolves.toMatchObject([{ serviceAccountId: \"svc_ingest\" }])\n\n const updated = await storage.serviceAccounts.update({\n projectId,\n id: \"svc_ingest\",\n name: \"Ingest worker v2\",\n status: \"suspended\",\n updatedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n expect(updated).toMatchObject({\n name: \"Ingest worker v2\",\n description: \"Reads source data into Sixb.\",\n status: \"suspended\",\n })\n await expect(\n storage.serviceAccounts.update({\n projectId,\n id: \"svc_ingest\",\n description: \"Imports source data into Sixb.\",\n updatedAt: at(\"2026-05-14T10:04:00.000Z\"),\n })\n ).resolves.toMatchObject({\n name: \"Ingest worker v2\",\n description: \"Imports source data into Sixb.\",\n status: \"suspended\",\n })\n await expect(\n storage.serviceAccounts.list({ projectId, statuses: [\"suspended\"] })\n ).resolves.toMatchObject({\n serviceAccounts: [{ id: \"svc_ingest\" }],\n total: 1,\n })\n })\n })\n\n test(\"rejects service account memberships for missing service accounts\", async () => {\n await withStorage(async (storage) => {\n await expectAuthError(\n storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_missing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n }),\n \"missing_service_account\"\n )\n })\n })\n\n test(\"reconciles agent-managed service account memberships\", async () => {\n await withStorage(async (storage) => {\n await storage.serviceAccounts.create({\n id: \"svc_agent_ops\",\n projectId,\n name: \"Ops agent\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupId: \"manual-extra\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupId: \"stale-agent\",\n source: \"agent\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n const first = await storage.serviceAccountGroupMemberships.reconcileForServiceAccount({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupIds: [\"agent-runtime\", \"agent-runtime\", \"ops\"],\n source: \"agent\",\n updatedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n expect(first.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"agent-runtime\", \"agent\"],\n [\"manual-extra\", \"manual\"],\n [\"ops\", \"agent\"],\n ])\n\n const second = await storage.serviceAccountGroupMemberships.reconcileForServiceAccount({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupIds: [\"ops\"],\n source: \"agent\",\n updatedAt: at(\"2026-05-14T10:04:00.000Z\"),\n })\n expect(second.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"manual-extra\", \"manual\"],\n [\"ops\", \"agent\"],\n ])\n })\n })\n\n test(\"creates, resolves, touches, lists, and revokes access tokens\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.serviceAccounts.create({\n id: \"svc_ingest\",\n projectId,\n name: \"Ingest worker\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n\n const personal = await storage.accessTokens.create({\n id: \"tok_personal\",\n projectId,\n name: \"Local CLI\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash-personal\",\n groupIds: [\"commercial\", \"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n expect(personal.groupIds).toEqual([\"commercial\", \"finance\"])\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"hash-personal\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"tok_personal\" })\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"wrong\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n const touched = await storage.accessTokens.touch({\n projectId,\n id: \"tok_personal\",\n lastUsedAt: at(\"2026-05-14T10:03:00.000Z\"),\n userAgent: \"sixb-cli/0.1\",\n ipAddress: \"203.0.113.10\",\n })\n expect(touched.lastUsedAt?.toISOString()).toBe(\"2026-05-14T10:03:00.000Z\")\n expect(touched.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n\n await storage.accessTokens.create({\n id: \"tok_service\",\n projectId,\n name: \"Sandbox agent\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"svc_ingest\",\n tokenHash: \"hash-service\",\n createdAt: at(\"2026-05-14T10:04:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:04:00.000Z\"),\n })\n await expect(\n storage.accessTokens.list({\n projectId,\n subjectType: \"serviceAccount\",\n subjectId: \"svc_ingest\",\n })\n ).resolves.toMatchObject({\n accessTokens: [{ id: \"tok_service\" }],\n total: 1,\n })\n\n await storage.accessTokens.revoke({\n projectId,\n id: \"tok_personal\",\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"hash-personal\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"round-trips the creator principal for service accounts and access tokens\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_creator\", email: \"creator@acme.com\" })\n await storage.serviceAccounts.create({\n id: \"svc_creator\",\n projectId,\n name: \"Creator service account\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_creator\",\n projectId,\n userId: \"usr_creator\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-creator\",\n createdAt: at(\"2026-05-14T10:00:30.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:30.000Z\"),\n })\n\n const principals = [\n { type: \"user\", id: \"usr_creator\" },\n { type: \"serviceAccount\", id: \"svc_creator\" },\n { type: \"system\", id: \"scheduler\" },\n ] as const\n\n for (const [index, principal] of principals.entries()) {\n const accountId = `svc_by_${principal.type}`\n const createdAccount = await storage.serviceAccounts.create({\n id: accountId,\n projectId,\n name: `Service account by ${principal.type}`,\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n createdAt: at(`2026-05-14T10:1${index}:00.000Z`),\n })\n expect(createdAccount.createdByPrincipal).toEqual(principal)\n expect(createdAccount.createdBySessionId).toBe(\"ses_creator\")\n await expect(\n storage.serviceAccounts.getById({ projectId, id: accountId })\n ).resolves.toMatchObject({\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n })\n\n const tokenId = `tok_by_${principal.type}`\n const createdToken = await storage.accessTokens.create({\n id: tokenId,\n projectId,\n name: `Token by ${principal.type}`,\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_creator\",\n tokenHash: `hash-${tokenId}`,\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n createdAt: at(`2026-05-14T10:2${index}:00.000Z`),\n expiresAt: at(`2026-05-21T10:2${index}:00.000Z`),\n })\n expect(createdToken.createdByPrincipal).toEqual(principal)\n expect(createdToken.createdBySessionId).toBe(\"ses_creator\")\n await expect(\n storage.accessTokens.getById({ projectId, id: tokenId })\n ).resolves.toMatchObject({\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n })\n }\n\n // Omitting the creator round-trips as undefined on every backend.\n const anonymous = await storage.serviceAccounts.create({\n id: \"svc_anonymous\",\n projectId,\n name: \"Anonymous service account\",\n createdAt: at(\"2026-05-14T10:30:00.000Z\"),\n })\n expect(anonymous.createdByPrincipal).toBeUndefined()\n expect(anonymous.createdBySessionId).toBeUndefined()\n await expect(\n storage.serviceAccounts.getById({ projectId, id: \"svc_anonymous\" })\n ).resolves.toMatchObject({ id: \"svc_anonymous\" })\n })\n })\n\n test(\"touch preserves prior access-token metadata when omitted\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.accessTokens.create({\n id: \"tok_touch\",\n projectId,\n name: \"Touch token\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash-touch\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n\n const first = await storage.accessTokens.touch({\n projectId,\n id: \"tok_touch\",\n lastUsedAt: at(\"2026-05-14T10:01:00.000Z\"),\n userAgent: \"sixb-cli/0.1\",\n ipAddress: \"203.0.113.10\",\n })\n expect(first.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n expect(first.lastUsedIpAddress).toBe(\"203.0.113.10\")\n\n // A later touch without metadata advances lastUsedAt but keeps the\n // previously captured user agent and IP address.\n const second = await storage.accessTokens.touch({\n projectId,\n id: \"tok_touch\",\n lastUsedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n expect(second.lastUsedAt?.toISOString()).toBe(\"2026-05-14T10:05:00.000Z\")\n expect(second.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n expect(second.lastUsedIpAddress).toBe(\"203.0.113.10\")\n await expect(\n storage.accessTokens.getById({ projectId, id: \"tok_touch\" })\n ).resolves.toMatchObject({\n lastUsedUserAgent: \"sixb-cli/0.1\",\n lastUsedIpAddress: \"203.0.113.10\",\n })\n })\n })\n\n test(\"lists access tokens with revoked, order, and pagination parity\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const ids = [\"tok_a\", \"tok_b\", \"tok_c\", \"tok_d\"]\n for (const [index, id] of ids.entries()) {\n await storage.accessTokens.create({\n id,\n projectId,\n name: `Token ${id}`,\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: `hash-${id}`,\n createdAt: at(`2026-05-14T10:0${index}:00.000Z`),\n expiresAt: at(`2026-05-21T10:0${index}:00.000Z`),\n })\n }\n await storage.accessTokens.revoke({\n projectId,\n id: \"tok_b\",\n revokedAt: at(\"2026-05-14T11:00:00.000Z\"),\n })\n\n // includeRevoked defaults to false: the revoked token is hidden.\n const active = await storage.accessTokens.list({ projectId })\n expect(active.accessTokens.map((token) => token.id)).toEqual([\"tok_a\", \"tok_c\", \"tok_d\"])\n expect(active.total).toBe(3)\n expect(active.hasMore).toBe(false)\n\n // includeRevoked: true surfaces it again, default order is ascending.\n const all = await storage.accessTokens.list({ projectId, includeRevoked: true })\n expect(all.accessTokens.map((token) => token.id)).toEqual([\n \"tok_a\",\n \"tok_b\",\n \"tok_c\",\n \"tok_d\",\n ])\n expect(all.total).toBe(4)\n\n // order: \"desc\" reverses by createdAt.\n const descending = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n order: \"desc\",\n })\n expect(descending.accessTokens.map((token) => token.id)).toEqual([\n \"tok_d\",\n \"tok_c\",\n \"tok_b\",\n \"tok_a\",\n ])\n\n // First page reports hasMore at the page boundary.\n const firstPage = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 2,\n })\n expect(firstPage.accessTokens.map((token) => token.id)).toEqual([\"tok_a\", \"tok_b\"])\n expect(firstPage.total).toBe(4)\n expect(firstPage.hasMore).toBe(true)\n\n // Second page exhausts the result set.\n const secondPage = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 2,\n offset: 2,\n })\n expect(secondPage.accessTokens.map((token) => token.id)).toEqual([\"tok_c\", \"tok_d\"])\n expect(secondPage.hasMore).toBe(false)\n\n // A page that exactly consumes the remainder reports no more.\n const exactBoundary = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 4,\n })\n expect(exactBoundary.accessTokens.map((token) => token.id)).toEqual(ids)\n expect(exactBoundary.hasMore).toBe(false)\n })\n })\n\n test(\"lists service accounts with pagination parity\", async () => {\n await withStorage(async (storage) => {\n const ids = [\"svc_a\", \"svc_b\", \"svc_c\"]\n for (const [index, id] of ids.entries()) {\n await storage.serviceAccounts.create({\n id,\n projectId,\n name: `Service account ${id}`,\n createdAt: at(`2026-05-14T10:0${index}:00.000Z`),\n })\n }\n\n // Default order is ascending by createdAt across every backend.\n const all = await storage.serviceAccounts.list({ projectId })\n expect(all.serviceAccounts.map((account) => account.id)).toEqual(ids)\n expect(all.total).toBe(3)\n expect(all.hasMore).toBe(false)\n\n const firstPage = await storage.serviceAccounts.list({ projectId, limit: 2 })\n expect(firstPage.serviceAccounts.map((account) => account.id)).toEqual([\"svc_a\", \"svc_b\"])\n expect(firstPage.total).toBe(3)\n expect(firstPage.hasMore).toBe(true)\n\n const secondPage = await storage.serviceAccounts.list({\n projectId,\n limit: 2,\n offset: 2,\n })\n expect(secondPage.serviceAccounts.map((account) => account.id)).toEqual([\"svc_c\"])\n expect(secondPage.hasMore).toBe(false)\n })\n })\n\n test(\"rejects invalid access token subjects\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await expectAuthError(\n storage.accessTokens.create({\n id: \"tok_bad_kind\",\n projectId,\n name: \"Bad kind\",\n kind: \"serviceAccount\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n }),\n \"invalid_input\"\n )\n await expectAuthError(\n storage.accessTokens.create({\n id: \"tok_missing_subject\",\n projectId,\n name: \"Missing subject\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"svc_missing\",\n tokenHash: \"hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n }),\n \"missing_service_account\"\n )\n })\n })\n\n test(\"creates one active magic link per email and consumes it once\", async () => {\n await withStorage(async (storage) => {\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:15:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_2\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \" ava@acme.com \",\n tokenHash: \"hash-2\",\n returnTo: \"/dashboard\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n revokedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await expectAuthError(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"wrong\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n }),\n \"invalid_magic_link\"\n )\n\n await expect(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"hash-2\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n audience: \"atlas\",\n returnTo: \"/dashboard\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n await expectAuthError(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"hash-2\",\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n }),\n \"invalid_magic_link\"\n )\n })\n })\n\n test(\"stores OIDC attempts with one-time state consumption\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n returnTo: \"/objects\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"wrong\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n }),\n \"invalid_oidc_attempt\"\n )\n await expect(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"state-hash\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n ).resolves.toMatchObject({\n audience: \"atlas\",\n codeVerifier: \"verifier\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await expectAuthError(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"state-hash\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n }),\n \"invalid_oidc_attempt\"\n )\n })\n })\n\n test(\"authorizes a device and atomically creates its one-time access token\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_device\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"session-hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.deviceAuthorizations.create({\n id: \"dva_1\",\n projectId,\n deviceCodeHash: \"device-code-hash\",\n userCode: \"BCDF-HJKM\",\n clientName: \"sixb CLI\",\n tokenName: \"codex\",\n tokenExpiresAt: at(\"2026-08-12T10:00:00.000Z\"),\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expect(\n storage.deviceAuthorizations.getByUserCode({ projectId, userCode: \"BCDF-HJKM\" })\n ).resolves.toMatchObject({ id: \"dva_1\", status: \"pending\" })\n await storage.deviceAuthorizations.approve({\n projectId,\n id: \"dva_1\",\n userId: \"usr_1\",\n sessionId: \"ses_device\",\n approvedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n\n const completed = await storage.completeDeviceAuthorization({\n projectId,\n id: \"dva_1\",\n deviceCodeHash: \"device-code-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n accessToken: {\n id: \"tok_device\",\n projectId,\n name: \"codex\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"access-token-hash\",\n createdByPrincipal: { type: \"user\", id: \"usr_1\" },\n createdBySessionId: \"ses_device\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-08-12T10:00:00.000Z\"),\n },\n })\n\n expect(completed.authorization).toMatchObject({ status: \"consumed\" })\n expect(completed.accessToken).toMatchObject({ id: \"tok_device\", subjectId: \"usr_1\" })\n await expectAuthError(\n storage.completeDeviceAuthorization({\n projectId,\n id: \"dva_1\",\n deviceCodeHash: \"device-code-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n accessToken: {\n id: \"tok_device_2\",\n projectId,\n name: \"codex\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"access-token-hash-2\",\n createdBySessionId: \"ses_device\",\n createdAt: at(\"2026-05-14T10:03:00.000Z\"),\n expiresAt: at(\"2026-08-12T10:00:00.000Z\"),\n },\n }),\n \"invalid_device_authorization\"\n )\n await expect(\n storage.accessTokens.getById({ projectId, id: \"tok_device_2\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"completes magic-link sign-in for an existing user\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_old\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"old-hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_new\", \"session-hash\", \"atlas\", at(\"2026-06-21T10:10:00.000Z\")),\n })\n\n expect(result.user.id).toBe(\"usr_1\")\n expect(result.session).toMatchObject({\n id: \"ses_new\",\n strategyId: \"magic-link\",\n tokenHash: \"session-hash\",\n absoluteExpiresAt: at(\"2026-06-21T10:10:00.000Z\"),\n })\n // Signing in again keeps the user's existing session active; concurrent\n // sessions are allowed.\n const oldSession = await storage.sessions.getById({ projectId, id: \"ses_old\" })\n expect(oldSession?.revokedAt).toBeUndefined()\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_unused_2\",\n session: sessionInput(\"ses_replay\"),\n }),\n \"invalid_magic_link\"\n )\n })\n })\n\n test(\"creates invited users through magic-link completion and applies groups once\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:17:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_new\",\n manualGroupIds: [\"security-admins\"],\n session: sessionInput(\"ses_new\"),\n })\n\n expect(result.invitation).toMatchObject({\n id: \"inv_1\",\n status: \"accepted\",\n })\n const memberships = await storage.groupMemberships.listForUser({\n projectId,\n userId: \"usr_new\",\n })\n expect(memberships.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"commercial\", \"invitation\"],\n [\"finance\", \"invitation\"],\n [\"security-admins\", \"manual\"],\n ])\n })\n })\n\n test(\"preserves existing membership source when accepting an invitation\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_existing\", email: \"ava@acme.com\" })\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_existing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:17:00.000Z\"),\n })\n\n await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_existing\"),\n })\n\n const memberships = await storage.groupMemberships.listForUser({\n projectId,\n userId: \"usr_existing\",\n })\n expect(memberships.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"commercial\", \"manual\"],\n [\"finance\", \"invitation\"],\n ])\n })\n })\n\n test(\"does not create missing users when invitation eligibility disappeared\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n await storage.invitations.revoke({\n projectId,\n id: \"inv_1\",\n revokedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_new\",\n session: sessionInput(\"ses_new\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"ava@acme.com\" })\n ).resolves.toBeNull()\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n })\n })\n\n test(\"allows explicit bootstrap creation through magic-link completion\", async () => {\n await withStorage(async (storage) => {\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"founder@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_founder\",\n allowUserCreationWithoutInvitation: true,\n manualGroupIds: [\"security-admins\"],\n session: sessionInput(\"ses_founder\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_founder\",\n email: \"founder@acme.com\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_founder\" })\n ).resolves.toMatchObject([{ groupId: \"security-admins\", source: \"manual\" }])\n })\n })\n\n test(\"closes bootstrap user creation when an active user already exists\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, {\n id: \"usr_existing\",\n email: \"existing@acme.com\",\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"founder@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_founder\",\n allowUserCreationWithoutInvitation: true,\n requireNoActiveUsersForUserCreation: true,\n session: sessionInput(\"ses_founder\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"founder@acme.com\" })\n ).resolves.toBeNull()\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n })\n })\n\n test(\"does not apply the bootstrap closure guard to invited user creation\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, {\n id: \"usr_existing\",\n email: \"existing@acme.com\",\n })\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"invited@acme.com\",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"invited@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_invited\",\n requireNoActiveUsersForUserCreation: true,\n session: sessionInput(\"ses_invited\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_invited\",\n email: \"invited@acme.com\",\n })\n expect(result.invitation).toMatchObject({\n id: \"inv_1\",\n status: \"accepted\",\n })\n })\n })\n\n test(\"consumes valid magic links when an existing user is suspended\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { status: \"suspended\" })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_new\"),\n }),\n \"suspended_user\"\n )\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n })\n })\n\n test(\"completes OIDC sign-in through an existing identity\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_oidc\", email: \"ava@acme.com\" })\n await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava@acme.com\" },\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:11:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n subject: \"00u1\",\n email: \"renamed@acme.com\",\n emailVerified: true,\n claims: { email: \"renamed@acme.com\" },\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_oidc\"),\n })\n\n expect(result.identity).toMatchObject({\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"renamed@acme.com\" },\n })\n await expect(storage.users.getById({ projectId, id: \"usr_oidc\" })).resolves.toMatchObject({\n email: \"ava@acme.com\",\n })\n })\n })\n\n test(\"auto-links OIDC by verified email only when explicitly allowed\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_existing\", email: \"ava@acme.com\" })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_blocked\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"blocked-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_blocked\",\n stateHash: \"blocked-state\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: false,\n autoLinkByVerifiedEmail: true,\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_blocked\"),\n }),\n \"email_link_not_allowed\"\n )\n\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_allowed\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"allowed-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:12:00.000Z\"),\n })\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_allowed\",\n stateHash: \"allowed-state\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: true,\n autoLinkByVerifiedEmail: true,\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_allowed\"),\n })\n\n expect(result.user.id).toBe(\"usr_existing\")\n expect(result.identity).toMatchObject({\n userId: \"usr_existing\",\n })\n })\n })\n\n test(\"creates new OIDC users through active invitations and applies groups\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_oidc\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T09:59:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n displayName: \"Ava Chen\",\n emailVerified: true,\n newUserId: \"usr_oidc\",\n session: sessionInput(\"ses_oidc\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_oidc\",\n email: \"ava@acme.com\",\n displayName: \"Ava Chen\",\n })\n expect(result.invitation).toMatchObject({\n id: \"inv_oidc\",\n status: \"accepted\",\n })\n expect(result.identity).toMatchObject({\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_oidc\" })\n ).resolves.toMatchObject([{ groupId: \"commercial\", source: \"invitation\" }])\n })\n })\n\n test(\"does not create new OIDC users without invitation or bootstrap eligibility\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: true,\n newUserId: \"usr_oidc\",\n session: sessionInput(\"ses_oidc\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"ava@acme.com\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"allows first OIDC bootstrap user creation with manual groups\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_bootstrap\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"bootstrap-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_bootstrap\",\n stateHash: \"bootstrap-state\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"founder@acme.com\",\n emailVerified: true,\n allowUserCreationWithoutInvitation: true,\n requireNoActiveUsersForUserCreation: true,\n manualGroupIds: [\"security-admins\"],\n newUserId: \"usr_founder\",\n session: sessionInput(\"ses_oidc_bootstrap\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_founder\",\n email: \"founder@acme.com\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_founder\" })\n ).resolves.toMatchObject([{ groupId: \"security-admins\", source: \"manual\" }])\n })\n })\n\n test(\"suspends users and revokes active sessions immediately\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_1\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_app\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-app\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n\n const suspended = await storage.suspendUserAndRevokeSessions({\n projectId,\n userId: \"usr_1\",\n suspendedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n\n expect(suspended.status).toBe(\"suspended\")\n await expect(storage.sessions.getById({ projectId, id: \"ses_1\" })).resolves.toMatchObject({\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n await expect(storage.sessions.getById({ projectId, id: \"ses_app\" })).resolves.toMatchObject(\n {\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n }\n )\n })\n })\n })\n}\n",
|
|
11
14
|
"import { describe, expect, test } from \"bun:test\"\nimport { blobIdFromDigest, computeBlobDigest } from \"../blob-storage\"\nimport type { BlobStorage } from \"../blob-storage/types\"\n\nexport interface BlobStorageContractSuiteOptions<TStorage extends BlobStorage = BlobStorage> {\n /** Factory that produces an isolated storage instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\n/** Runs the shared content, streaming, size-validation, and cancellation contract. */\nexport function runBlobStorageContractSuite<TStorage extends BlobStorage>(\n label: string,\n options: BlobStorageContractSuiteOptions<TStorage>\n): void {\n const encoder = new TextEncoder()\n\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"streams bodies into stable content-addressed references\", async () => {\n await withStorage(async (storage) => {\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(encoder.encode(\"streamed \"))\n controller.enqueue(encoder.encode(\"body\"))\n controller.close()\n },\n })\n\n const fileRef = await storage.put({\n body,\n expectedSizeBytes: 13,\n fileName: \"report.bin\",\n mediaType: \"application/octet-stream\",\n logicalPath: \"reports/report.bin\",\n })\n\n expect(fileRef.sizeBytes).toBe(13)\n expect(fileRef.blobId).toBe(blobIdFromDigest(fileRef.digest))\n expect(fileRef.fileName).toBe(\"report.bin\")\n expect(fileRef.mediaType).toBe(\"application/octet-stream\")\n expect(fileRef.logicalPath).toBe(\"reports/report.bin\")\n expect(await new Response(await storage.open(fileRef.blobId)).text()).toBe(\"streamed body\")\n })\n })\n\n test(\"rejects an expected size mismatch without publishing a blob\", async () => {\n await withStorage(async (storage) => {\n const bytes = encoder.encode(\"wrong size\")\n const blobId = blobIdFromDigest(computeBlobDigest(bytes))\n\n await expect(\n storage.put({ body: bytes, expectedSizeBytes: bytes.byteLength + 1 })\n ).rejects.toThrow(\n `Blob size mismatch: expected ${bytes.byteLength + 1} bytes, received ${bytes.byteLength}.`\n )\n await expect(storage.stat(blobId)).resolves.toBeNull()\n })\n })\n\n test(\"rejects invalid expected sizes\", async () => {\n await withStorage(async (storage) => {\n const body = new ReadableStream<Uint8Array>({\n pull(controller) {\n controller.close()\n },\n })\n\n await expect(storage.put({ body, expectedSizeBytes: -1 })).rejects.toThrow(\n \"expectedSizeBytes must be a non-negative safe integer\"\n )\n })\n })\n\n test(\"cancels an active body without publishing partial bytes\", async () => {\n await withStorage(async (storage) => {\n const abort = new AbortController()\n let bodyCancelled = false\n const firstChunk = encoder.encode(\"partial\")\n const blobId = blobIdFromDigest(computeBlobDigest(firstChunk))\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(firstChunk)\n },\n cancel() {\n bodyCancelled = true\n },\n })\n\n const put = storage.put({ body, signal: abort.signal })\n abort.abort(new Error(\"cancel blob put\"))\n\n await expect(put).rejects.toThrow(\"cancel blob put\")\n expect(bodyCancelled).toBe(true)\n await expect(storage.stat(blobId)).resolves.toBeNull()\n })\n })\n })\n}\n",
|
|
12
15
|
"import { describe, expect, test } from \"bun:test\"\nimport { BrokerError } from \"../broker/errors\"\nimport type {\n Broker,\n BrokerRecord,\n BrokerRecordInput,\n BrokerStreamDefinition,\n} from \"../broker/types\"\nimport type { JsonValue } from \"../json\"\n\nexport interface BrokerContractSuiteOptions<TBroker extends Broker = Broker> {\n /** Factory that produces a fresh `Broker` instance for each test case. */\n readonly createBroker: () => TBroker | Promise<TBroker>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (broker: TBroker) => void | Promise<void>\n /**\n * Retention age used by the maxAgeMs assertion. Defaults to 20ms.\n * Providers with coarse server-side retention can increase this in their own suite.\n */\n readonly maxAgeMs?: number\n /**\n * Time to wait for maxAgeMs retention to expire. Defaults to `maxAgeMs + 20`.\n */\n readonly maxAgeWaitMs?: number\n /**\n * Time to wait after registering a live subscription before appending records.\n * Defaults to 0 for synchronous providers.\n */\n readonly subscriptionSetupMs?: number\n /**\n * Time to wait for asynchronous subscription delivery. Defaults to 200ms.\n */\n readonly subscriptionDeliveryTimeoutMs?: number\n /**\n * Poll interval while waiting for asynchronous subscription delivery. Defaults to 10ms.\n */\n readonly subscriptionPollIntervalMs?: number\n}\n\nconst eventsStream: BrokerStreamDefinition = { id: \"__events\" }\nconst retainedStream: BrokerStreamDefinition = { id: \"__retained\", retention: { maxRecords: 2 } }\n\n/**\n * Runs the shared `Broker` contract against any provider.\n *\n * The contract intentionally stays small: append records, read retained records\n * by exclusive cursor, subscribe to retained/live streams, and apply portable\n * retention. Provider-specific administration and durable consumer identity\n * are outside the V1 broker surface.\n */\nexport function runBrokerContractSuite<TBroker extends Broker>(\n label: string,\n options: BrokerContractSuiteOptions<TBroker>\n): void {\n const maxAgeMs = options.maxAgeMs ?? 20\n const maxAgeWaitMs = options.maxAgeWaitMs ?? maxAgeMs + 20\n const subscriptionSetupMs = options.subscriptionSetupMs ?? 0\n const subscriptionDeliveryTimeoutMs = options.subscriptionDeliveryTimeoutMs ?? 200\n const subscriptionPollIntervalMs = options.subscriptionPollIntervalMs ?? 10\n\n const withBroker = async (body: (broker: TBroker) => Promise<void>): Promise<void> => {\n const broker = await options.createBroker()\n try {\n await body(broker)\n } finally {\n await options.teardown?.(broker)\n }\n }\n\n describe(label, () => {\n describe(\"append\", () => {\n test(\"returns stored records with cursors and timestamps\", async () => {\n await withBroker(async (broker) => {\n const before = Date.now()\n\n const records = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n {\n name: \"test.record\",\n key: \"Room:room-1\",\n payload: { objectTypeId: \"Room\", primaryId: \"room-1\" },\n },\n ],\n })\n\n expect(records).toHaveLength(1)\n expect(records[0]).toMatchObject({\n streamId: eventsStream.id,\n name: \"test.record\",\n key: \"Room:room-1\",\n payload: { objectTypeId: \"Room\", primaryId: \"room-1\" },\n })\n expect(records[0]?.cursor).toBeTruthy()\n expect(Date.parse(records[0]!.publishedAt)).toBeGreaterThanOrEqual(before)\n })\n })\n\n test(\"snapshots appended payloads\", async () => {\n await withBroker(async (broker) => {\n const payload = { nested: { value: \"before\" } }\n\n const [record] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload }],\n })\n payload.nested.value = \"after\"\n\n expect(record?.payload).toEqual({ nested: { value: \"before\" } })\n const [readBack] = await readRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n })\n expect(readBack?.payload).toEqual({ nested: { value: \"before\" } })\n })\n })\n\n test(\"returns empty array for empty appends\", async () => {\n await withBroker(async (broker) => {\n const records = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [],\n })\n\n expect(records).toEqual([])\n })\n })\n\n test(\"rejects empty projectId and stream id\", async () => {\n await withBroker(async (broker) => {\n await expect(\n appendRecords(broker, {\n projectId: \" \",\n stream: eventsStream,\n records: [{ payload: { ok: true } }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: { id: \" \" },\n records: [{ payload: { ok: true } }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"rejects payloads that are not JSON values\", async () => {\n await withBroker(async (broker) => {\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n {\n payload: {\n observedAt: new Date(\"2026-01-01T00:00:00.000Z\"),\n } as unknown as JsonValue,\n },\n ],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: { value: Number.NaN } as unknown as JsonValue }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"requires streams to be ensured before appending records\", async () => {\n await withBroker(async (broker) => {\n await expect(\n broker.append({\n projectId: \"project-a\",\n streamId: \"missing\",\n records: [{ payload: \"one\" }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n })\n\n describe(\"read\", () => {\n test(\"reads records after an exclusive cursor\", async () => {\n await withBroker(async (broker) => {\n const [first] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"one\", payload: { value: 1 } },\n { name: \"two\", payload: { value: 2 } },\n { name: \"three\", payload: { value: 3 } },\n ],\n })\n\n const records = await readRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n afterCursor: first?.cursor,\n })\n\n expect(records.map((record) => record.name)).toEqual([\"two\", \"three\"])\n })\n })\n\n test(\"limits matching records after applying name filters\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"test.record\", payload: { id: \"room-1\" } },\n { name: \"telemetry.appended\", payload: { id: \"temp-1\" } },\n { name: \"test.record\", payload: { id: \"room-2\" } },\n ],\n })\n\n const records = await readRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n names: [\"test.record\"],\n limit: 2,\n })\n\n expect(records.map((record) => record.payload)).toEqual([\n { id: \"room-1\" },\n { id: \"room-2\" },\n ])\n })\n })\n\n test(\"returns empty array for missing streams and non-positive limits\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"test.record\", payload: { id: \"room-1\" } }],\n })\n\n expect(\n await broker.read({\n projectId: \"project-a\",\n streamId: \"missing\",\n })\n ).toEqual({ records: [], cursor: undefined, hasMore: false })\n expect(\n await readRecords(broker, { projectId: \"project-a\", stream: eventsStream, limit: 0 })\n ).toEqual([])\n expect(\n await readRecords(broker, { projectId: \"project-a\", stream: eventsStream, limit: -1 })\n ).toEqual([])\n })\n })\n\n test(\"isolates projects and streams\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: { id: \"stream-a\" },\n records: [{ payload: { value: \"a\" } }],\n })\n await appendRecords(broker, {\n projectId: \"project-b\",\n stream: { id: \"stream-a\" },\n records: [{ payload: { value: \"b\" } }],\n })\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: { id: \"stream-b\" },\n records: [{ payload: { value: \"c\" } }],\n })\n\n expect(\n await payloads(\n readRecords(broker, { projectId: \"project-a\", stream: { id: \"stream-a\" } })\n )\n ).toEqual([{ value: \"a\" }])\n expect(\n await payloads(\n readRecords(broker, { projectId: \"project-b\", stream: { id: \"stream-a\" } })\n )\n ).toEqual([{ value: \"b\" }])\n expect(\n await payloads(\n readRecords(broker, { projectId: \"project-a\", stream: { id: \"stream-b\" } })\n )\n ).toEqual([{ value: \"c\" }])\n })\n })\n\n test(\"advances the page cursor when filters match no records\", async () => {\n await withBroker(async (broker) => {\n const appended = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"one\", payload: 1 },\n { name: \"two\", payload: 2 },\n ],\n })\n\n const page = await broker.read({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n names: [\"missing\"],\n limit: 1,\n })\n\n expect(page.records).toEqual([])\n expect(page.cursor).toBe(appended.at(-1)?.cursor)\n expect(page.hasMore).toBe(false)\n })\n })\n\n test(\"filters by record key before applying the page limit\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { key: \"sync:a\", payload: \"a1\" },\n { key: \"sync:b\", payload: \"b\" },\n { key: \"sync:a\", payload: \"a2\" },\n ],\n })\n\n const page = await broker.read({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n keys: [\"sync:a\"],\n limit: 2,\n })\n expect(page.records.map((record) => record.payload)).toEqual([\"a1\", \"a2\"])\n })\n })\n\n test(\"reports no forward page when only filtered-out records remain\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { key: \"target\", payload: \"match\" },\n { key: \"other\", payload: \"filtered-one\" },\n { key: \"other\", payload: \"filtered-two\" },\n ],\n })\n\n const page = await broker.read({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n keys: [\"target\"],\n limit: 1,\n })\n expect(page.records.map((record) => record.payload)).toEqual([\"match\"])\n expect(page.hasMore).toBe(false)\n })\n })\n\n test(\"reports no backward page when only filtered-out records remain\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { key: \"other\", payload: \"filtered-one\" },\n { key: \"other\", payload: \"filtered-two\" },\n { key: \"target\", payload: \"match\" },\n ],\n })\n\n const page = await broker.tail({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n keys: [\"target\"],\n limit: 1,\n })\n expect(page.records.map((record) => record.payload)).toEqual([\"match\"])\n expect(page.hasMore).toBe(false)\n })\n })\n\n test(\"tails recent records and paginates toward older history\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [1, 2, 3, 4, 5].map((payload) => ({ payload })),\n })\n\n const recent = await broker.tail({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n limit: 2,\n })\n expect(recent.records.map((record) => record.payload)).toEqual([4, 5])\n expect(recent.hasMore).toBe(true)\n\n const older = await broker.tail({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n beforeCursor: recent.cursor,\n limit: 2,\n })\n expect(older.records.map((record) => record.payload)).toEqual([2, 3])\n expect(older.hasMore).toBe(true)\n })\n })\n })\n\n describe(\"latestCursor\", () => {\n test(\"returns undefined for missing and empty streams\", async () => {\n await withBroker(async (broker) => {\n expect(\n await broker.latestCursor({ projectId: \"project-a\", streamId: \"missing\" })\n ).toBeUndefined()\n\n await broker.ensureStream({ projectId: \"project-a\", stream: eventsStream })\n expect(\n await broker.latestCursor({ projectId: \"project-a\", streamId: eventsStream.id })\n ).toBeUndefined()\n })\n })\n\n test(\"returns the newest retained record cursor\", async () => {\n await withBroker(async (broker) => {\n const records = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n records: [{ payload: \"one\" }, { payload: \"two\" }, { payload: \"three\" }],\n })\n\n expect(\n await broker.latestCursor({ projectId: \"project-a\", streamId: retainedStream.id })\n ).toBe(records.at(-1)?.cursor)\n })\n })\n })\n\n describe(\"subscribe\", () => {\n test(\"requires streams to be ensured before subscribing\", async () => {\n await withBroker(async (broker) => {\n await expect(\n broker.subscribe({ projectId: \"project-a\", streamId: \"missing\" }, () => {})\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"defaults to latest and receives only new records\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"before\", payload: { value: \"before\" } }],\n })\n\n const received: string[] = []\n await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"after\", payload: \"after\" }],\n })\n\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not receive the appended record\",\n })\n expect(received).toEqual([\"after\"])\n })\n })\n\n test(\"can subscribe from earliest retained record\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"one\", payload: \"one\" },\n { name: \"two\", payload: \"two\" },\n ],\n })\n\n const received: string[] = []\n await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream, from: \"earliest\" },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"three\", payload: \"three\" }],\n })\n\n await waitUntil(() => received.length === 3, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not receive retained plus live records\",\n })\n expect(received).toEqual([\"one\", \"two\", \"three\"])\n })\n })\n\n test(\"can subscribe after a cursor and filter by name and key\", async () => {\n await withBroker(async (broker) => {\n const [first] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"test.record\", key: \"other\", payload: \"one\" },\n { name: \"telemetry.appended\", key: \"target\", payload: \"two\" },\n { name: \"test.record\", key: \"target\", payload: \"three\" },\n ],\n })\n\n const received: string[] = []\n await subscribeRecords(\n broker,\n {\n projectId: \"project-a\",\n stream: eventsStream,\n afterCursor: first?.cursor,\n names: [\"test.record\"],\n keys: [\"target\"],\n },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not replay matching records after cursor\",\n })\n expect(received).toEqual([\"three\"])\n })\n })\n\n test(\"unsubscribe stops delivery\", async () => {\n await withBroker(async (broker) => {\n const received: string[] = []\n const unsubscribe = await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: \"one\" }],\n })\n\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not receive the first record before unsubscribe\",\n })\n\n unsubscribe()\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: \"two\" }],\n })\n await Bun.sleep(Math.min(250, subscriptionDeliveryTimeoutMs))\n\n expect(received).toEqual([\"one\"])\n })\n })\n\n test(\"swallows handler errors\", async () => {\n await withBroker(async (broker) => {\n const received: string[] = []\n await subscribeRecords(broker, { projectId: \"project-a\", stream: eventsStream }, () => {\n throw new Error(\"subscriber failed\")\n })\n await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: \"one\" }],\n })\n ).resolves.toHaveLength(1)\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription delivery stopped after another handler threw\",\n })\n expect(received).toEqual([\"one\"])\n })\n })\n })\n\n describe(\"retention\", () => {\n test(\"bounds retained history by bytes\", async () => {\n await withBroker(async (broker) => {\n const stream = { id: \"__byte_retained\", retention: { maxBytes: 1_024 } }\n await broker.ensureStream({ projectId: \"project-a\", stream })\n\n await broker.append({\n projectId: \"project-a\",\n streamId: stream.id,\n records: [\"one\", \"two\", \"three\"].map((label) => ({\n name: label,\n payload: { label, body: \"x\".repeat(600) },\n })),\n })\n\n const records = await broker.read({\n projectId: \"project-a\",\n streamId: stream.id,\n })\n expect(records.records.length).toBeGreaterThan(0)\n expect(records.records.length).toBeLessThan(3)\n expect(records.records.at(-1)?.name).toBe(\"three\")\n })\n })\n\n test(\"retains only the latest maxRecords\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n records: [{ payload: \"one\" }, { payload: \"two\" }, { payload: \"three\" }],\n })\n\n const records = await readRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n })\n\n expect(records.map((record) => record.payload)).toEqual([\"two\", \"three\"])\n })\n })\n\n test(\"rejects resuming from a cursor that predates the retained range\", async () => {\n await withBroker(async (broker) => {\n const [first] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n records: [\n { payload: \"one\" },\n { payload: \"two\" },\n { payload: \"three\" },\n { payload: \"four\" },\n ],\n })\n\n await expect(\n readRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n afterCursor: first?.cursor,\n })\n ).rejects.toBeInstanceOf(BrokerError)\n\n await expect(\n broker.tail({\n projectId: \"project-a\",\n streamId: retainedStream.id,\n beforeCursor: first?.cursor,\n })\n ).rejects.toBeInstanceOf(BrokerError)\n\n // A resuming subscriber must be told the gap exists rather than silently fast-forwarded\n // to the oldest retained record, which would look like a complete stream. To prove this\n // still guards, drop the `assertCursorInRetainedRange` call from `subscribe` in\n // `broker/in-memory.ts` (or from `nats-broker.ts`) and only this expectation fails.\n await expect(\n broker.subscribe(\n {\n projectId: \"project-a\",\n streamId: retainedStream.id,\n afterCursor: first?.cursor,\n },\n () => undefined\n )\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"retains only records within maxAgeMs\", async () => {\n await withBroker(async (broker) => {\n const stream = { id: \"__age_retained\", retention: { maxAgeMs } }\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream,\n records: [{ payload: \"old\" }],\n })\n\n await Bun.sleep(maxAgeWaitMs)\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream,\n records: [{ payload: \"new\" }],\n })\n\n const records = await readRecords(broker, { projectId: \"project-a\", stream })\n\n expect(records.map((record) => record.payload)).toEqual([\"new\"])\n })\n })\n })\n })\n}\n\nasync function payloads(records: Promise<readonly BrokerRecord[]>): Promise<readonly unknown[]> {\n return (await records).map((record) => record.payload)\n}\n\nasync function appendRecords(\n broker: Broker,\n params: {\n projectId: string\n stream: BrokerStreamDefinition\n records: readonly BrokerRecordInput[]\n }\n): Promise<readonly BrokerRecord[]> {\n await broker.ensureStream({ projectId: params.projectId, stream: params.stream })\n return broker.append({\n projectId: params.projectId,\n streamId: params.stream.id,\n records: params.records,\n })\n}\n\nasync function readRecords(\n broker: Broker,\n params: {\n projectId: string\n stream: BrokerStreamDefinition\n afterCursor?: string\n limit?: number\n names?: readonly string[]\n keys?: readonly string[]\n }\n): Promise<readonly BrokerRecord[]> {\n await broker.ensureStream({ projectId: params.projectId, stream: params.stream })\n return (\n await broker.read({\n projectId: params.projectId,\n streamId: params.stream.id,\n afterCursor: params.afterCursor,\n limit: params.limit,\n names: params.names,\n keys: params.keys,\n })\n ).records\n}\n\nasync function subscribeRecords(\n broker: Broker,\n params: {\n projectId: string\n stream: BrokerStreamDefinition\n from?: \"latest\" | \"earliest\"\n afterCursor?: string\n names?: readonly string[]\n keys?: readonly string[]\n },\n handler: (records: readonly BrokerRecord[]) => void\n): Promise<() => void> {\n await broker.ensureStream({ projectId: params.projectId, stream: params.stream })\n return broker.subscribe(\n {\n projectId: params.projectId,\n streamId: params.stream.id,\n from: params.from,\n afterCursor: params.afterCursor,\n names: params.names,\n keys: params.keys,\n },\n handler\n )\n}\n\nasync function waitUntil(\n predicate: () => boolean,\n options: { timeoutMs: number; intervalMs: number; message: string }\n): Promise<void> {\n const deadline = Date.now() + options.timeoutMs\n while (Date.now() < deadline) {\n if (predicate()) {\n return\n }\n await Bun.sleep(options.intervalMs)\n }\n throw new Error(`${options.message} within ${options.timeoutMs}ms`)\n}\n",
|
|
13
16
|
"import { describe, expect, test } from \"bun:test\"\nimport type {\n ClaimConnectorConnectionRunCallbackInput,\n ClaimConnectorCredentialMutationResult,\n ConnectorAuthorizationRecord,\n ConnectorConnectionStorage,\n ConnectorCredentialMutationKind,\n CreateConnectorAuthorizationAttemptInput,\n CreateConnectorConnectionRunInput,\n} from \"../storage/connector-connections\"\nimport type { CreateExecutionInput } from \"../storage/executions\"\nimport type { Storage } from \"../storage/types\"\n\nexport type ConnectorConnectionStorageContractStorage = Storage & {\n readonly connectorConnections: ConnectorConnectionStorage\n}\n\nexport interface ConnectorConnectionStorageContractSuiteOptions<\n TStorage extends\n ConnectorConnectionStorageContractStorage = ConnectorConnectionStorageContractStorage,\n> {\n /** Factory that produces one isolated complete storage provider for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Advances the storage-authoritative clock without relying on wall-clock sleeps. */\n readonly advanceTime: (storage: TStorage, durationMs: number) => void | Promise<void>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"project-a\"\nconst connectorId = \"social\"\nconst credentials = {\n version: 1,\n algorithm: \"A256GCM\",\n nonce: \"nonce\",\n ciphertext: \"ciphertext\",\n tag: \"tag\",\n} as const\n\n/** Runs the atomicity, fencing, slot uniqueness and project-isolation storage contract. */\nexport function runConnectorConnectionStorageContractSuite<\n TStorage extends ConnectorConnectionStorageContractStorage,\n>(label: string, options: ConnectorConnectionStorageContractSuiteOptions<TStorage>): void {\n const withStorage = async (\n body: (connections: TStorage[\"connectorConnections\"], storage: TStorage) => Promise<void>\n ): Promise<void> => {\n const root = await options.createStorage()\n try {\n await body(root.connectorConnections, root)\n } finally {\n await options.teardown?.(root)\n }\n }\n\n describe(label, () => {\n test(\"binds one-use authorization attempts to their initiating execution\", async () => {\n await withStorage(async (storage) => {\n const attempt = authorizationAttempt()\n await expect(storage.createAuthorizationAttempt(attempt)).resolves.toMatchObject({\n id: attempt.id,\n projectId,\n connectorId,\n initiatedByExecutionId: attempt.initiatedByExecutionId,\n })\n\n for (const mismatchedScope of [\n { projectId: \"project-b\" },\n { connectorId: \"another-connector\" },\n ]) {\n await expect(\n storage.consumeAuthorizationAttempt({\n ...authorizationAttemptConsumption(),\n ...mismatchedScope,\n })\n ).rejects.toThrow(\"invalid, expired, or already used\")\n }\n\n await expect(\n storage.consumeAuthorizationAttempt(authorizationAttemptConsumption())\n ).resolves.toMatchObject({\n id: attempt.id,\n initiatedByExecutionId: attempt.initiatedByExecutionId,\n })\n await expect(\n storage.consumeAuthorizationAttempt(authorizationAttemptConsumption())\n ).rejects.toThrow(\"invalid, expired, or already used\")\n await expect(\n storage.createAuthorizationAttempt(authorizationAttempt())\n ).resolves.toMatchObject({ id: \"attempt-a\" })\n })\n })\n\n test(\"expires authorization attempts from the authoritative storage clock\", async () => {\n await withStorage(async (storage, root) => {\n const ttlMs = 60_000\n const attempt = await storage.createAuthorizationAttempt(authorizationAttempt({ ttlMs }))\n expect(attempt.expiresAt.getTime() - attempt.createdAt.getTime()).toBe(ttlMs)\n\n await options.advanceTime(root, ttlMs)\n\n await expect(\n storage.consumeAuthorizationAttempt(authorizationAttemptConsumption())\n ).rejects.toThrow(\"invalid, expired, or already used\")\n await expect(\n storage.createAuthorizationAttempt(authorizationAttempt())\n ).resolves.toMatchObject({ id: \"attempt-a\" })\n })\n })\n\n test(\"returns detached authorization attempt records\", async () => {\n await withStorage(async (storage) => {\n const created = await storage.createAuthorizationAttempt(authorizationAttempt())\n Object.assign(created.codeVerifier, { ciphertext: \"mutated\" })\n\n const consumed = await storage.consumeAuthorizationAttempt(\n authorizationAttemptConsumption()\n )\n expect(consumed.codeVerifier.ciphertext).toBe(credentials.ciphertext)\n })\n })\n\n test(\"commits and rolls back connection runs with their attempt and execution\", async () => {\n await withStorage(async (storage, root) => {\n const committedExecution = requestExecution(\"execution-commit\")\n const committedAttempt = authorizationAttempt({\n id: \"attempt-commit\",\n initiatedByExecutionId: committedExecution.id,\n connectionRunId: \"run-commit\",\n returnTo: \"https://app.example.com/connectors\",\n callbackBindingHash: \"binding-commit\",\n })\n const committedRun = connectionRun({\n id: \"run-commit\",\n initiatedByExecutionId: committedExecution.id,\n })\n await root.transaction(\n async (tx) => {\n await tx.executions.create(committedExecution)\n const connections = requireTransactionConnections(tx)\n await connections.createConnectionRun(committedRun)\n await connections.createAuthorizationAttempt(committedAttempt)\n },\n { isolation: \"serializable\" }\n )\n\n expect(\n await root.executions.getById({ projectId, id: committedExecution.id })\n ).not.toBeNull()\n await expect(\n storage.getConnectionRun({ projectId, connectorId, runId: committedRun.id })\n ).resolves.toMatchObject({ id: committedRun.id })\n await expect(\n storage.consumeAuthorizationAttempt(authorizationAttemptConsumption(committedAttempt.id))\n ).resolves.toMatchObject({ id: committedAttempt.id })\n\n const rolledBackExecution = requestExecution(\"execution-rollback\")\n const rolledBackAttempt = authorizationAttempt({\n id: \"attempt-rollback\",\n initiatedByExecutionId: rolledBackExecution.id,\n connectionRunId: \"run-rollback\",\n returnTo: \"https://app.example.com/connectors\",\n callbackBindingHash: \"binding-rollback\",\n })\n const rolledBackRun = connectionRun({\n id: \"run-rollback\",\n initiatedByExecutionId: rolledBackExecution.id,\n })\n const rollback = new Error(\"rollback connector authorization attempt\")\n await expect(\n root.transaction(\n async (tx) => {\n await tx.executions.create(rolledBackExecution)\n const connections = requireTransactionConnections(tx)\n await connections.createConnectionRun(rolledBackRun)\n await connections.createAuthorizationAttempt(rolledBackAttempt)\n throw rollback\n },\n { isolation: \"serializable\" }\n )\n ).rejects.toBe(rollback)\n\n expect(await root.executions.getById({ projectId, id: rolledBackExecution.id })).toBeNull()\n await expect(\n storage.getConnectionRun({ projectId, connectorId, runId: rolledBackRun.id })\n ).resolves.toBeNull()\n await expect(\n storage.consumeAuthorizationAttempt(authorizationAttemptConsumption(rolledBackAttempt.id))\n ).rejects.toThrow(\"invalid, expired, or already used\")\n })\n })\n\n test(\"links at most one headless attempt to an awaiting provider run\", async () => {\n await withStorage(async (storage) => {\n const headlessAttempt = {\n connectionRunId: \"run-a\",\n returnTo: \"https://app.example.com/connectors\",\n callbackBindingHash: \"binding-hash\",\n } as const\n\n await expect(\n storage.createAuthorizationAttempt(authorizationAttempt(headlessAttempt))\n ).rejects.toThrow(\"does not match its connection run\")\n\n await storage.createConnectionRun(connectionRun())\n await expect(\n storage.createAuthorizationAttempt(authorizationAttempt(headlessAttempt))\n ).resolves.toMatchObject({ id: \"attempt-a\", connectionRunId: \"run-a\" })\n await expect(\n storage.createAuthorizationAttempt(\n authorizationAttempt({ ...headlessAttempt, id: \"attempt-b\" })\n )\n ).rejects.toThrow(\"does not match its connection run\")\n })\n })\n\n test(\"claims a headless callback once with state and browser binding\", async () => {\n await withStorage(async (storage) => {\n await storage.createConnectionRun(connectionRun())\n await storage.createAuthorizationAttempt(\n authorizationAttempt({\n connectionRunId: \"run-a\",\n returnTo: \"https://app.example.com/connectors\",\n callbackBindingHash: \"binding-hash\",\n })\n )\n\n await expect(\n storage.claimConnectionRunCallback(\n connectionRunCallbackClaim({\n callbackBindingHash: \"wrong-binding\",\n })\n )\n ).resolves.toBeNull()\n\n const claimed = await storage.claimConnectionRunCallback(\n connectionRunCallbackClaim({\n callbackBindingHash: \"binding-hash\",\n })\n )\n expect(claimed).toMatchObject({\n type: \"claimed\",\n run: { id: \"run-a\", status: \"running\" },\n attempt: { id: \"attempt-a\", connectionRunId: \"run-a\" },\n returnTo: \"https://app.example.com/connectors\",\n })\n expect(claimed && \"returnTo\" in claimed.run).toBe(false)\n await expect(\n storage.claimConnectionRunCallback(\n connectionRunCallbackClaim({\n callbackBindingHash: \"binding-hash\",\n })\n )\n ).resolves.toBeNull()\n })\n })\n\n test(\"expires a waiting run and removes its protocol attempt lazily\", async () => {\n await withStorage(async (storage, root) => {\n await storage.createConnectionRun(connectionRun())\n await storage.createAuthorizationAttempt(\n authorizationAttempt({\n connectionRunId: \"run-a\",\n returnTo: \"https://app.example.com/connectors\",\n callbackBindingHash: \"binding-hash\",\n })\n )\n await options.advanceTime(root, 60_000)\n\n await expect(\n storage.getConnectionRun({ projectId, connectorId, runId: \"run-a\" })\n ).resolves.toMatchObject({ status: \"expired\" })\n await expect(\n storage.claimConnectionRunCallback(\n connectionRunCallbackClaim({\n callbackBindingHash: \"binding-hash\",\n })\n )\n ).resolves.toBeNull()\n })\n })\n\n test(\"fails an expired processing run and fences its late result\", async () => {\n await withStorage(async (storage, root) => {\n await storage.createConnectionRun(connectionRun())\n await storage.createAuthorizationAttempt(\n authorizationAttempt({\n connectionRunId: \"run-a\",\n returnTo: \"https://app.example.com/connectors\",\n callbackBindingHash: \"binding-hash\",\n })\n )\n const claimed = await storage.claimConnectionRunCallback(\n connectionRunCallbackClaim({ processingTtlMs: 1_000 })\n )\n if (!claimed || claimed.type !== \"claimed\") throw new Error(\"Expected callback claim.\")\n const authorization = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n await expect(\n storage.attachConnectionRunAuthorization({\n projectId,\n connectorId,\n runId: \"run-a\",\n processingId: claimed.run.processingId,\n authorizationId: authorization.id,\n })\n ).resolves.not.toBeNull()\n\n await options.advanceTime(root, 1_000)\n await expect(\n storage.getConnectionRun({ projectId, connectorId, runId: \"run-a\" })\n ).resolves.toMatchObject({\n status: \"failed\",\n authorizationId: authorization.id,\n error: { code: \"internal.unexpected\" },\n })\n await expect(\n storage.getAuthorization(authorizationKey(authorization.id))\n ).resolves.toMatchObject({ status: \"revocation_pending\" })\n await expect(\n storage.finishConnectionRun({\n projectId,\n connectorId,\n runId: \"run-a\",\n processingId: claimed.run.processingId,\n status: \"cancelled\",\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"keeps account selection atomic with its connection run\", async () => {\n await withStorage(async (storage) => {\n const active = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n await connect(storage, active, \"connection-a\", \"account-a\")\n const pending = await createAuthorization(storage, \"authorization-b\", \"account-b\")\n await createSelectionRun(storage, pending)\n\n await expect(\n storage.putConnectionFromRun({\n id: \"connection-b\",\n projectId,\n connectorId,\n runId: \"run-a\",\n account: { id: \"account-b\", label: \"Account B\" },\n replace: false,\n })\n ).rejects.toThrow(\"explicit replacement is required\")\n expect(\n await storage.getConnectionRun({ projectId, connectorId, runId: \"run-a\" })\n ).toMatchObject({ status: \"waiting\", waitingFor: \"account_selection\" })\n expect(await storage.getAuthorization(authorizationKey(pending.id))).toEqual(pending)\n\n const selected = await storage.putConnectionFromRun({\n id: \"connection-b\",\n projectId,\n connectorId,\n runId: \"run-a\",\n account: { id: \"account-b\", label: \"Account B\" },\n replace: true,\n })\n expect(selected.run).toMatchObject({ status: \"succeeded\" })\n })\n })\n\n test(\"keeps one stable connection per project connector slot\", async () => {\n await withStorage(async (storage) => {\n const first = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n const firstConnection = await connect(storage, first, \"connection-a\", \"account-a\")\n const second = await createAuthorization(storage, \"authorization-b\", \"account-b\")\n\n await expect(connect(storage, second, \"connection-b\", \"account-b\")).rejects.toThrow(\n \"explicit replacement is required\"\n )\n const replaced = await storage.putConnection({\n id: \"connection-b\",\n projectId,\n connectorId,\n authorizationId: second.id,\n owner: { type: \"project\" },\n slot: \"default\",\n account: { id: \"account-b\", label: \"ignored\" },\n replace: true,\n })\n expect(replaced.connection.id).toBe(firstConnection.connection.id)\n expect(replaced.revocationPendingAuthorizationId).toBe(first.id)\n expect(await storage.getAuthorization(authorizationKey(first.id))).toMatchObject({\n status: \"revocation_pending\",\n })\n expect(\n await storage.getConnection({\n projectId,\n connectorId,\n owner: { type: \"project\" },\n slot: \"default\",\n })\n ).toMatchObject({ authorizationId: second.id, account: { id: \"account-b\" } })\n })\n })\n\n test(\"retains disconnected identities and reactivates the same slot id\", async () => {\n await withStorage(async (storage) => {\n const first = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n const connected = await connect(storage, first, \"connection-a\", \"account-a\")\n\n const disconnected = await storage.disconnectConnection({\n projectId,\n connectorId,\n connectionId: connected.connection.id,\n })\n expect(disconnected).toMatchObject({\n connection: { id: connected.connection.id, status: \"disconnected\" },\n authorization: { status: \"revocation_pending\" },\n revocationPendingAuthorizationId: first.id,\n })\n expect(\n await storage.getConnection({\n projectId,\n connectorId,\n owner: { type: \"project\" },\n slot: \"default\",\n })\n ).toBeNull()\n expect(\n await storage.getConnectionById({\n projectId,\n connectorId,\n connectionId: connected.connection.id,\n })\n ).toMatchObject({ status: \"disconnected\" })\n\n const second = await createAuthorization(storage, \"authorization-b\", \"account-a\")\n const reconnected = await connect(storage, second, \"ignored-new-id\", \"account-a\")\n expect(reconnected.connection).toMatchObject({\n id: connected.connection.id,\n authorizationId: second.id,\n status: \"connected\",\n })\n })\n })\n\n test(\"keeps pending selection untouched when connection validation fails\", async () => {\n await withStorage(async (storage) => {\n const active = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n const existing = await connect(storage, active, \"connection-a\", \"account-a\")\n const replacement = await createAuthorization(storage, \"authorization-b\", \"account-b\")\n\n await expect(connect(storage, replacement, \"connection-b\", \"account-b\")).rejects.toThrow(\n \"explicit replacement is required\"\n )\n expect(await storage.getAuthorization(authorizationKey(replacement.id))).toEqual(\n replacement\n )\n\n const duplicateId = await createAuthorization(storage, \"authorization-c\", \"account-c\")\n await expect(\n storage.putConnection({\n id: existing.connection.id,\n projectId,\n connectorId,\n authorizationId: duplicateId.id,\n owner: { type: \"project\" },\n slot: \"secondary\",\n account: { id: \"account-c\", label: \"ignored\" },\n replace: false,\n })\n ).rejects.toThrow(\"connection id already exists\")\n expect(await storage.getAuthorization(authorizationKey(duplicateId.id))).toEqual(\n duplicateId\n )\n })\n })\n\n test(\"commits expiry cleanup before rejecting account selection\", async () => {\n await withStorage(async (storage, root) => {\n const authorization = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n await options.advanceTime(root, 60_000)\n\n await expect(connect(storage, authorization, \"connection-a\", \"account-a\")).rejects.toThrow(\n \"selectable authorization\"\n )\n await expect(\n storage.getAuthorization(authorizationKey(authorization.id))\n ).resolves.toMatchObject({ status: \"revocation_pending\" })\n })\n })\n\n test(\"commits lazy run expiry before rejecting a late selection\", async () => {\n await withStorage(async (storage, root) => {\n const authorization = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n await createSelectionRun(storage, authorization)\n await options.advanceTime(root, 60_000)\n\n await expect(\n storage.putConnectionFromRun({\n id: \"connection-a\",\n projectId,\n connectorId,\n runId: \"run-a\",\n account: { id: \"account-a\", label: \"Account A\" },\n replace: false,\n })\n ).rejects.toThrow(\"invalid, expired, or already used\")\n await expect(\n storage.getConnectionRun({ projectId, connectorId, runId: \"run-a\" })\n ).resolves.toMatchObject({ status: \"expired\" })\n await expect(\n storage.getAuthorization(authorizationKey(authorization.id))\n ).resolves.toMatchObject({ status: \"revocation_pending\" })\n })\n })\n\n test(\"scopes direct record reads by project and connector\", async () => {\n await withStorage(async (storage) => {\n const authorization = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n const connected = await connect(storage, authorization, \"connection-a\", \"account-a\")\n\n expect(await storage.getAuthorization(authorizationKey(authorization.id))).toEqual(\n connected.authorization\n )\n for (const scope of [\n { projectId: \"project-b\", connectorId },\n { projectId, connectorId: \"another-connector\" },\n ]) {\n expect(\n await storage.getAuthorization({\n ...scope,\n authorizationId: authorization.id,\n })\n ).toBeNull()\n expect(\n await storage.getConnectionById({\n ...scope,\n connectionId: connected.connection.id,\n })\n ).toBeNull()\n expect(\n await storage.listConnectionsByAuthorization({\n ...scope,\n authorizationId: authorization.id,\n })\n ).toEqual([])\n }\n })\n })\n\n test(\"fences staged credentials by project, revision and mutation id\", async () => {\n await withStorage(async (storage) => {\n const authorization = await createActiveAuthorization(storage)\n for (const scope of [\n { projectId: \"project-b\", connectorId },\n { projectId, connectorId: \"another-connector\" },\n ]) {\n await expect(\n storage.claimCredentialMutation({\n ...scope,\n authorizationId: authorization.id,\n expectedRevision: authorization.revision,\n mutation: { id: \"mutation-a\", kind: \"refresh\", holderId: \"worker-a\" },\n leaseDurationMs: 30_000,\n operationTimeoutMs: 60_000,\n })\n ).resolves.toBeNull()\n }\n\n const claim = await storage.claimCredentialMutation({\n projectId,\n connectorId,\n authorizationId: authorization.id,\n expectedRevision: authorization.revision,\n mutation: { id: \"mutation-a\", kind: \"refresh\", holderId: \"worker-a\" },\n leaseDurationMs: 30_000,\n operationTimeoutMs: 60_000,\n })\n expect(claim).not.toBeNull()\n const claimed = claim!.authorization\n const executing = await storage.markCredentialMutationExecuting({\n ...fence(claimed),\n holderId: \"worker-a\",\n })\n expect(executing?.credentialMutation?.phase).toBe(\"executing\")\n for (const scope of [\n { projectId: \"project-b\", connectorId },\n { projectId, connectorId: \"another-connector\" },\n ]) {\n await expect(\n storage.stageCredentialMutationCredentials({\n ...fence(claimed),\n ...scope,\n holderId: \"worker-a\",\n credentials,\n scopes: [],\n })\n ).resolves.toBeNull()\n }\n await expect(\n storage.stageCredentialMutationCredentials({\n ...fence(claimed),\n mutationId: \"stale-mutation\",\n holderId: \"worker-a\",\n credentials,\n scopes: [],\n })\n ).resolves.toBeNull()\n\n const staged = await storage.stageCredentialMutationCredentials({\n ...fence(claimed),\n holderId: \"worker-a\",\n credentials,\n scopes: [],\n })\n expect(staged?.credentialMutation?.phase).toBe(\"result_staged\")\n await expect(\n storage.finalizeRefresh({ ...fence(claimed), expectedRevision: claimed.revision + 1 })\n ).resolves.toBeNull()\n await expect(storage.finalizeRefresh(fence(claimed))).resolves.toMatchObject({\n revision: claimed.revision + 1,\n credentialMutation: undefined,\n })\n })\n })\n\n test(\"releases an expired prepared mutation without changing credential state\", async () => {\n await withStorage(async (storage, root) => {\n const authorization = await createActiveAuthorization(storage)\n await claimMutation(storage, authorization, \"mutation-prepared\", \"refresh\", {\n leaseDurationMs: 10_000,\n operationTimeoutMs: 60_000,\n })\n\n await options.advanceTime(root, 10_000)\n await expect(\n storage.recoverExpiredCredentialMutation(authorizationKey(authorization.id))\n ).resolves.toMatchObject({\n status: \"active\",\n revision: authorization.revision,\n credentialMutation: undefined,\n })\n })\n })\n\n test(\"fails closed expired executing credential changes but keeps revocation retryable\", async () => {\n for (const kind of [\"refresh\", \"reauthorization\"] as const) {\n await withStorage(async (storage, root) => {\n const authorization = await createActiveAuthorization(storage)\n const claim = await claimMutation(storage, authorization, `mutation-${kind}`, kind, {\n leaseDurationMs: 10_000,\n operationTimeoutMs: 60_000,\n })\n await markExecuting(storage, claim.authorization)\n\n await options.advanceTime(root, 10_000)\n await expect(\n storage.recoverExpiredCredentialMutation(authorizationKey(authorization.id))\n ).resolves.toMatchObject({\n status: \"needs_reauthorization\",\n revision: claim.authorization.revision + 1,\n credentialMutation: undefined,\n })\n })\n }\n\n await withStorage(async (storage, root) => {\n const authorization = await createActiveAuthorization(storage)\n const claim = await claimMutation(\n storage,\n authorization,\n \"mutation-revocation\",\n \"revocation\",\n { leaseDurationMs: 10_000, operationTimeoutMs: 60_000 }\n )\n await markExecuting(storage, claim.authorization)\n\n await options.advanceTime(root, 10_000)\n const recovered = await storage.recoverExpiredCredentialMutation(\n authorizationKey(authorization.id)\n )\n expect(recovered).toMatchObject({\n status: \"revocation_pending\",\n revision: claim.authorization.revision,\n credentialMutation: undefined,\n })\n if (!recovered) throw new Error(\"Expected expired revocation recovery.\")\n await expect(\n claimMutation(storage, recovered, \"mutation-revocation-retry\", \"revocation\")\n ).resolves.toBeDefined()\n })\n })\n\n test(\"preserves a staged provider result after its lease and deadline\", async () => {\n await withStorage(async (storage, root) => {\n const authorization = await createActiveAuthorization(storage)\n const claim = await claimMutation(storage, authorization, \"mutation-staged\", \"refresh\", {\n leaseDurationMs: 10_000,\n operationTimeoutMs: 20_000,\n })\n const executing = await markExecuting(storage, claim.authorization)\n const staged = await storage.stageCredentialMutationCredentials({\n ...fence(executing),\n holderId: \"worker-a\",\n credentials: { ...credentials, ciphertext: \"refreshed\" },\n scopes: [\"accounts.read\"],\n })\n expect(staged?.credentialMutation?.phase).toBe(\"result_staged\")\n\n await options.advanceTime(root, 20_000)\n const recovered = await storage.recoverExpiredCredentialMutation(\n authorizationKey(authorization.id)\n )\n expect(recovered?.credentialMutation?.phase).toBe(\"result_staged\")\n if (!recovered) throw new Error(\"Expected staged refresh recovery.\")\n await expect(storage.finalizeRefresh(fence(recovered))).resolves.toMatchObject({\n status: \"active\",\n revision: authorization.revision + 1,\n scopes: [\"accounts.read\"],\n credentialMutation: undefined,\n })\n })\n })\n\n test(\"never renews a credential lease past its operation deadline\", async () => {\n await withStorage(async (storage, root) => {\n const authorization = await createActiveAuthorization(storage)\n const claim = await claimMutation(storage, authorization, \"mutation-renew\", \"refresh\", {\n leaseDurationMs: 10_000,\n operationTimeoutMs: 25_000,\n })\n const executing = await markExecuting(storage, claim.authorization)\n const deadline = executing.credentialMutation!.deadlineAt\n\n await options.advanceTime(root, 8_000)\n const renewed = await storage.renewCredentialMutation({\n ...fence(executing),\n holderId: \"worker-a\",\n leaseDurationMs: 30_000,\n })\n expect(renewed?.credentialMutation?.expiresAt).toEqual(deadline)\n\n await options.advanceTime(root, 17_000)\n await expect(\n storage.recoverExpiredCredentialMutation(authorizationKey(authorization.id))\n ).resolves.toMatchObject({\n status: \"needs_reauthorization\",\n credentialMutation: undefined,\n })\n })\n })\n\n test(\"disconnects every local usage atomically when revocation starts\", async () => {\n await withStorage(async (storage) => {\n const authorization = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n const first = await connect(storage, authorization, \"connection-a\", \"account-a\")\n await storage.putConnection({\n id: \"connection-b\",\n projectId,\n connectorId,\n authorizationId: authorization.id,\n owner: { type: \"project\" },\n slot: \"secondary\",\n account: { id: \"account-a\", label: \"ignored\" },\n replace: false,\n })\n const active = (await storage.getAuthorization(authorizationKey(authorization.id)))!\n const claim = await storage.claimCredentialMutation({\n projectId,\n connectorId,\n authorizationId: authorization.id,\n expectedRevision: active.revision,\n mutation: { id: \"mutation-revoke\", kind: \"revocation\", holderId: \"worker-a\" },\n leaseDurationMs: 30_000,\n operationTimeoutMs: 60_000,\n })\n\n expect(claim?.authorization.status).toBe(\"revocation_pending\")\n expect(claim?.disconnected.map((connection) => connection.id).sort()).toEqual(\n [first.connection.id, \"connection-b\"].sort()\n )\n expect(\n await storage.listConnectionsByAuthorization(authorizationKey(authorization.id))\n ).toEqual([])\n expect(\n await storage.getAuthorizationByConnectionId({\n projectId,\n connectorId,\n connectionId: first.connection.id,\n })\n ).toMatchObject({ id: authorization.id, status: \"revocation_pending\" })\n\n if (!claim) throw new Error(\"Expected revocation mutation claim.\")\n const executing = await markExecuting(storage, claim.authorization)\n const staged = await storage.stageCredentialMutationRevocation({\n ...fence(executing),\n holderId: \"worker-a\",\n })\n if (!staged) throw new Error(\"Expected staged revocation.\")\n const revoked = await storage.finalizeRevocation(fence(staged))\n expect(revoked).toMatchObject({\n status: \"revoked\",\n credentials: undefined,\n scopes: [],\n accounts: [],\n })\n expect(await storage.listConnections({ projectId, connectorId })).toEqual(\n expect.arrayContaining([\n expect.objectContaining({ id: first.connection.id, status: \"disconnected\" }),\n expect.objectContaining({ id: \"connection-b\", status: \"disconnected\" }),\n ])\n )\n })\n })\n\n test(\"freezes the attached connection set during reauthorization\", async () => {\n await withStorage(async (storage) => {\n const authorization = await createActiveAuthorization(storage)\n const connections = await storage.listConnectionsByAuthorization(\n authorizationKey(authorization.id)\n )\n const claim = await storage.claimCredentialMutation({\n projectId,\n connectorId,\n authorizationId: authorization.id,\n expectedRevision: authorization.revision,\n mutation: {\n id: \"mutation-reauthorize\",\n kind: \"reauthorization\",\n holderId: \"worker-a\",\n },\n expectedConnectionIds: connections.map((connection) => connection.id),\n leaseDurationMs: 30_000,\n operationTimeoutMs: 60_000,\n })\n expect(claim).not.toBeNull()\n\n await expect(\n storage.disconnectConnection({\n projectId,\n connectorId,\n connectionId: connections[0].id,\n })\n ).rejects.toThrow(\"being reauthorized\")\n })\n })\n })\n}\n\nfunction authorizationAttempt(\n overrides: Partial<CreateConnectorAuthorizationAttemptInput> = {}\n): CreateConnectorAuthorizationAttemptInput {\n return {\n id: \"attempt-a\",\n projectId,\n connectorId,\n owner: { type: \"project\" },\n slot: \"default\",\n initiatedByExecutionId: \"execution-a\",\n stateHash: \"state-hash\",\n codeVerifier: credentials,\n redirectUri: \"https://example.com/oauth/callback\",\n ttlMs: 60_000,\n ...overrides,\n }\n}\n\nfunction connectionRun(\n overrides: Partial<CreateConnectorConnectionRunInput> = {}\n): CreateConnectorConnectionRunInput {\n return {\n id: \"run-a\",\n projectId,\n connectorId,\n kind: \"connect\",\n owner: { type: \"project\" },\n slot: \"default\",\n initiatedByExecutionId: \"execution-a\",\n ttlMs: 60_000,\n ...overrides,\n }\n}\n\nasync function createSelectionRun(\n storage: ConnectorConnectionStorage,\n authorization: ConnectorAuthorizationRecord\n): Promise<void> {\n await storage.createConnectionRun(connectionRun())\n await storage.createAuthorizationAttempt(\n authorizationAttempt({\n connectionRunId: \"run-a\",\n returnTo: \"https://app.example.com/connectors\",\n callbackBindingHash: \"binding-hash\",\n })\n )\n const claimed = await storage.claimConnectionRunCallback(connectionRunCallbackClaim())\n if (!claimed || claimed.type !== \"claimed\") throw new Error(\"Expected callback claim.\")\n const attached = await storage.attachConnectionRunAuthorization({\n projectId,\n connectorId,\n runId: \"run-a\",\n processingId: claimed.run.processingId,\n authorizationId: authorization.id,\n })\n if (!attached) throw new Error(\"Expected authorization to be attached to the run.\")\n const waiting = await storage.waitForConnectionRunSelection({\n projectId,\n connectorId,\n runId: \"run-a\",\n processingId: claimed.run.processingId,\n authorizationId: authorization.id,\n expiresAt: authorization.selectionExpiresAt!,\n })\n if (!waiting) throw new Error(\"Expected account-selection run.\")\n}\n\nfunction connectionRunCallbackClaim(\n overrides: Partial<ClaimConnectorConnectionRunCallbackInput> = {}\n): ClaimConnectorConnectionRunCallbackInput {\n return {\n projectId,\n attemptId: \"attempt-a\",\n stateHash: \"state-hash\",\n callbackBindingHash: \"binding-hash\",\n redirectUri: \"https://example.com/oauth/callback\",\n processingId: \"processing-a\",\n processingTtlMs: 60_000,\n ...overrides,\n }\n}\n\nfunction authorizationKey(\n authorizationId: string,\n overrides: Partial<{ readonly projectId: string; readonly connectorId: string }> = {}\n) {\n return { projectId, connectorId, authorizationId, ...overrides }\n}\n\nfunction authorizationAttemptConsumption(id = \"attempt-a\") {\n return {\n id,\n projectId,\n connectorId,\n stateHash: \"state-hash\",\n redirectUri: \"https://example.com/oauth/callback\",\n }\n}\n\nfunction requestExecution(id: string): CreateExecutionInput {\n const requestId = `request-${id}`\n return {\n id,\n projectId,\n executor: { type: \"request\", requestId },\n source: { type: \"http\", requestId },\n correlationId: `correlation-${id}`,\n authorizationRef: { type: \"disabled\" },\n }\n}\n\nfunction requireTransactionConnections(storage: Storage): ConnectorConnectionStorage {\n if (storage.connectorConnections) return storage.connectorConnections\n throw new Error(\"Connector connection storage is missing from the transaction facade.\")\n}\n\nasync function createAuthorization(\n storage: ConnectorConnectionStorage,\n id: string,\n accountId: string\n): Promise<ConnectorAuthorizationRecord> {\n return storage.createAuthorization({\n id,\n projectId,\n connectorId,\n authorizedBy: { type: \"user\", id: \"user-a\" },\n credentials,\n scopes: [],\n accounts: [{ id: accountId, label: accountId }],\n selectionTtlMs: 60_000,\n })\n}\n\nasync function createActiveAuthorization(\n storage: ConnectorConnectionStorage\n): Promise<ConnectorAuthorizationRecord> {\n const authorization = await createAuthorization(storage, \"authorization-a\", \"account-a\")\n const result = await connect(storage, authorization, \"connection-a\", \"account-a\")\n return result.authorization\n}\n\nfunction connect(\n storage: ConnectorConnectionStorage,\n authorization: ConnectorAuthorizationRecord,\n connectionId: string,\n accountId: string\n) {\n return storage.putConnection({\n id: connectionId,\n projectId,\n connectorId,\n authorizationId: authorization.id,\n owner: { type: \"project\" },\n slot: \"default\",\n account: { id: accountId, label: \"ignored\" },\n replace: false,\n })\n}\n\nasync function claimMutation(\n storage: ConnectorConnectionStorage,\n authorization: ConnectorAuthorizationRecord,\n mutationId: string,\n kind: ConnectorCredentialMutationKind,\n timing: { readonly leaseDurationMs: number; readonly operationTimeoutMs: number } = {\n leaseDurationMs: 30_000,\n operationTimeoutMs: 60_000,\n }\n): Promise<ClaimConnectorCredentialMutationResult> {\n const expectedConnectionIds =\n kind === \"reauthorization\"\n ? (await storage.listConnectionsByAuthorization(authorizationKey(authorization.id))).map(\n (connection) => connection.id\n )\n : undefined\n const claim = await storage.claimCredentialMutation({\n projectId,\n connectorId,\n authorizationId: authorization.id,\n expectedRevision: authorization.revision,\n mutation: { id: mutationId, kind, holderId: \"worker-a\" },\n ...(expectedConnectionIds === undefined ? {} : { expectedConnectionIds }),\n ...timing,\n })\n if (!claim) throw new Error(`Expected '${kind}' credential mutation claim.`)\n return claim\n}\n\nasync function markExecuting(\n storage: ConnectorConnectionStorage,\n authorization: ConnectorAuthorizationRecord\n): Promise<ConnectorAuthorizationRecord> {\n const executing = await storage.markCredentialMutationExecuting({\n ...fence(authorization),\n holderId: \"worker-a\",\n })\n if (!executing) throw new Error(\"Expected credential mutation execution.\")\n return executing\n}\n\nfunction fence(authorization: ConnectorAuthorizationRecord) {\n return {\n projectId: authorization.projectId,\n connectorId: authorization.connectorId,\n authorizationId: authorization.id,\n expectedRevision: authorization.revision,\n mutationId: authorization.credentialMutation!.id,\n }\n}\n",
|
|
14
|
-
"import { describe, expect, test } from \"bun:test\"\nimport { defineObjectType, link, OntologyRegistry, prop } from \"../ontology\"\nimport { linkBatchKey, objectBatchKey, objectLinkCursor, type Storage } from \"../storage\"\nimport { createMaterializerTestFixture } from \"./materializer-fixture\"\n\nexport interface EffectiveStorageContractSuiteOptions<TStorage extends Storage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"effective-storage-contract\"\nconst Device = defineObjectType({\n id: \"EffectiveStorageDevice\",\n name: \"Device\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n prop(\"temperature\", \"double\", { mode: \"telemetry\" }),\n ],\n links: [link.self(\"peers\", { cardinality: \"many\" })],\n})\nconst OpaqueA = defineObjectType({\n id: \"A\",\n name: \"Opaque A\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n ],\n links: [link.self(\"D\", { cardinality: \"many\" })],\n})\nconst OpaqueAB = defineObjectType({\n id: \"A:B\",\n name: \"Opaque AB\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n ],\n links: [link.self(\"D\", { cardinality: \"many\" })],\n})\nconst ontology = new OntologyRegistry({ sources: [Device, OpaqueA, OpaqueAB] })\n\nexport function runEffectiveStorageContractSuite<TStorage extends Storage>(\n name: string,\n provider: EffectiveStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await provider.createStorage()\n try {\n await seedEffectiveState(storage)\n await body(storage)\n } finally {\n await provider.cleanup?.(storage)\n }\n }\n\n describe(name, () => {\n test(\"reads Materializer-owned objects\", async () => {\n await withStorage(async (storage) => {\n const object = await storage.objects.getByPrimaryId({\n projectId,\n objectTypeId: Device.id,\n primaryId: \"a\",\n })\n expect(object).toMatchObject({\n properties: { id: \"a\", name: \"Alpha\", temperature: 22 },\n version: 2,\n })\n expect(typeof object?.lastCommitId).toBe(\"string\")\n\n const batch = await storage.objects.getByPrimaryIdBatch({\n projectId,\n items: [\n { objectTypeId: Device.id, primaryId: \"a\" },\n { objectTypeId: Device.id, primaryId: \"missing\" },\n ],\n })\n expect([...batch.keys()]).toEqual([objectBatchKey(Device.id, \"a\")])\n })\n })\n\n test(\"reads Materializer-owned links\", async () => {\n await withStorage(async (storage) => {\n const outgoing = await storage.objects.listLinks({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n })\n expect(outgoing.map((row) => row.targetId).sort()).toEqual([\"b\", \"c\"])\n expect(outgoing.every((row) => row.lastCommitId.length > 0)).toBe(true)\n\n const incoming = await storage.objects.listIncidentLinksBatch({\n projectId,\n items: [{ objectTypeId: Device.id, objectId: \"b\" }],\n })\n expect(incoming).toHaveLength(1)\n expect(incoming[0]).toMatchObject({ sourceId: \"a\", targetId: \"b\" })\n\n const linksByScope = await storage.objects.listLinksBatch({\n projectId,\n items: [{ objectTypeId: Device.id, objectId: \"a\", linkId: \"peers\" }],\n })\n expect(linksByScope.get(linkBatchKey(Device.id, \"a\", \"peers\"))).toHaveLength(2)\n })\n })\n\n test(\"pages and filters incident links in the provider\", async () => {\n await withStorage(async (storage) => {\n const first = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"a\" }],\n direction: \"outgoing\",\n linkId: \"peers\",\n endpointObjectTypeIds: [Device.id],\n limit: 1,\n })\n expect(first.links.map((row) => row.targetId)).toEqual([\"b\"])\n expect(first.hasMore).toBe(true)\n\n const second = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"a\" }],\n direction: \"outgoing\",\n linkId: \"peers\",\n endpointObjectTypeIds: [Device.id],\n after: objectLinkCursor(first.links[0]),\n limit: 1,\n })\n expect(second.links.map((row) => row.targetId)).toEqual([\"c\"])\n expect(second.hasMore).toBe(false)\n\n const duplicateRefs = await storage.objects.queryLinks({\n projectId,\n objectRefs: [\n { objectTypeId: Device.id, primaryId: \"a\" },\n { objectTypeId: Device.id, primaryId: \"a\" },\n ],\n direction: \"outgoing\",\n limit: 10,\n })\n expect(duplicateRefs.links.map((row) => row.targetId)).toEqual([\"b\", \"c\"])\n\n const incoming = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"b\" }],\n direction: \"incoming\",\n limit: 10,\n })\n expect(incoming.links.map((row) => [row.sourceId, row.targetId])).toEqual([[\"a\", \"b\"]])\n\n const bothDirections = await storage.objects.queryLinks({\n projectId,\n objectRefs: [\n { objectTypeId: Device.id, primaryId: \"a\" },\n { objectTypeId: Device.id, primaryId: \"b\" },\n ],\n direction: \"both\",\n endpointObjectTypeIds: [Device.id],\n limit: 10,\n })\n expect(bothDirections.links.map((row) => [row.sourceId, row.targetId])).toEqual([\n [\"a\", \"b\"],\n [\"a\", \"c\"],\n ])\n\n const unauthorized = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"a\" }],\n direction: \"both\",\n endpointObjectTypeIds: [],\n limit: 10,\n })\n expect(unauthorized).toEqual({ links: [], hasMore: false })\n })\n })\n\n test(\"keeps delimiter-bearing object and batch-link identities distinct\", async () => {\n await withStorage(async (storage) => {\n const opaqueProjectId = `${projectId}-opaque-batch-keys`\n const fixture = createMaterializerTestFixture({\n projectId: opaqueProjectId,\n ontology,\n storage,\n })\n await fixture.seed({\n objects: [\n {\n ref: { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n properties: { id: \"B:C\", name: \"First\" },\n },\n {\n ref: { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n properties: { id: \"C\", name: \"Second\" },\n },\n ],\n links: [\n {\n ref: {\n source: { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n linkId: \"D\",\n target: { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n },\n },\n {\n ref: {\n source: { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n linkId: \"D\",\n target: { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n },\n },\n ],\n })\n\n const objects = await storage.objects.getByPrimaryIdBatch({\n projectId: opaqueProjectId,\n items: [\n { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n ],\n })\n expect(objects.get(objectBatchKey(OpaqueA.id, \"B:C\"))?.properties.name).toBe(\"First\")\n expect(objects.get(objectBatchKey(OpaqueAB.id, \"C\"))?.properties.name).toBe(\"Second\")\n\n const links = await storage.objects.listLinksBatch({\n projectId: opaqueProjectId,\n items: [\n { objectTypeId: OpaqueA.id, objectId: \"B:C\", linkId: \"D\" },\n { objectTypeId: OpaqueAB.id, objectId: \"C\", linkId: \"D\" },\n ],\n })\n expect(links.get(linkBatchKey(OpaqueA.id, \"B:C\", \"D\"))).toHaveLength(1)\n expect(links.get(linkBatchKey(OpaqueAB.id, \"C\", \"D\"))).toHaveLength(1)\n })\n })\n\n test(\"preserves distinct incident links when opaque ids contain delimiters\", async () => {\n await withStorage(async (storage) => {\n const opaqueIdsProjectId = `${projectId}-opaque-link-ids`\n const firstSourceId = \"opaque:source\"\n const firstTargetId = `target:peers:${Device.id}:opaque:end`\n const secondSourceId = `${firstSourceId}:peers:${Device.id}:target`\n const secondTargetId = \"opaque:end\"\n const fixture = createMaterializerTestFixture({\n projectId: opaqueIdsProjectId,\n ontology,\n storage,\n })\n await fixture.seed({\n objects: [\n device(firstSourceId, \"First source\"),\n device(firstTargetId, \"First target\"),\n device(secondSourceId, \"Second source\"),\n device(secondTargetId, \"Second target\"),\n ],\n links: [peer(firstSourceId, firstTargetId), peer(secondSourceId, secondTargetId)],\n })\n\n const incident = await storage.objects.listIncidentLinksBatch({\n projectId: opaqueIdsProjectId,\n items: [\n { objectTypeId: Device.id, objectId: firstSourceId },\n { objectTypeId: Device.id, objectId: secondSourceId },\n ],\n })\n const matching = incident.filter(\n (row) => row.sourceId === firstSourceId || row.sourceId === secondSourceId\n )\n\n expect(matching.map((row) => [row.sourceId, row.linkId, row.targetId])).toEqual(\n expect.arrayContaining([\n [firstSourceId, \"peers\", firstTargetId],\n [secondSourceId, \"peers\", secondTargetId],\n ])\n )\n expect(matching).toHaveLength(2)\n })\n })\n\n test(\"pages Materializer-owned objects with a stable cursor\", async () => {\n await withStorage(async (storage) => {\n const firstPage = await storage.objects.listByPrimaryIdPage({\n projectId,\n objectTypeId: Device.id,\n limit: 2,\n })\n expect(firstPage.objects.map((row) => row.primaryId)).toEqual([\"a\", \"b\"])\n expect(firstPage.nextPrimaryId).toBe(\"b\")\n const secondPage = await storage.objects.listByPrimaryIdPage({\n projectId,\n objectTypeId: Device.id,\n afterPrimaryId: firstPage.nextPrimaryId,\n limit: 2,\n })\n expect(secondPage.objects.map((row) => row.primaryId)).toEqual([\"c\"])\n })\n })\n\n test(\"reads Materializer-owned telemetry\", async () => {\n await withStorage(async (storage) => {\n const descending = await storage.timeseries.getHistory({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n propertyId: \"temperature\",\n from: new Date(\"2026-01-01T10:30:00.000Z\"),\n order: \"desc\",\n })\n expect(descending.map((point) => point.value)).toEqual([22])\n expect(typeof descending[0]?.lastCommitId).toBe(\"string\")\n\n const histories = await storage.timeseries.getHistoryBatch({\n projectId,\n series: [\n { objectTypeId: Device.id, objectId: \"a\", propertyId: \"temperature\" },\n { objectTypeId: Device.id, objectId: \"b\", propertyId: \"temperature\" },\n ],\n limitPerSeries: 1,\n order: \"desc\",\n })\n expect(histories.map((series) => series.points[0]?.value)).toEqual([22, 18])\n\n const latest = await storage.timeseries.getLatest({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n propertyId: \"temperature\",\n })\n expect(latest).toMatchObject({ value: 22, at: new Date(\"2026-01-01T12:00:00.000Z\") })\n })\n })\n })\n}\n\nasync function seedEffectiveState(storage: Storage): Promise<void> {\n const fixture = createMaterializerTestFixture({ projectId, ontology, storage })\n await fixture.seed({\n objects: [device(\"a\", \"Alpha\"), device(\"b\", \"Beta\"), device(\"c\", \"Gamma\")],\n links: [peer(\"a\", \"b\"), peer(\"a\", \"c\")],\n telemetry: [\n temperature(\"a\", 20, \"2026-01-01T10:00:00.000Z\"),\n temperature(\"a\", 22, \"2026-01-01T12:00:00.000Z\"),\n temperature(\"b\", 18, \"2026-01-01T11:00:00.000Z\"),\n ],\n })\n}\n\nfunction device(primaryId: string, name: string) {\n return {\n ref: { objectTypeId: Device.id, primaryId },\n properties: { id: primaryId, name },\n }\n}\n\nfunction peer(sourceId: string, targetId: string) {\n return {\n ref: {\n source: { objectTypeId: Device.id, primaryId: sourceId },\n linkId: \"peers\",\n target: { objectTypeId: Device.id, primaryId: targetId },\n },\n }\n}\n\nfunction temperature(objectId: string, value: number, at: string) {\n return {\n series: {\n object: { objectTypeId: Device.id, primaryId: objectId },\n propertyId: \"temperature\",\n },\n value,\n at,\n }\n}\n",
|
|
17
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { defineObjectType, link, OntologyRegistry, prop } from \"../ontology\"\nimport { linkBatchKey, objectBatchKey, objectLinkCursor, type Storage } from \"../storage\"\nimport { createMaterializerTestFixture } from \"./materializer-fixture\"\n\nexport interface EffectiveStorageContractSuiteOptions<TStorage extends Storage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"effective-storage-contract\"\nconst Device = defineObjectType({\n id: \"EffectiveStorageDevice\",\n name: \"Device\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n prop(\"temperature\", \"double\", { mode: \"telemetry\" }),\n ],\n links: [link.self(\"peers\", { cardinality: \"many\" })],\n})\nconst OpaqueA = defineObjectType({\n id: \"A\",\n name: \"Opaque A\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n ],\n links: [link.self(\"D\", { cardinality: \"many\" })],\n})\nconst OpaqueAB = defineObjectType({\n id: \"A:B\",\n name: \"Opaque AB\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n ],\n links: [link.self(\"D\", { cardinality: \"many\" })],\n})\nconst ontology = new OntologyRegistry({ sources: [Device, OpaqueA, OpaqueAB] })\n\nexport function runEffectiveStorageContractSuite<TStorage extends Storage>(\n name: string,\n provider: EffectiveStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await provider.createStorage()\n try {\n await seedEffectiveState(storage)\n await body(storage)\n } finally {\n await provider.cleanup?.(storage)\n }\n }\n\n describe(name, () => {\n test(\"reads Materializer-owned objects\", async () => {\n await withStorage(async (storage) => {\n const object = await storage.objects.getByPrimaryId({\n projectId,\n objectTypeId: Device.id,\n primaryId: \"a\",\n })\n expect(object).toMatchObject({\n properties: { id: \"a\", name: \"Alpha\", temperature: 22 },\n version: 2,\n })\n expect(typeof object?.lastCommitId).toBe(\"string\")\n\n const batch = await storage.objects.getByPrimaryIdBatch({\n projectId,\n items: [\n { objectTypeId: Device.id, primaryId: \"a\" },\n { objectTypeId: Device.id, primaryId: \"missing\" },\n ],\n })\n expect([...batch.keys()]).toEqual([objectBatchKey(Device.id, \"a\")])\n\n const selectedProperties = await storage.objects.selectsObjectProperties({\n projectId,\n items: [\n { objectTypeId: Device.id, primaryId: \"a\", propertyId: \"name\" },\n { objectTypeId: Device.id, primaryId: \"a\", propertyId: \"not-materialized\" },\n { objectTypeId: Device.id, primaryId: \"missing\", propertyId: \"name\" },\n { objectTypeId: Device.id, primaryId: \"a\", propertyId: \"name\" },\n ],\n })\n expect(selectedProperties).toEqual([true, true, false, true])\n })\n })\n\n test(\"reads Materializer-owned links\", async () => {\n await withStorage(async (storage) => {\n const outgoing = await storage.objects.listLinks({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n })\n expect(outgoing.map((row) => row.targetId).sort()).toEqual([\"b\", \"c\"])\n expect(outgoing.every((row) => row.lastCommitId.length > 0)).toBe(true)\n\n const incoming = await storage.objects.listIncidentLinksBatch({\n projectId,\n items: [{ objectTypeId: Device.id, objectId: \"b\" }],\n })\n expect(incoming).toHaveLength(1)\n expect(incoming[0]).toMatchObject({ sourceId: \"a\", targetId: \"b\" })\n\n const linksByScope = await storage.objects.listLinksBatch({\n projectId,\n items: [{ objectTypeId: Device.id, objectId: \"a\", linkId: \"peers\" }],\n })\n expect(linksByScope.get(linkBatchKey(Device.id, \"a\", \"peers\"))).toHaveLength(2)\n\n const incomingByScope = await storage.objects.listLinksBatch({\n projectId,\n direction: \"incoming\",\n items: [{ objectTypeId: Device.id, objectId: \"b\", linkId: \"peers\" }],\n })\n expect(incomingByScope.get(linkBatchKey(Device.id, \"b\", \"peers\"))).toMatchObject([\n { sourceId: \"a\", targetId: \"b\" },\n ])\n\n const bothDirectionsByScope = await storage.objects.listLinksBatch({\n projectId,\n direction: \"both\",\n items: [\n { objectTypeId: Device.id, objectId: \"a\", linkId: \"peers\" },\n { objectTypeId: Device.id, objectId: \"b\", linkId: \"peers\" },\n ],\n })\n expect(bothDirectionsByScope.get(linkBatchKey(Device.id, \"a\", \"peers\"))).toHaveLength(2)\n expect(bothDirectionsByScope.get(linkBatchKey(Device.id, \"b\", \"peers\"))).toMatchObject([\n { sourceId: \"a\", targetId: \"b\" },\n ])\n })\n })\n\n test(\"pages and filters incident links in the provider\", async () => {\n await withStorage(async (storage) => {\n const first = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"a\" }],\n direction: \"outgoing\",\n linkId: \"peers\",\n endpointObjectTypeIds: [Device.id],\n limit: 1,\n })\n expect(first.links.map((row) => row.targetId)).toEqual([\"b\"])\n expect(first.hasMore).toBe(true)\n\n const second = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"a\" }],\n direction: \"outgoing\",\n linkId: \"peers\",\n endpointObjectTypeIds: [Device.id],\n after: objectLinkCursor(first.links[0]),\n limit: 1,\n })\n expect(second.links.map((row) => row.targetId)).toEqual([\"c\"])\n expect(second.hasMore).toBe(false)\n\n const duplicateRefs = await storage.objects.queryLinks({\n projectId,\n objectRefs: [\n { objectTypeId: Device.id, primaryId: \"a\" },\n { objectTypeId: Device.id, primaryId: \"a\" },\n ],\n direction: \"outgoing\",\n limit: 10,\n })\n expect(duplicateRefs.links.map((row) => row.targetId)).toEqual([\"b\", \"c\"])\n\n const incoming = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"b\" }],\n direction: \"incoming\",\n limit: 10,\n })\n expect(incoming.links.map((row) => [row.sourceId, row.targetId])).toEqual([[\"a\", \"b\"]])\n\n const bothDirections = await storage.objects.queryLinks({\n projectId,\n objectRefs: [\n { objectTypeId: Device.id, primaryId: \"a\" },\n { objectTypeId: Device.id, primaryId: \"b\" },\n ],\n direction: \"both\",\n endpointObjectTypeIds: [Device.id],\n limit: 10,\n })\n expect(bothDirections.links.map((row) => [row.sourceId, row.targetId])).toEqual([\n [\"a\", \"b\"],\n [\"a\", \"c\"],\n ])\n\n const unauthorized = await storage.objects.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Device.id, primaryId: \"a\" }],\n direction: \"both\",\n endpointObjectTypeIds: [],\n limit: 10,\n })\n expect(unauthorized).toEqual({ links: [], hasMore: false })\n })\n })\n\n test(\"keeps delimiter-bearing object and batch-link identities distinct\", async () => {\n await withStorage(async (storage) => {\n const opaqueProjectId = `${projectId}-opaque-batch-keys`\n const fixture = createMaterializerTestFixture({\n projectId: opaqueProjectId,\n ontology,\n storage,\n })\n await fixture.seed({\n objects: [\n {\n ref: { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n properties: { id: \"B:C\", name: \"First\" },\n },\n {\n ref: { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n properties: { id: \"C\", name: \"Second\" },\n },\n ],\n links: [\n {\n ref: {\n source: { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n linkId: \"D\",\n target: { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n },\n },\n {\n ref: {\n source: { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n linkId: \"D\",\n target: { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n },\n },\n ],\n })\n\n const objects = await storage.objects.getByPrimaryIdBatch({\n projectId: opaqueProjectId,\n items: [\n { objectTypeId: OpaqueA.id, primaryId: \"B:C\" },\n { objectTypeId: OpaqueAB.id, primaryId: \"C\" },\n ],\n })\n expect(objects.get(objectBatchKey(OpaqueA.id, \"B:C\"))?.properties.name).toBe(\"First\")\n expect(objects.get(objectBatchKey(OpaqueAB.id, \"C\"))?.properties.name).toBe(\"Second\")\n\n const links = await storage.objects.listLinksBatch({\n projectId: opaqueProjectId,\n direction: \"both\",\n items: [\n { objectTypeId: OpaqueA.id, objectId: \"B:C\", linkId: \"D\" },\n { objectTypeId: OpaqueAB.id, objectId: \"C\", linkId: \"D\" },\n ],\n })\n expect(links.get(linkBatchKey(OpaqueA.id, \"B:C\", \"D\"))).toHaveLength(1)\n expect(links.get(linkBatchKey(OpaqueAB.id, \"C\", \"D\"))).toHaveLength(1)\n })\n })\n\n test(\"preserves distinct incident links when opaque ids contain delimiters\", async () => {\n await withStorage(async (storage) => {\n const opaqueIdsProjectId = `${projectId}-opaque-link-ids`\n const firstSourceId = \"opaque:source\"\n const firstTargetId = `target:peers:${Device.id}:opaque:end`\n const secondSourceId = `${firstSourceId}:peers:${Device.id}:target`\n const secondTargetId = \"opaque:end\"\n const fixture = createMaterializerTestFixture({\n projectId: opaqueIdsProjectId,\n ontology,\n storage,\n })\n await fixture.seed({\n objects: [\n device(firstSourceId, \"First source\"),\n device(firstTargetId, \"First target\"),\n device(secondSourceId, \"Second source\"),\n device(secondTargetId, \"Second target\"),\n ],\n links: [peer(firstSourceId, firstTargetId), peer(secondSourceId, secondTargetId)],\n })\n\n const incident = await storage.objects.listIncidentLinksBatch({\n projectId: opaqueIdsProjectId,\n items: [\n { objectTypeId: Device.id, objectId: firstSourceId },\n { objectTypeId: Device.id, objectId: secondSourceId },\n ],\n })\n const matching = incident.filter(\n (row) => row.sourceId === firstSourceId || row.sourceId === secondSourceId\n )\n\n expect(matching.map((row) => [row.sourceId, row.linkId, row.targetId])).toEqual(\n expect.arrayContaining([\n [firstSourceId, \"peers\", firstTargetId],\n [secondSourceId, \"peers\", secondTargetId],\n ])\n )\n expect(matching).toHaveLength(2)\n })\n })\n\n test(\"pages Materializer-owned objects with a stable cursor\", async () => {\n await withStorage(async (storage) => {\n const firstPage = await storage.objects.listByPrimaryIdPage({\n projectId,\n objectTypeId: Device.id,\n limit: 2,\n })\n expect(firstPage.objects.map((row) => row.primaryId)).toEqual([\"a\", \"b\"])\n expect(firstPage.nextPrimaryId).toBe(\"b\")\n const secondPage = await storage.objects.listByPrimaryIdPage({\n projectId,\n objectTypeId: Device.id,\n afterPrimaryId: firstPage.nextPrimaryId,\n limit: 2,\n })\n expect(secondPage.objects.map((row) => row.primaryId)).toEqual([\"c\"])\n })\n })\n\n test(\"reads Materializer-owned telemetry\", async () => {\n await withStorage(async (storage) => {\n const descending = await storage.timeseries.getHistory({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n propertyId: \"temperature\",\n from: new Date(\"2026-01-01T10:30:00.000Z\"),\n order: \"desc\",\n })\n expect(descending.map((point) => point.value)).toEqual([22])\n expect(typeof descending[0]?.lastCommitId).toBe(\"string\")\n\n const histories = await storage.timeseries.getHistoryBatch({\n projectId,\n series: [\n { objectTypeId: Device.id, objectId: \"a\", propertyId: \"temperature\" },\n { objectTypeId: Device.id, objectId: \"b\", propertyId: \"temperature\" },\n ],\n limitPerSeries: 1,\n order: \"desc\",\n })\n expect(histories.map((series) => series.points[0]?.value)).toEqual([22, 18])\n\n const latest = await storage.timeseries.getLatest({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n propertyId: \"temperature\",\n })\n expect(latest).toMatchObject({ value: 22, at: new Date(\"2026-01-01T12:00:00.000Z\") })\n })\n })\n })\n}\n\nasync function seedEffectiveState(storage: Storage): Promise<void> {\n const fixture = createMaterializerTestFixture({ projectId, ontology, storage })\n await fixture.seed({\n objects: [device(\"a\", \"Alpha\"), device(\"b\", \"Beta\"), device(\"c\", \"Gamma\")],\n links: [peer(\"a\", \"b\"), peer(\"a\", \"c\")],\n telemetry: [\n temperature(\"a\", 20, \"2026-01-01T10:00:00.000Z\"),\n temperature(\"a\", 22, \"2026-01-01T12:00:00.000Z\"),\n temperature(\"b\", 18, \"2026-01-01T11:00:00.000Z\"),\n ],\n })\n}\n\nfunction device(primaryId: string, name: string) {\n return {\n ref: { objectTypeId: Device.id, primaryId },\n properties: { id: primaryId, name },\n }\n}\n\nfunction peer(sourceId: string, targetId: string) {\n return {\n ref: {\n source: { objectTypeId: Device.id, primaryId: sourceId },\n linkId: \"peers\",\n target: { objectTypeId: Device.id, primaryId: targetId },\n },\n }\n}\n\nfunction temperature(objectId: string, value: number, at: string) {\n return {\n series: {\n object: { objectTypeId: Device.id, primaryId: objectId },\n propertyId: \"temperature\",\n },\n value,\n at,\n }\n}\n",
|
|
15
18
|
"import { createTestingScope } from \"../execution/scopes\"\nimport type { JsonValue } from \"../json\"\nimport type {\n EditCommitResult,\n OntologyEditOperation,\n OntologyLinkRef,\n OntologyObjectRef,\n TelemetryCommitResult,\n TelemetryPointWrite,\n} from \"../materialization/model\"\nimport {\n type BoundOntologyMaterializer,\n createOntologyMaterializer,\n type OntologyMaterializerDependencies,\n} from \"../materializer/materializer\"\nimport type { OntologyRegistry } from \"../ontology\"\nimport { ProjectionRegistry } from \"../projections/registry\"\nimport type { Storage } from \"../storage\"\n\nexport interface MaterializerFixtureObject {\n readonly ref: OntologyObjectRef\n readonly properties: Readonly<Record<string, JsonValue>>\n}\n\nexport interface MaterializerFixtureLink {\n readonly ref: OntologyLinkRef\n readonly properties?: Readonly<Record<string, JsonValue>>\n}\n\nexport interface MaterializerFixtureSeed {\n readonly objects?: readonly MaterializerFixtureObject[]\n readonly links?: readonly MaterializerFixtureLink[]\n readonly telemetry?: readonly TelemetryPointWrite[]\n}\n\nexport interface MaterializerTestFixture {\n readonly materializer: BoundOntologyMaterializer\n commit(operations: readonly OntologyEditOperation[]): Promise<EditCommitResult>\n appendTelemetry(points: readonly TelemetryPointWrite[]): Promise<TelemetryCommitResult>\n seed(input: MaterializerFixtureSeed): Promise<void>\n}\n\n/**\n * Creates data for storage/query tests through the same validated Materializer path as production.\n * It intentionally exposes no direct storage writer.\n */\nexport function createMaterializerTestFixture(input: {\n readonly projectId: string\n readonly ontology: OntologyRegistry\n readonly storage: Storage\n readonly dependencies?: OntologyMaterializerDependencies\n}): MaterializerTestFixture {\n const projections = new ProjectionRegistry({\n projections: [],\n ontology: input.ontology,\n datasetsById: new Map(),\n })\n const materializer = createOntologyMaterializer({\n projectId: input.projectId,\n ontology: input.ontology,\n projections,\n storage: input.storage,\n dependencies: input.dependencies,\n }).withScope(\n createTestingScope({\n projectId: input.projectId,\n executionId: `materializer_fixture_execution:${input.projectId}`,\n requestId: `materializer_fixture_request:${input.projectId}`,\n correlationId: `materializer_fixture_correlation:${input.projectId}`,\n })\n )\n let requestOrdinal = 0\n\n function nextRequestId(kind: \"edit\" | \"telemetry\"): string {\n requestOrdinal += 1\n return `materializer-fixture:${kind}:${requestOrdinal}`\n }\n\n async function commit(operations: readonly OntologyEditOperation[]): Promise<EditCommitResult> {\n return materializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"runtime\", requestId: nextRequestId(\"edit\") },\n operations,\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n }\n\n async function appendTelemetry(\n points: readonly TelemetryPointWrite[]\n ): Promise<TelemetryCommitResult> {\n return materializer.telemetry.append({\n source: { kind: \"runtime\", requestId: nextRequestId(\"telemetry\") },\n points,\n })\n }\n\n return {\n materializer,\n commit,\n appendTelemetry,\n async seed(seed) {\n const operations: OntologyEditOperation[] = []\n for (const object of seed.objects ?? []) {\n operations.push({\n id: `seed-object:${operations.length}`,\n kind: \"object.upsert\",\n ref: object.ref,\n properties: object.properties,\n })\n }\n for (const link of seed.links ?? []) {\n operations.push({\n id: `seed-link:${operations.length}`,\n kind: \"link.upsert\",\n ref: link.ref,\n ...(link.properties === undefined ? {} : { properties: link.properties }),\n })\n }\n if (operations.length > 0) await commit(operations)\n if (seed.telemetry && seed.telemetry.length > 0) {\n await appendTelemetry(seed.telemetry)\n }\n },\n }\n}\n",
|
|
16
19
|
"import type { AuthorizationContext } from \"../authorization\"\nimport { createTestingScope } from \"../execution/scopes\"\nimport type { ExecutionScope } from \"../execution/types\"\nimport type { OntologySource } from \"../ontology\"\nimport { SixbHost, type SixbHostOptions } from \"../runtime/host\"\nimport { isBoundSixb, type Sixb } from \"../runtime/sixb\"\n\nexport type { AuthorizationContext } from \"../authorization\"\n\nexport interface TestExecutionOptions {\n readonly authorization?: AuthorizationContext\n readonly executionId?: string\n readonly requestId?: string\n readonly correlationId?: string\n}\n\n/**\n * Bind a host to principal test authority from `authorization`, or to explicit disabled authority\n * when omitted. Test executions deliberately omit live session identity. Trusted primitive and\n * kernel authority remain unavailable to application tests.\n */\nexport interface TestExecutionHost {\n readonly id: string\n withScope(scope: ExecutionScope): object\n}\n\nexport function createTestSixb<\n TOntologySources extends readonly OntologySource[] = readonly OntologySource[],\n>(\n hostOrOptions: TestExecutionHost | SixbHostOptions<TOntologySources>,\n options: TestExecutionOptions = {}\n): Sixb<TOntologySources> {\n const host: TestExecutionHost =\n \"withScope\" in hostOrOptions ? hostOrOptions : new SixbHost(hostOrOptions)\n const sixb = host.withScope(\n createTestingScope({\n projectId: host.id,\n ...(options.authorization === undefined ? {} : { context: options.authorization }),\n ...(options.executionId === undefined ? {} : { executionId: options.executionId }),\n ...(options.requestId === undefined ? {} : { requestId: options.requestId }),\n ...(options.correlationId === undefined ? {} : { correlationId: options.correlationId }),\n })\n )\n if (!isBoundSixb<TOntologySources>(sixb)) {\n throw new Error(\"[Sixb] Test host did not return an execution-bound Sixb SDK.\")\n }\n return sixb\n}\n",
|
|
17
|
-
"import { describe, expect, test } from \"bun:test\"\nimport type { AuthStorage } from \"../storage/auth\"\nimport type {\n CreateExecutionInput,\n ExecutionStorage,\n TrustedPrimitiveKind,\n} from \"../storage/executions\"\nimport type { Storage } from \"../storage/types\"\n\nexport type ExecutionStorageContractStorage = Storage & {\n readonly auth: AuthStorage\n readonly executions: ExecutionStorage\n}\n\nexport interface ExecutionStorageContractSuiteOptions<\n TStorage extends ExecutionStorageContractStorage = ExecutionStorageContractStorage,\n> {\n /** Factory that returns one isolated, migrated storage bundle for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"execution-contract\"\nconst createdAt = new Date(\"2026-06-01T12:00:00.000Z\")\nconst expiresAt = new Date(\"2027-06-01T12:00:00.000Z\")\n\n/** Runs the immutable execution-ledger contract against one complete storage provider. */\nexport function runExecutionStorageContractSuite<TStorage extends ExecutionStorageContractStorage>(\n label: string,\n options: ExecutionStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"round-trips every durable executor and authority shape\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n\n const records = [\n principalRequest({\n id: \"principal-request\",\n credential: { type: \"session\", id: \"session-user\" },\n }),\n principalRequest({\n id: \"service-request\",\n principal: { type: \"serviceAccount\", id: \"service-one\" },\n credential: { type: \"accessToken\", id: \"token-service\" },\n }),\n disabledRequest(\"disabled-request\"),\n ...trustedPrimitiveKinds.map((kind) => trustedPrimitive(`${kind}-execution`, {}, kind)),\n agentExecution(\"agent-execution\"),\n kernelExecution(\"kernel-execution\"),\n ] as const\n\n for (const input of records) {\n const creationStartedAt = new Date()\n const created = await storage.executions.create(input)\n const { createdAt: persistedAt, ...persistedInput } = created\n expect(persistedInput).toEqual(input)\n expect(Number.isFinite(persistedAt.getTime())).toBe(true)\n expect(persistedAt.getTime()).toBeGreaterThanOrEqual(creationStartedAt.getTime())\n expect(\n await storage.executions.getById({ projectId: input.projectId, id: input.id })\n ).toEqual(created)\n }\n\n const first = await storage.executions.getById({ projectId, id: \"principal-request\" })\n if (!first || first.authorizationRef.type !== \"principal\") {\n throw new Error(\"Expected principal execution fixture\")\n }\n const persisted = structuredClone(first)\n ;(first.authorizationRef.principal as { id: string }).id = \"mutated\"\n first.createdAt.setUTCFullYear(2000)\n expect(await storage.executions.getById({ projectId, id: first.id })).toEqual(persisted)\n })\n })\n\n test(\"keeps execution identity immutable and project-scoped\", async () => {\n await withStorage(async (storage) => {\n const first = disabledRequest(\"shared-id\")\n await storage.executions.create(first)\n\n await expect(storage.executions.create(first)).rejects.toMatchObject({\n code: \"duplicate_execution\",\n })\n\n const otherProject = disabledRequest(\"shared-id\", \"execution-contract-other\")\n await expect(storage.executions.create(otherProject)).resolves.toMatchObject({\n projectId: otherProject.projectId,\n })\n expect(\n await storage.executions.getById({ projectId: \"missing-project\", id: first.id })\n ).toBeNull()\n\n const backdated = await storage.executions.create({\n ...disabledRequest(\"caller-timestamp\"),\n createdAt: new Date(\"2000-01-01T00:00:00.000Z\"),\n } as CreateExecutionInput)\n expect(backdated.createdAt.getUTCFullYear()).not.toBe(2000)\n })\n })\n\n test(\"admits exactly one concurrent create for an execution id\", async () => {\n await withStorage(async (storage) => {\n const input = disabledRequest(\"concurrent-id\")\n const results = await Promise.allSettled([\n storage.executions.create(input),\n storage.executions.create(input),\n ])\n\n expect(results.filter((result) => result.status === \"fulfilled\")).toHaveLength(1)\n const [rejected] = results.filter((result) => result.status === \"rejected\")\n expect(rejected?.reason).toMatchObject({ code: \"duplicate_execution\" })\n })\n })\n\n test(\"rejects non-durable sources and executor-authority mismatches\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n\n const invalidInputs: readonly CreateExecutionInput[] = [\n {\n ...disabledRequest(\"queue-source\"),\n source: { type: \"queue\", queue: \"actions\", jobId: \"job-1\" },\n } as unknown as CreateExecutionInput,\n {\n ...disabledRequest(\"wrong-request-source\"),\n source: { type: \"http\", requestId: \"different-request\" },\n },\n {\n ...disabledRequest(\"principal-missing-requester\"),\n authorizationRef: {\n type: \"principal\",\n principal: { type: \"user\", id: \"user-one\" },\n },\n },\n {\n ...trustedPrimitive(\"untrusted-primitive\"),\n authorizationRef: { type: \"disabled\" },\n },\n {\n ...agentExecution(\"user-agent\"),\n authorizationRef: {\n type: \"principal\",\n principal: { type: \"user\", id: \"user-one\" },\n },\n },\n {\n ...kernelExecution(\"requested-kernel\"),\n requestedBy: { type: \"user\", id: \"user-one\" },\n },\n ]\n\n for (const input of invalidInputs) {\n await expect(storage.executions.create(input)).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n }\n })\n })\n\n test(\"requires every principal and verifies credential ownership\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n\n await expect(\n storage.executions.create(\n principalRequest({\n id: \"missing-principal\",\n principal: { type: \"user\", id: \"unknown-user\" },\n })\n )\n ).rejects.toMatchObject({ code: \"missing_principal\" })\n\n await expect(\n storage.executions.create(\n principalRequest({\n id: \"missing-session\",\n credential: { type: \"session\", id: \"missing-session\" },\n })\n )\n ).rejects.toMatchObject({ code: \"missing_credential\" })\n\n await expect(\n storage.executions.create(\n principalRequest({\n id: \"wrong-session-owner\",\n credential: { type: \"session\", id: \"session-other\" },\n })\n )\n ).rejects.toMatchObject({ code: \"invalid_credential\" })\n\n await expect(\n storage.executions.create({\n ...trustedPrimitive(\"missing-requester\"),\n requestedBy: { type: \"user\", id: \"unknown-user\" },\n })\n ).rejects.toMatchObject({ code: \"missing_principal\" })\n })\n })\n\n test(\"requires children to preserve direct parent provenance\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n await storage.executions.create(principalRequest({ id: \"parent\" }))\n\n const validChild = trustedPrimitive(\"valid-child\", {\n correlationId: \"correlation-parent\",\n source: { type: \"execution\", executionId: \"parent\" },\n })\n const storedChild = await storage.executions.create(validChild)\n expect(storedChild).toMatchObject({\n source: { type: \"execution\", executionId: \"parent\" },\n })\n expect(storedChild).not.toHaveProperty(\"parentExecutionId\")\n\n const invalidChildren: readonly [CreateExecutionInput, string][] = [\n [\n trustedPrimitive(\"missing-parent\", {\n source: { type: \"execution\", executionId: \"unknown-parent\" },\n }),\n \"missing_parent_execution\",\n ],\n [\n trustedPrimitive(\"wrong-correlation\", {\n correlationId: \"different-correlation\",\n source: { type: \"execution\", executionId: \"parent\" },\n }),\n \"invalid_parent_execution\",\n ],\n [\n trustedPrimitive(\"wrong-requester\", {\n requestedBy: { type: \"user\", id: \"user-other\" },\n source: { type: \"execution\", executionId: \"parent\" },\n }),\n \"invalid_parent_execution\",\n ],\n ]\n\n for (const [input, code] of invalidChildren) {\n await expect(storage.executions.create(input)).rejects.toMatchObject({ code })\n }\n })\n })\n\n test(\"participates in storage transactions and rollback\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.transaction(async (tx) => {\n await tx.executions.create(disabledRequest(\"rolled-back\"))\n throw new Error(\"rollback\")\n })\n ).rejects.toThrow(\"rollback\")\n expect(await storage.executions.getById({ projectId, id: \"rolled-back\" })).toBeNull()\n\n await storage.transaction((tx) => tx.executions.create(disabledRequest(\"committed\")))\n expect(await storage.executions.getById({ projectId, id: \"committed\" })).not.toBeNull()\n })\n })\n })\n}\n\nasync function seedAuth(auth: AuthStorage): Promise<void> {\n await auth.users.create({\n id: \"user-one\",\n projectId,\n email: \"one@example.com\",\n createdAt,\n updatedAt: createdAt,\n })\n await auth.users.create({\n id: \"user-other\",\n projectId,\n email: \"other@example.com\",\n createdAt,\n updatedAt: createdAt,\n })\n await auth.serviceAccounts.create({\n id: \"service-one\",\n projectId,\n name: \"Service one\",\n createdAt,\n updatedAt: createdAt,\n })\n await auth.sessions.create({\n id: \"session-user\",\n projectId,\n userId: \"user-one\",\n strategyId: \"contract\",\n audience: \"atlas\",\n tokenHash: \"session-user-hash\",\n createdAt,\n expiresAt,\n })\n await auth.sessions.create({\n id: \"session-other\",\n projectId,\n userId: \"user-other\",\n strategyId: \"contract\",\n audience: \"atlas\",\n tokenHash: \"session-other-hash\",\n createdAt,\n expiresAt,\n })\n await auth.accessTokens.create({\n id: \"token-service\",\n projectId,\n name: \"Service token\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"service-one\",\n tokenHash: \"service-token-hash\",\n createdAt,\n expiresAt,\n })\n}\n\nfunction principalRequest(input: {\n readonly id: string\n readonly principal?: { readonly type: \"user\" | \"serviceAccount\"; readonly id: string }\n readonly credential?:\n | { readonly type: \"session\"; readonly id: string }\n | { readonly type: \"accessToken\"; readonly id: string }\n}): CreateExecutionInput {\n const principal = input.principal ?? ({ type: \"user\", id: \"user-one\" } as const)\n return {\n id: input.id,\n projectId,\n requestedBy: principal,\n executor: { type: \"request\", requestId: `request-${input.id}` },\n source: { type: \"http\", requestId: `request-${input.id}` },\n correlationId: input.id === \"parent\" ? \"correlation-parent\" : `correlation-${input.id}`,\n authorizationRef: {\n type: \"principal\",\n principal,\n ...(input.credential === undefined ? {} : { credential: input.credential }),\n },\n }\n}\n\nfunction disabledRequest(id: string, inputProjectId = projectId): CreateExecutionInput {\n return {\n id,\n projectId: inputProjectId,\n executor: { type: \"request\", requestId: `request-${id}` },\n source: { type: \"http\", requestId: `request-${id}` },\n correlationId: `correlation-${id}`,\n authorizationRef: { type: \"disabled\" },\n }\n}\n\nfunction trustedPrimitive(\n id: string,\n overrides: Partial<Pick<CreateExecutionInput, \"correlationId\" | \"requestedBy\" | \"source\">> = {},\n kind: TrustedPrimitiveKind = \"action\"\n): CreateExecutionInput {\n const runId = `run-${id}`\n return {\n id,\n projectId,\n requestedBy: { type: \"user\", id: \"user-one\" },\n executor: { type: \"primitive\", kind, runId },\n source: trustedPrimitiveSource(kind, id),\n correlationId: `correlation-${id}`,\n authorizationRef: {\n type: \"trustedPrimitive\",\n primitive: { kind, id: `contract.${kind}`, runId },\n },\n ...overrides,\n }\n}\n\nfunction trustedPrimitiveSource(\n kind: TrustedPrimitiveKind,\n id: string\n): CreateExecutionInput[\"source\"] {\n if (kind === \"pipeline\") {\n return { type: \"schedule\", eventId: `schedule-event-${id}` }\n }\n if (kind === \"projection\") {\n return {\n type: \"datasetVersion\",\n datasetId: \"contract-dataset\",\n versionId: `version-${id}`,\n }\n }\n if (kind === \"webhook\") {\n return { type: \"webhook\", deliveryId: `delivery-${id}` }\n }\n return { type: \"event\", eventId: `event-${id}` }\n}\n\nconst trustedPrimitiveKinds = [\n \"action\",\n \"pipeline\",\n \"projection\",\n \"rule\",\n \"sync\",\n \"webhook\",\n \"workflow\",\n] as const satisfies readonly TrustedPrimitiveKind[]\n\nfunction agentExecution(id: string): CreateExecutionInput {\n return {\n id,\n projectId,\n requestedBy: { type: \"user\", id: \"user-one\" },\n executor: { type: \"agent\", runId: `run-${id}` },\n source: { type: \"event\", eventId: `event-${id}` },\n correlationId: `correlation-${id}`,\n authorizationRef: {\n type: \"principal\",\n principal: { type: \"serviceAccount\", id: \"service-one\" },\n },\n }\n}\n\nfunction kernelExecution(id: string): CreateExecutionInput {\n const operation = { type: \"ontology.recover\", recoveryId: `recovery-${id}` } as const\n return {\n id,\n projectId,\n executor: { type: \"kernel\", operation },\n source: { type: \"event\", eventId: `event-${id}` },\n correlationId: `correlation-${id}`,\n authorizationRef: { type: \"kernel\", operation },\n }\n}\n",
|
|
18
|
-
"import { describe, expect, test } from \"bun:test\"\nimport { change, col, defineDataset } from \"../datasets\"\nimport type { DatasetMergeCommitResult, DatasetRow, LakeStorage } from \"../lake-storage\"\n\nexport interface LakeMergeStorageContractSuiteOptions<TStorage extends LakeStorage = LakeStorage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst invoices = defineDataset(\"contract.merges.invoices\", {\n schema: [col(\"id\", \"string\"), col(\"status\", \"string\"), col(\"note\", \"string\", { nullable: true })],\n primaryKey: \"id\",\n})\n\nconst lineItems = defineDataset(\"contract.merges.line_items\", {\n schema: [col(\"invoiceId\", \"string\"), col(\"lineItemId\", \"string\"), col(\"description\", \"string\")],\n primaryKey: [\"invoiceId\", \"lineItemId\"],\n})\n\nconst unkeyed = defineDataset(\"contract.merges.unkeyed\", {\n schema: [col(\"id\", \"string\")],\n})\n\nexport function runLakeMergeStorageContractSuite<TStorage extends LakeStorage>(\n label: string,\n options: LakeMergeStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"creates an initial merge version from async changes\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const merge = await storage.beginMerge({\n dataset: invoices,\n producer: { kind: \"sync\", id: \"sync-invoices\", runId: \"run_1\" },\n inputs: [{ datasetId: \"source.events\", versionId: \"cursor_1\" }],\n })\n\n async function* changes() {\n yield change.upsert({ id: \"inv_1\", status: \"open\", note: null })\n yield change.upsert({ id: \"inv_2\", status: \"paid\", note: \"settled\" })\n }\n\n await merge.writeChanges(changes())\n const result = await merge.commit({ commitMessage: \"initial invoice changes\" })\n const version = expectCreated(result)\n\n expect(version).toMatchObject({\n datasetId: invoices.id,\n mode: \"merge\",\n rowCount: 2,\n producer: { kind: \"sync\", id: \"sync-invoices\", runId: \"run_1\" },\n inputs: [{ datasetId: \"source.events\", versionId: \"cursor_1\" }],\n })\n expect(version.parentVersionId).toBeUndefined()\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n { id: \"inv_2\", status: \"paid\", note: \"settled\" },\n ])\n })\n })\n\n test(\"inserts, updates, and deletes while preserving the parent version\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const seed = await storage.beginWrite({ dataset: invoices, mode: \"snapshot\" })\n await seed.writeRows([\n { id: \"inv_1\", status: \"open\", note: null },\n { id: \"inv_2\", status: \"open\", note: null },\n ])\n const parent = await seed.commit()\n\n const merge = await storage.beginMerge({ dataset: invoices })\n await merge.writeChanges([\n change.upsert({ id: \"inv_1\", status: \"paid\", note: null }),\n // Primary keys are immutable, so moving a row is an old-key delete plus a complete row.\n change.delete({ id: \"inv_2\" }),\n change.upsert({ id: \"inv_2_moved\", status: \"open\", note: \"moved\" }),\n ])\n const version = expectCreated(await merge.commit())\n\n expect(version.parentVersionId).toBe(parent.versionId)\n expect(version.mode).toBe(\"merge\")\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"paid\", note: null },\n { id: \"inv_2_moved\", status: \"open\", note: \"moved\" },\n ])\n await expect(\n collectRows(storage.readRows({ datasetId: invoices.id, versionId: parent.versionId }))\n ).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n { id: \"inv_2\", status: \"open\", note: null },\n ])\n })\n })\n\n test(\"applies the final change for repeated single and composite keys\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(lineItems)\n const merge = await storage.beginMerge({ dataset: lineItems })\n await merge.writeChanges([\n change.upsert({ invoiceId: \"a|b\", lineItemId: \"c\", description: \"first\" }),\n change.upsert({ invoiceId: \"a\", lineItemId: \"b|c\", description: \"other key\" }),\n ])\n await merge.writeChanges([\n change.delete({ invoiceId: \"a|b\", lineItemId: \"c\" }),\n change.upsert({ invoiceId: \"a|b\", lineItemId: \"c\", description: \"final\" }),\n ])\n expectCreated(await merge.commit())\n\n await expect(collectRows(storage.readRows({ datasetId: lineItems.id }))).resolves.toEqual([\n { invoiceId: \"a|b\", lineItemId: \"c\", description: \"final\" },\n { invoiceId: \"a\", lineItemId: \"b|c\", description: \"other key\" },\n ])\n })\n })\n\n test(\"does not create versions when visible rows do not change\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n\n const empty = await storage.beginMerge({ dataset: invoices })\n expect(await empty.commit()).toEqual({ outcome: \"unchanged\", version: null })\n\n const initialNoOp = await storage.beginMerge({ dataset: invoices })\n await initialNoOp.writeChanges([change.delete({ id: \"missing\" })])\n expect(await initialNoOp.commit()).toEqual({ outcome: \"unchanged\", version: null })\n expect(await storage.listVersions(invoices.id)).toEqual([])\n\n const seed = await storage.beginMerge({ dataset: invoices })\n await seed.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\", note: null })])\n const seedVersion = expectCreated(await seed.commit())\n\n const identical = await storage.beginMerge({ dataset: invoices })\n await identical.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\", note: null })])\n expect(await identical.commit()).toMatchObject({\n outcome: \"unchanged\",\n version: { versionId: seedVersion.versionId },\n })\n\n const laterNoOp = await storage.beginMerge({ dataset: invoices })\n await laterNoOp.writeChanges([\n change.upsert({ id: \"inv_1\", status: \"paid\", note: null }),\n change.upsert({ id: \"inv_1\", status: \"open\" }),\n change.delete({ id: \"missing\" }),\n ])\n const noOpResult = await laterNoOp.commit()\n\n expect(noOpResult).toMatchObject({ outcome: \"unchanged\" })\n expect(noOpResult.version?.versionId).toBe(seedVersion.versionId)\n expect(await storage.listVersions(invoices.id)).toHaveLength(1)\n })\n })\n\n test(\"automatically rejects stale merge sessions, including an absent base\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const first = await storage.beginMerge({ dataset: invoices })\n const stale = await storage.beginMerge({ dataset: invoices })\n\n await first.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\", note: null })])\n await first.commit()\n await stale.writeChanges([change.upsert({ id: \"inv_2\", status: \"open\" })])\n\n await expect(stale.commit()).rejects.toThrow(\"Optimistic merge commit failed\")\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n ])\n })\n })\n\n test(\"checks an explicit latest-version guard against the captured merge base\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const seed = await storage.beginMerge({ dataset: invoices })\n await seed.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\" })])\n const version = expectCreated(await seed.commit())\n\n await expect(\n storage.beginMerge({ dataset: invoices, expectedLatestVersionId: \"stale-version\" })\n ).rejects.toThrow(\"Optimistic merge start failed\")\n\n const guarded = await storage.beginMerge({\n dataset: invoices,\n expectedLatestVersionId: version.versionId,\n })\n await guarded.abort()\n })\n })\n\n test(\"serializes concurrent commits from the same base\", async () => {\n // Regression guard: bypassing a provider's per-dataset commit lock lets both commits create\n // versions from the same base and makes the fulfilled-count assertion fail.\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const left = await storage.beginMerge({ dataset: invoices })\n const right = await storage.beginMerge({ dataset: invoices })\n await left.writeChanges([change.upsert({ id: \"inv_left\", status: \"open\" })])\n await right.writeChanges([change.upsert({ id: \"inv_right\", status: \"open\" })])\n\n const results = await Promise.allSettled([left.commit(), right.commit()])\n\n expect(results.filter((result) => result.status === \"fulfilled\")).toHaveLength(1)\n expect(results.filter((result) => result.status === \"rejected\")).toHaveLength(1)\n expect(await storage.listVersions(invoices.id)).toHaveLength(1)\n expect(await collectRows(storage.readRows({ datasetId: invoices.id }))).toHaveLength(1)\n })\n })\n\n test(\"rejects unkeyed datasets and malformed changes\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(unkeyed)\n await expect(storage.beginMerge({ dataset: unkeyed })).rejects.toThrow(\n \"must define a primaryKey\"\n )\n\n await storage.createDataset(invoices)\n const merge = await storage.beginMerge({ dataset: invoices })\n await expect(merge.writeChanges([change.upsert({ id: \"inv_1\" })])).rejects.toThrow(\n \"missing required column 'status'\"\n )\n await expect(merge.writeChanges([change.delete({})])).rejects.toThrow(\n \"missing primary-key column 'id'\"\n )\n await expect(\n merge.writeChanges([{ kind: \"delete\", key: { id: \"inv_1\", extra: \"x\" } }])\n ).rejects.toThrow(\"unknown column 'extra'\")\n await merge.abort()\n })\n })\n\n test(\"enforces unique keys for snapshot and append baselines\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n\n const duplicateSnapshot = await storage.beginWrite({ dataset: invoices, mode: \"snapshot\" })\n await expect(\n duplicateSnapshot.writeRows([\n { id: \"inv_1\", status: \"open\" },\n { id: \"inv_1\", status: \"paid\" },\n ])\n ).rejects.toThrow(\"duplicate primary key\")\n await duplicateSnapshot.abort()\n\n const seed = await storage.beginWrite({ dataset: invoices, mode: \"snapshot\" })\n await seed.writeRows([{ id: \"inv_1\", status: \"open\" }])\n await seed.commit()\n\n const conflictingAppend = await storage.beginWrite({ dataset: invoices, mode: \"append\" })\n await conflictingAppend.writeRows([{ id: \"inv_1\", status: \"paid\" }])\n await expect(conflictingAppend.commit()).rejects.toThrow(\"duplicate primary key\")\n })\n })\n\n test(\"clones staged changes and enforces the session lifecycle\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const row = { id: \"inv_1\", status: \"open\", note: null }\n const merge = await storage.beginMerge({ dataset: invoices })\n await merge.writeChanges([change.upsert(row)])\n row.status = \"paid\"\n expectCreated(await merge.commit())\n await merge.abort()\n\n await expect(merge.writeChanges([])).rejects.toThrow(\"already closed\")\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n ])\n\n const aborted = await storage.beginMerge({ dataset: invoices })\n await aborted.writeChanges([change.delete({ id: \"inv_1\" })])\n await aborted.abort()\n await aborted.abort()\n expect(await storage.listVersions(invoices.id)).toHaveLength(1)\n })\n })\n })\n}\n\nfunction expectCreated(result: DatasetMergeCommitResult) {\n expect(result.outcome).toBe(\"created\")\n if (result.outcome !== \"created\") {\n throw new Error(\"Expected merge to create a dataset version\")\n }\n return result.version\n}\n\nasync function collectRows(rows: AsyncIterable<DatasetRow>): Promise<DatasetRow[]> {\n const result: DatasetRow[] = []\n for await (const row of rows) {\n result.push(row)\n }\n return result\n}\n",
|
|
19
|
-
"import { describe, expect, test } from \"bun:test\"\nimport type { FileRef } from \"../blob-storage\"\nimport { col, defineDataset } from \"../datasets\"\nimport { LakeStorageError } from \"../lake-storage/errors\"\nimport type { DatasetRow, LakeStorage } from \"../lake-storage/types\"\n\nexport type LakeStorageSchemaEvolutionCapability = \"strict\" | \"addNullableColumns\"\n\nexport interface LakeStorageContractSuiteOptions<TStorage extends LakeStorage = LakeStorage> {\n /** Factory that produces a fresh `LakeStorage` instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n /**\n * Dataset definition update policy supported by the provider. Defaults to\n * `strict`, which allows metadata-only merges but rejects schema evolution.\n */\n readonly schemaEvolution?: LakeStorageSchemaEvolutionCapability\n /**\n * Version id that is syntactically valid for the provider but should not\n * exist. Defaults to a generic id accepted by providers without format\n * restrictions.\n */\n readonly missingVersionId?: string\n}\n\nconst definitionDataset = defineDataset(\"contract.definitions.orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n description: \"Contract orders\",\n})\n\nconst reorderedDefinitionDataset = defineDataset(\"contract.definitions.orders\", {\n schema: [col(\"customerName\", \"string\"), col(\"orderId\", \"string\")],\n description: \"Contract orders\",\n})\n\nconst keyedDefinitionDataset = defineDataset(\"contract.definitions.keyed_orders\", {\n schema: [col(\"tenantId\", \"string\"), col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n primaryKey: [\"tenantId\", \"orderId\"],\n description: \"Contract keyed orders\",\n})\n\nconst writeDataset = defineDataset(\"contract.writes.orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n})\n\nconst nullableWriteDataset = defineDataset(\"contract.writes.nullable_orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"note\", \"string\", { nullable: true })],\n})\n\nconst decimalWriteDataset = defineDataset(\"contract.writes.decimals\", {\n schema: [col(\"id\", \"string\"), col(\"amount\", \"decimal\", { nullable: true })],\n})\n\nconst fileRefDataset = defineDataset(\"contract.files.documents\", {\n schema: [col(\"id\", \"string\"), col(\"attachment\", \"fileRef\", { nullable: true })],\n})\n\nconst invoiceRef: FileRef = {\n blobId: `blob_${\"a\".repeat(64)}`,\n digest: `sha256:${\"a\".repeat(64)}`,\n sizeBytes: 15,\n fileName: \"invoice.txt\",\n mediaType: \"text/plain\",\n logicalPath: \"invoices/invoice.txt\",\n}\n\n/**\n * Runs the shared `LakeStorage` contract against any provider.\n *\n * The suite covers provider-independent Lake semantics: definition\n * materialization and compatibility checks, versioned writes and reads,\n * optimistic commits, unchanged-write detection, write-session lifecycle,\n * and row validation.\n */\nexport function runLakeStorageContractSuite<TStorage extends LakeStorage>(\n label: string,\n options: LakeStorageContractSuiteOptions<TStorage>\n): void {\n const schemaEvolution = options.schemaEvolution ?? \"strict\"\n const missingVersionId = options.missingVersionId ?? \"missing-version\"\n\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n describe(\"dataset definitions\", () => {\n test(\"creates, gets, lists, and reuses dataset definitions\", async () => {\n await withStorage(async (storage) => {\n expect(await storage.getDataset(definitionDataset.id)).toBeNull()\n\n const created = await storage.createDataset(definitionDataset)\n const repeated = await storage.createDataset(definitionDataset)\n\n expect(created).toEqual(definitionDataset)\n expect(repeated).toEqual(definitionDataset)\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n expect(await storage.getDataset(\"missing.dataset\")).toBeNull()\n expect(await storage.listDatasets()).toEqual([definitionDataset])\n expect(await storage.listVersions(definitionDataset.id)).toEqual([])\n })\n })\n\n test(\"round-trips keyed definitions through create, get, list, and reuse\", async () => {\n // Regression guard: omitting primaryKey from mergeDatasetDefinition makes reuse lose\n // the key and fails this contract case.\n await withStorage(async (storage) => {\n const created = await storage.createDataset(keyedDefinitionDataset)\n const repeated = await storage.createDataset(keyedDefinitionDataset)\n\n expect(created).toEqual(keyedDefinitionDataset)\n expect(repeated).toEqual(keyedDefinitionDataset)\n expect(await storage.getDataset(keyedDefinitionDataset.id)).toEqual(\n keyedDefinitionDataset\n )\n expect(await storage.listDatasets()).toEqual([keyedDefinitionDataset])\n expect(await storage.listVersions(keyedDefinitionDataset.id)).toEqual([])\n })\n })\n\n test(\"treats same-column declaration reorders as a no-op\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(definitionDataset)\n await storage.assertDatasetDefinitionsCompatible([reorderedDefinitionDataset])\n\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n await expect(storage.createDataset(reorderedDefinitionDataset)).resolves.toEqual(\n definitionDataset\n )\n expect(await storage.listVersions(definitionDataset.id)).toEqual([])\n })\n })\n\n test(\"persists compatible metadata additions\", async () => {\n await withStorage(async (storage) => {\n const minimalDataset = defineDataset(\"contract.definitions.metadata\", {\n schema: [col(\"orderId\", \"string\"), col(\"orderDate\", \"date\")],\n })\n const documentedDataset = defineDataset(\"contract.definitions.metadata\", {\n schema: [col(\"orderId\", \"string\"), col(\"orderDate\", \"date\")],\n partitionBy: [\"orderDate\"],\n description: \"Contract metadata\",\n })\n\n await storage.createDataset(minimalDataset)\n await storage.assertDatasetDefinitionsCompatible([documentedDataset])\n\n expect(await storage.getDataset(minimalDataset.id)).toEqual(minimalDataset)\n await expect(storage.createDataset(documentedDataset)).resolves.toEqual(documentedDataset)\n expect(await storage.getDataset(minimalDataset.id)).toEqual(documentedDataset)\n })\n })\n\n test(\"rejects incompatible definition changes without mutating the stored definition\", async () => {\n await withStorage(async (storage) => {\n const changedDataset = defineDataset(definitionDataset.id, {\n schema: [col(\"orderId\", \"int64\"), col(\"customerName\", \"string\")],\n description: \"Contract orders\",\n })\n\n await storage.createDataset(definitionDataset)\n\n await expect(\n storage.assertDatasetDefinitionsCompatible([changedDataset])\n ).rejects.toThrow(\"changing column 'orderId' type\")\n await expect(storage.createDataset(changedDataset)).rejects.toBeInstanceOf(\n LakeStorageError\n )\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n })\n })\n\n test(\"checks provider schema evolution policy\", async () => {\n await withStorage(async (storage) => {\n const initialDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"invoiceId\", \"string\")],\n })\n const requestedDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"currency\", \"string\", { nullable: true }), col(\"invoiceId\", \"string\")],\n })\n const storedDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"invoiceId\", \"string\"), col(\"currency\", \"string\", { nullable: true })],\n })\n\n await storage.createDataset(initialDataset)\n\n if (schemaEvolution === \"strict\") {\n await expect(\n storage.assertDatasetDefinitionsCompatible([requestedDataset])\n ).rejects.toThrow(\"incompatible schema\")\n await expect(storage.createDataset(requestedDataset)).rejects.toThrow(\n \"incompatible schema\"\n )\n expect(await storage.getDataset(initialDataset.id)).toEqual(initialDataset)\n return\n }\n\n await storage.assertDatasetDefinitionsCompatible([requestedDataset])\n expect(await storage.getDataset(initialDataset.id)).toEqual(initialDataset)\n expect(await storage.listVersions(initialDataset.id)).toEqual([])\n\n await expect(storage.createDataset(requestedDataset)).resolves.toEqual(storedDataset)\n expect(await storage.getDataset(initialDataset.id)).toEqual(storedDataset)\n\n const [schemaVersion] = await storage.listVersions(initialDataset.id)\n expect(schemaVersion).toMatchObject({\n datasetId: initialDataset.id,\n mode: \"schema\",\n schema: storedDataset.schema,\n })\n })\n })\n\n test(\"keeps compatibility checks read-only for missing datasets\", async () => {\n await withStorage(async (storage) => {\n await storage.assertDatasetDefinitionsCompatible([definitionDataset])\n\n expect(await storage.getDataset(definitionDataset.id)).toBeNull()\n expect(await storage.listDatasets()).toEqual([])\n })\n })\n })\n\n describe(\"catalog state\", () => {\n test(\"reports materialized state and latest version summaries in bulk\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const commit = await write.commit()\n expect(commit.outcome).toBe(\"created\")\n const version = commit\n\n await storage.createDataset(definitionDataset)\n\n const state = await storage.listDatasetCatalogState([\n writeDataset.id,\n definitionDataset.id,\n \"contract.missing.dataset\",\n ])\n\n const byId = new Map(state.map((entry) => [entry.datasetId, entry]))\n\n expect(byId.get(writeDataset.id)).toMatchObject({\n datasetId: writeDataset.id,\n materialized: true,\n })\n expect(byId.get(writeDataset.id)?.latestVersion).toMatchObject({\n datasetId: writeDataset.id,\n versionId: version.versionId,\n mode: \"snapshot\",\n rowCount: 2,\n })\n\n // Created without a committed write: materialized, but no version.\n expect(byId.get(definitionDataset.id)).toEqual({\n datasetId: definitionDataset.id,\n materialized: true,\n latestVersion: null,\n })\n\n // Registered but never created.\n expect(byId.get(\"contract.missing.dataset\")).toEqual({\n datasetId: \"contract.missing.dataset\",\n materialized: false,\n latestVersion: null,\n })\n })\n })\n\n test(\"returns an empty result for an empty request\", async () => {\n await withStorage(async (storage) => {\n expect(await storage.listDatasetCatalogState([])).toEqual([])\n })\n })\n })\n\n describe(\"writes and reads\", () => {\n test(\"keeps immutable-version row order and offsets stable\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n const expected = [\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_5\", customerName: \"Margaret\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_4\", customerName: \"Dorothy\" },\n ]\n await write.writeRows(expected)\n const version = await write.commit()\n const pinned = { datasetId: writeDataset.id, versionId: version.versionId }\n\n await expect(collectRows(storage.readRows(pinned))).resolves.toEqual(expected)\n await expect(collectRows(storage.readRows(pinned))).resolves.toEqual(expected)\n for (const offset of [0, 2, expected.length, expected.length + 3]) {\n await expect(collectRows(storage.readRows({ ...pinned, offset }))).resolves.toEqual(\n expected.slice(offset)\n )\n }\n await expect(\n collectRows(storage.readRows({ ...pinned, columns: [\"orderId\"], offset: 1, limit: 2 }))\n ).resolves.toEqual([{ orderId: \"ord_1\" }, { orderId: \"ord_5\" }])\n })\n })\n\n test(\"rejects writes for unknown datasets\", async () => {\n await withStorage(async (storage) => {\n await expect(storage.beginWrite({ dataset: writeDataset })).rejects.toThrow(\n \"Unknown dataset\"\n )\n })\n })\n\n test(\"commits snapshot and append versions with versioned reads\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const snapshotWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n producer: { kind: \"sync\", id: \"contract-sync\", runId: \"run_1\" },\n })\n await snapshotWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const snapshotCommit = await snapshotWrite.commit({ commitMessage: \"snapshot orders\" })\n expect(snapshotCommit.outcome).toBe(\"created\")\n const version1 = snapshotCommit\n\n expect(version1).toMatchObject({\n datasetId: writeDataset.id,\n mode: \"snapshot\",\n schema: writeDataset.schema,\n producer: { kind: \"sync\", id: \"contract-sync\", runId: \"run_1\" },\n rowCount: 2,\n })\n expect(version1.parentVersionId).toBeUndefined()\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version1.versionId,\n })\n expect(await storage.getVersion(writeDataset.id, version1.versionId)).toMatchObject({\n datasetId: writeDataset.id,\n versionId: version1.versionId,\n mode: \"snapshot\",\n rowCount: 2,\n })\n\n await Bun.sleep(2)\n\n const appendWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"append\",\n inputs: [{ datasetId: writeDataset.id, versionId: version1.versionId }],\n })\n await appendWrite.writeRows([{ orderId: \"ord_3\", customerName: \"Katherine\" }])\n const appendCommit = await appendWrite.commit({\n expectedLatestVersionId: version1.versionId,\n })\n expect(appendCommit.outcome).toBe(\"created\")\n const version2 = appendCommit\n\n expect(version2).toMatchObject({\n datasetId: writeDataset.id,\n parentVersionId: version1.versionId,\n mode: \"append\",\n schema: writeDataset.schema,\n inputs: [{ datasetId: writeDataset.id, versionId: version1.versionId }],\n rowCount: 3,\n })\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version2.versionId,\n })\n\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n ])\n await expect(\n collectRows(\n storage.readRows({ datasetId: writeDataset.id, versionId: version1.versionId })\n )\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n limit: 2,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_1\" }, { orderId: \"ord_2\" }])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n limit: 1,\n offset: 1,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_2\" }])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n offset: 1,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_2\" }, { orderId: \"ord_3\" }])\n\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([version2.versionId, version1.versionId])\n expect(\n (await storage.listVersions(writeDataset.id, 1)).map((version) => version.versionId)\n ).toEqual([version2.versionId])\n expect(await storage.listVersions(\"missing.dataset\")).toEqual([])\n expect(await storage.getLatestVersion(\"missing.dataset\")).toBeNull()\n expect(await storage.getVersion(writeDataset.id, missingVersionId)).toBeNull()\n })\n })\n\n test(\"creates an initial empty snapshot version\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n const version = await write.commit()\n\n expect(version).toMatchObject({\n datasetId: writeDataset.id,\n mode: \"snapshot\",\n outcome: \"created\",\n rowCount: 0,\n })\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version.versionId,\n })\n expect(await storage.listVersions(writeDataset.id)).toHaveLength(1)\n\n const repeatedWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n const repeatedVersion = await repeatedWrite.commit()\n expect(repeatedVersion.outcome).toBe(\"unchanged\")\n expect(repeatedVersion.versionId).toBe(version.versionId)\n expect(await storage.listVersions(writeDataset.id)).toHaveLength(1)\n\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([])\n })\n })\n\n test(\"creates an initial empty append version\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n const version = await write.commit()\n\n expect(version).toMatchObject({\n datasetId: writeDataset.id,\n mode: \"append\",\n outcome: \"created\",\n })\n expect(version.parentVersionId).toBeUndefined()\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version.versionId,\n })\n expect(await storage.listVersions(writeDataset.id)).toHaveLength(1)\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([])\n })\n })\n\n test(\"snapshot writes replace the visible latest rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const firstWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await firstWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const firstVersion = await firstWrite.commit()\n\n const replacementWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n await replacementWrite.writeRows([{ orderId: \"ord_9\", customerName: \"Dorothy\" }])\n const replacementVersion = await replacementWrite.commit()\n\n expect(replacementVersion.versionId).not.toBe(firstVersion.versionId)\n expect(replacementVersion.parentVersionId).toBeUndefined()\n expect(replacementVersion.rowCount).toBe(1)\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([{ orderId: \"ord_9\", customerName: \"Dorothy\" }])\n await expect(\n collectRows(\n storage.readRows({ datasetId: writeDataset.id, versionId: firstVersion.versionId })\n )\n ).resolves.toEqual([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n })\n })\n\n test(\"reuses the latest version when a snapshot commits identical content\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const seedVersion = await seedWrite.commit()\n expect(seedVersion.outcome).toBe(\"created\")\n\n // Identical rows in a different order are the same snapshot content.\n const identicalWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n await identicalWrite.writeRows([\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_1\", customerName: \"Ada\" },\n ])\n const identicalVersion = await identicalWrite.commit()\n\n expect(identicalVersion.outcome).toBe(\"unchanged\")\n expect(identicalVersion.versionId).toBe(seedVersion.versionId)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([seedVersion.versionId])\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: seedVersion.versionId,\n })\n\n await Bun.sleep(2)\n\n const changedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await changedWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Hopper\" },\n ])\n const changedVersion = await changedWrite.commit()\n\n expect(changedVersion.outcome).toBe(\"created\")\n expect(changedVersion.versionId).not.toBe(seedVersion.versionId)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([changedVersion.versionId, seedVersion.versionId])\n })\n })\n\n test(\"snapshot content comparison respects row multiplicities\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const rowA = { orderId: \"ord_1\", customerName: \"Ada\" }\n const rowB = { orderId: \"ord_2\", customerName: \"Grace\" }\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([rowA, rowA, rowB])\n const seedVersion = await seedWrite.commit()\n\n await Bun.sleep(2)\n\n // Same distinct rows and row count, but different duplicate counts:\n // this is new content, not a no-op.\n const shiftedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await shiftedWrite.writeRows([rowA, rowB, rowB])\n const shiftedVersion = await shiftedWrite.commit()\n\n expect(shiftedVersion.outcome).toBe(\"created\")\n expect(shiftedVersion.versionId).not.toBe(seedVersion.versionId)\n })\n })\n\n test(\"treats omitted and null nullable values as the same snapshot content\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(nullableWriteDataset)\n\n const seedWrite = await storage.beginWrite({\n dataset: nullableWriteDataset,\n mode: \"snapshot\",\n })\n await seedWrite.writeRows([{ orderId: \"ord_1\", note: null }])\n const seedVersion = await seedWrite.commit()\n\n const omittedWrite = await storage.beginWrite({\n dataset: nullableWriteDataset,\n mode: \"snapshot\",\n })\n await omittedWrite.writeRows([{ orderId: \"ord_1\" }])\n const omittedVersion = await omittedWrite.commit()\n\n expect(omittedVersion.outcome).toBe(\"unchanged\")\n expect(omittedVersion.versionId).toBe(seedVersion.versionId)\n })\n })\n\n test(\"reuses the latest version when an append commits zero rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const seedVersion = await seedWrite.commit()\n\n const emptyAppend = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n const appendVersion = await emptyAppend.commit()\n\n expect(appendVersion.outcome).toBe(\"unchanged\")\n expect(appendVersion.versionId).toBe(seedVersion.versionId)\n expect(appendVersion.rowCount).toBe(1)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([seedVersion.versionId])\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n })\n })\n\n test(\"fails stale optimistic commits\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const initialVersion = await seedWrite.commit()\n\n const delayedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n await delayedWrite.writeRows([{ orderId: \"ord_2\", customerName: \"Grace\" }])\n\n const competingWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"append\",\n })\n await competingWrite.writeRows([{ orderId: \"ord_3\", customerName: \"Katherine\" }])\n await competingWrite.commit({ expectedLatestVersionId: initialVersion.versionId })\n\n await expect(\n delayedWrite.commit({ expectedLatestVersionId: initialVersion.versionId })\n ).rejects.toThrow(\"Optimistic commit failed\")\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n ])\n })\n })\n\n test(\"abort closes a write session without committing rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n await write.abort()\n await write.abort()\n\n expect(await storage.getLatestVersion(writeDataset.id)).toBeNull()\n expect(await storage.listVersions(writeDataset.id)).toEqual([])\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).rejects.toThrow(\"No committed version found\")\n })\n })\n\n test(\"commit closes a write session and leaves abort idempotent\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n await write.commit()\n await write.abort()\n\n await expect(write.writeRows([])).rejects.toThrow(\"already closed\")\n })\n })\n\n test(\"rejects rows that do not match the dataset schema\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n\n await expect(write.writeRows([{ orderId: \"ord_1\" }])).rejects.toThrow(\n \"missing required column\"\n )\n await expect(\n write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\", unexpected: true } as never])\n ).rejects.toThrow(\"unknown column\")\n await write.abort()\n })\n })\n\n test(\"round-trips exact decimal strings in eager and streaming reads\", async () => {\n await withStorage(async (storage) => {\n const exact = \"9007199254740993.123456789\"\n await storage.createDataset(decimalWriteDataset)\n\n const write = await storage.beginWrite({ dataset: decimalWriteDataset, mode: \"snapshot\" })\n await write.writeRows([\n { id: \"amount_1\", amount: exact },\n { id: \"amount_2\", amount: null },\n ])\n await write.commit()\n\n await expect(\n collectRows(storage.readRows({ datasetId: decimalWriteDataset.id }))\n ).resolves.toEqual([\n { id: \"amount_1\", amount: exact },\n { id: \"amount_2\", amount: null },\n ])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: decimalWriteDataset.id,\n columns: [\"amount\"],\n limit: 1,\n })\n )\n ).resolves.toEqual([{ amount: exact }])\n })\n })\n\n test(\"round-trips fileRef row values\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(fileRefDataset)\n\n const write = await storage.beginWrite({ dataset: fileRefDataset, mode: \"snapshot\" })\n await write.writeRows([\n { id: \"doc_1\", attachment: invoiceRef },\n { id: \"doc_2\", attachment: null },\n ])\n await write.commit()\n\n await expect(\n collectRows(storage.readRows({ datasetId: fileRefDataset.id }))\n ).resolves.toEqual([\n { id: \"doc_1\", attachment: invoiceRef },\n { id: \"doc_2\", attachment: null },\n ])\n })\n })\n })\n })\n}\n\nasync function collectRows(rows: AsyncIterable<DatasetRow>): Promise<DatasetRow[]> {\n const result: DatasetRow[] = []\n for await (const row of rows) {\n result.push(row)\n }\n return result\n}\n",
|
|
20
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { AuthStorage } from \"../storage/auth\"\nimport type {\n CreateExecutionInput,\n ExecutionStorage,\n TrustedPrimitiveKind,\n} from \"../storage/executions\"\nimport type { ShareGrantStorage } from \"../storage/share-grants\"\nimport type { ShareSessionStorage } from \"../storage/share-sessions\"\nimport type { Storage } from \"../storage/types\"\n\nexport type ExecutionStorageContractStorage = Storage & {\n readonly auth: AuthStorage\n readonly executions: ExecutionStorage\n readonly shareGrants: ShareGrantStorage\n readonly shareSessions: ShareSessionStorage\n}\n\nexport interface ExecutionStorageContractSuiteOptions<\n TStorage extends ExecutionStorageContractStorage = ExecutionStorageContractStorage,\n> {\n /** Factory that returns one isolated, migrated storage bundle for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"execution-contract\"\nconst createdAt = new Date(\"2026-06-01T12:00:00.000Z\")\nconst expiresAt = new Date(\"2027-06-01T12:00:00.000Z\")\n\n/** Runs the immutable execution-ledger contract against one complete storage provider. */\nexport function runExecutionStorageContractSuite<TStorage extends ExecutionStorageContractStorage>(\n label: string,\n options: ExecutionStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"round-trips every durable executor and authority shape\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n await seedSharedSession(storage)\n\n const records = [\n principalRequest({\n id: \"principal-request\",\n credential: { type: \"session\", id: \"session-user\" },\n }),\n principalRequest({\n id: \"service-request\",\n principal: { type: \"serviceAccount\", id: \"service-one\" },\n credential: { type: \"accessToken\", id: \"token-service\" },\n }),\n disabledRequest(\"disabled-request\"),\n delegatedRequest(\"delegated-request\"),\n ...trustedPrimitiveKinds.map((kind) => trustedPrimitive(`${kind}-execution`, {}, kind)),\n agentExecution(\"agent-execution\"),\n kernelExecution(\"kernel-execution\"),\n ] as const\n\n for (const input of records) {\n const creationStartedAt = new Date()\n const created = await storage.executions.create(input)\n const { createdAt: persistedAt, ...persistedInput } = created\n expect(persistedInput).toEqual(input)\n expect(Number.isFinite(persistedAt.getTime())).toBe(true)\n expect(persistedAt.getTime()).toBeGreaterThanOrEqual(creationStartedAt.getTime())\n expect(\n await storage.executions.getById({ projectId: input.projectId, id: input.id })\n ).toEqual(created)\n }\n\n const first = await storage.executions.getById({ projectId, id: \"principal-request\" })\n if (!first || first.authorizationRef.type !== \"principal\") {\n throw new Error(\"Expected principal execution fixture\")\n }\n const persisted = structuredClone(first)\n ;(first.authorizationRef.principal as { id: string }).id = \"mutated\"\n first.createdAt.setUTCFullYear(2000)\n expect(await storage.executions.getById({ projectId, id: first.id })).toEqual(persisted)\n })\n })\n\n test(\"keeps execution identity immutable and project-scoped\", async () => {\n await withStorage(async (storage) => {\n const first = disabledRequest(\"shared-id\")\n await storage.executions.create(first)\n\n await expect(storage.executions.create(first)).rejects.toMatchObject({\n code: \"duplicate_execution\",\n })\n\n const otherProject = disabledRequest(\"shared-id\", \"execution-contract-other\")\n await expect(storage.executions.create(otherProject)).resolves.toMatchObject({\n projectId: otherProject.projectId,\n })\n expect(\n await storage.executions.getById({ projectId: \"missing-project\", id: first.id })\n ).toBeNull()\n\n const backdated = await storage.executions.create({\n ...disabledRequest(\"caller-timestamp\"),\n createdAt: new Date(\"2000-01-01T00:00:00.000Z\"),\n } as CreateExecutionInput)\n expect(backdated.createdAt.getUTCFullYear()).not.toBe(2000)\n })\n })\n\n test(\"admits exactly one concurrent create for an execution id\", async () => {\n await withStorage(async (storage) => {\n const input = disabledRequest(\"concurrent-id\")\n const results = await Promise.allSettled([\n storage.executions.create(input),\n storage.executions.create(input),\n ])\n\n expect(results.filter((result) => result.status === \"fulfilled\")).toHaveLength(1)\n const [rejected] = results.filter((result) => result.status === \"rejected\")\n expect(rejected?.reason).toMatchObject({ code: \"duplicate_execution\" })\n })\n })\n\n test(\"rejects non-durable sources and executor-authority mismatches\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n\n const invalidInputs: readonly CreateExecutionInput[] = [\n {\n ...disabledRequest(\"queue-source\"),\n source: { type: \"queue\", queue: \"actions\", jobId: \"job-1\" },\n } as unknown as CreateExecutionInput,\n {\n ...disabledRequest(\"wrong-request-source\"),\n source: { type: \"http\", requestId: \"different-request\" },\n },\n {\n ...disabledRequest(\"principal-missing-requester\"),\n authorizationRef: {\n type: \"principal\",\n principal: { type: \"user\", id: \"user-one\" },\n },\n },\n {\n ...trustedPrimitive(\"untrusted-primitive\"),\n authorizationRef: { type: \"disabled\" },\n },\n {\n ...agentExecution(\"user-agent\"),\n authorizationRef: {\n type: \"principal\",\n principal: { type: \"user\", id: \"user-one\" },\n },\n },\n {\n ...kernelExecution(\"requested-kernel\"),\n requestedBy: { type: \"user\", id: \"user-one\" },\n },\n ]\n\n for (const input of invalidInputs) {\n await expect(storage.executions.create(input)).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n }\n })\n })\n\n test(\"requires every principal and verifies credential ownership\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n await seedSharedSession(storage)\n\n await expect(\n storage.executions.create(\n principalRequest({\n id: \"missing-principal\",\n principal: { type: \"user\", id: \"unknown-user\" },\n })\n )\n ).rejects.toMatchObject({ code: \"missing_principal\" })\n\n await expect(\n storage.executions.create({\n ...delegatedRequest(\"missing-shared-session\"),\n authorizationRef: {\n type: \"delegated\",\n delegation: {\n kind: \"share\",\n grantId: \"grant-one\",\n sessionId: \"missing-shared-session\",\n },\n },\n })\n ).rejects.toMatchObject({ code: \"missing_credential\" })\n\n await expect(\n storage.executions.create({\n ...delegatedRequest(\"wrong-shared-grant\"),\n authorizationRef: {\n type: \"delegated\",\n delegation: {\n kind: \"share\",\n grantId: \"grant-two\",\n sessionId: \"share-session-one\",\n },\n },\n })\n ).rejects.toMatchObject({ code: \"invalid_credential\" })\n\n await expect(\n storage.executions.create(\n principalRequest({\n id: \"missing-session\",\n credential: { type: \"session\", id: \"missing-session\" },\n })\n )\n ).rejects.toMatchObject({ code: \"missing_credential\" })\n\n await expect(\n storage.executions.create(\n principalRequest({\n id: \"wrong-session-owner\",\n credential: { type: \"session\", id: \"session-other\" },\n })\n )\n ).rejects.toMatchObject({ code: \"invalid_credential\" })\n\n await expect(\n storage.executions.create({\n ...trustedPrimitive(\"missing-requester\"),\n requestedBy: { type: \"user\", id: \"unknown-user\" },\n })\n ).rejects.toMatchObject({ code: \"missing_principal\" })\n })\n })\n\n test(\"requires children to preserve direct parent provenance\", async () => {\n await withStorage(async (storage) => {\n await seedAuth(storage.auth)\n await storage.executions.create(principalRequest({ id: \"parent\" }))\n\n const validChild = trustedPrimitive(\"valid-child\", {\n correlationId: \"correlation-parent\",\n source: { type: \"execution\", executionId: \"parent\" },\n })\n const storedChild = await storage.executions.create(validChild)\n expect(storedChild).toMatchObject({\n source: { type: \"execution\", executionId: \"parent\" },\n })\n expect(storedChild).not.toHaveProperty(\"parentExecutionId\")\n\n const invalidChildren: readonly [CreateExecutionInput, string][] = [\n [\n trustedPrimitive(\"missing-parent\", {\n source: { type: \"execution\", executionId: \"unknown-parent\" },\n }),\n \"missing_parent_execution\",\n ],\n [\n trustedPrimitive(\"wrong-correlation\", {\n correlationId: \"different-correlation\",\n source: { type: \"execution\", executionId: \"parent\" },\n }),\n \"invalid_parent_execution\",\n ],\n [\n trustedPrimitive(\"wrong-requester\", {\n requestedBy: { type: \"user\", id: \"user-other\" },\n source: { type: \"execution\", executionId: \"parent\" },\n }),\n \"invalid_parent_execution\",\n ],\n ]\n\n for (const [input, code] of invalidChildren) {\n await expect(storage.executions.create(input)).rejects.toMatchObject({ code })\n }\n })\n })\n\n test(\"participates in storage transactions and rollback\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.transaction(async (tx) => {\n await tx.executions.create(disabledRequest(\"rolled-back\"))\n throw new Error(\"rollback\")\n })\n ).rejects.toThrow(\"rollback\")\n expect(await storage.executions.getById({ projectId, id: \"rolled-back\" })).toBeNull()\n\n await storage.transaction((tx) => tx.executions.create(disabledRequest(\"committed\")))\n expect(await storage.executions.getById({ projectId, id: \"committed\" })).not.toBeNull()\n })\n })\n })\n}\n\nasync function seedAuth(auth: AuthStorage): Promise<void> {\n await auth.users.create({\n id: \"user-one\",\n projectId,\n email: \"one@example.com\",\n createdAt,\n updatedAt: createdAt,\n })\n await auth.users.create({\n id: \"user-other\",\n projectId,\n email: \"other@example.com\",\n createdAt,\n updatedAt: createdAt,\n })\n await auth.serviceAccounts.create({\n id: \"service-one\",\n projectId,\n name: \"Service one\",\n createdAt,\n updatedAt: createdAt,\n })\n await auth.sessions.create({\n id: \"session-user\",\n projectId,\n userId: \"user-one\",\n strategyId: \"contract\",\n audience: \"atlas\",\n tokenHash: \"session-user-hash\",\n createdAt,\n expiresAt,\n })\n await auth.sessions.create({\n id: \"session-other\",\n projectId,\n userId: \"user-other\",\n strategyId: \"contract\",\n audience: \"atlas\",\n tokenHash: \"session-other-hash\",\n createdAt,\n expiresAt,\n })\n await auth.accessTokens.create({\n id: \"token-service\",\n projectId,\n name: \"Service token\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"service-one\",\n tokenHash: \"service-token-hash\",\n createdAt,\n expiresAt,\n })\n}\n\nasync function seedSharedSession(storage: ExecutionStorageContractStorage): Promise<void> {\n for (const id of [\"grant-one\", \"grant-two\"] as const) {\n await storage.shareGrants.create({\n id,\n projectId,\n definitionId: \"contract-share\",\n target: { objectTypeId: \"ContractObject\", primaryId: id },\n issuedBy: { type: \"user\", id: \"user-one\" },\n authoritySnapshot: { version: 1, access: { grants: [] } },\n tokenHash: id === \"grant-one\" ? \"a\".repeat(64) : \"b\".repeat(64),\n destinationPath: `/contract/${id}`,\n createdAt,\n expiresAt,\n })\n }\n await storage.shareSessions.create({\n id: \"share-session-one\",\n projectId,\n grantId: \"grant-one\",\n tokenHash: \"c\".repeat(64),\n createdAt,\n expiresAt,\n absoluteExpiresAt: expiresAt,\n })\n}\n\nfunction principalRequest(input: {\n readonly id: string\n readonly principal?: { readonly type: \"user\" | \"serviceAccount\"; readonly id: string }\n readonly credential?:\n | { readonly type: \"session\"; readonly id: string }\n | { readonly type: \"accessToken\"; readonly id: string }\n}): CreateExecutionInput {\n const principal = input.principal ?? ({ type: \"user\", id: \"user-one\" } as const)\n return {\n id: input.id,\n projectId,\n requestedBy: principal,\n executor: { type: \"request\", requestId: `request-${input.id}` },\n source: { type: \"http\", requestId: `request-${input.id}` },\n correlationId: input.id === \"parent\" ? \"correlation-parent\" : `correlation-${input.id}`,\n authorizationRef: {\n type: \"principal\",\n principal,\n ...(input.credential === undefined ? {} : { credential: input.credential }),\n },\n }\n}\n\nfunction disabledRequest(id: string, inputProjectId = projectId): CreateExecutionInput {\n return {\n id,\n projectId: inputProjectId,\n executor: { type: \"request\", requestId: `request-${id}` },\n source: { type: \"http\", requestId: `request-${id}` },\n correlationId: `correlation-${id}`,\n authorizationRef: { type: \"disabled\" },\n }\n}\n\nfunction delegatedRequest(id: string): CreateExecutionInput {\n return {\n id,\n projectId,\n executor: { type: \"request\", requestId: `request-${id}` },\n source: { type: \"http\", requestId: `request-${id}` },\n correlationId: `correlation-${id}`,\n authorizationRef: {\n type: \"delegated\",\n delegation: {\n kind: \"share\",\n grantId: \"grant-one\",\n sessionId: \"share-session-one\",\n },\n },\n }\n}\n\nfunction trustedPrimitive(\n id: string,\n overrides: Partial<Pick<CreateExecutionInput, \"correlationId\" | \"requestedBy\" | \"source\">> = {},\n kind: TrustedPrimitiveKind = \"action\"\n): CreateExecutionInput {\n const runId = `run-${id}`\n return {\n id,\n projectId,\n requestedBy: { type: \"user\", id: \"user-one\" },\n executor: { type: \"primitive\", kind, runId },\n source: trustedPrimitiveSource(kind, id),\n correlationId: `correlation-${id}`,\n authorizationRef: {\n type: \"trustedPrimitive\",\n primitive: { kind, id: `contract.${kind}`, runId },\n },\n ...overrides,\n }\n}\n\nfunction trustedPrimitiveSource(\n kind: TrustedPrimitiveKind,\n id: string\n): CreateExecutionInput[\"source\"] {\n if (kind === \"pipeline\") {\n return { type: \"schedule\", eventId: `schedule-event-${id}` }\n }\n if (kind === \"projection\") {\n return {\n type: \"datasetVersion\",\n datasetId: \"contract-dataset\",\n versionId: `version-${id}`,\n }\n }\n if (kind === \"webhook\") {\n return { type: \"webhook\", deliveryId: `delivery-${id}` }\n }\n return { type: \"event\", eventId: `event-${id}` }\n}\n\nconst trustedPrimitiveKinds = [\n \"action\",\n \"pipeline\",\n \"projection\",\n \"rule\",\n \"sync\",\n \"webhook\",\n \"workflow\",\n] as const satisfies readonly TrustedPrimitiveKind[]\n\nfunction agentExecution(id: string): CreateExecutionInput {\n return {\n id,\n projectId,\n requestedBy: { type: \"user\", id: \"user-one\" },\n executor: { type: \"agent\", runId: `run-${id}` },\n source: { type: \"execution\", executionId: \"principal-request\" },\n correlationId: \"correlation-principal-request\",\n authorizationRef: {\n type: \"principal\",\n principal: { type: \"serviceAccount\", id: \"service-one\" },\n },\n }\n}\n\nfunction kernelExecution(id: string): CreateExecutionInput {\n const operation = { type: \"ontology.recover\", recoveryId: `recovery-${id}` } as const\n return {\n id,\n projectId,\n executor: { type: \"kernel\", operation },\n source: { type: \"event\", eventId: `event-${id}` },\n correlationId: `correlation-${id}`,\n authorizationRef: { type: \"kernel\", operation },\n }\n}\n",
|
|
21
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { change, col, defineDataset } from \"../datasets\"\nimport type { DatasetMergeCommitResult, DatasetRow, LakeStorage } from \"../lake-storage\"\nimport { runDatasetSequenceContract } from \"./dataset-sequence-contract\"\n\nexport interface LakeMergeStorageContractSuiteOptions<TStorage extends LakeStorage = LakeStorage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n readonly reopen?: (storage: TStorage) => TStorage | Promise<TStorage>\n}\n\nconst invoices = defineDataset(\"contract.merges.invoices\", {\n schema: [col(\"id\", \"string\"), col(\"status\", \"string\"), col(\"note\", \"string\", { nullable: true })],\n primaryKey: \"id\",\n})\n\nconst lineItems = defineDataset(\"contract.merges.line_items\", {\n schema: [col(\"invoiceId\", \"string\"), col(\"lineItemId\", \"string\"), col(\"description\", \"string\")],\n primaryKey: [\"invoiceId\", \"lineItemId\"],\n})\n\nconst unkeyed = defineDataset(\"contract.merges.unkeyed\", {\n schema: [col(\"id\", \"string\")],\n})\n\nexport function runLakeMergeStorageContractSuite<TStorage extends LakeStorage>(\n label: string,\n options: LakeMergeStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n runDatasetSequenceContract(options)\n test(\"creates an initial merge version from async changes\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const merge = await storage.beginMerge({\n dataset: invoices,\n producer: { kind: \"sync\", id: \"sync-invoices\", runId: \"run_1\" },\n inputs: [{ datasetId: \"source.events\", versionId: \"cursor_1\" }],\n })\n\n async function* changes() {\n yield change.upsert({ id: \"inv_1\", status: \"open\", note: null })\n yield change.upsert({ id: \"inv_2\", status: \"paid\", note: \"settled\" })\n }\n\n await merge.writeChanges(changes())\n const result = await merge.commit({ commitMessage: \"initial invoice changes\" })\n const version = expectCreated(result)\n\n expect(version).toMatchObject({\n datasetId: invoices.id,\n mode: \"merge\",\n rowCount: 2,\n producer: { kind: \"sync\", id: \"sync-invoices\", runId: \"run_1\" },\n inputs: [{ datasetId: \"source.events\", versionId: \"cursor_1\" }],\n })\n expect(version.parentVersionId).toBeUndefined()\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n { id: \"inv_2\", status: \"paid\", note: \"settled\" },\n ])\n })\n })\n\n test(\"inserts, updates, and deletes while preserving the parent version\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const seed = await storage.beginWrite({ dataset: invoices, mode: \"snapshot\" })\n await seed.writeRows([\n { id: \"inv_1\", status: \"open\", note: null },\n { id: \"inv_2\", status: \"open\", note: null },\n ])\n const parent = await seed.commit()\n\n const merge = await storage.beginMerge({ dataset: invoices })\n await merge.writeChanges([\n change.upsert({ id: \"inv_1\", status: \"paid\", note: null }),\n // Primary keys are immutable, so moving a row is an old-key delete plus a complete row.\n change.delete({ id: \"inv_2\" }),\n change.upsert({ id: \"inv_2_moved\", status: \"open\", note: \"moved\" }),\n ])\n const version = expectCreated(await merge.commit())\n\n expect(version.parentVersionId).toBe(parent.versionId)\n expect(version.mode).toBe(\"merge\")\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"paid\", note: null },\n { id: \"inv_2_moved\", status: \"open\", note: \"moved\" },\n ])\n await expect(\n collectRows(storage.readRows({ datasetId: invoices.id, versionId: parent.versionId }))\n ).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n { id: \"inv_2\", status: \"open\", note: null },\n ])\n })\n })\n\n test(\"applies the final change for repeated single and composite keys\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(lineItems)\n const merge = await storage.beginMerge({ dataset: lineItems })\n await merge.writeChanges([\n change.upsert({ invoiceId: \"a|b\", lineItemId: \"c\", description: \"first\" }),\n change.upsert({ invoiceId: \"a\", lineItemId: \"b|c\", description: \"other key\" }),\n ])\n await merge.writeChanges([\n change.delete({ invoiceId: \"a|b\", lineItemId: \"c\" }),\n change.upsert({ invoiceId: \"a|b\", lineItemId: \"c\", description: \"final\" }),\n ])\n expectCreated(await merge.commit())\n\n await expect(collectRows(storage.readRows({ datasetId: lineItems.id }))).resolves.toEqual([\n { invoiceId: \"a|b\", lineItemId: \"c\", description: \"final\" },\n { invoiceId: \"a\", lineItemId: \"b|c\", description: \"other key\" },\n ])\n })\n })\n\n test(\"does not create versions when visible rows do not change\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n\n const empty = await storage.beginMerge({ dataset: invoices })\n expect(await empty.commit()).toEqual({ outcome: \"unchanged\", version: null })\n\n const initialNoOp = await storage.beginMerge({ dataset: invoices })\n await initialNoOp.writeChanges([change.delete({ id: \"missing\" })])\n expect(await initialNoOp.commit()).toEqual({ outcome: \"unchanged\", version: null })\n expect(await storage.listVersions(invoices.id)).toEqual([])\n\n const seed = await storage.beginMerge({ dataset: invoices })\n await seed.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\", note: null })])\n const seedVersion = expectCreated(await seed.commit())\n\n const identical = await storage.beginMerge({ dataset: invoices })\n await identical.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\", note: null })])\n expect(await identical.commit()).toMatchObject({\n outcome: \"unchanged\",\n version: { versionId: seedVersion.versionId },\n })\n\n const laterNoOp = await storage.beginMerge({ dataset: invoices })\n await laterNoOp.writeChanges([\n change.upsert({ id: \"inv_1\", status: \"paid\", note: null }),\n change.upsert({ id: \"inv_1\", status: \"open\" }),\n change.delete({ id: \"missing\" }),\n ])\n const noOpResult = await laterNoOp.commit()\n\n expect(noOpResult).toMatchObject({ outcome: \"unchanged\" })\n expect(noOpResult.version?.versionId).toBe(seedVersion.versionId)\n expect(await storage.listVersions(invoices.id)).toHaveLength(1)\n })\n })\n\n test(\"automatically rejects stale merge sessions, including an absent base\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const first = await storage.beginMerge({ dataset: invoices })\n const stale = await storage.beginMerge({ dataset: invoices })\n\n await first.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\", note: null })])\n await first.commit()\n await stale.writeChanges([change.upsert({ id: \"inv_2\", status: \"open\" })])\n\n await expect(stale.commit()).rejects.toThrow(\"Optimistic merge commit failed\")\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n ])\n })\n })\n\n test(\"checks an explicit latest-version guard against the captured merge base\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const seed = await storage.beginMerge({ dataset: invoices })\n await seed.writeChanges([change.upsert({ id: \"inv_1\", status: \"open\" })])\n const version = expectCreated(await seed.commit())\n\n await expect(\n storage.beginMerge({ dataset: invoices, expectedLatestVersionId: \"stale-version\" })\n ).rejects.toThrow(\"Optimistic merge start failed\")\n\n const guarded = await storage.beginMerge({\n dataset: invoices,\n expectedLatestVersionId: version.versionId,\n })\n await guarded.abort()\n })\n })\n\n test(\"serializes concurrent commits from the same base\", async () => {\n // Regression guard: bypassing a provider's per-dataset commit lock lets both commits create\n // versions from the same base and makes the fulfilled-count assertion fail.\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const left = await storage.beginMerge({ dataset: invoices })\n const right = await storage.beginMerge({ dataset: invoices })\n await left.writeChanges([change.upsert({ id: \"inv_left\", status: \"open\" })])\n await right.writeChanges([change.upsert({ id: \"inv_right\", status: \"open\" })])\n\n const results = await Promise.allSettled([left.commit(), right.commit()])\n\n expect(results.filter((result) => result.status === \"fulfilled\")).toHaveLength(1)\n expect(results.filter((result) => result.status === \"rejected\")).toHaveLength(1)\n expect(await storage.listVersions(invoices.id)).toHaveLength(1)\n expect(await collectRows(storage.readRows({ datasetId: invoices.id }))).toHaveLength(1)\n })\n })\n\n test(\"rejects unkeyed datasets and malformed changes\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(unkeyed)\n await expect(storage.beginMerge({ dataset: unkeyed })).rejects.toThrow(\n \"must define a primaryKey\"\n )\n\n await storage.createDataset(invoices)\n const merge = await storage.beginMerge({ dataset: invoices })\n await expect(merge.writeChanges([change.upsert({ id: \"inv_1\" })])).rejects.toThrow(\n \"missing required column 'status'\"\n )\n await expect(merge.writeChanges([change.delete({})])).rejects.toThrow(\n \"missing primary-key column 'id'\"\n )\n await expect(\n merge.writeChanges([{ kind: \"delete\", key: { id: \"inv_1\", extra: \"x\" } }])\n ).rejects.toThrow(\"unknown column 'extra'\")\n await merge.abort()\n })\n })\n\n test(\"enforces unique keys for snapshot and append baselines\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n\n const duplicateSnapshot = await storage.beginWrite({ dataset: invoices, mode: \"snapshot\" })\n await expect(\n duplicateSnapshot.writeRows([\n { id: \"inv_1\", status: \"open\" },\n { id: \"inv_1\", status: \"paid\" },\n ])\n ).rejects.toThrow(\"duplicate primary key\")\n await duplicateSnapshot.abort()\n\n const seed = await storage.beginWrite({ dataset: invoices, mode: \"snapshot\" })\n await seed.writeRows([{ id: \"inv_1\", status: \"open\" }])\n await seed.commit()\n\n const conflictingAppend = await storage.beginWrite({ dataset: invoices, mode: \"append\" })\n await conflictingAppend.writeRows([{ id: \"inv_1\", status: \"paid\" }])\n await expect(conflictingAppend.commit()).rejects.toThrow(\"duplicate primary key\")\n })\n })\n\n test(\"clones staged changes and enforces the session lifecycle\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(invoices)\n const row = { id: \"inv_1\", status: \"open\", note: null }\n const merge = await storage.beginMerge({ dataset: invoices })\n await merge.writeChanges([change.upsert(row)])\n row.status = \"paid\"\n expectCreated(await merge.commit())\n await merge.abort()\n\n await expect(merge.writeChanges([])).rejects.toThrow(\"already closed\")\n await expect(collectRows(storage.readRows({ datasetId: invoices.id }))).resolves.toEqual([\n { id: \"inv_1\", status: \"open\", note: null },\n ])\n\n const aborted = await storage.beginMerge({ dataset: invoices })\n await aborted.writeChanges([change.delete({ id: \"inv_1\" })])\n await aborted.abort()\n await aborted.abort()\n expect(await storage.listVersions(invoices.id)).toHaveLength(1)\n })\n })\n })\n}\n\nfunction expectCreated(result: DatasetMergeCommitResult) {\n expect(result.outcome).toBe(\"created\")\n if (result.outcome !== \"created\") {\n throw new Error(\"Expected merge to create a dataset version\")\n }\n return result.version\n}\n\nasync function collectRows(rows: AsyncIterable<DatasetRow>): Promise<DatasetRow[]> {\n const result: DatasetRow[] = []\n for await (const row of rows) {\n result.push(row)\n }\n return result\n}\n",
|
|
22
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { InMemoryBlobStorage } from \"../blob-storage\"\nimport { InMemoryBroker } from \"../broker\"\nimport { change, col, type DatasetDefinition, defineDataset, type MergeChange } from \"../datasets\"\nimport { writeDataset } from \"../datasets/write\"\nimport type { DatasetMergeCommitResult, DatasetRow, LakeStorage } from \"../lake-storage\"\nimport { InMemoryQueues } from \"../queues\"\nimport { SixbHost } from \"../runtime/host\"\nimport { InMemoryStorage } from \"../storage\"\nimport { createTestSixb } from \"./execution\"\nimport type { LakeMergeStorageContractSuiteOptions } from \"./lake-merge-storage-contract\"\n\nconst dataset = defineDataset(\"contract.source_order\", {\n schema: [\n col(\"id\", \"string\"),\n col(\"revision\", \"int64\"),\n col(\"name\", \"string\"),\n col(\"details\", \"json\", { nullable: true }),\n ],\n primaryKey: \"id\",\n sequenceBy: \"revision\",\n})\nconst upsert = (revision: string | number, name = \"Sam\", id = \"42\") =>\n change.upsert({ id, revision, name })\n\nasync function merge(\n storage: LakeStorage,\n changes: readonly MergeChange<DatasetRow, DatasetRow>[],\n definition: DatasetDefinition = dataset\n) {\n const session = await storage.beginMerge({ dataset: definition })\n try {\n await session.writeChanges(changes)\n return await session.commit()\n } catch (error) {\n await session.abort()\n throw error\n }\n}\n\nasync function rows(storage: LakeStorage, definition: DatasetDefinition = dataset) {\n const result: DatasetRow[] = []\n for await (const row of storage.readRows({ datasetId: definition.id })) result.push(row)\n return result\n}\n\nexport function runDatasetSequenceContract<TStorage extends LakeStorage>(\n options: LakeMergeStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (run: (storage: TStorage) => Promise<void>) => {\n const storage = await options.createStorage()\n try {\n await storage.createDataset(dataset)\n await run(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(\"source ordering\", () => {\n test(\"initializes empty snapshots and preserves versions across retries and reopen\", async () => {\n // Regression proof: remove createInitialVersion from the writer or provider; the first\n // snapshot has no version. Ignore the rebased head and the concurrent-write assertion fails.\n let storage = await options.createStorage()\n const snapshot = () =>\n writeDataset({\n lakeStorage: storage,\n blobStorage: new InMemoryBlobStorage(),\n dataset,\n mode: \"snapshot\",\n signal: new AbortController().signal,\n readValues: async () => [],\n })\n try {\n await storage.createDataset(dataset)\n expect(await merge(storage, [])).toEqual({ outcome: \"unchanged\", version: null })\n const initialized = await Promise.all([snapshot(), snapshot()])\n expect(initialized.map((result) => result.outcome).sort()).toEqual([\"created\", \"unchanged\"])\n const initial = initialized.find((result) => result.outcome === \"created\")!\n expect(initialized[0]?.version).toEqual(initialized[1]?.version)\n expect(initial).toMatchObject({\n outcome: \"created\",\n version: { rowCount: 0, mode: \"merge\" },\n })\n expect(await rows(storage)).toEqual([])\n if (options.reopen) storage = await options.reopen(storage)\n expect(await storage.getLatestVersion(dataset.id)).toEqual(initial.version)\n expect(await snapshot()).toMatchObject({ outcome: \"unchanged\", version: initial.version })\n\n const concurrent = defineDataset(\"contract.empty_race\", {\n schema: dataset.schema.columns,\n primaryKey: \"id\",\n sequenceBy: \"revision\",\n })\n let committed: DatasetMergeCommitResult | undefined\n const rebased = await writeDataset({\n lakeStorage: storage,\n blobStorage: new InMemoryBlobStorage(),\n dataset: concurrent,\n mode: \"snapshot\",\n signal: new AbortController().signal,\n readValues: async () => {\n committed = await merge(storage, [upsert(8)], concurrent)\n return []\n },\n })\n expect(rebased).toMatchObject({ outcome: \"unchanged\", version: committed?.version })\n expect(await rows(storage, concurrent)).toHaveLength(1)\n } finally {\n await options.teardown?.(storage)\n }\n })\n\n test(\"rejects lossy timestamps outside the ordering column before changing source state\", () =>\n withStorage(async (storage) => {\n // Regression proof: remove the sequenced timestamp check in getColumnValidationError;\n // submillisecond content is accepted and its distinct values collapse to one digest.\n const timestamps = defineDataset(\"contract.content_timestamps\", {\n schema: [...dataset.schema.columns, col(\"at\", \"timestamp\", { nullable: true })],\n primaryKey: \"id\",\n sequenceBy: \"revision\",\n })\n await storage.createDataset(timestamps)\n const row = (at: unknown, id = \"42\") => change.upsert({ id, revision: 1, name: \"Sam\", at })\n const initial = await merge(storage, [row(\"2026-09-09T10:00:00.123Z\")], timestamps)\n for (const at of [\n \"2026-09-09T10:00:00.123001Z\",\n \"2026-09-09T10:00:00.123999Z\",\n \"2026-09-09T10:00:00\",\n \"2026-02-30T00:00:00Z\",\n ]) {\n await expect(merge(storage, [row(at, \"new\")], timestamps)).rejects.toThrow(\"column 'at'\")\n expect(await storage.getLatestVersion(timestamps.id)).toEqual(initial.version)\n }\n for (const at of [\"2026-09-09T12:00:00.123+02:00\", new Date(\"2026-09-09T10:00:00.123Z\")]) {\n expect((await merge(storage, [row(at)], timestamps)).outcome).toBe(\"unchanged\")\n }\n await expect(merge(storage, [row(\"2026-09-09T10:00:00.124Z\")], timestamps)).rejects.toThrow(\n \"conflicting content\"\n )\n await merge(storage, [row(null, \"nullable\")], timestamps)\n expect((await merge(storage, [row(undefined, \"nullable\")], timestamps)).outcome).toBe(\n \"unchanged\"\n )\n }))\n\n test(\"ingests through the bound SDK and preserves execution provenance\", async () => {\n // Regression proof: remove ingest from DuckLake's producer parser; reopen loses provenance.\n let storage = await options.createStorage()\n const broker = new InMemoryBroker()\n try {\n const host = new SixbHost({\n id: \"ingest-contract\",\n ontology: [],\n datasets: [dataset],\n lakeStorage: storage,\n broker,\n storage: new InMemoryStorage(),\n queues: new InMemoryQueues(),\n blobStorage: new InMemoryBlobStorage(),\n })\n const sixb = createTestSixb(host)\n const result = await sixb.datasets.ingest(dataset, { changes: [upsert(8)] })\n expect(result.outcome).toBe(\"created\")\n if (options.reopen) storage = await options.reopen(storage)\n expect((await storage.getLatestVersion(dataset.id))?.producer).toEqual({\n kind: \"ingest\",\n id: sixb.execution.id,\n })\n expect((await rows(storage)).map((row) => row.name)).toEqual([\"Sam\"])\n expect(await host.events.read()).toMatchObject([\n { type: \"dataset.version.committed\", payload: { versionId: result.version?.versionId } },\n ])\n } finally {\n await options.teardown?.(storage)\n }\n })\n test(\"rebases retained changes while preserving explicit version guards\", () =>\n withStorage(async (storage) => {\n // Regression proof: disable retryOnConflict in retryDatasetMergeCommit; the second commit fails.\n const first = await storage.beginMerge({ dataset })\n const second = await storage.beginMerge({ dataset })\n await first.writeChanges([upsert(8)])\n await second.writeChanges([upsert(7, \"stale\"), upsert(1, \"other\", \"other\")])\n const initial = await first.commit({ retryOnConflict: true })\n await second.commit({ retryOnConflict: true })\n expect((await rows(storage)).map((row) => row.name).sort()).toEqual([\"Sam\", \"other\"])\n const guarded = await storage.beginMerge({\n dataset,\n expectedLatestVersionId: (await storage.getLatestVersion(dataset.id))?.versionId,\n })\n await guarded.writeChanges([upsert(10)])\n await merge(storage, [change.delete({ id: \"42\" }, { sequence: 9 })])\n await expect(guarded.commit({ retryOnConflict: true })).rejects.toThrow(\"Optimistic\")\n await guarded.abort()\n const staleDelete = await storage.beginMerge({ dataset })\n await staleDelete.writeChanges([change.delete({ id: \"42\" }, { sequence: 9 })])\n await merge(storage, [upsert(10)])\n expect((await staleDelete.commit({ retryOnConflict: true })).outcome).toBe(\"unchanged\")\n expect((await storage.getLatestVersion(dataset.id))?.versionId).not.toBe(\n initial.version?.versionId\n )\n }))\n // Regression proof: bypass reconcileDatasetSequences at the provider commit boundary.\n // The stale-write, conflict, and deletion assertions below must then fail.\n test(\"orders repeated keys exactly and conflicts atomically\", () =>\n withStorage(async (storage) => {\n const first = await merge(storage, [upsert(\"9007199254740993\")])\n expect((await merge(storage, [upsert(\"9007199254740992\", \"stale\")])).outcome).toBe(\n \"unchanged\"\n )\n expect((await merge(storage, [upsert(\"09007199254740993\")])).outcome).toBe(\"unchanged\")\n await expect(\n merge(storage, [upsert(\"1\", \"other\", \"other\"), upsert(\"9007199254740993\", \"conflict\")])\n ).rejects.toThrow(\"conflicting content\")\n expect((await storage.getLatestVersion(dataset.id))?.versionId).toBe(\n first.version?.versionId\n )\n expect(await rows(storage)).toHaveLength(1)\n await merge(storage, [\n upsert(\"9007199254740995\", \"newest\"),\n upsert(\"9007199254740994\", \"stale\"),\n ])\n expect((await rows(storage))[0]?.name).toBe(\"newest\")\n await expect(\n merge(storage, [upsert(\"9007199254740996\", \"a\"), upsert(\"9007199254740996\", \"b\")])\n ).rejects.toThrow(\"conflicting content\")\n expect((await rows(storage))[0]?.name).toBe(\"newest\")\n }))\n\n test(\"retains absent-key deletions and protects their version boundary\", () =>\n withStorage(async (storage) => {\n const staleSession = await storage.beginMerge({ dataset })\n await staleSession.writeChanges([upsert(8)])\n const deleted = await merge(storage, [change.delete({ id: \"42\" }, { sequence: 9 })])\n expect(deleted).toMatchObject({ outcome: \"created\", version: { rowCount: 0 } })\n await expect(staleSession.commit()).rejects.toThrow(\"Optimistic\")\n await staleSession.abort()\n expect((await merge(storage, [upsert(8)])).outcome).toBe(\"unchanged\")\n expect(\n (await merge(storage, [change.delete({ id: \"42\" }, { sequence: \"9\" })])).outcome\n ).toBe(\"unchanged\")\n await expect(merge(storage, [upsert(9)])).rejects.toThrow(\"conflicting content\")\n await merge(storage, [upsert(10)])\n expect(await rows(storage)).toHaveLength(1)\n expect((await merge(storage, [change.delete({ id: \"42\" }, { sequence: 9 })])).outcome).toBe(\n \"unchanged\"\n )\n await merge(storage, [change.delete({ id: \"42\" }, { sequence: 11 })])\n expect(await rows(storage)).toEqual([])\n }))\n\n test(\"compares canonical content across JSON order and nullable representations\", () =>\n withStorage(async (storage) => {\n await merge(storage, [\n change.upsert({ id: \"42\", revision: 1, name: \"Sam\", details: { a: 1, b: 2 } }),\n ])\n expect(\n (\n await merge(storage, [\n change.upsert({ id: \"42\", revision: \"01\", name: \"Sam\", details: { b: 2, a: 1 } }),\n ])\n ).outcome\n ).toBe(\"unchanged\")\n await merge(storage, [upsert(2)])\n expect(\n (\n await merge(storage, [\n change.upsert({ id: \"42\", revision: \"2\", name: \"Sam\", details: null }),\n ])\n ).outcome\n ).toBe(\"unchanged\")\n }))\n\n test(\"validates integer ranges and delete sequences at the provider boundary\", () =>\n withStorage(async (storage) => {\n for (const revision of [\n null,\n undefined,\n 1.5,\n Number.MAX_SAFE_INTEGER + 1,\n \"9223372036854775808\",\n \"-9223372036854775809\",\n \"1e3\",\n ]) {\n await expect(\n merge(storage, [change.upsert({ id: \"42\", revision, name: \"Sam\" })])\n ).rejects.toThrow(\"sequence\")\n }\n await expect(merge(storage, [change.delete({ id: \"42\" })])).rejects.toThrow(\"sequence\")\n await merge(storage, [upsert(\"-9223372036854775808\"), upsert(\"9223372036854775807\")])\n expect((await rows(storage))[0]?.revision?.toString()).toBe(\"9223372036854775807\")\n }))\n\n test(\"normalizes timezone-aware timestamps without discarding precision\", () =>\n withStorage(async (storage) => {\n const timestamps = defineDataset(\"contract.source_timestamps\", {\n schema: [col(\"id\", \"string\"), col(\"updated\", \"timestamp\"), col(\"name\", \"string\")],\n primaryKey: \"id\",\n sequenceBy: \"updated\",\n })\n await storage.createDataset(timestamps)\n const row = (updated: unknown, name = \"Sam\") => change.upsert({ id: \"42\", updated, name })\n await merge(storage, [row(\"2026-09-09T10:00:00.123Z\")], timestamps)\n for (const updated of [\n \"2026-09-09T12:00:00.123+02:00\",\n new Date(\"2026-09-09T10:00:00.123Z\"),\n ]) {\n expect((await merge(storage, [row(updated)], timestamps)).outcome).toBe(\"unchanged\")\n }\n for (const updated of [\n \"2026-09-09T10:00:00.1234Z\",\n \"2026-09-09T10:00:00\",\n \"2026-02-30T00:00:00Z\",\n new Date(Number.NaN),\n ]) {\n await expect(merge(storage, [row(updated)], timestamps)).rejects.toThrow(\"sequence\")\n }\n await merge(\n storage,\n [change.delete({ id: \"42\" }, { sequence: \"2026-09-09T10:00:00.124Z\" })],\n timestamps\n )\n expect((await merge(storage, [row(\"2026-09-09T10:00:00.123Z\")], timestamps)).outcome).toBe(\n \"unchanged\"\n )\n }))\n\n test(\"round-trips immutable sequencing and rejects writes that bypass ordering\", () =>\n withStorage(async (storage) => {\n expect((await storage.getDataset(dataset.id))?.sequenceBy).toBe(\"revision\")\n expect(\n (await storage.listDatasets()).find((item) => item.id === dataset.id)?.sequenceBy\n ).toBe(\"revision\")\n const { sequenceBy: _, ...unsequenced } = dataset\n await expect(storage.createDataset(unsequenced)).rejects.toThrow(\"immutable\")\n await storage.createDataset({ ...unsequenced, id: \"legacy\" })\n await expect(storage.createDataset({ ...dataset, id: \"legacy\" })).rejects.toThrow(\n \"immutable\"\n )\n await expect(\n storage.createDataset({ ...dataset, id: \"invalid\", primaryKey: undefined })\n ).rejects.toThrow(\"sequenceBy\")\n await expect(\n storage.createDataset({ ...dataset, id: \"invalid\", sequenceBy: \"name\" })\n ).rejects.toThrow(\"sequenceBy\")\n await expect(storage.beginWrite({ dataset })).rejects.toThrow(\"beginMerge\")\n }))\n\n const reopen = options.reopen\n if (reopen)\n test(\"preserves source state after reopen\", async () => {\n let storage = await options.createStorage()\n try {\n await storage.createDataset(dataset)\n await merge(storage, [\n upsert(8, \"visible\", \"visible\"),\n change.delete({ id: \"42\" }, { sequence: 9 }),\n ])\n storage = await reopen(storage)\n expect((await storage.getDataset(dataset.id))?.sequenceBy).toBe(\"revision\")\n expect((await merge(storage, [upsert(8), upsert(7, \"stale\", \"visible\")])).outcome).toBe(\n \"unchanged\"\n )\n expect(await rows(storage)).toHaveLength(1)\n await merge(storage, [upsert(10)])\n expect(await rows(storage)).toHaveLength(2)\n } finally {\n await options.teardown?.(storage)\n }\n })\n })\n}\n",
|
|
23
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { FileRef } from \"../blob-storage\"\nimport { col, defineDataset } from \"../datasets\"\nimport { LakeStorageError } from \"../lake-storage/errors\"\nimport type { DatasetRow, LakeStorage } from \"../lake-storage/types\"\n\nexport type LakeStorageSchemaEvolutionCapability = \"strict\" | \"addNullableColumns\"\n\nexport interface LakeStorageContractSuiteOptions<TStorage extends LakeStorage = LakeStorage> {\n /** Factory that produces a fresh `LakeStorage` instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n /**\n * Dataset definition update policy supported by the provider. Defaults to\n * `strict`, which allows metadata-only merges but rejects schema evolution.\n */\n readonly schemaEvolution?: LakeStorageSchemaEvolutionCapability\n /**\n * Version id that is syntactically valid for the provider but should not\n * exist. Defaults to a generic id accepted by providers without format\n * restrictions.\n */\n readonly missingVersionId?: string\n}\n\nconst definitionDataset = defineDataset(\"contract.definitions.orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n description: \"Contract orders\",\n})\n\nconst reorderedDefinitionDataset = defineDataset(\"contract.definitions.orders\", {\n schema: [col(\"customerName\", \"string\"), col(\"orderId\", \"string\")],\n description: \"Contract orders\",\n})\n\nconst keyedDefinitionDataset = defineDataset(\"contract.definitions.keyed_orders\", {\n schema: [col(\"tenantId\", \"string\"), col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n primaryKey: [\"tenantId\", \"orderId\"],\n description: \"Contract keyed orders\",\n})\n\nconst writeDataset = defineDataset(\"contract.writes.orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n})\n\nconst nullableWriteDataset = defineDataset(\"contract.writes.nullable_orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"note\", \"string\", { nullable: true })],\n})\n\nconst decimalWriteDataset = defineDataset(\"contract.writes.decimals\", {\n schema: [col(\"id\", \"string\"), col(\"amount\", \"decimal\", { nullable: true })],\n})\n\nconst fileRefDataset = defineDataset(\"contract.files.documents\", {\n schema: [col(\"id\", \"string\"), col(\"attachment\", \"fileRef\", { nullable: true })],\n})\n\nconst invoiceRef: FileRef = {\n blobId: `blob_${\"a\".repeat(64)}`,\n digest: `sha256:${\"a\".repeat(64)}`,\n sizeBytes: 15,\n fileName: \"invoice.txt\",\n mediaType: \"text/plain\",\n logicalPath: \"invoices/invoice.txt\",\n}\n\n/**\n * Runs the shared `LakeStorage` contract against any provider.\n *\n * The suite covers provider-independent Lake semantics: definition\n * materialization and compatibility checks, versioned writes and reads,\n * optimistic commits, unchanged-write detection, write-session lifecycle,\n * and row validation.\n */\nexport function runLakeStorageContractSuite<TStorage extends LakeStorage>(\n label: string,\n options: LakeStorageContractSuiteOptions<TStorage>\n): void {\n const schemaEvolution = options.schemaEvolution ?? \"strict\"\n const missingVersionId = options.missingVersionId ?? \"missing-version\"\n\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n describe(\"dataset definitions\", () => {\n test(\"creates, gets, lists, and reuses dataset definitions\", async () => {\n await withStorage(async (storage) => {\n expect(await storage.getDataset(definitionDataset.id)).toBeNull()\n\n const created = await storage.createDataset(definitionDataset)\n const repeated = await storage.createDataset(definitionDataset)\n\n expect(created).toEqual(definitionDataset)\n expect(repeated).toEqual(definitionDataset)\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n expect(await storage.getDataset(\"missing.dataset\")).toBeNull()\n expect(await storage.listDatasets()).toEqual([definitionDataset])\n expect(await storage.listVersions(definitionDataset.id)).toEqual([])\n })\n })\n\n test(\"round-trips keyed definitions through create, get, list, and reuse\", async () => {\n // Regression guard: omitting primaryKey from mergeDatasetDefinition makes reuse lose\n // the key and fails this contract case.\n await withStorage(async (storage) => {\n const created = await storage.createDataset(keyedDefinitionDataset)\n const repeated = await storage.createDataset(keyedDefinitionDataset)\n\n expect(created).toEqual(keyedDefinitionDataset)\n expect(repeated).toEqual(keyedDefinitionDataset)\n expect(await storage.getDataset(keyedDefinitionDataset.id)).toEqual(\n keyedDefinitionDataset\n )\n expect(await storage.listDatasets()).toEqual([keyedDefinitionDataset])\n expect(await storage.listVersions(keyedDefinitionDataset.id)).toEqual([])\n })\n })\n\n test(\"treats same-column declaration reorders as a no-op\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(definitionDataset)\n await storage.assertDatasetDefinitionsCompatible([reorderedDefinitionDataset])\n\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n await expect(storage.createDataset(reorderedDefinitionDataset)).resolves.toEqual(\n definitionDataset\n )\n expect(await storage.listVersions(definitionDataset.id)).toEqual([])\n })\n })\n\n test(\"persists compatible metadata additions\", async () => {\n await withStorage(async (storage) => {\n const minimalDataset = defineDataset(\"contract.definitions.metadata\", {\n schema: [col(\"orderId\", \"string\"), col(\"orderDate\", \"date\")],\n })\n const documentedDataset = defineDataset(\"contract.definitions.metadata\", {\n schema: [col(\"orderId\", \"string\"), col(\"orderDate\", \"date\")],\n partitionBy: [\"orderDate\"],\n description: \"Contract metadata\",\n })\n\n await storage.createDataset(minimalDataset)\n await storage.assertDatasetDefinitionsCompatible([documentedDataset])\n\n expect(await storage.getDataset(minimalDataset.id)).toEqual(minimalDataset)\n await expect(storage.createDataset(documentedDataset)).resolves.toEqual(documentedDataset)\n expect(await storage.getDataset(minimalDataset.id)).toEqual(documentedDataset)\n })\n })\n\n test(\"rejects incompatible definition changes without mutating the stored definition\", async () => {\n await withStorage(async (storage) => {\n const changedDataset = defineDataset(definitionDataset.id, {\n schema: [col(\"orderId\", \"int64\"), col(\"customerName\", \"string\")],\n description: \"Contract orders\",\n })\n\n await storage.createDataset(definitionDataset)\n\n await expect(\n storage.assertDatasetDefinitionsCompatible([changedDataset])\n ).rejects.toThrow(\"changing column 'orderId' type\")\n await expect(storage.createDataset(changedDataset)).rejects.toBeInstanceOf(\n LakeStorageError\n )\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n })\n })\n\n test(\"checks provider schema evolution policy\", async () => {\n await withStorage(async (storage) => {\n const initialDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"invoiceId\", \"string\")],\n })\n const requestedDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"currency\", \"string\", { nullable: true }), col(\"invoiceId\", \"string\")],\n })\n const storedDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"invoiceId\", \"string\"), col(\"currency\", \"string\", { nullable: true })],\n })\n\n await storage.createDataset(initialDataset)\n\n if (schemaEvolution === \"strict\") {\n await expect(\n storage.assertDatasetDefinitionsCompatible([requestedDataset])\n ).rejects.toThrow(\"incompatible schema\")\n await expect(storage.createDataset(requestedDataset)).rejects.toThrow(\n \"incompatible schema\"\n )\n expect(await storage.getDataset(initialDataset.id)).toEqual(initialDataset)\n return\n }\n\n await storage.assertDatasetDefinitionsCompatible([requestedDataset])\n expect(await storage.getDataset(initialDataset.id)).toEqual(initialDataset)\n expect(await storage.listVersions(initialDataset.id)).toEqual([])\n\n await expect(storage.createDataset(requestedDataset)).resolves.toEqual(storedDataset)\n expect(await storage.getDataset(initialDataset.id)).toEqual(storedDataset)\n\n const [schemaVersion] = await storage.listVersions(initialDataset.id)\n expect(schemaVersion).toMatchObject({\n datasetId: initialDataset.id,\n mode: \"schema\",\n schema: storedDataset.schema,\n })\n })\n })\n\n test(\"keeps compatibility checks read-only for missing datasets\", async () => {\n await withStorage(async (storage) => {\n await storage.assertDatasetDefinitionsCompatible([definitionDataset])\n\n expect(await storage.getDataset(definitionDataset.id)).toBeNull()\n expect(await storage.listDatasets()).toEqual([])\n })\n })\n })\n\n describe(\"catalog state\", () => {\n test(\"reports materialized state and latest version summaries in bulk\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const commit = await write.commit()\n expect(commit.outcome).toBe(\"created\")\n const version = commit\n\n await storage.createDataset(definitionDataset)\n\n const state = await storage.listDatasetCatalogState([\n writeDataset.id,\n definitionDataset.id,\n \"contract.missing.dataset\",\n ])\n\n const byId = new Map(state.map((entry) => [entry.datasetId, entry]))\n\n expect(byId.get(writeDataset.id)).toMatchObject({\n datasetId: writeDataset.id,\n materialized: true,\n })\n expect(byId.get(writeDataset.id)?.latestVersion).toMatchObject({\n datasetId: writeDataset.id,\n versionId: version.versionId,\n mode: \"snapshot\",\n rowCount: 2,\n })\n\n // Created without a committed write: materialized, but no version.\n expect(byId.get(definitionDataset.id)).toEqual({\n datasetId: definitionDataset.id,\n materialized: true,\n latestVersion: null,\n })\n\n // Registered but never created.\n expect(byId.get(\"contract.missing.dataset\")).toEqual({\n datasetId: \"contract.missing.dataset\",\n materialized: false,\n latestVersion: null,\n })\n })\n })\n\n test(\"returns an empty result for an empty request\", async () => {\n await withStorage(async (storage) => {\n expect(await storage.listDatasetCatalogState([])).toEqual([])\n })\n })\n })\n\n describe(\"writes and reads\", () => {\n test(\"keeps immutable-version row order and offsets stable\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n const expected = [\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_5\", customerName: \"Margaret\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_4\", customerName: \"Dorothy\" },\n ]\n await write.writeRows(expected)\n const version = await write.commit()\n const pinned = { datasetId: writeDataset.id, versionId: version.versionId }\n\n await expect(collectRows(storage.readRows(pinned))).resolves.toEqual(expected)\n await expect(collectRows(storage.readRows(pinned))).resolves.toEqual(expected)\n for (const offset of [0, 2, expected.length, expected.length + 3]) {\n await expect(collectRows(storage.readRows({ ...pinned, offset }))).resolves.toEqual(\n expected.slice(offset)\n )\n }\n await expect(\n collectRows(storage.readRows({ ...pinned, columns: [\"orderId\"], offset: 1, limit: 2 }))\n ).resolves.toEqual([{ orderId: \"ord_1\" }, { orderId: \"ord_5\" }])\n })\n })\n\n test(\"rejects writes for unknown datasets\", async () => {\n await withStorage(async (storage) => {\n await expect(storage.beginWrite({ dataset: writeDataset })).rejects.toThrow(\n \"Unknown dataset\"\n )\n })\n })\n\n test(\"commits snapshot and append versions with versioned reads\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const snapshotWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n producer: { kind: \"sync\", id: \"contract-sync\", runId: \"run_1\" },\n })\n await snapshotWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const snapshotCommit = await snapshotWrite.commit({ commitMessage: \"snapshot orders\" })\n expect(snapshotCommit.outcome).toBe(\"created\")\n const version1 = snapshotCommit\n\n expect(version1).toMatchObject({\n datasetId: writeDataset.id,\n mode: \"snapshot\",\n schema: writeDataset.schema,\n producer: { kind: \"sync\", id: \"contract-sync\", runId: \"run_1\" },\n rowCount: 2,\n })\n expect(version1.parentVersionId).toBeUndefined()\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version1.versionId,\n })\n expect(await storage.getVersion(writeDataset.id, version1.versionId)).toMatchObject({\n datasetId: writeDataset.id,\n versionId: version1.versionId,\n mode: \"snapshot\",\n rowCount: 2,\n })\n\n await Bun.sleep(2)\n\n const appendWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"append\",\n inputs: [{ datasetId: writeDataset.id, versionId: version1.versionId }],\n })\n await appendWrite.writeRows([{ orderId: \"ord_3\", customerName: \"Katherine\" }])\n const appendCommit = await appendWrite.commit({\n expectedLatestVersionId: version1.versionId,\n })\n expect(appendCommit.outcome).toBe(\"created\")\n const version2 = appendCommit\n\n expect(version2).toMatchObject({\n datasetId: writeDataset.id,\n parentVersionId: version1.versionId,\n mode: \"append\",\n schema: writeDataset.schema,\n inputs: [{ datasetId: writeDataset.id, versionId: version1.versionId }],\n rowCount: 3,\n })\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version2.versionId,\n })\n\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n ])\n await expect(\n collectRows(\n storage.readRows({ datasetId: writeDataset.id, versionId: version1.versionId })\n )\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n limit: 2,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_1\" }, { orderId: \"ord_2\" }])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n limit: 1,\n offset: 1,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_2\" }])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n offset: 1,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_2\" }, { orderId: \"ord_3\" }])\n\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([version2.versionId, version1.versionId])\n expect(\n (await storage.listVersions(writeDataset.id, 1)).map((version) => version.versionId)\n ).toEqual([version2.versionId])\n expect(await storage.listVersions(\"missing.dataset\")).toEqual([])\n expect(await storage.getLatestVersion(\"missing.dataset\")).toBeNull()\n expect(await storage.getVersion(writeDataset.id, missingVersionId)).toBeNull()\n })\n })\n\n test(\"creates an initial empty snapshot version\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n const version = await write.commit()\n\n expect(version).toMatchObject({\n datasetId: writeDataset.id,\n mode: \"snapshot\",\n outcome: \"created\",\n rowCount: 0,\n })\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version.versionId,\n })\n expect(await storage.listVersions(writeDataset.id)).toHaveLength(1)\n\n const repeatedWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n const repeatedVersion = await repeatedWrite.commit()\n expect(repeatedVersion.outcome).toBe(\"unchanged\")\n expect(repeatedVersion.versionId).toBe(version.versionId)\n expect(await storage.listVersions(writeDataset.id)).toHaveLength(1)\n\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([])\n })\n })\n\n test(\"guards initial and existing versions before accepting even an unchanged write\", () =>\n withStorage(async (storage) => {\n // Regression proof: treat null like undefined or move the version guard after no-op\n // detection. An old writer then succeeds after a competing version has committed.\n await storage.createDataset(writeDataset)\n const first = await storage.beginWrite({ dataset: writeDataset })\n const stale = await storage.beginWrite({ dataset: writeDataset })\n const initial = await first.commit({ expectedLatestVersionId: null })\n await expect(stale.commit({ expectedLatestVersionId: null })).rejects.toThrow(\n \"Optimistic\"\n )\n await stale.abort()\n const replacement = await storage.beginWrite({ dataset: writeDataset })\n await replacement.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const next = await replacement.commit({ expectedLatestVersionId: initial.versionId })\n const identical = await storage.beginWrite({ dataset: writeDataset })\n await identical.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n await expect(\n identical.commit({ expectedLatestVersionId: initial.versionId })\n ).rejects.toThrow(\"Optimistic\")\n await identical.abort()\n expect((await storage.getLatestVersion(writeDataset.id))?.versionId).toBe(next.versionId)\n }))\n\n test(\"versions changed input lineage even when output rows are identical\", () =>\n withStorage(async (storage) => {\n // Regression proof: omit hasDatasetInputChanges in the provider's no-op branch.\n // The updated input reference is lost and the stale writer is no longer fenced.\n await storage.createDataset(writeDataset)\n await storage.createDataset(definitionDataset)\n const sourceWrite = await storage.beginWrite({ dataset: definitionDataset })\n const source1 = await sourceWrite.commit()\n const rows = [{ orderId: \"ord_1\", customerName: \"Ada\" }]\n const ref1 = { datasetId: definitionDataset.id, versionId: source1.versionId }\n const first = await storage.beginWrite({ dataset: writeDataset, inputs: [ref1] })\n await first.writeRows(rows)\n const initial = await first.commit({ expectedLatestVersionId: null })\n const stale = await storage.beginWrite({ dataset: writeDataset, inputs: [ref1] })\n await stale.writeRows([{ orderId: \"ord_1\", customerName: \"Stale\" }])\n const sourceUpdate = await storage.beginWrite({ dataset: definitionDataset })\n await sourceUpdate.writeRows([{ orderId: \"source\", customerName: \"Changed\" }])\n const source2 = await sourceUpdate.commit()\n const ref2 = { datasetId: definitionDataset.id, versionId: source2.versionId }\n const update = await storage.beginWrite({ dataset: writeDataset, inputs: [ref2] })\n await update.writeRows(rows)\n const newer = await update.commit({ expectedLatestVersionId: initial.versionId })\n expect(newer).toMatchObject({ outcome: \"created\", inputs: [ref2] })\n await expect(\n stale.commit({ expectedLatestVersionId: initial.versionId })\n ).rejects.toThrow(\"Optimistic\")\n await stale.abort()\n const same = await storage.beginWrite({ dataset: writeDataset, inputs: [ref2] })\n await same.writeRows(rows)\n const unchanged = await same.commit({ expectedLatestVersionId: newer.versionId })\n expect(unchanged).toMatchObject({ outcome: \"unchanged\", versionId: newer.versionId })\n expect(await collectRows(storage.readRows({ datasetId: writeDataset.id }))).toEqual(rows)\n }))\n\n test(\"creates an initial empty append version\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n const version = await write.commit()\n\n expect(version).toMatchObject({\n datasetId: writeDataset.id,\n mode: \"append\",\n outcome: \"created\",\n })\n expect(version.parentVersionId).toBeUndefined()\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version.versionId,\n })\n expect(await storage.listVersions(writeDataset.id)).toHaveLength(1)\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([])\n })\n })\n\n test(\"snapshot writes replace the visible latest rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const firstWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await firstWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const firstVersion = await firstWrite.commit()\n\n const replacementWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n await replacementWrite.writeRows([{ orderId: \"ord_9\", customerName: \"Dorothy\" }])\n const replacementVersion = await replacementWrite.commit()\n\n expect(replacementVersion.versionId).not.toBe(firstVersion.versionId)\n expect(replacementVersion.parentVersionId).toBeUndefined()\n expect(replacementVersion.rowCount).toBe(1)\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([{ orderId: \"ord_9\", customerName: \"Dorothy\" }])\n await expect(\n collectRows(\n storage.readRows({ datasetId: writeDataset.id, versionId: firstVersion.versionId })\n )\n ).resolves.toEqual([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n })\n })\n\n test(\"reuses the latest version when a snapshot commits identical content\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const seedVersion = await seedWrite.commit()\n expect(seedVersion.outcome).toBe(\"created\")\n\n // Identical rows in a different order are the same snapshot content.\n const identicalWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n await identicalWrite.writeRows([\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_1\", customerName: \"Ada\" },\n ])\n const identicalVersion = await identicalWrite.commit()\n\n expect(identicalVersion.outcome).toBe(\"unchanged\")\n expect(identicalVersion.versionId).toBe(seedVersion.versionId)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([seedVersion.versionId])\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: seedVersion.versionId,\n })\n\n await Bun.sleep(2)\n\n const changedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await changedWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Hopper\" },\n ])\n const changedVersion = await changedWrite.commit()\n\n expect(changedVersion.outcome).toBe(\"created\")\n expect(changedVersion.versionId).not.toBe(seedVersion.versionId)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([changedVersion.versionId, seedVersion.versionId])\n })\n })\n\n test(\"snapshot content comparison respects row multiplicities\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const rowA = { orderId: \"ord_1\", customerName: \"Ada\" }\n const rowB = { orderId: \"ord_2\", customerName: \"Grace\" }\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([rowA, rowA, rowB])\n const seedVersion = await seedWrite.commit()\n\n await Bun.sleep(2)\n\n // Same distinct rows and row count, but different duplicate counts:\n // this is new content, not a no-op.\n const shiftedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await shiftedWrite.writeRows([rowA, rowB, rowB])\n const shiftedVersion = await shiftedWrite.commit()\n\n expect(shiftedVersion.outcome).toBe(\"created\")\n expect(shiftedVersion.versionId).not.toBe(seedVersion.versionId)\n })\n })\n\n test(\"treats omitted and null nullable values as the same snapshot content\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(nullableWriteDataset)\n\n const seedWrite = await storage.beginWrite({\n dataset: nullableWriteDataset,\n mode: \"snapshot\",\n })\n await seedWrite.writeRows([{ orderId: \"ord_1\", note: null }])\n const seedVersion = await seedWrite.commit()\n\n const omittedWrite = await storage.beginWrite({\n dataset: nullableWriteDataset,\n mode: \"snapshot\",\n })\n await omittedWrite.writeRows([{ orderId: \"ord_1\" }])\n const omittedVersion = await omittedWrite.commit()\n\n expect(omittedVersion.outcome).toBe(\"unchanged\")\n expect(omittedVersion.versionId).toBe(seedVersion.versionId)\n })\n })\n\n test(\"reuses the latest version when an append commits zero rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const seedVersion = await seedWrite.commit()\n\n const emptyAppend = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n const appendVersion = await emptyAppend.commit()\n\n expect(appendVersion.outcome).toBe(\"unchanged\")\n expect(appendVersion.versionId).toBe(seedVersion.versionId)\n expect(appendVersion.rowCount).toBe(1)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([seedVersion.versionId])\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n })\n })\n\n test(\"fails stale optimistic commits\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const initialVersion = await seedWrite.commit()\n\n const delayedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n await delayedWrite.writeRows([{ orderId: \"ord_2\", customerName: \"Grace\" }])\n\n const competingWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"append\",\n })\n await competingWrite.writeRows([{ orderId: \"ord_3\", customerName: \"Katherine\" }])\n await competingWrite.commit({ expectedLatestVersionId: initialVersion.versionId })\n\n await expect(\n delayedWrite.commit({ expectedLatestVersionId: initialVersion.versionId })\n ).rejects.toThrow(\"Optimistic commit failed\")\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n ])\n })\n })\n\n test(\"abort closes a write session without committing rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n await write.abort()\n await write.abort()\n\n expect(await storage.getLatestVersion(writeDataset.id)).toBeNull()\n expect(await storage.listVersions(writeDataset.id)).toEqual([])\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).rejects.toThrow(\"No committed version found\")\n })\n })\n\n test(\"commit closes a write session and leaves abort idempotent\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n await write.commit()\n await write.abort()\n\n await expect(write.writeRows([])).rejects.toThrow(\"already closed\")\n })\n })\n\n test(\"rejects rows that do not match the dataset schema\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n\n await expect(write.writeRows([{ orderId: \"ord_1\" }])).rejects.toThrow(\n \"missing required column\"\n )\n await expect(\n write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\", unexpected: true } as never])\n ).rejects.toThrow(\"unknown column\")\n await write.abort()\n })\n })\n\n test(\"round-trips exact decimal strings in eager and streaming reads\", async () => {\n await withStorage(async (storage) => {\n const exact = \"9007199254740993.123456789\"\n await storage.createDataset(decimalWriteDataset)\n\n const write = await storage.beginWrite({ dataset: decimalWriteDataset, mode: \"snapshot\" })\n await write.writeRows([\n { id: \"amount_1\", amount: exact },\n { id: \"amount_2\", amount: null },\n ])\n await write.commit()\n\n await expect(\n collectRows(storage.readRows({ datasetId: decimalWriteDataset.id }))\n ).resolves.toEqual([\n { id: \"amount_1\", amount: exact },\n { id: \"amount_2\", amount: null },\n ])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: decimalWriteDataset.id,\n columns: [\"amount\"],\n limit: 1,\n })\n )\n ).resolves.toEqual([{ amount: exact }])\n })\n })\n\n test(\"round-trips fileRef row values\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(fileRefDataset)\n\n const write = await storage.beginWrite({ dataset: fileRefDataset, mode: \"snapshot\" })\n await write.writeRows([\n { id: \"doc_1\", attachment: invoiceRef },\n { id: \"doc_2\", attachment: null },\n ])\n await write.commit()\n\n await expect(\n collectRows(storage.readRows({ datasetId: fileRefDataset.id }))\n ).resolves.toEqual([\n { id: \"doc_1\", attachment: invoiceRef },\n { id: \"doc_2\", attachment: null },\n ])\n })\n })\n })\n })\n}\n\nasync function collectRows(rows: AsyncIterable<DatasetRow>): Promise<DatasetRow[]> {\n const result: DatasetRow[] = []\n for await (const row of rows) {\n result.push(row)\n }\n return result\n}\n",
|
|
20
24
|
"import { describe, expect, test } from \"bun:test\"\nimport { commitExactObject, type OntologyContractStorage } from \"./ontology-contract-fixture\"\n\n/** Stable logical failure points exercised by the provider-independent exact-plan fixture. */\nexport type MaterializationFailureBoundary =\n | \"effective.object.upsert\"\n | \"outbox.insert\"\n | \"finalize\"\n\nexport interface MaterializationFailureContractSuiteOptions<\n TStorage extends OntologyContractStorage = OntologyContractStorage,\n TSnapshot = unknown,\n> {\n /** Factory that returns an isolated, transaction-capable storage facade for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional provider setup invoked after the storage facade is created. */\n readonly setup?: (storage: TStorage) => void | Promise<void>\n /** Optional provider cleanup invoked after every test, including failed tests. */\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n /** Captures every provider state that must participate in materialization rollback. */\n readonly captureState: (storage: TStorage) => TSnapshot | Promise<TSnapshot>\n /** Arms one logical write boundary to throw the supplied failure. */\n readonly injectFailure: (\n storage: TStorage,\n boundary: MaterializationFailureBoundary,\n failure: Error\n ) => void | Promise<void>\n /** Clears provider hooks after an injected attempt. */\n readonly clearFailure?: (storage: TStorage) => void | Promise<void>\n /** Providers may omit a boundary only when their test adapter cannot expose it. */\n readonly boundaries?: readonly MaterializationFailureBoundary[]\n}\n\n/**\n * Verifies that failures in the exact-plan write path leave no partial object,\n * commit, or outbox state. The suite is opt-in because production adapters do\n * not need to expose failure injection.\n */\nexport function runMaterializationFailureContractSuite<\n TStorage extends OntologyContractStorage,\n TSnapshot,\n>(label: string, options: MaterializationFailureContractSuiteOptions<TStorage, TSnapshot>): void {\n const boundaries = options.boundaries ?? [\"effective.object.upsert\", \"outbox.insert\", \"finalize\"]\n\n describe(label, () => {\n for (const boundary of boundaries) {\n test(`rolls back the complete transaction when ${boundary} fails`, async () => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n const before = await options.captureState(storage)\n const failure = new Error(`contract injected ${boundary}`)\n await options.injectFailure(storage, boundary, failure)\n await expect(commitExactObject(storage, `failure-${boundary}`)).rejects.toThrow(\n failure.message\n )\n await options.clearFailure?.(storage)\n expect(await options.captureState(storage)).toEqual(before)\n } finally {\n await options.clearFailure?.(storage)\n await options.cleanup?.(storage)\n }\n })\n }\n })\n}\n",
|
|
21
25
|
"import { createEventId } from \"../materialization/identity\"\nimport type {\n MaterializationPlanHeader,\n MaterializationWorkRecord,\n OntologyMaterializationEvent,\n OntologyStorage,\n} from \"../storage/ontology\"\nimport type { Storage } from \"../storage/types\"\n\nexport interface OntologyContractStorage extends Storage {\n readonly ontology: OntologyStorage\n}\n\nconst emptyChunk = {\n overrides: {\n objects: { upserts: [], deletes: [] },\n links: {\n edges: { upserts: [], deletes: [] },\n slots: { upserts: [], deletes: [] },\n },\n },\n effective: {\n objectUpserts: [],\n objectDeletes: [],\n linkUpserts: [],\n linkDeletes: [],\n },\n timeseries: { pointUpserts: [] },\n outbox: [],\n} as const\n\nexport function contractEditHeader(id: string): MaterializationPlanHeader {\n return {\n commit: {\n projectId: \"contract-project\",\n id,\n idempotencyKey: `runtime:${id}`,\n requestHash: `hash:${id}`,\n executionId: `contract-execution:${id}`,\n origin: { kind: \"runtime\", requestId: id },\n ontologyRevision: \"ontology-contract-revision\",\n intent: { kind: \"edit\", mode: \"atomic\", operationCount: 0 },\n committedAt: CONTRACT_COMMITTED_AT,\n },\n expected: {\n sources: [],\n objects: [],\n links: [],\n linkScopes: [],\n points: [],\n },\n }\n}\n\nexport const CONTRACT_COMMITTED_AT = \"2026-01-02T00:00:00.000Z\"\n\nexport function contractEditResult(commitId: string, eventCount = 0) {\n return {\n kind: \"edit\" as const,\n commitId,\n created: true,\n eventCount,\n committedAt: CONTRACT_COMMITTED_AT,\n outcomes: [],\n changes: { objects: [], links: [] },\n }\n}\n\nexport async function commitEmptyEdit(storage: OntologyContractStorage, id: string): Promise<void> {\n await storage.transaction(async (tx) => {\n const header = contractEditHeader(id)\n await ensureContractExecution(tx, header)\n const session = await tx.ontology.materializations.begin(header)\n await tx.ontology.materializations.finalize({\n session,\n finalization: { sourceActivations: [], result: contractEditResult(id) },\n })\n })\n}\n\n/**\n * Applies a provider-authored exact object row and matching outbox row. The\n * fixture contains no ontology merge or diff logic; all semantic decisions are\n * already represented by the exact plan.\n */\nexport async function commitExactObject(\n storage: OntologyContractStorage,\n id: string,\n options: {\n readonly primaryId?: string\n readonly omitFinalize?: boolean\n readonly throwAfterFinalize?: boolean\n } = {}\n): Promise<{ readonly eventId: string }> {\n const header = contractEditHeader(id)\n const ref = { objectTypeId: \"ContractDevice\", primaryId: options.primaryId ?? id }\n const row = {\n ref,\n properties: { name: id },\n version: 1,\n createdAt: header.commit.committedAt,\n updatedAt: header.commit.committedAt,\n lastCommitId: id,\n }\n const exactWrite = { row, expected: { ref, exists: false as const } }\n const draft = {\n schemaVersion: 1 as const,\n projectId: header.commit.projectId,\n occurredAt: header.commit.committedAt,\n correlationId: `contract-correlation:${id}`,\n origin: header.commit.origin,\n commitId: id,\n type: \"object.created\" as const,\n topic: \"objects\" as const,\n partitionKey: `${ref.objectTypeId}:${ref.primaryId}`,\n payload: {\n objectTypeId: ref.objectTypeId,\n primaryId: ref.primaryId,\n properties: row.properties,\n propertyChanges: {},\n },\n }\n const eventId = createEventId(header.commit.projectId, id, 0)\n const envelope: OntologyMaterializationEvent = {\n ...draft,\n id: eventId,\n commitOrdinal: 0,\n }\n const work: readonly MaterializationWorkRecord[] = [\n {\n kind: \"plan\",\n recordKey: `plan:${id}`,\n applyPhase: 4,\n sortKey: \"61\",\n item: { kind: \"object-upsert\", value: exactWrite },\n },\n {\n kind: \"event\",\n recordKey: `event:0:${id}`,\n eventKindRank: 0,\n sortKey: \"61\",\n draft,\n },\n ]\n\n await storage.transaction(async (tx) => {\n await ensureContractExecution(tx, header)\n const materializations = tx.ontology.materializations\n const session = await materializations.begin(header)\n await materializations.stageWork({ session, records: work })\n\n const applyRecords = []\n for await (const page of materializations.streamWork({\n session,\n order: \"apply\",\n pageRows: 1,\n })) {\n applyRecords.push(...page.records)\n }\n const objectUpserts = applyRecords.flatMap((record) =>\n record.kind === \"plan\" && record.item.kind === \"object-upsert\" ? [record.item.value] : []\n )\n await materializations.applyChunk({\n session,\n chunk: {\n ...emptyChunk,\n effective: { ...emptyChunk.effective, objectUpserts },\n },\n })\n\n const eventRecords = []\n for await (const page of materializations.streamWork({\n session,\n order: \"event\",\n pageRows: 1,\n })) {\n eventRecords.push(...page.records)\n }\n await materializations.applyChunk({\n session,\n chunk: {\n ...emptyChunk,\n outbox: eventRecords.map((record) => {\n if (record.kind !== \"event\") throw new Error(\"Expected event work record.\")\n return {\n envelope,\n availableAt: header.commit.committedAt,\n createdAt: header.commit.committedAt,\n }\n }),\n },\n })\n if (!options.omitFinalize) {\n await materializations.finalize({\n session,\n finalization: { sourceActivations: [], result: contractEditResult(id, 1) },\n })\n }\n if (options.throwAfterFinalize) throw new Error(\"contract rollback\")\n })\n\n return { eventId }\n}\n\nexport async function ensureContractExecution(\n storage: Pick<Storage, \"executions\">,\n header: MaterializationPlanHeader\n): Promise<void> {\n if (\n await storage.executions.getById({\n projectId: header.commit.projectId,\n id: header.commit.executionId,\n })\n ) {\n return\n }\n await storage.executions.create({\n id: header.commit.executionId,\n projectId: header.commit.projectId,\n executor: { type: \"request\", requestId: `contract-request:${header.commit.id}` },\n source: { type: \"http\", requestId: `contract-request:${header.commit.id}` },\n correlationId: `contract-correlation:${header.commit.id}`,\n authorizationRef: { type: \"disabled\" },\n })\n}\n",
|
|
22
26
|
"import { expect, test } from \"bun:test\"\nimport {\n col,\n type DatasetDefinition,\n defineDataset,\n defineObjectType,\n defineProjection,\n link,\n OntologyRegistry,\n prop,\n type Storage,\n} from \"..\"\nimport type { TrustedPrimitiveRef } from \"../execution\"\nimport { restoreTrustedPrimitiveExecutionScope } from \"../execution/durable\"\nimport { createTestingScope } from \"../execution/scopes\"\nimport type { OntologyMaterializer } from \"../materializer\"\nimport {\n createLinkScopeFingerprint,\n createOntologyMaterializer,\n type OntologyEditOperation,\n ProjectionRegistry,\n type ProjectionSourceEntry,\n} from \"../materializer\"\nimport type { ActionRunStorage, ProjectionRunStorage } from \"../storage\"\nimport { createTestActionExecution, queueTestActionRun } from \"./action-execution\"\nimport { createTestProjectionExecution, startTestProjectionRun } from \"./projection-execution\"\n\nexport interface MaterializerStorageContractProvider<TStorage extends Storage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\ntype ContractStorage = Storage & {\n readonly actionRuns: ActionRunStorage\n readonly projectionRuns: ProjectionRunStorage\n}\n\nconst Device = defineObjectType({\n id: \"StorageContractDevice\",\n name: \"Device\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n prop(\"temperature\", \"double\", { mode: \"telemetry\" }),\n ],\n links: [link.self(\"parent\", { cardinality: \"one\" }), link.self(\"peers\", { cardinality: \"many\" })],\n})\n\nconst devices = defineDataset(\"storage_contract_devices\", {\n schema: [\n col(\"id\", \"string\"),\n col(\"name\", \"string\"),\n col(\"parent_id\", \"string\", { nullable: true }),\n ],\n})\nconst readings = defineDataset(\"storage_contract_readings\", {\n schema: [col(\"device_id\", \"string\"), col(\"at\", \"timestamp\"), col(\"value\", \"float64\")],\n})\nconst devicePeers = defineDataset(\"storage_contract_device_peers\", {\n schema: [col(\"source_id\", \"string\"), col(\"target_id\", \"string\")],\n})\nconst ConflictDevice = defineObjectType({\n id: \"StorageContractConflictDevice\",\n name: \"Conflict device\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n prop(\"state\", \"string\", { required: true }),\n ],\n})\nconst conflictDevices = defineDataset(\"storage_contract_conflict_devices\", {\n schema: [\n col(\"id\", \"string\"),\n col(\"name\", \"string\"),\n col(\"state\", \"string\"),\n col(\"updated_at\", \"timestamp\"),\n ],\n})\nconst deviceProjection = defineProjection(\"storage_contract_devices\", Device)\n .fromDataset(devices)\n .properties({ id: \"id\", name: \"name\" })\n .withLinks({\n parent: {\n link: Device.l.parent,\n sourceField: \"parent_id\",\n target: Device,\n },\n })\nconst temperatureProjection = defineProjection(\n \"storage_contract_temperatures\",\n Device.p.temperature\n)\n .fromDataset(readings)\n .points({ objectId: \"device_id\", at: \"at\", value: \"value\" })\nconst devicePeersProjection = defineProjection(\"storage_contract_device_peers\", Device.l.peers)\n .fromDataset(devicePeers)\n .sourceField(\"source_id\")\n .targetField(\"target_id\")\nconst conflictDeviceProjection = defineProjection(\n \"storage_contract_conflict_devices\",\n ConflictDevice\n)\n .fromDataset(conflictDevices)\n .properties({ id: \"id\", name: \"name\", state: \"state\" })\n .resolveConflicts({ strategy: \"mostRecent\", sourceTimestamp: \"updated_at\" })\n\nconst ontology = new OntologyRegistry({ sources: [Device, ConflictDevice] })\nconst projections = new ProjectionRegistry({\n projections: [\n deviceProjection,\n temperatureProjection,\n devicePeersProjection,\n conflictDeviceProjection,\n ],\n ontology,\n datasetsById: new Map<string, DatasetDefinition>([\n [devices.id, devices],\n [readings.id, readings],\n [devicePeers.id, devicePeers],\n [conflictDevices.id, conflictDevices],\n ]),\n})\n\nexport function runMaterializerStorageContractSuite<TStorage extends Storage>(\n name: string,\n provider: MaterializerStorageContractProvider<TStorage>\n): void {\n test(`${name} persists replacement, Action, and telemetry commits atomically`, async () => {\n const createdStorage = await provider.createStorage()\n const storage = requireContractStorage(createdStorage)\n let materializationOrdinal = 0\n const materializer = createOntologyMaterializer({\n projectId: \"materializer-storage-contract\",\n ontology,\n projections,\n storage,\n dependencies: {\n batching: { sourceStageRows: 1, statePageRows: 1, planChunkRows: 1 },\n clock: () => new Date(\"2026-02-01T12:00:00.000Z\"),\n materializationId: () => `storage-contract-candidate-${++materializationOrdinal}`,\n },\n })\n try {\n const firstVersion = {\n datasetId: devices.id,\n versionId: \"v1\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n }\n const firstExecution = await claim(storage, {\n runId: \"replacement-v1\",\n projectionId: deviceProjection.id,\n protocol: \"replacement\",\n datasetVersion: firstVersion,\n })\n const firstMaterializer = await projectionMaterializer(\n materializer,\n storage,\n deviceProjection.id,\n \"replacement-v1\"\n )\n const first = await firstMaterializer.projections.replace({\n source: { projectionId: deviceProjection.id },\n datasetVersion: firstVersion,\n execution: firstExecution,\n entries: entries([sourceEntry(\"one\", \"One\", \"two\"), sourceEntry(\"two\", \"Two\")]),\n })\n expect(first.counts).toMatchObject({ objectsCreated: 2, linksCreated: 1 })\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n primaryId: \"one\",\n })\n ).toMatchObject({ properties: { id: \"one\", name: \"One\" }, lastCommitId: first.commitId })\n\n const secondVersion = {\n datasetId: devices.id,\n versionId: \"v2\",\n createdAt: \"2026-01-02T00:00:00.000Z\",\n }\n const secondExecution = await claim(storage, {\n runId: \"replacement-v2\",\n projectionId: deviceProjection.id,\n protocol: \"replacement\",\n datasetVersion: secondVersion,\n })\n const secondMaterializer = await projectionMaterializer(\n materializer,\n storage,\n deviceProjection.id,\n \"replacement-v2\"\n )\n const second = await secondMaterializer.projections.replace({\n source: { projectionId: deviceProjection.id },\n datasetVersion: secondVersion,\n execution: secondExecution,\n entries: entries([sourceEntry(\"one\", \"One updated\")]),\n })\n expect(second.counts).toMatchObject({\n objectsUpdated: 1,\n objectsDeleted: 1,\n linksDeleted: 1,\n })\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n primaryId: \"two\",\n })\n ).toBeNull()\n\n await createTestActionExecution(storage.executions, {\n projectId: \"materializer-storage-contract\",\n actionId: \"renameDevice\",\n runId: \"missing-action-run\",\n })\n const missingActionMaterializer = await primitiveMaterializer(materializer, storage, {\n kind: \"action\",\n id: \"renameDevice\",\n runId: \"missing-action-run\",\n })\n await expect(\n missingActionMaterializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"action\", actionId: \"renameDevice\", runId: \"missing-action-run\" },\n operations: [\n {\n id: \"missing-run-rename\",\n kind: \"object.patch\",\n ref: { objectTypeId: Device.id, primaryId: \"one\" },\n set: { name: \"Must not persist\" },\n unset: [],\n reset: [],\n },\n ],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n ).rejects.toThrow(\"missing-action-run\")\n\n await queueTestActionRun(storage, {\n id: \"action-run\",\n projectId: \"materializer-storage-contract\",\n actionId: \"renameDevice\",\n subject: { kind: \"object\", objectTypeId: Device.id, primaryId: \"one\" },\n params: {},\n idempotencyKey: \"action-run\",\n })\n await storage.actionRuns.start({\n id: \"action-run\",\n projectId: \"materializer-storage-contract\",\n })\n const actionMaterializer = await primitiveMaterializer(materializer, storage, {\n kind: \"action\",\n id: \"renameDevice\",\n runId: \"action-run\",\n })\n const actionCommit = await actionMaterializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"action\", actionId: \"renameDevice\", runId: \"action-run\" },\n operations: [\n {\n id: \"rename\",\n kind: \"object.patch\",\n ref: { objectTypeId: Device.id, primaryId: \"one\" },\n set: { name: \"Managed name\" },\n unset: [],\n reset: [],\n },\n ],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"materializer-storage-contract\",\n origin: { kind: \"action\", actionRunId: \"action-run\" },\n })\n ).toMatchObject({ id: actionCommit.commitId })\n\n const telemetryVersion = {\n datasetId: readings.id,\n versionId: \"readings-v1\",\n createdAt: \"2026-01-03T00:00:00.000Z\",\n }\n await createTestProjectionExecution(storage.executions, {\n projectId: \"materializer-storage-contract\",\n projectionId: temperatureProjection.id,\n runId: \"missing-telemetry-run\",\n datasetId: readings.id,\n datasetVersionId: \"missing-readings-run\",\n })\n const missingTelemetryMaterializer = await primitiveMaterializer(materializer, storage, {\n kind: \"projection\",\n id: temperatureProjection.id,\n runId: \"missing-telemetry-run\",\n })\n await expect(\n missingTelemetryMaterializer.telemetry.append({\n source: {\n kind: \"projection\",\n projection: { projectionId: temperatureProjection.id },\n datasetVersion: {\n datasetId: readings.id,\n versionId: \"missing-readings-run\",\n createdAt: \"2026-01-02T12:00:00.000Z\",\n },\n execution: {\n projectionRunId: \"missing-telemetry-run\",\n executionToken: \"missing-execution-token\",\n },\n batchOrdinal: 0,\n sourceRowCount: 1,\n sourceRowsSkipped: 0,\n inputExhausted: true,\n },\n points: [\n {\n series: {\n object: { objectTypeId: Device.id, primaryId: \"one\" },\n propertyId: \"temperature\",\n },\n value: 20,\n at: \"2026-01-02T13:00:00.000Z\",\n },\n ],\n })\n ).rejects.toThrow(\"missing-telemetry-run\")\n\n const telemetryExecution = await claim(storage, {\n runId: \"telemetry-v1\",\n projectionId: temperatureProjection.id,\n protocol: \"telemetry\",\n datasetVersion: telemetryVersion,\n fixedBatchSize: 1,\n })\n const telemetryMaterializer = await projectionMaterializer(\n materializer,\n storage,\n temperatureProjection.id,\n \"telemetry-v1\"\n )\n const telemetry = await telemetryMaterializer.telemetry.append({\n source: {\n kind: \"projection\",\n projection: { projectionId: temperatureProjection.id },\n datasetVersion: telemetryVersion,\n execution: telemetryExecution,\n batchOrdinal: 0,\n sourceRowCount: 1,\n sourceRowsSkipped: 0,\n inputExhausted: true,\n },\n points: [\n {\n series: {\n object: { objectTypeId: Device.id, primaryId: \"one\" },\n propertyId: \"temperature\",\n },\n value: 21.5,\n at: \"2026-01-03T01:00:00.000Z\",\n },\n ],\n })\n expect(telemetry).toMatchObject({ pointsCreated: 1, latestObjectsChanged: 1 })\n expect(\n await storage.timeseries.getLatest({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n objectId: \"one\",\n propertyId: \"temperature\",\n })\n ).toMatchObject({ value: 21.5, lastCommitId: telemetry.commitId })\n } finally {\n await provider.cleanup?.(createdStorage)\n }\n })\n\n test(`${name} persists per-property Action edit times`, async () => {\n const createdStorage = await provider.createStorage()\n const storage = requireContractStorage(createdStorage)\n let materializationOrdinal = 0\n let now = new Date(\"2026-02-01T00:00:10.000Z\")\n const materializer = createOntologyMaterializer({\n projectId: \"materializer-storage-contract\",\n ontology,\n projections,\n storage,\n dependencies: {\n batching: { sourceStageRows: 1, statePageRows: 1, planChunkRows: 1 },\n clock: () => now,\n materializationId: () => `conflict-contract-candidate-${++materializationOrdinal}`,\n },\n })\n const runtimeMaterializer = materializer.withScope(runtimeScope())\n const ref = { objectTypeId: ConflictDevice.id, primaryId: \"one\" }\n const replace = async (\n versionId: string,\n sourceUpdatedAt: string,\n name: string,\n state: string\n ) => {\n const datasetVersion = {\n datasetId: conflictDevices.id,\n versionId,\n createdAt: sourceUpdatedAt,\n }\n const execution = await claim(storage, {\n runId: `conflict-${versionId}`,\n projectionId: conflictDeviceProjection.id,\n protocol: \"replacement\",\n datasetVersion,\n })\n const projectionMaterializerForRun = await projectionMaterializer(\n materializer,\n storage,\n conflictDeviceProjection.id,\n `conflict-${versionId}`\n )\n await projectionMaterializerForRun.projections.replace({\n source: { projectionId: conflictDeviceProjection.id },\n datasetVersion,\n execution,\n entries: entries([\n {\n root: { kind: \"object\", ref },\n assertions: [{ kind: \"object\", ref, properties: { name, state }, sourceUpdatedAt }],\n },\n ]),\n })\n }\n const edit = (requestId: string, propertyId: \"name\" | \"state\", value: string) =>\n runtimeMaterializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"runtime\", requestId },\n operations: [\n {\n id: requestId,\n kind: \"object.patch\",\n ref,\n set: { [propertyId]: value },\n unset: [],\n reset: [],\n },\n ],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n\n try {\n await replace(\"v1\", \"2026-02-01T00:00:10.000Z\", \"Source A\", \"source-open\")\n\n now = new Date(\"2026-02-01T00:00:11.000Z\")\n await edit(\"conflict-name\", \"name\", \"Action B\")\n now = new Date(\"2026-02-01T00:00:13.000Z\")\n await edit(\"conflict-state\", \"state\", \"action-closed\")\n\n await replace(\"v2\", \"2026-02-01T00:00:12.000Z\", \"Source C\", \"source-changed\")\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"materializer-storage-contract\",\n objectTypeId: ConflictDevice.id,\n primaryId: \"one\",\n })\n ).toMatchObject({ properties: { id: \"one\", name: \"Source C\", state: \"action-closed\" } })\n } finally {\n await provider.cleanup?.(createdStorage)\n }\n })\n\n test(`${name} persists cardinality-one edit authority by scope`, async () => {\n const createdStorage = await provider.createStorage()\n const storage = requireContractStorage(createdStorage)\n let materializationOrdinal = 0\n const materializer = createOntologyMaterializer({\n projectId: \"materializer-storage-contract\",\n ontology,\n projections,\n storage,\n dependencies: {\n batching: { sourceStageRows: 1, statePageRows: 1, planChunkRows: 1 },\n clock: () => new Date(\"2026-02-01T12:00:00.000Z\"),\n materializationId: () => `scope-contract-candidate-${++materializationOrdinal}`,\n },\n })\n const runtimeMaterializer = materializer.withScope(runtimeScope())\n const linkRef = (targetId: string) => ({\n source: { objectTypeId: Device.id, primaryId: \"document\" },\n linkId: \"parent\",\n target: { objectTypeId: Device.id, primaryId: targetId },\n })\n const replace = async (versionId: string, parentId: string) => {\n const datasetVersion = {\n datasetId: devices.id,\n versionId,\n createdAt: `2026-01-0${versionId.slice(1)}T00:00:00.000Z`,\n }\n const execution = await claim(storage, {\n runId: `scope-${versionId}`,\n projectionId: deviceProjection.id,\n protocol: \"replacement\",\n datasetVersion,\n })\n const projectionMaterializerForRun = await projectionMaterializer(\n materializer,\n storage,\n deviceProjection.id,\n `scope-${versionId}`\n )\n await projectionMaterializerForRun.projections.replace({\n source: { projectionId: deviceProjection.id },\n datasetVersion,\n execution,\n entries: entries([\n sourceEntry(\"document\", \"Document\", parentId),\n sourceEntry(\"rockland\", \"Rockland\"),\n sourceEntry(\"haverstraw\", \"Haverstraw\"),\n ]),\n })\n }\n const edit = (requestId: string, operation: OntologyEditOperation) =>\n runtimeMaterializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"runtime\", requestId },\n operations: [operation],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n const targets = async () =>\n (\n await storage.objects.listLinks({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n objectId: \"document\",\n })\n ).map((row) => row.targetId)\n\n try {\n await replace(\"v1\", \"rockland\")\n await edit(\"scope-set\", {\n id: \"set\",\n kind: \"link.upsert\",\n ref: linkRef(\"rockland\"),\n })\n\n await replace(\"v2\", \"haverstraw\")\n expect(await targets()).toEqual([\"rockland\"])\n\n await edit(\"scope-reset\", {\n id: \"reset\",\n kind: \"link.reset\",\n ref: linkRef(\"rockland\"),\n })\n expect(await targets()).toEqual([\"haverstraw\"])\n\n await edit(\"scope-clear\", {\n id: \"clear\",\n kind: \"link.delete\",\n ref: linkRef(\"haverstraw\"),\n })\n await replace(\"v3\", \"rockland\")\n expect(await targets()).toEqual([])\n\n await edit(\"scope-clear-reset\", {\n id: \"reset\",\n kind: \"link.reset\",\n ref: linkRef(\"haverstraw\"),\n })\n expect(await targets()).toEqual([\"rockland\"])\n } finally {\n await provider.cleanup?.(createdStorage)\n }\n })\n\n test(`${name} fences projected cardinality-many link scopes by fingerprint`, async () => {\n const createdStorage = await provider.createStorage()\n const storage = requireContractStorage(createdStorage)\n let materializationOrdinal = 0\n const materializer = createOntologyMaterializer({\n projectId: \"materializer-storage-contract\",\n ontology,\n projections,\n storage,\n dependencies: {\n batching: { sourceStageRows: 1, statePageRows: 1, planChunkRows: 1 },\n clock: () => new Date(\"2026-02-01T12:00:00.000Z\"),\n materializationId: () => `many-scope-contract-candidate-${++materializationOrdinal}`,\n },\n })\n const runtimeMaterializer = materializer.withScope(runtimeScope())\n const source = { objectTypeId: Device.id, primaryId: \"source\" }\n const peer = (primaryId: string) => ({ objectTypeId: Device.id, primaryId })\n const linkRef = (targetId: string) => ({\n source,\n linkId: \"peers\",\n target: peer(targetId),\n })\n\n try {\n await runtimeMaterializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"runtime\", requestId: \"many-scope-endpoints\" },\n operations: [\"source\", \"peer-a\", \"peer-b\", \"peer-c\"].map((primaryId) => ({\n id: `create-${primaryId}`,\n kind: \"object.create\" as const,\n ref: peer(primaryId),\n properties: { name: primaryId },\n })),\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n\n const datasetVersion = {\n datasetId: devicePeers.id,\n versionId: \"many-links-v1\",\n createdAt: \"2026-02-01T00:00:00.000Z\",\n }\n const execution = await claim(storage, {\n runId: \"many-links-v1\",\n projectionId: devicePeersProjection.id,\n protocol: \"replacement\",\n datasetVersion,\n })\n const projectedLinks = [linkRef(\"peer-a\"), linkRef(\"peer-b\")]\n await (\n await projectionMaterializer(\n materializer,\n storage,\n devicePeersProjection.id,\n \"many-links-v1\"\n )\n ).projections.replace({\n source: { projectionId: devicePeersProjection.id },\n datasetVersion,\n execution,\n entries: entries(\n projectedLinks.map((ref) => ({\n root: { kind: \"link\", ref },\n assertions: [{ kind: \"link\", ref }],\n }))\n ),\n })\n\n const observedLinks = await storage.objects.listLinks({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n objectId: source.primaryId,\n linkId: \"peers\",\n })\n const fingerprint = createLinkScopeFingerprint(\n observedLinks.map((row) => {\n if (row.lastCommitId === undefined) {\n throw new Error(\"Projected contract link is missing materializer provenance.\")\n }\n return {\n ref: linkRef(row.targetId),\n createdAt: row.createdAt.toISOString(),\n updatedAt: row.updatedAt.toISOString(),\n lastCommitId: row.lastCommitId,\n }\n })\n )\n const commitObservation = async (runId: string, name: string) => {\n await queueTestActionRun(storage, {\n id: runId,\n projectId: \"materializer-storage-contract\",\n actionId: \"observePeers\",\n subject: { kind: \"object\", objectTypeId: Device.id, primaryId: source.primaryId },\n params: {},\n idempotencyKey: runId,\n })\n await storage.actionRuns.start({ id: runId, projectId: \"materializer-storage-contract\" })\n const actionMaterializer = await primitiveMaterializer(materializer, storage, {\n kind: \"action\",\n id: \"observePeers\",\n runId,\n })\n return actionMaterializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"action\", actionId: \"observePeers\", runId },\n operations: [\n {\n id: `record-${runId}`,\n kind: \"object.patch\",\n ref: source,\n set: { name },\n unset: [],\n reset: [],\n },\n ],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [{ source, linkId: \"peers\", fingerprint }],\n })\n }\n\n // Regression guard for G-021: make begin() hydrate the expected scope through the\n // cardinality-one slot reader again and this otherwise unrelated Action commit fails before\n // its already-stable fingerprint can be compared.\n await expect(commitObservation(\"many-scope-action\", \"observed peers\")).resolves.toMatchObject(\n { kind: \"edit\", created: true }\n )\n\n await runtimeMaterializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"runtime\", requestId: \"many-scope-change\" },\n operations: [{ id: \"add-peer\", kind: \"link.upsert\", ref: linkRef(\"peer-c\") }],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n\n await expect(commitObservation(\"stale-many-scope-action\", \"must not commit\")).rejects.toThrow(\n \"Expected link scope changed\"\n )\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n primaryId: source.primaryId,\n })\n ).toMatchObject({ properties: { name: \"observed peers\" } })\n } finally {\n await provider.cleanup?.(createdStorage)\n }\n })\n}\n\nfunction runtimeScope() {\n return createTestingScope({\n projectId: \"materializer-storage-contract\",\n executionId: \"materializer-storage-contract-runtime-execution\",\n requestId: \"materializer-storage-contract-runtime-request\",\n correlationId: \"materializer-storage-contract-runtime-correlation\",\n })\n}\n\nasync function projectionMaterializer(\n materializer: OntologyMaterializer,\n storage: ContractStorage,\n projectionId: string,\n runId: string\n) {\n return primitiveMaterializer(materializer, storage, {\n kind: \"projection\",\n id: projectionId,\n runId,\n })\n}\n\nasync function primitiveMaterializer(\n materializer: OntologyMaterializer,\n storage: ContractStorage,\n primitive: TrustedPrimitiveRef\n) {\n const run =\n primitive.kind === \"action\"\n ? await storage.actionRuns.getById({\n projectId: \"materializer-storage-contract\",\n id: primitive.runId,\n })\n : await storage.projectionRuns.getById({\n projectId: \"materializer-storage-contract\",\n id: primitive.runId,\n })\n const executionId = run?.executionId ?? `test_${primitive.kind}_execution:${primitive.runId}`\n const execution = await storage.executions.getById({\n projectId: \"materializer-storage-contract\",\n id: executionId,\n })\n if (!execution) throw new Error(`Test execution '${executionId}' is missing.`)\n return materializer.withScope(restoreTrustedPrimitiveExecutionScope({ execution, primitive }))\n}\n\nfunction requireContractStorage(storage: Storage): ContractStorage {\n if (!storage.actionRuns) {\n throw new Error(\"[Sixb] Materializer storage contract requires Action materialization runs.\")\n }\n if (!storage.projectionRuns) {\n throw new Error(\n \"[Sixb] Materializer storage contract requires projection materialization runs.\"\n )\n }\n return storage as ContractStorage\n}\n\nfunction sourceEntry(id: string, name: string, parentId?: string): ProjectionSourceEntry {\n const ref = { objectTypeId: Device.id, primaryId: id }\n return {\n root: { kind: \"object\", ref },\n assertions: [\n { kind: \"object\", ref, properties: { name } },\n ...(parentId\n ? [\n {\n kind: \"link\" as const,\n ref: {\n source: ref,\n linkId: \"parent\",\n target: { objectTypeId: Device.id, primaryId: parentId },\n },\n },\n ]\n : []),\n ],\n }\n}\n\nasync function* entries(values: readonly ProjectionSourceEntry[]) {\n for (const value of values) yield value\n}\n\nasync function claim(\n storage: ContractStorage,\n input: {\n readonly runId: string\n readonly projectionId: string\n readonly protocol: \"replacement\" | \"telemetry\"\n readonly datasetVersion: {\n readonly datasetId: string\n readonly versionId: string\n readonly createdAt: string\n }\n readonly fixedBatchSize?: number\n }\n) {\n const resolved =\n input.protocol === \"replacement\"\n ? projections.resolveSource(input.projectionId)\n : projections.resolveTelemetry(input.projectionId)\n const definition = resolved.definition\n const identityBase = {\n projectionId: input.projectionId,\n datasetVersion: input.datasetVersion,\n ontologyRevision: projections.ontologyRevision,\n projectionRevision: resolved.projectionRevision,\n ownershipHash: resolved.ownershipHash,\n }\n const common = {\n id: input.runId,\n projectId: \"materializer-storage-contract\",\n } as const\n\n if (definition._tag === \"TelemetryProjectionDefinition\") {\n const claim = await startTestProjectionRun(storage, {\n ...common,\n identity: { ...identityBase, projectionKind: \"telemetry\", protocol: \"telemetry\" },\n target: { objectTypeId: definition.objectTypeId },\n fixedBatchSize: input.fixedBatchSize ?? 1,\n })\n return claim.execution\n }\n\n if (definition._tag === \"LinkProjectionDefinition\") {\n const claim = await startTestProjectionRun(storage, {\n ...common,\n identity: { ...identityBase, projectionKind: \"link\", protocol: \"replacement\" },\n target: {\n sourceObjectTypeId: definition.sourceObjectTypeId,\n targetObjectTypeId: definition.targetObjectTypeId,\n },\n })\n return claim.execution\n }\n\n const claim = await startTestProjectionRun(storage, {\n ...common,\n identity: { ...identityBase, projectionKind: \"object\", protocol: \"replacement\" },\n target: { objectTypeId: definition.objectTypeId },\n })\n return claim.execution\n}\n",
|
|
23
27
|
"import type { TrustedPrimitiveRef } from \"../execution\"\nimport type {\n ProjectionRunClaim,\n ProjectionRunRecord,\n QueueProjectionRunInput,\n StartOrReclaimProjectionRunInput,\n Storage,\n} from \"../storage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\ntype ProjectionRunQueueFixtureInput = QueueProjectionRunInput extends infer TInput\n ? TInput extends QueueProjectionRunInput\n ? Omit<TInput, \"executionId\">\n : never\n : never\n\n/** Create the durable execution required by a Projection-run storage fixture. */\nexport async function createTestProjectionExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly projectionId: string\n readonly runId: string\n readonly datasetId: string\n readonly datasetVersionId: string\n readonly executionId?: string\n }\n): Promise<string> {\n const executionId = input.executionId ?? `test_projection_execution:${input.runId}`\n const existing = await executions.getById({ projectId: input.projectId, id: executionId })\n if (existing) return executionId\n\n const primitive: TrustedPrimitiveRef = {\n kind: \"projection\",\n id: input.projectionId,\n runId: input.runId,\n }\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: {\n type: \"datasetVersion\",\n datasetId: input.datasetId,\n versionId: input.datasetVersionId,\n },\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n return executionId\n}\n\n/** Queue a Projection run with the valid durable execution fixture required by every provider. */\nexport async function queueTestProjectionRun(\n storage: Pick<Storage, \"projectionRuns\" | \"executions\">,\n input: ProjectionRunQueueFixtureInput\n): Promise<ProjectionRunRecord> {\n if (!storage.projectionRuns)\n throw new Error(\"Projection run storage is not configured for this test.\")\n const executionId = await createTestProjectionExecution(storage.executions, {\n projectId: input.projectId,\n projectionId: input.identity.projectionId,\n runId: input.id,\n datasetId: input.identity.datasetVersion.datasetId,\n datasetVersionId: input.identity.datasetVersion.versionId,\n })\n return storage.projectionRuns.queue({ ...input, executionId })\n}\n\n/** Start a Projection run after creating its durable execution and queued state. */\nexport async function startTestProjectionRun(\n storage: Pick<Storage, \"projectionRuns\" | \"executions\">,\n input: StartOrReclaimProjectionRunInput\n): Promise<ProjectionRunClaim> {\n const projectionRuns = storage.projectionRuns\n if (!projectionRuns) throw new Error(\"Projection run storage is not configured for this test.\")\n const { startedAt, ...queuedRun } = input\n await queueTestProjectionRun(storage, { ...queuedRun, queuedAt: startedAt })\n return projectionRuns.startOrReclaim(input)\n}\n\n/** Claim a queued fixture, or rotate its attempt when the same durable run is reclaimed. */\nexport async function claimTestProjectionRun(\n storage: Pick<Storage, \"projectionRuns\" | \"executions\">,\n input: StartOrReclaimProjectionRunInput\n): Promise<ProjectionRunClaim> {\n if (!storage.projectionRuns)\n throw new Error(\"Projection run storage is not configured for this test.\")\n const existing = await storage.projectionRuns.getById({\n projectId: input.projectId,\n id: input.id,\n })\n if (!existing) {\n const { startedAt, ...queuedRun } = input\n await queueTestProjectionRun(storage, { ...queuedRun, queuedAt: startedAt })\n }\n return storage.projectionRuns.startOrReclaim(input)\n}\n",
|
|
24
28
|
"import { describe, expect, test } from \"bun:test\"\nimport type { JsonValue } from \"../json\"\nimport {\n collectObjectQueryValidationIssues,\n countObjects,\n executeObjectQuery,\n executeObjectQueryLinks,\n existsObjects,\n facetObjects,\n normalizeObjectQuery,\n type ObjectQuery,\n ObjectQueryPlanningError,\n validateObjectQuery,\n} from \"../objects/query\"\nimport { defineObjectType, link, OntologyRegistry, prop, stringEnum } from \"../ontology\"\nimport type { ObjectStorage, QueryObjectsResult } from \"../storage/objects\"\nimport type { Storage } from \"../storage/types\"\nimport {\n createMaterializerTestFixture,\n type MaterializerFixtureLink,\n type MaterializerFixtureObject,\n type MaterializerTestFixture,\n} from \"./materializer-fixture\"\n\nexport interface ObjectQueryProviderContractSuiteOptions<TStorage extends Storage> {\n /** Factory that produces a fresh complete storage instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"object-query-contract\"\n\nconst Device = defineObjectType({\n id: \"ContractDevice\",\n name: \"Contract Device\",\n properties: [\n prop(\"id\", \"string\", {\n required: true,\n primary: true,\n query: { searchable: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"name\", \"string\", {\n query: { searchable: true, text: true, filterable: true, exact: true, sortable: true },\n }),\n ],\n search: { defaultText: [\"name\"] },\n})\n\nconst Room = defineObjectType({\n id: \"ContractRoom\",\n name: \"Contract Room\",\n properties: [\n prop(\"id\", \"string\", {\n required: true,\n primary: true,\n query: { searchable: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"name\", \"string\", {\n query: { searchable: true, text: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"description\", \"string\", {\n query: { searchable: true, text: true },\n }),\n prop(\"floor\", \"string\", {\n nullable: true,\n query: { searchable: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"capacity\", \"double\", {\n query: { searchable: true, filterable: true, sortable: true },\n }),\n prop(\"occupied\", \"boolean\", {\n query: { searchable: true, filterable: true, exact: true, facet: true },\n }),\n prop(\"status\", stringEnum([\"active\", \"paused\"]), {\n query: { searchable: true, filterable: true, exact: true, facet: true },\n }),\n prop(\n \"tags\",\n { type: \"array\", items: \"string\" },\n { query: { searchable: true, filterable: true } }\n ),\n prop(\n \"metadata\",\n { type: \"map\", keySchema: \"string\", valueSchema: \"string\" },\n { query: { searchable: true, filterable: true } }\n ),\n prop(\n \"embedding\",\n { type: \"array\", items: \"double\" },\n { query: { searchable: true, vector: true } }\n ),\n ],\n links: [link(\"hasDevice\", Device)],\n search: {\n defaultText: [\"name\", \"description\"],\n vector: { property: \"embedding\", source: [\"name\", \"description\"] },\n },\n})\n\nconst Zone = defineObjectType({\n id: \"ContractZone\",\n name: \"Contract Zone\",\n properties: [prop(\"id\", \"string\", { required: true, primary: true })],\n links: [link(\"hasDevice\", Device)],\n})\n\nconst Asset = defineObjectType({\n id: \"ContractAsset\",\n name: \"Contract Asset\",\n properties: [prop(\"id\", \"string\", { required: true, primary: true })],\n})\n\nconst LaptopAsset = defineObjectType({\n id: \"ContractLaptopAsset\",\n name: \"Contract Laptop Asset\",\n extends: Asset,\n properties: [],\n})\n\nconst DefaultTextBase = defineObjectType({\n id: \"ContractDefaultTextBase\",\n name: \"Contract Default Text Base\",\n properties: [\n prop(\"id\", \"string\", { required: true, primary: true }),\n prop(\"name\", \"string\", { query: { searchable: true, text: true } }),\n prop(\"alias\", \"string\"),\n ],\n search: { defaultText: [\"name\"] },\n})\n\nconst DefaultTextChild = defineObjectType({\n id: \"ContractDefaultTextChild\",\n name: \"Contract Default Text Child\",\n extends: DefaultTextBase,\n properties: [prop(\"alias\", \"string\", { query: { searchable: true, text: true } })],\n search: { defaultText: [\"alias\"] },\n})\n\nexport const objectQueryContractOntology = new OntologyRegistry({\n sources: [Room, Device, Zone, Asset, LaptopAsset, DefaultTextBase, DefaultTextChild],\n})\n\n/**\n * Runs the shared object-query provider contract against any ObjectStorage.\n *\n * The contract defines the portable V1 query surface: capability declarations,\n * validation/normalization handoff, provider pushdown, bounded fallback,\n * canonical reference sets, traversal, set operations, pagination, search profile defaults, and stable\n * structured rejections for features outside a provider's capability map.\n */\nexport function runObjectQueryProviderContractSuite<TStorage extends Storage>(\n label: string,\n options: ObjectQueryProviderContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (\n body: (context: {\n readonly objects: TStorage[\"objects\"]\n readonly fixture: MaterializerTestFixture\n }) => Promise<void>\n ): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body({\n objects: storage.objects,\n fixture: createMaterializerTestFixture({\n projectId,\n ontology: objectQueryContractOntology,\n storage,\n }),\n })\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"normalizes query shape and resolves search profile defaults\", () => {\n const normalized = normalizeObjectQuery({\n kind: \"limit\",\n limit: 10,\n input: {\n kind: \"limit\",\n limit: 3,\n input: {\n kind: \"project\",\n properties: [\"id\", \"name\", \"id\"],\n input: {\n kind: \"text\",\n query: \"alpha\",\n fields: [\"name\", \"description\", \"name\"],\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n })\n\n expect(normalized.kind).toBe(\"limit\")\n if (normalized.kind !== \"limit\") return\n expect(normalized.limit).toBe(3)\n expect(normalized.input.kind).toBe(\"project\")\n if (normalized.input.kind !== \"project\") return\n expect(normalized.input.properties).toEqual([\"id\", \"name\"])\n expect(normalized.input.input.kind).toBe(\"text\")\n if (normalized.input.input.kind !== \"text\") return\n expect(normalized.input.input.fields).toEqual([\"name\", \"description\"])\n\n const validated = validateObjectQuery(\n { kind: \"text\", query: \"alpha\", input: { kind: \"start\", objectTypeId: Room.id } },\n { ontology: objectQueryContractOntology }\n )\n expect(validated.query.kind).toBe(\"text\")\n if (validated.query.kind === \"text\") {\n expect(validated.query.fields).toBeUndefined()\n expect(validated.query.fieldsByObjectType).toEqual({\n [Room.id]: [\"name\", \"description\"],\n })\n }\n })\n\n test(\"collects validation failures before provider planning\", () => {\n const issues = collectObjectQueryValidationIssues(\n {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"missing\", value: \"x\" },\n input: {\n kind: \"text\",\n query: \"alpha\",\n fields: [\"capacity\"],\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology }\n )\n\n expect(issues.map((issue) => issue.code)).toEqual(\n expect.arrayContaining([\n \"unknown_property\",\n \"query_field_not_enabled\",\n \"text_field_not_string_like\",\n ])\n )\n })\n\n test(\"declares the portable V1 query capability surface\", async () => {\n await withStorage(async ({ objects: storage }) => {\n const capabilities = storage.queryCapabilities()\n\n expect(capabilities.queryObjects).toBe(true)\n expect(capabilities.countObjects).toBe(true)\n expect(capabilities.existsObjects).toBe(true)\n expect(capabilities.facetObjects).toBe(true)\n for (const node of [\n \"start\",\n \"filter\",\n \"text\",\n \"sort\",\n \"limit\",\n \"page\",\n \"traverse\",\n \"set\",\n \"project\",\n ] as const) {\n expect(capabilities.nodes?.[node]).toBe(true)\n }\n for (const op of [\n \"and\",\n \"or\",\n \"not\",\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"in\",\n \"exists\",\n \"contains\",\n ] as const) {\n expect(capabilities.predicateOps?.[op]).toBe(true)\n }\n expect(capabilities.sortKinds?.property).toBe(true)\n expect(capabilities.traversalDirections?.outgoing).toBe(true)\n expect(capabilities.traversalDirections?.incoming).toBe(true)\n expect(capabilities.setOps?.union).toBe(true)\n expect(capabilities.setOps?.intersect).toBe(true)\n expect(capabilities.setOps?.subtract).toBe(true)\n })\n })\n\n test(\"pushes down scalar predicates, boolean groups, sorting, limits, and projections\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\", \"name\", \"capacity\"],\n input: {\n kind: \"limit\",\n limit: 2,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"capacity\", direction: \"desc\" }],\n input: {\n kind: \"filter\",\n predicate: {\n op: \"and\",\n items: [\n { op: \"eq\", propertyId: \"status\", value: \"active\" },\n { op: \"neq\", propertyId: \"name\", value: \"Gamma Huddle\" },\n { op: \"gte\", propertyId: \"capacity\", value: 10 },\n { op: \"lte\", propertyId: \"capacity\", value: 30 },\n { op: \"in\", propertyId: \"floor\", values: [\"2\"] },\n { op: \"contains\", propertyId: \"tags\", value: \"lab\" },\n {\n op: \"or\",\n items: [\n { op: \"contains\", propertyId: \"name\", value: \"Alpha\" },\n { op: \"contains\", propertyId: \"metadata\", value: \"wing\" },\n ],\n },\n { op: \"not\", item: { op: \"eq\", propertyId: \"id\", value: \"missing\" } },\n ],\n },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-beta\", \"room-alpha\"])\n expect(result.objects[0]?.properties).toEqual({\n id: \"room-beta\",\n name: \"Beta Lab\",\n capacity: 30,\n })\n expect(result.total).toBe(2)\n expect(result.hasMore).toBe(false)\n })\n })\n\n test(\"queries opaque ids through canonical exact refs\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n const issue297 = \"github:issue:sixb-ai/sixb#297\"\n const issue298 = \"github:issue:sixb-ai/sixb#298\"\n await fixture.seed({\n objects: [\n objectSeed(Asset.id, issue297, { id: issue297 }),\n objectSeed(Asset.id, issue298, { id: issue298 }),\n ],\n })\n\n const refs = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"refs\",\n refs: [\n { objectTypeId: Asset.id, primaryId: issue298 },\n { objectTypeId: Asset.id, primaryId: issue297 },\n ],\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n // The JSON query body preserves URL-reserved characters without encoding.\n expect(refs.plan.mode).toBe(\n storage.queryCapabilities().nodes?.refs === true ? \"pushdown\" : \"fallback\"\n )\n expect(ids(refs)).toEqual([issue297, issue298])\n })\n })\n\n test(\"executes canonical heterogeneous refs with pagination and projection\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const refs: Extract<ObjectQuery, { kind: \"refs\" }>[\"refs\"] = [\n { objectTypeId: Device.id, primaryId: \"device-sensor\" },\n { objectTypeId: Room.id, primaryId: \"room-gamma\" },\n { objectTypeId: Room.id, primaryId: \"missing\" },\n { objectTypeId: Room.id, primaryId: \"room-alpha\" },\n ]\n const first = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\"],\n input: { kind: \"page\", pageSize: 2, input: { kind: \"refs\", refs } },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const second = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\"],\n input: {\n kind: \"page\",\n pageSize: 2,\n pageToken: first.nextPageToken,\n input: { kind: \"refs\", refs },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const count = await countObjects(\n { projectId, query: { kind: \"refs\", refs } },\n { ontology: objectQueryContractOntology, storage }\n )\n\n const expectedMode =\n storage.queryCapabilities().nodes?.refs === true ? \"pushdown\" : \"fallback\"\n expect(first.plan.mode).toBe(expectedMode)\n expect(ids(first)).toEqual([\"device-sensor\", \"room-alpha\"])\n expect(first.objects.map((row) => row.properties)).toEqual([\n { id: \"device-sensor\" },\n { id: \"room-alpha\" },\n ])\n expect(first.total).toBe(3)\n expect(first.hasMore).toBe(true)\n expect(first.nextPageToken).toBeTruthy()\n expect(second.plan.mode).toBe(expectedMode)\n expect(ids(second)).toEqual([\"room-gamma\"])\n expect(second.hasMore).toBe(false)\n expect(count.plan.mode).toBe(expectedMode)\n expect(count.count).toBe(3)\n })\n })\n\n test(\"composes refs with traversal in provider pushdown\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n if (storage.queryCapabilities().nodes?.refs !== true) return\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"outgoing\",\n linkId: \"hasDevice\",\n input: {\n kind: \"refs\",\n refs: [{ objectTypeId: Room.id, primaryId: \"room-alpha\" }],\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"device-projector\"])\n })\n })\n\n test(\"queries and paginates incident links over a provider-backed object set\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const query: ObjectQuery = {\n kind: \"refs\",\n refs: [{ objectTypeId: Device.id, primaryId: \"device-projector\" }],\n }\n\n const first = await executeObjectQueryLinks(\n {\n projectId,\n query,\n direction: \"incoming\",\n includeObjects: true,\n pageSize: 1,\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const second = await executeObjectQueryLinks(\n {\n projectId,\n query,\n direction: \"incoming\",\n includeObjects: true,\n pageSize: 1,\n pageToken: first.nextPageToken,\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(first.links).toEqual([\n expect.objectContaining({\n sourceTypeId: Room.id,\n sourceId: \"room-alpha\",\n linkId: \"hasDevice\",\n targetTypeId: Device.id,\n targetId: \"device-projector\",\n }),\n ])\n expect(first.objects.map((row) => row.primaryId)).toEqual([\n \"device-projector\",\n \"room-alpha\",\n ])\n expect(first.hasMore).toBe(true)\n expect(first.nextPageToken).toBeTruthy()\n expect(second.links).toEqual([\n expect.objectContaining({\n sourceTypeId: Zone.id,\n sourceId: \"zone-one\",\n linkId: \"hasDevice\",\n targetTypeId: Device.id,\n targetId: \"device-projector\",\n }),\n ])\n expect(second.objects.map((row) => row.primaryId)).toEqual([\"device-projector\", \"zone-one\"])\n expect(second.hasMore).toBe(false)\n })\n })\n\n test(\"does not admit a provider page probe into the link selector\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQueryLinks(\n {\n projectId,\n query: {\n kind: \"page\",\n pageSize: 1,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n direction: \"outgoing\",\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.links).toEqual([\n expect.objectContaining({ sourceId: \"room-alpha\", targetId: \"device-projector\" }),\n ])\n })\n })\n\n test(\"matches null, missing, neq, in, and not predicate semantics\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const nullable = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: {\n op: \"or\",\n items: [\n { op: \"eq\", propertyId: \"floor\", value: null },\n { op: \"exists\", propertyId: \"floor\", value: false },\n ],\n },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const notTwoOrNull = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: {\n op: \"and\",\n items: [\n { op: \"neq\", propertyId: \"floor\", value: \"2\" },\n { op: \"in\", propertyId: \"floor\", values: [\"1\", null] },\n ],\n },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const notNullFloor = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"neq\", propertyId: \"floor\", value: null },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const notFloorTwo = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"not\", item: { op: \"eq\", propertyId: \"floor\", value: \"2\" } },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(ids(nullable)).toEqual([\"room-missing-floor\", \"room-null-floor\"])\n expect(ids(notTwoOrNull)).toEqual([\"room-gamma\", \"room-null-floor\"])\n expect(ids(notNullFloor)).toEqual([\n \"room-alpha\",\n \"room-beta\",\n \"room-gamma\",\n \"room-missing-floor\",\n ])\n expect(ids(notFloorTwo)).toEqual([\"room-gamma\", \"room-missing-floor\", \"room-null-floor\"])\n })\n })\n\n test(\"keeps page tokens stable when projection hides sorted cursor fields\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const input: ObjectQuery = {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"capacity\", direction: \"desc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"exists\", propertyId: \"capacity\", value: true },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n }\n const page1 = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\"],\n input: { kind: \"page\", pageSize: 2, input },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const page2 = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\"],\n input: { kind: \"page\", pageSize: 2, pageToken: page1.nextPageToken, input },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(page1.plan.mode).toBe(\"pushdown\")\n expect(ids(page1)).toEqual([\"room-beta\", \"room-gamma\"])\n expect(page1.objects.map((row) => row.properties)).toEqual([\n { id: \"room-beta\" },\n { id: \"room-gamma\" },\n ])\n expect(page1.hasMore).toBe(true)\n expect(page1.nextPageToken).toBeTruthy()\n expect(ids(page2)).toEqual([\"room-alpha\"])\n })\n })\n\n test(\"omits totals when requested without losing hasMore\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const limited = await executeObjectQuery(\n {\n projectId,\n includeTotal: false,\n query: { kind: \"limit\", limit: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const page = await executeObjectQuery(\n {\n projectId,\n includeTotal: false,\n query: { kind: \"page\", pageSize: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const sortedLimited = await executeObjectQuery(\n {\n projectId,\n includeTotal: false,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"capacity\", direction: \"desc\" }],\n input: { kind: \"limit\", limit: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(limited.plan.mode).toBe(\"pushdown\")\n expect(ids(limited)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(limited.total).toBeUndefined()\n expect(limited.hasMore).toBe(true)\n expect(ids(page)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(page.total).toBeUndefined()\n expect(page.hasMore).toBe(true)\n expect(page.nextPageToken).toBeTruthy()\n expect(ids(sortedLimited)).toEqual([\"room-beta\", \"room-alpha\"])\n expect(sortedLimited.total).toBeUndefined()\n expect(sortedLimited.hasMore).toBe(true)\n })\n })\n\n test(\"counts matching objects without returning rows\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const active = await countObjects(\n {\n projectId,\n query: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const limited = await countObjects(\n {\n projectId,\n query: { kind: \"limit\", limit: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(active.plan.mode).toBe(\"pushdown\")\n expect(active.count).toBe(2)\n expect(limited.count).toBe(5)\n })\n })\n\n test(\"checks existence without returning rows\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const active = await existsObjects(\n {\n projectId,\n query: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const missing = await existsObjects(\n {\n projectId,\n query: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"name\", value: \"No Such Room\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const limited = await existsObjects(\n {\n projectId,\n query: { kind: \"limit\", limit: 0, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(active.plan.mode).toBe(\"pushdown\")\n expect(active.exists).toBe(true)\n expect(missing.exists).toBe(false)\n expect(limited.exists).toBe(true)\n })\n })\n\n test(\"plans aggregate operations without outer row-shaping requirements\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const query: ObjectQuery = {\n kind: \"sort\",\n fields: [{ kind: \"relevance\" }],\n input: {\n kind: \"text\",\n query: \"alpha\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n }\n\n const count = await countObjects(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n const exists = await existsObjects(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(count.plan.mode).toBe(\"pushdown\")\n if (count.plan.mode !== \"pushdown\") return\n expect(count.plan.query.kind).toBe(\"text\")\n expect(count.count).toBe(1)\n expect(exists.plan.mode).toBe(\"pushdown\")\n if (exists.plan.mode !== \"pushdown\") return\n expect(exists.plan.query.kind).toBe(\"text\")\n expect(exists.exists).toBe(true)\n })\n })\n\n test(\"counts matching objects by facetable properties without returning rows\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const status = await facetObjects(\n {\n projectId,\n query: { kind: \"start\", objectTypeId: Room.id },\n facets: [\n { propertyId: \"status\", limit: 10 },\n { propertyId: \"occupied\", limit: 10 },\n ],\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const limited = await facetObjects(\n {\n projectId,\n query: { kind: \"limit\", limit: 0, input: { kind: \"start\", objectTypeId: Room.id } },\n facets: [\n { propertyId: \"status\", limit: 10 },\n { propertyId: \"occupied\", limit: 10 },\n ],\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(status.plan.mode).toBe(\"pushdown\")\n expect(status.facets).toEqual([\n {\n propertyId: \"status\",\n buckets: [\n { value: \"paused\", count: 3 },\n { value: \"active\", count: 2 },\n ],\n },\n {\n propertyId: \"occupied\",\n buckets: [\n { value: false, count: 3 },\n { value: true, count: 2 },\n ],\n },\n ])\n expect(limited.facets).toEqual(status.facets)\n })\n })\n\n test(\"pushes down traversal and set operations\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const outgoing = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"outgoing\",\n linkId: \"hasDevice\",\n input: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const incoming = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"incoming\",\n linkId: \"hasDevice\",\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const incomingRooms = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"incoming\",\n linkId: \"hasDevice\",\n sourceObjectTypeId: Room.id,\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const incomingZones = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"incoming\",\n linkId: \"hasDevice\",\n sourceObjectTypeId: Zone.id,\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const intersect = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"set\",\n op: \"intersect\",\n inputs: [\n {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n {\n kind: \"filter\",\n predicate: { op: \"contains\", propertyId: \"tags\", value: \"lab\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n ],\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const subtract = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"set\",\n op: \"subtract\",\n inputs: [\n {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n {\n kind: \"filter\",\n predicate: { op: \"contains\", propertyId: \"name\", value: \"Alpha\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n ],\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(outgoing.plan.mode).toBe(\"pushdown\")\n expect(incoming.plan.mode).toBe(\"pushdown\")\n expect(sortedIds(outgoing)).toEqual([\"device-projector\", \"device-sensor\"])\n expect(sortedIds(incoming)).toEqual([\"room-alpha\", \"room-beta\", \"zone-one\"])\n expect(incomingRooms.plan.mode).toBe(\"pushdown\")\n expect(sortedIds(incomingRooms)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(sortedIds(incomingZones)).toEqual([\"zone-one\"])\n expect(sortedIds(intersect)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(ids(subtract)).toEqual([\"room-beta\"])\n })\n })\n\n test(\"hydrates expand links identically via pushdown or bounded fallback\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const outgoing = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"expand\",\n expansions: [{ linkId: \"hasDevice\", direction: \"outgoing\" }],\n input: {\n kind: \"limit\",\n limit: 10,\n input: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n // A provider that declares expand pushdown hydrates links in-database;\n // otherwise the same links come back through the bounded fallback. Either\n // path must produce identical results.\n const expandMode = storage.queryCapabilities().nodes?.expand ? \"pushdown\" : \"fallback\"\n expect(outgoing.plan.mode).toBe(expandMode)\n expect(expandedIds(outgoing, \"room-alpha\", \"hasDevice\")).toEqual([\"device-projector\"])\n expect(expandedIds(outgoing, \"room-beta\", \"hasDevice\")).toEqual([\"device-sensor\"])\n\n const incoming = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"expand\",\n expansions: [{ linkId: \"hasDevice\", direction: \"incoming\" }],\n input: {\n kind: \"limit\",\n limit: 10,\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n // device-projector is linked from both a Room and a Zone.\n expect(incoming.plan.mode).toBe(expandMode)\n expect(expandedIds(incoming, \"device-projector\", \"hasDevice\")).toEqual([\n \"room-alpha\",\n \"zone-one\",\n ])\n expect(expandedIds(incoming, \"device-sensor\", \"hasDevice\")).toEqual([\"room-beta\"])\n })\n })\n\n test(\"expands includeSubtypes outside storage when the expanded query can push down\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"limit\",\n limit: 10,\n input: { kind: \"start\", objectTypeId: Asset.id, includeSubtypes: true },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(sortedIds(result)).toEqual([\"asset-base\", \"laptop-1\"])\n })\n })\n\n test(\"pushes down basic text search using search profile defaults\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"name\", direction: \"asc\" }],\n input: {\n kind: \"text\",\n query: \"alpha collaboration\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-alpha\"])\n })\n })\n\n test(\"scopes search profile defaults by object type for subtype text queries\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await fixture.seed({\n objects: [\n {\n ref: { objectTypeId: DefaultTextBase.id, primaryId: \"default-base\" },\n properties: { id: \"default-base\", name: \"ordinary\", alias: \"secret\" },\n },\n {\n ref: { objectTypeId: DefaultTextChild.id, primaryId: \"default-child\" },\n properties: { id: \"default-child\", name: \"ordinary\", alias: \"secret\" },\n },\n ],\n })\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"text\",\n query: \"secret\",\n input: {\n kind: \"start\",\n objectTypeId: DefaultTextBase.id,\n includeSubtypes: true,\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(ids(result)).toEqual([\"default-child\"])\n })\n })\n\n test(\"executes or rejects relevance sorting according to provider capabilities\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const query: ObjectQuery = {\n kind: \"sort\",\n fields: [{ kind: \"relevance\" }],\n input: {\n kind: \"text\",\n query: \"alpha\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n }\n\n if (storage.queryCapabilities().sortKinds?.relevance === true) {\n const result = await executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-alpha\"])\n return\n }\n\n await expectPlanningIssue(\n executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n ),\n \"sort_kind_not_supported\"\n )\n })\n })\n\n test(\"executes or rejects vector search according to provider capabilities\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const query: ObjectQuery = {\n kind: \"vector\",\n propertyId: \"embedding\",\n vector: [1, 0],\n k: 2,\n input: { kind: \"start\", objectTypeId: Room.id },\n }\n\n if (storage.queryCapabilities().nodes?.vector === true) {\n const result = await executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-alpha\", \"room-beta\"])\n return\n }\n\n await expectPlanningIssue(\n executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n ),\n \"query_node_not_supported\"\n )\n })\n })\n\n test(\"executes bounded fallback when pushdown is disabled for a safe query\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const fallbackStorage = withoutQueryPushdown(storage)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"limit\",\n limit: 2,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"name\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage: fallbackStorage, maxFallbackRows: 20 }\n )\n\n expect(result.plan.mode).toBe(\"fallback\")\n expect(ids(result)).toEqual([\"room-alpha\", \"room-beta\"])\n })\n })\n\n test(\"rejects fallback for unsupported query nodes when pushdown is disabled\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const fallbackStorage = withoutQueryPushdown(storage)\n\n await expectPlanningIssue(\n executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"limit\",\n limit: 5,\n input: {\n kind: \"traverse\",\n direction: \"outgoing\",\n linkId: \"hasDevice\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage: fallbackStorage, maxFallbackRows: 20 }\n ),\n \"fallback_node_not_supported\"\n )\n })\n })\n })\n}\n\nexport async function seedObjectQueryContractData(fixture: MaterializerTestFixture): Promise<void> {\n await fixture.seed({\n objects: [\n objectSeed(Room.id, \"room-alpha\", {\n id: \"room-alpha\",\n name: \"Alpha Conference\",\n description: \"north alpha collaboration\",\n floor: \"2\",\n capacity: 10,\n occupied: true,\n status: \"active\",\n tags: [\"lab\", \"video\"],\n metadata: { wing: \"north\" },\n embedding: [1, 0],\n }),\n objectSeed(Room.id, \"room-beta\", {\n id: \"room-beta\",\n name: \"Beta Lab\",\n description: \"south beta focus\",\n floor: \"2\",\n capacity: 30,\n occupied: false,\n status: \"active\",\n tags: [\"lab\"],\n metadata: { wing: \"south\" },\n embedding: [0.8, 0.2],\n }),\n objectSeed(Room.id, \"room-gamma\", {\n id: \"room-gamma\",\n name: \"Gamma Huddle\",\n description: \"quiet office\",\n floor: \"1\",\n capacity: 20,\n occupied: true,\n status: \"paused\",\n tags: [\"office\"],\n metadata: { zone: \"quiet\" },\n embedding: [0, 1],\n }),\n objectSeed(Room.id, \"room-null-floor\", {\n id: \"room-null-floor\",\n name: \"Null Floor\",\n description: \"nullable floor fixture\",\n floor: null,\n occupied: false,\n status: \"paused\",\n tags: [],\n metadata: {},\n embedding: [0, 0],\n }),\n objectSeed(Room.id, \"room-missing-floor\", {\n id: \"room-missing-floor\",\n name: \"Missing Floor\",\n description: \"missing floor fixture\",\n occupied: false,\n status: \"paused\",\n tags: [],\n metadata: {},\n embedding: [0, 0],\n }),\n objectSeed(Device.id, \"device-projector\", {\n id: \"device-projector\",\n name: \"Projector\",\n }),\n objectSeed(Device.id, \"device-sensor\", { id: \"device-sensor\", name: \"Sensor\" }),\n objectSeed(Asset.id, \"asset-base\", { id: \"asset-base\" }),\n objectSeed(LaptopAsset.id, \"laptop-1\", { id: \"laptop-1\" }),\n objectSeed(Zone.id, \"zone-one\", { id: \"zone-one\" }),\n ],\n links: [\n linkSeed(Room.id, \"room-alpha\", \"hasDevice\", Device.id, \"device-projector\"),\n linkSeed(Room.id, \"room-beta\", \"hasDevice\", Device.id, \"device-sensor\"),\n linkSeed(Zone.id, \"zone-one\", \"hasDevice\", Device.id, \"device-projector\"),\n ],\n })\n}\n\nfunction objectSeed(\n objectTypeId: string,\n primaryId: string,\n properties: Record<string, JsonValue>\n): MaterializerFixtureObject {\n return {\n ref: { objectTypeId, primaryId },\n properties,\n }\n}\n\nfunction linkSeed(\n sourceTypeId: string,\n sourceId: string,\n linkId: string,\n targetTypeId: string,\n targetId: string\n): MaterializerFixtureLink {\n return {\n ref: {\n source: { objectTypeId: sourceTypeId, primaryId: sourceId },\n linkId,\n target: { objectTypeId: targetTypeId, primaryId: targetId },\n },\n }\n}\n\nfunction ids(result: QueryObjectsResult): string[] {\n return result.objects.map((row) => row.primaryId)\n}\n\n// Sorted primaryIds of the objects hydrated under `linkId` on the parent row.\nfunction expandedIds(result: QueryObjectsResult, parentId: string, linkId: string): string[] {\n const parent = result.objects.find((row) => row.primaryId === parentId)\n if (!parent) throw new Error(`parent row '${parentId}' not found`)\n const value = parent.links?.[linkId]\n if (!Array.isArray(value)) throw new Error(`expected an array of links under '${linkId}'`)\n return value.map((linked) => linked.primaryId).sort()\n}\n\nfunction sortedIds(result: QueryObjectsResult): string[] {\n return [...ids(result)].sort()\n}\n\nfunction withoutQueryPushdown(storage: ObjectStorage): ObjectStorage {\n return new Proxy(storage, {\n get(target, property, receiver) {\n if (property === \"queryCapabilities\") return () => ({ queryObjects: false })\n if (property === \"queryObjects\") return undefined\n\n const value = Reflect.get(target, property, receiver)\n return typeof value === \"function\" ? value.bind(target) : value\n },\n })\n}\n\nasync function expectPlanningIssue(promise: Promise<unknown>, code: string): Promise<void> {\n try {\n await promise\n } catch (error) {\n expect(error).toBeInstanceOf(ObjectQueryPlanningError)\n if (error instanceof ObjectQueryPlanningError) {\n expect(error.issues.map((issue) => issue.code)).toContain(code)\n }\n return\n }\n\n throw new Error(`Expected ObjectQueryPlanningError with code '${code}'`)\n}\n",
|
|
29
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { JsonValue } from \"../json\"\nimport { executeObjectQuery, type ObjectQuery } from \"../objects/query\"\nimport { defineObjectType, link, OntologyRegistry, prop } from \"../ontology\"\nimport {\n compileSelectedObjectReadScope,\n linkBatchKey,\n MAX_OBJECT_READ_FACETS,\n type ObjectReadExecutionLimits,\n type ObjectReadScopeFactory,\n type ObjectReadStorage,\n objectBatchKey,\n type SelectedObjectReadScope,\n} from \"../storage/objects\"\nimport type { Storage } from \"../storage/types\"\nimport {\n createMaterializerTestFixture,\n type MaterializerFixtureLink,\n type MaterializerFixtureObject,\n type MaterializerTestFixture,\n} from \"./materializer-fixture\"\n\nexport interface ObjectReadScopeContractHarness<TStorage extends Storage> {\n readonly storage: TStorage\n /** Kept separate from `storage.objects` until the effective Storage contract activates it. */\n readonly objectReadScopeFactory: ObjectReadScopeFactory\n}\n\nexport interface ObjectReadScopeContractSuiteOptions<TStorage extends Storage> {\n readonly createHarness: () =>\n | ObjectReadScopeContractHarness<TStorage>\n | Promise<ObjectReadScopeContractHarness<TStorage>>\n readonly teardown?: (harness: ObjectReadScopeContractHarness<TStorage>) => void | Promise<void>\n}\n\nconst projectId = \"object-read-scope-contract\"\nconst otherProjectId = \"object-read-scope-contract-other\"\nconst Product = defineObjectType({\n id: \"ScopeProduct\",\n name: \"Scope Product\",\n properties: [\n prop(\"id\", \"string\", { required: true, primary: true }),\n prop(\"name\", \"string\", { query: { searchable: true, text: true } }),\n prop(\"internal\", \"string\"),\n ],\n search: { defaultText: [\"name\"] },\n})\n\nconst LineItem = defineObjectType({\n id: \"ScopeLineItem\",\n name: \"Scope Line Item\",\n properties: [\n prop(\"id\", \"string\", { required: true, primary: true }),\n prop(\"name\", \"string\", { query: { searchable: true, text: true, sortable: true } }),\n prop(\"price\", \"double\", { query: { searchable: true, filterable: true, sortable: true } }),\n prop(\"reviewNote\", \"string\"),\n prop(\"internal\", \"string\"),\n ],\n links: [link(\"product\", Product, { cardinality: \"one\" })],\n search: { defaultText: [\"name\"] },\n})\n\nconst Proposal = defineObjectType({\n id: \"ScopeProposal\",\n name: \"Scope Proposal\",\n properties: [\n prop(\"id\", \"string\", { required: true, primary: true }),\n prop(\"title\", \"string\", {\n query: { searchable: true, text: true, filterable: true, sortable: true },\n }),\n prop(\"rank\", \"double\", { query: { searchable: true, filterable: true, sortable: true } }),\n prop(\"category\", \"string\", { query: { searchable: true, filterable: true, facet: true } }),\n prop(\n \"embedding\",\n { type: \"array\", items: \"double\" },\n { query: { searchable: true, vector: true } }\n ),\n prop(\"secret\", \"string\", { query: { searchable: true, filterable: true, facet: true } }),\n ],\n links: [\n link(\"items\", LineItem, {\n properties: [prop(\"position\", \"double\"), prop(\"label\", \"string\"), prop(\"internal\", \"string\")],\n }),\n link(\"reviewers\", LineItem),\n link.self(\"related\"),\n link(\"aPrivate\", Product),\n link(\"zVisible\", Product),\n ],\n search: { defaultText: [\"title\"] },\n})\n\nexport const objectReadScopeContractOntology = new OntologyRegistry({\n sources: [Proposal, LineItem, Product],\n})\n\nconst limits: ObjectReadExecutionLimits = {\n maxTraversalFacts: 100,\n maxOutputJsonBytes: 1_000_000,\n}\n\n/**\n * Portable selected-object-read contract shared by every storage provider.\n *\n * It verifies the security boundary, not a provider's implementation strategy: selection is live,\n * path-sensitive, applied before every terminal, redacted, project-bound, and independently\n * budgeted.\n */\nexport function runObjectReadScopeContractSuite<TStorage extends Storage>(\n label: string,\n options: ObjectReadScopeContractSuiteOptions<TStorage>\n): void {\n const withHarness = async (\n body: (context: {\n readonly harness: ObjectReadScopeContractHarness<TStorage>\n readonly fixture: MaterializerTestFixture\n }) => Promise<void>\n ): Promise<void> => {\n const harness = await options.createHarness()\n try {\n const fixture = createMaterializerTestFixture({\n projectId,\n ontology: objectReadScopeContractOntology,\n storage: harness.storage,\n })\n await seed(fixture)\n await body({ harness, fixture })\n } finally {\n await options.teardown?.(harness)\n }\n }\n\n describe(label, () => {\n test(\"selects exact live identities, unions properties, and redacts detached rows\", async () => {\n await withHarness(async ({ harness, fixture }) => {\n const reader = createReader(harness.objectReadScopeFactory)\n\n const proposal = await reader.getByPrimaryId({\n projectId,\n objectTypeId: Proposal.id,\n primaryId: \"proposal-1\",\n })\n expect(proposal?.primaryId).toBe(\"proposal-1\")\n expect(proposal?.properties).toEqual({\n id: \"proposal-1\",\n title: \"Visible proposal\",\n rank: 50,\n category: \"visible\",\n embedding: [0, 1],\n })\n expect(proposal?.links).toBeUndefined()\n expect(\n await reader.getByPrimaryId({\n projectId,\n objectTypeId: Proposal.id,\n primaryId: \"proposal-2\",\n })\n ).toBeNull()\n\n const item = await reader.getByPrimaryId({\n projectId,\n objectTypeId: LineItem.id,\n primaryId: \"item:opaque|1\",\n })\n expect(item?.properties).toEqual({\n id: \"item:opaque|1\",\n name: \"Visible item\",\n reviewNote: \"Property union\",\n })\n expect(\n await reader.selectsObjectProperties({\n projectId,\n items: [\n { objectTypeId: LineItem.id, primaryId: \"item:opaque|1\", propertyId: \"price\" },\n { objectTypeId: LineItem.id, primaryId: \"item:opaque|1\", propertyId: \"price\" },\n { objectTypeId: LineItem.id, primaryId: \"item:opaque|1\", propertyId: \"secret\" },\n { objectTypeId: LineItem.id, primaryId: \"item-hidden\", propertyId: \"id\" },\n ],\n })\n ).toEqual([true, true, false, false])\n\n const listed = await reader.list({\n projectId,\n objectTypeId: LineItem.id,\n limit: 1,\n orderBy: \"primaryId\",\n order: \"asc\",\n })\n expect(listed).toMatchObject({ total: 2, hasMore: true })\n expect(listed.objects).toHaveLength(1)\n expect(listed.objects[0]?.primaryId).toBe(\"item:opaque|1\")\n expect(listed.objects[0]?.properties).toEqual({\n id: \"item:opaque|1\",\n name: \"Visible item\",\n reviewNote: \"Property union\",\n })\n expect(listed.objects[0]?.links).toBeUndefined()\n\n if (!item) throw new Error(\"expected a selected item\")\n item.properties.name = \"mutated outside provider\"\n expect(\n (\n await reader.getByPrimaryId({\n projectId,\n objectTypeId: LineItem.id,\n primaryId: \"item:opaque|1\",\n })\n )?.properties\n ).toEqual({ id: \"item:opaque|1\", name: \"Visible item\", reviewNote: \"Property union\" })\n\n await fixture.seed({\n objects: [object(LineItem.id, \"item-live\", { id: \"item-live\", name: \"Added later\" })],\n links: [linkRow(Proposal.id, \"proposal-1\", \"items\", LineItem.id, \"item-live\")],\n })\n expect(\n (\n await reader.getByPrimaryId({\n projectId,\n objectTypeId: LineItem.id,\n primaryId: \"item-live\",\n })\n )?.properties\n ).toEqual({ id: \"item-live\", name: \"Added later\" })\n\n await fixture.commit([\n {\n id: \"delete-live-link\",\n kind: \"link.delete\",\n ref: linkRow(Proposal.id, \"proposal-1\", \"items\", LineItem.id, \"item-live\").ref,\n },\n ])\n expect(\n await reader.getByPrimaryId({\n projectId,\n objectTypeId: LineItem.id,\n primaryId: \"item-live\",\n })\n ).toBeNull()\n })\n })\n\n test(\"supports an empty selection and rejects every cross-project call\", async () => {\n await withHarness(async ({ harness }) => {\n const empty = createReader(harness.objectReadScopeFactory, {\n kind: \"selected\",\n roots: [],\n })\n expect((await empty.list({ projectId })).total).toBe(0)\n expect(\n await empty.queryObjects?.({\n projectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n })\n ).toMatchObject({ objects: [], total: 0 })\n\n const reader = createReader(harness.objectReadScopeFactory)\n const queryObjects = reader.queryObjects?.bind(reader)\n const countObjects = reader.countObjects?.bind(reader)\n const existsObjects = reader.existsObjects?.bind(reader)\n const facetObjects = reader.facetObjects?.bind(reader)\n if (!queryObjects || !countObjects || !existsObjects || !facetObjects) {\n throw new Error(\"Selected object-read scope contract requires every query terminal.\")\n }\n const crossProjectCalls: readonly (() => Promise<unknown>)[] = [\n () =>\n queryObjects({\n projectId: otherProjectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n }),\n () =>\n countObjects({\n projectId: otherProjectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n }),\n () =>\n existsObjects({\n projectId: otherProjectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n }),\n () =>\n facetObjects({\n projectId: otherProjectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n facets: [{ propertyId: \"category\", limit: 1 }],\n }),\n () =>\n reader.getByPrimaryId({\n projectId: otherProjectId,\n objectTypeId: Proposal.id,\n primaryId: \"proposal-1\",\n }),\n () =>\n reader.selectsObjectProperties({\n projectId: otherProjectId,\n items: [{ objectTypeId: Proposal.id, primaryId: \"proposal-1\", propertyId: \"id\" }],\n }),\n () =>\n reader.listLinks({\n projectId: otherProjectId,\n objectTypeId: Proposal.id,\n objectId: \"proposal-1\",\n }),\n () =>\n reader.getByPrimaryIdBatch({\n projectId: otherProjectId,\n items: [{ objectTypeId: Proposal.id, primaryId: \"proposal-1\" }],\n }),\n () =>\n reader.listLinksBatch({\n projectId: otherProjectId,\n items: [{ objectTypeId: Proposal.id, objectId: \"proposal-1\", linkId: \"items\" }],\n }),\n () =>\n reader.queryLinks({\n projectId: otherProjectId,\n objectRefs: [{ objectTypeId: Proposal.id, primaryId: \"proposal-1\" }],\n direction: \"outgoing\",\n limit: 1,\n }),\n () => reader.list({ projectId: otherProjectId }),\n ]\n\n for (const call of crossProjectCalls) {\n await expect(call()).rejects.toThrow(`belongs to project '${projectId}'`)\n }\n })\n })\n\n test(\"makes every selected target invisible as soon as its root is deleted\", async () => {\n await withHarness(async ({ harness, fixture }) => {\n const reader = createReader(harness.objectReadScopeFactory)\n await fixture.commit([\n {\n id: \"delete-selected-root\",\n kind: \"object.delete\",\n ref: { objectTypeId: Proposal.id, primaryId: \"proposal-1\" },\n },\n ])\n\n for (const ref of [\n { objectTypeId: Proposal.id, primaryId: \"proposal-1\" },\n { objectTypeId: LineItem.id, primaryId: \"item:opaque|1\" },\n { objectTypeId: LineItem.id, primaryId: \"reviewer-1\" },\n { objectTypeId: Product.id, primaryId: \"product-1\" },\n ]) {\n expect(await reader.getByPrimaryId({ projectId, ...ref })).toBeNull()\n }\n\n expect(await reader.list({ projectId })).toEqual({ objects: [], hasMore: false, total: 0 })\n expect(\n await reader.queryObjects?.({\n projectId,\n query: { kind: \"start\", objectTypeId: LineItem.id },\n })\n ).toMatchObject({ objects: [], total: 0 })\n expect(\n await reader.listLinks({\n projectId,\n objectTypeId: Proposal.id,\n objectId: \"proposal-1\",\n })\n ).toEqual([])\n expect(\n await reader.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Proposal.id, primaryId: \"proposal-1\" }],\n direction: \"outgoing\",\n limit: 10,\n })\n ).toEqual({ links: [], hasMore: false })\n })\n })\n\n test(\"uses collision-safe batch keys and exact incoming, outgoing, and self-loop semantics\", async () => {\n await withHarness(async ({ harness }) => {\n const reader = createReader(harness.objectReadScopeFactory)\n const objects = await reader.getByPrimaryIdBatch({\n projectId,\n items: [\n { objectTypeId: Proposal.id, primaryId: \"proposal-1\" },\n { objectTypeId: LineItem.id, primaryId: \"item:opaque|1\" },\n { objectTypeId: Proposal.id, primaryId: \"proposal-2\" },\n ],\n })\n expect([...objects.keys()]).toEqual([\n objectBatchKey(Proposal.id, \"proposal-1\"),\n objectBatchKey(LineItem.id, \"item:opaque|1\"),\n ])\n expect(objects.get(objectBatchKey(Proposal.id, \"proposal-1\"))?.properties).toEqual({\n id: \"proposal-1\",\n title: \"Visible proposal\",\n rank: 50,\n category: \"visible\",\n embedding: [0, 1],\n })\n expect(objects.get(objectBatchKey(Proposal.id, \"proposal-1\"))?.links).toBeUndefined()\n expect(objects.get(objectBatchKey(LineItem.id, \"item:opaque|1\"))?.properties).toEqual({\n id: \"item:opaque|1\",\n name: \"Visible item\",\n reviewNote: \"Property union\",\n })\n expect(objects.get(objectBatchKey(LineItem.id, \"item:opaque|1\"))?.links).toBeUndefined()\n\n const outgoing = await reader.listLinksBatch({\n projectId,\n direction: \"outgoing\",\n items: [{ objectTypeId: Proposal.id, objectId: \"proposal-1\", linkId: \"items\" }],\n })\n const outgoingRows = outgoing.get(linkBatchKey(Proposal.id, \"proposal-1\", \"items\"))\n expect(outgoingRows).toHaveLength(1)\n expect(outgoingRows?.[0]?.targetId).toBe(\"item:opaque|1\")\n expect(outgoingRows?.[0]?.properties).toEqual({ position: 1, label: \"primary\" })\n\n const listedLinks = await reader.listLinks({\n projectId,\n objectTypeId: Proposal.id,\n objectId: \"proposal-1\",\n linkId: \"items\",\n })\n expect(listedLinks).toHaveLength(1)\n expect(listedLinks[0]?.targetId).toBe(\"item:opaque|1\")\n expect(listedLinks[0]?.properties).toEqual({ position: 1, label: \"primary\" })\n\n const queriedLinks = await reader.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Proposal.id, primaryId: \"proposal-1\" }],\n direction: \"outgoing\",\n linkId: \"items\",\n limit: 10,\n })\n expect(queriedLinks.links).toHaveLength(1)\n expect(queriedLinks.links[0]?.targetId).toBe(\"item:opaque|1\")\n expect(queriedLinks.links[0]?.properties).toEqual({ position: 1, label: \"primary\" })\n\n const incoming = await reader.listLinksBatch({\n projectId,\n direction: \"incoming\",\n items: [{ objectTypeId: LineItem.id, objectId: \"item:opaque|1\", linkId: \"items\" }],\n })\n const incomingRows = incoming.get(linkBatchKey(LineItem.id, \"item:opaque|1\", \"items\"))\n expect(incomingRows).toHaveLength(1)\n expect(incomingRows?.[0]?.properties).toEqual({ position: 1, label: \"primary\" })\n expect(incoming.has(linkBatchKey(Proposal.id, \"proposal-1\", \"items\"))).toBe(false)\n\n const selfLoop = await reader.listLinksBatch({\n projectId,\n direction: \"both\",\n items: [{ objectTypeId: Proposal.id, objectId: \"proposal-1\", linkId: \"related\" }],\n })\n expect(selfLoop.get(linkBatchKey(Proposal.id, \"proposal-1\", \"related\"))).toHaveLength(1)\n })\n })\n\n test(\"applies scope before query ordering, pagination, predicates, and aggregate terminals\", async () => {\n await withHarness(async ({ harness }) => {\n const reader = createReader(harness.objectReadScopeFactory)\n const query = async (value: ObjectQuery) =>\n reader.queryObjects?.({ projectId, query: value })\n\n const queriedProposal = await query({ kind: \"start\", objectTypeId: Proposal.id })\n expect(queriedProposal?.objects.map((row) => row.primaryId)).toEqual([\"proposal-1\"])\n expect(queriedProposal?.objects[0]?.properties).toEqual({\n id: \"proposal-1\",\n title: \"Visible proposal\",\n rank: 50,\n category: \"visible\",\n embedding: [0, 1],\n })\n expect(queriedProposal?.objects[0]?.links).toBeUndefined()\n expect(\n (\n await query({\n kind: \"refs\",\n refs: [\n { objectTypeId: Proposal.id, primaryId: \"proposal-2\" },\n { objectTypeId: Proposal.id, primaryId: \"proposal-1\" },\n { objectTypeId: LineItem.id, primaryId: \"item:opaque|1\" },\n ],\n })\n )?.objects.map((row) => `${row.objectTypeId}:${row.primaryId}`)\n ).toEqual([`${LineItem.id}:item:opaque|1`, `${Proposal.id}:proposal-1`])\n expect(\n (\n await query({\n kind: \"filter\",\n input: { kind: \"start\", objectTypeId: Proposal.id },\n predicate: { op: \"eq\", propertyId: \"secret\", value: \"root-secret\" },\n })\n )?.objects\n ).toEqual([])\n expect(\n (\n await query({\n kind: \"limit\",\n limit: 1,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"rank\", direction: \"asc\" }],\n input: { kind: \"start\", objectTypeId: Proposal.id },\n },\n })\n )?.objects.map((row) => row.primaryId)\n ).toEqual([\"proposal-1\"])\n expect(\n (\n await query({\n kind: \"text\",\n input: { kind: \"start\", objectTypeId: Proposal.id },\n query: \"visible\",\n fields: [\"title\"],\n })\n )?.objects.map((row) => row.primaryId)\n ).toEqual([\"proposal-1\"])\n expect(\n (\n await query({\n kind: \"set\",\n op: \"union\",\n inputs: [\n { kind: \"start\", objectTypeId: Proposal.id },\n { kind: \"start\", objectTypeId: Product.id },\n ],\n })\n )?.objects.map((row) => row.primaryId)\n ).toEqual(expect.arrayContaining([\"proposal-1\", \"product-1\"]))\n\n const firstPage = await query({\n kind: \"page\",\n pageSize: 1,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: { kind: \"start\", objectTypeId: LineItem.id },\n },\n })\n expect(firstPage).toMatchObject({\n hasMore: true,\n objects: [{ primaryId: \"item:opaque|1\" }],\n })\n expect(firstPage?.nextPageToken).toBeString()\n const secondPage = await query({\n kind: \"page\",\n pageSize: 1,\n pageToken: firstPage?.nextPageToken,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: { kind: \"start\", objectTypeId: LineItem.id },\n },\n })\n expect(secondPage).toMatchObject({\n hasMore: false,\n objects: [{ primaryId: \"reviewer-1\" }],\n })\n expect(secondPage?.objects[0]?.properties).toEqual({\n id: \"reviewer-1\",\n reviewNote: \"selected\",\n })\n expect(secondPage?.objects[0]?.links).toBeUndefined()\n\n expect(\n await reader.countObjects?.({\n projectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n })\n ).toEqual({ count: 1 })\n expect(\n await reader.existsObjects?.({\n projectId,\n query: {\n kind: \"filter\",\n input: { kind: \"start\", objectTypeId: Proposal.id },\n predicate: { op: \"eq\", propertyId: \"secret\", value: \"root-secret\" },\n },\n })\n ).toEqual({ exists: false })\n expect(\n await reader.facetObjects?.({\n projectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n facets: [\n { propertyId: \"category\", limit: 10 },\n { propertyId: \"secret\", limit: 10 },\n ],\n })\n ).toEqual({\n facets: [\n { propertyId: \"category\", buckets: [{ value: \"visible\", count: 1 }] },\n { propertyId: \"secret\", buckets: [] },\n ],\n })\n })\n })\n\n test(\"preserves path provenance through traverse and nested expand\", async () => {\n await withHarness(async ({ harness }) => {\n const reader = createReader(harness.objectReadScopeFactory)\n const traversed = await reader.queryObjects?.({\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"outgoing\",\n linkId: \"product\",\n input: { kind: \"start\", objectTypeId: LineItem.id },\n },\n })\n expect(traversed?.objects.map((row) => row.primaryId)).toEqual([\"product-1\"])\n expect(traversed?.objects[0]?.properties).toEqual({\n id: \"product-1\",\n name: \"Visible product\",\n })\n expect(traversed?.objects[0]?.links).toBeUndefined()\n expect(\n await reader.getByPrimaryId({\n projectId,\n objectTypeId: Product.id,\n primaryId: \"product-review\",\n })\n ).toBeNull()\n\n const expanded = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"expand\",\n input: {\n kind: \"limit\",\n limit: 10,\n input: { kind: \"start\", objectTypeId: Proposal.id },\n },\n expansions: [\n {\n linkId: \"items\",\n direction: \"outgoing\",\n expand: [{ linkId: \"product\", direction: \"outgoing\" }],\n },\n ],\n },\n },\n { ontology: objectReadScopeContractOntology, storage: reader }\n )\n const items = expanded.objects[0]?.links?.items\n expect(Array.isArray(items)).toBe(true)\n if (!Array.isArray(items)) throw new Error(\"expected expanded items\")\n expect(items[0]?.linkProperties).toEqual({ position: 1, label: \"primary\" })\n const expandedProduct = items[0]?.links?.product\n expect(expandedProduct).toMatchObject({ primaryId: \"product-1\" })\n if (!expandedProduct || Array.isArray(expandedProduct)) {\n throw new Error(\"expected one expanded product\")\n }\n expect(expandedProduct.properties).toEqual({\n id: \"product-1\",\n name: \"Visible product\",\n })\n expect(expandedProduct.links).toBeUndefined()\n })\n })\n\n test(\"filters unauthorized links and endpoints before canonical link pagination\", async () => {\n await withHarness(async ({ harness }) => {\n const reader = createReader(harness.objectReadScopeFactory, visibleLinkScope())\n expect(\n await reader.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Proposal.id, primaryId: \"proposal-1\" }],\n direction: \"outgoing\",\n limit: 1,\n })\n ).toMatchObject({ links: [{ linkId: \"zVisible\" }], hasMore: false })\n expect(\n await reader.queryLinks({\n projectId,\n objectRefs: [{ objectTypeId: Proposal.id, primaryId: \"proposal-1\" }],\n direction: \"outgoing\",\n endpointObjectTypeIds: [Proposal.id],\n limit: 1,\n })\n ).toEqual({ links: [], hasMore: false })\n })\n })\n\n test(\"enforces facet, traversal, and complete batch-output budgets independently\", async () => {\n await withHarness(async ({ harness }) => {\n const traversalBound = createReader(harness.objectReadScopeFactory, proposalScope(), {\n ...limits,\n maxTraversalFacts: 1,\n })\n await expect(traversalBound.list({ projectId })).rejects.toMatchObject({\n code: \"object_read_limit_exceeded\",\n metric: \"traversalFacts\",\n limit: 1,\n })\n\n const tinyOutput = createReader(harness.objectReadScopeFactory, proposalScope(), {\n ...limits,\n maxOutputJsonBytes: 8,\n })\n await expect(\n tinyOutput.getByPrimaryIdBatch({\n projectId,\n items: [{ objectTypeId: LineItem.id, primaryId: \"item:opaque|1\" }],\n })\n ).rejects.toMatchObject({\n code: \"object_read_limit_exceeded\",\n metric: \"outputJsonBytes\",\n limit: 8,\n })\n\n const facetBound = createReader(harness.objectReadScopeFactory, proposalScope(), {\n ...limits,\n maxTraversalFacts: 1,\n })\n await expect(\n facetBound.facetObjects?.({\n projectId,\n query: { kind: \"start\", objectTypeId: Proposal.id },\n facets: Array.from({ length: MAX_OBJECT_READ_FACETS + 1 }, (_, index) => ({\n propertyId: `facet-${index}`,\n limit: 1,\n })),\n })\n ).rejects.toThrow(`between 0 and ${MAX_OBJECT_READ_FACETS} facets`)\n })\n })\n })\n}\n\nfunction createReader(\n factory: ObjectReadScopeFactory,\n scope: SelectedObjectReadScope = proposalScope(),\n executionLimits: ObjectReadExecutionLimits = limits\n): ObjectReadStorage {\n return factory.createSelectedReadScope({\n projectId,\n scope: compileSelectedObjectReadScope(scope),\n limits: executionLimits,\n })\n}\n\nfunction proposalScope(): SelectedObjectReadScope {\n return {\n kind: \"selected\",\n roots: [\n {\n anchor: { objectTypeId: Proposal.id, primaryId: \"proposal-1\" },\n node: {\n objects: [\n {\n objectTypeId: Proposal.id,\n propertyIds: [\"id\", \"title\", \"rank\", \"category\", \"embedding\"],\n },\n ],\n links: [\n {\n definitions: [\n {\n sourceObjectTypeId: Proposal.id,\n linkId: \"items\",\n targetObjectTypeIds: [LineItem.id],\n propertyIds: [\"position\"],\n },\n {\n sourceObjectTypeId: Proposal.id,\n linkId: \"items\",\n targetObjectTypeIds: [LineItem.id],\n propertyIds: [\"label\", \"position\"],\n },\n ],\n target: {\n objects: [{ objectTypeId: LineItem.id, propertyIds: [\"id\", \"name\", \"price\"] }],\n links: [\n {\n definitions: [\n {\n sourceObjectTypeId: LineItem.id,\n linkId: \"product\",\n targetObjectTypeIds: [Product.id],\n propertyIds: [],\n },\n ],\n target: {\n objects: [{ objectTypeId: Product.id, propertyIds: [\"id\", \"name\"] }],\n links: [],\n },\n },\n ],\n },\n },\n {\n definitions: [\n {\n sourceObjectTypeId: Proposal.id,\n linkId: \"reviewers\",\n targetObjectTypeIds: [LineItem.id],\n propertyIds: [],\n },\n ],\n target: {\n objects: [{ objectTypeId: LineItem.id, propertyIds: [\"id\", \"reviewNote\"] }],\n links: [],\n },\n },\n {\n definitions: [\n {\n sourceObjectTypeId: Proposal.id,\n linkId: \"related\",\n targetObjectTypeIds: [Proposal.id],\n propertyIds: [],\n },\n ],\n target: {\n objects: [{ objectTypeId: Proposal.id, propertyIds: [\"id\", \"title\"] }],\n links: [],\n },\n },\n ],\n },\n },\n ],\n }\n}\n\nfunction visibleLinkScope(): SelectedObjectReadScope {\n return {\n kind: \"selected\",\n roots: [\n {\n anchor: { objectTypeId: Proposal.id, primaryId: \"proposal-1\" },\n node: {\n objects: [{ objectTypeId: Proposal.id, propertyIds: [\"id\"] }],\n links: [\n {\n definitions: [\n {\n sourceObjectTypeId: Proposal.id,\n linkId: \"zVisible\",\n targetObjectTypeIds: [Product.id],\n propertyIds: [],\n },\n ],\n target: {\n objects: [{ objectTypeId: Product.id, propertyIds: [\"id\"] }],\n links: [],\n },\n },\n ],\n },\n },\n ],\n }\n}\n\nasync function seed(fixture: MaterializerTestFixture): Promise<void> {\n await fixture.seed({\n objects: [\n object(Proposal.id, \"proposal-1\", {\n id: \"proposal-1\",\n title: \"Visible proposal\",\n rank: 50,\n category: \"visible\",\n embedding: [0, 1],\n secret: \"root-secret\",\n }),\n object(Proposal.id, \"proposal-2\", {\n id: \"proposal-2\",\n title: \"Hidden proposal\",\n rank: 1,\n category: \"hidden\",\n embedding: [1, 0],\n secret: \"hidden-secret\",\n }),\n object(LineItem.id, \"item:opaque|1\", {\n id: \"item:opaque|1\",\n name: \"Visible item\",\n reviewNote: \"Property union\",\n internal: \"hidden\",\n }),\n object(LineItem.id, \"item-hidden\", { id: \"item-hidden\", name: \"Hidden item\" }),\n object(LineItem.id, \"reviewer-1\", {\n id: \"reviewer-1\",\n name: \"Visible reviewer\",\n reviewNote: \"selected\",\n }),\n object(Product.id, \"product-1\", {\n id: \"product-1\",\n name: \"Visible product\",\n internal: \"hidden\",\n }),\n object(Product.id, \"product-review\", {\n id: \"product-review\",\n name: \"Product outside selected path\",\n }),\n ],\n links: [\n linkRow(Proposal.id, \"proposal-1\", \"items\", LineItem.id, \"item:opaque|1\", {\n position: 1,\n label: \"primary\",\n internal: \"hidden\",\n }),\n linkRow(Proposal.id, \"proposal-2\", \"items\", LineItem.id, \"item-hidden\"),\n linkRow(Proposal.id, \"proposal-1\", \"reviewers\", LineItem.id, \"item:opaque|1\"),\n linkRow(Proposal.id, \"proposal-1\", \"reviewers\", LineItem.id, \"reviewer-1\"),\n linkRow(Proposal.id, \"proposal-1\", \"related\", Proposal.id, \"proposal-1\"),\n linkRow(LineItem.id, \"item:opaque|1\", \"product\", Product.id, \"product-1\"),\n linkRow(LineItem.id, \"reviewer-1\", \"product\", Product.id, \"product-review\"),\n linkRow(Proposal.id, \"proposal-1\", \"aPrivate\", Product.id, \"product-review\"),\n linkRow(Proposal.id, \"proposal-1\", \"zVisible\", Product.id, \"product-1\"),\n ],\n })\n}\n\nfunction object(\n objectTypeId: string,\n primaryId: string,\n properties: Readonly<Record<string, JsonValue>>\n): MaterializerFixtureObject {\n return {\n ref: { objectTypeId, primaryId },\n properties,\n }\n}\n\nfunction linkRow(\n sourceObjectTypeId: string,\n sourcePrimaryId: string,\n linkId: string,\n targetObjectTypeId: string,\n targetPrimaryId: string,\n properties?: Readonly<Record<string, JsonValue>>\n): MaterializerFixtureLink {\n return {\n ref: {\n source: { objectTypeId: sourceObjectTypeId, primaryId: sourcePrimaryId },\n linkId,\n target: { objectTypeId: targetObjectTypeId, primaryId: targetPrimaryId },\n },\n ...(properties === undefined ? {} : { properties }),\n }\n}\n",
|
|
25
30
|
"import { describe, expect, test } from \"bun:test\"\nimport type {\n ProjectionExecution,\n ProjectionMaterializationIdentity,\n} from \"../materialization/model\"\nimport type {\n MaterializationPlanFinalization,\n MaterializationPlanHeader,\n MaterializationSession,\n OntologyOutboxFailure,\n OntologySourceRecord,\n} from \"../storage/ontology\"\nimport type { ProjectionRunStorage } from \"../storage/projection-runs\"\nimport {\n commitEmptyEdit,\n commitExactObject,\n contractEditHeader,\n contractEditResult,\n ensureContractExecution,\n type OntologyContractStorage,\n} from \"./ontology-contract-fixture\"\nimport { startTestProjectionRun } from \"./projection-execution\"\n\nexport interface OntologyStorageContractStorage extends OntologyContractStorage {\n readonly projectionRuns: ProjectionRunStorage\n}\n\nexport interface OntologyStorageContractSuiteOptions<\n TStorage extends OntologyStorageContractStorage = OntologyStorageContractStorage,\n> {\n /** Factory that returns a fresh, fully transaction-capable storage facade for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional provider setup invoked after the storage facade is created. */\n readonly setup?: (storage: TStorage) => void | Promise<void>\n /** Optional provider cleanup invoked after every test, including failed tests. */\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst replacementIdentity = (\n versionId: string,\n projectionId = \"contract.devices\"\n): Extract<ProjectionMaterializationIdentity, { readonly projectionKind: \"object\" }> => ({\n projectionId,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: {\n datasetId: \"contract.devices\",\n versionId,\n createdAt: `2026-01-${versionId.padStart(2, \"0\")}T00:00:00.000Z`,\n },\n ontologyRevision: \"ontology-contract-revision\",\n projectionRevision: \"projection-contract-revision\",\n ownershipHash: \"ownership-contract-hash\",\n})\n\nconst emptyProjectionCounts = {\n objectsCreated: 0,\n objectsUpdated: 0,\n objectsDeleted: 0,\n objectsUnchanged: 0,\n linksCreated: 0,\n linksUpdated: 0,\n linksDeleted: 0,\n linksUnchanged: 0,\n} as const\n\ninterface ReadyCandidate {\n readonly identity: Extract<\n ProjectionMaterializationIdentity,\n { readonly projectionKind: \"object\" }\n >\n readonly execution: ProjectionExecution\n readonly materializationId: string\n readonly source: { readonly projectionId: string }\n readonly executionId: string\n}\n\nfunction ontologyOutboxFailure(message: string): OntologyOutboxFailure {\n return {\n code: \"event.delivery_failed\",\n message,\n retryable: true,\n at: \"2026-01-03T02:00:00.000Z\",\n }\n}\n\n/**\n * Runs provider-level ontology persistence contracts without asking the provider\n * to interpret ontology definitions, edits, or projection rows. Exact plans are\n * supplied directly and the suite checks durable lifecycle, CAS, outbox, and\n * cross-facade transaction behavior.\n */\nexport function runOntologyStorageContractSuite<TStorage extends OntologyStorageContractStorage>(\n label: string,\n options: OntologyStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"stores one authoritative commit and rejects duplicate commit identities\", async () => {\n await withStorage(async (storage) => {\n await commitEmptyEdit(storage, \"commit-one\")\n const stored = await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"commit-one\",\n })\n expect(stored).toMatchObject({\n id: \"commit-one\",\n idempotencyKey: \"runtime:commit-one\",\n requestHash: \"hash:commit-one\",\n result: { commitId: \"commit-one\" },\n })\n expect(\n await storage.ontology.commits.getByIdempotencyKey({\n projectId: \"contract-project\",\n idempotencyKey: \"runtime:commit-one\",\n })\n ).toEqual(stored)\n\n await expect(commitEmptyEdit(storage, \"commit-one\")).rejects.toMatchObject({\n kind: \"idempotency\",\n })\n const divergent = structuredClone(contractEditHeader(\"different-id\"))\n ;(divergent.commit as { idempotencyKey: string }).idempotencyKey = \"runtime:commit-one\"\n ;(divergent.commit as { requestHash: string }).requestHash = \"different-hash\"\n await expect(\n storage.transaction(async (tx) => {\n await ensureContractExecution(tx, divergent)\n await tx.ontology.materializations.begin(divergent)\n })\n ).rejects.toMatchObject({ kind: \"idempotency\" })\n\n const list = await storage.ontology.commits.list({\n projectId: \"contract-project\",\n limit: 1,\n offset: 0,\n })\n expect(list).toMatchObject({ total: 1, hasMore: false })\n expect(list.commits.map((commit) => commit.id)).toEqual([\"commit-one\"])\n })\n })\n\n test(\"rejects an ontology commit whose execution does not exist\", async () => {\n await withStorage(async (storage) => {\n const header = contractEditHeader(\"missing-execution\")\n await expect(\n storage.transaction(async (tx) => {\n const session = await tx.ontology.materializations.begin(header)\n await tx.ontology.materializations.finalize({\n session,\n finalization: {\n sourceActivations: [],\n result: contractEditResult(header.commit.id),\n },\n })\n })\n ).rejects.toThrow()\n await expect(\n storage.ontology.commits.getById({\n projectId: header.commit.projectId,\n id: header.commit.id,\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"rejects unfinished sessions and rolls back their authoritative writes\", async () => {\n await withStorage(async (storage) => {\n const header = contractEditHeader(\"session-contract\")\n await expect(storage.ontology.materializations.begin(header)).rejects.toThrow(\n \"active storage transaction\"\n )\n\n await expect(\n commitExactObject(storage, \"unfinished-session\", { omitFinalize: true })\n ).rejects.toThrow(\"unfinished materialization session\")\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"unfinished-session\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"unfinished-session\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2027-01-01T00:00:00.000Z\",\n limit: 10,\n leaseId: \"unfinished-session-check\",\n leaseExpiresAt: \"2027-01-01T01:00:00.000Z\",\n })\n ).toEqual([])\n\n let leakedSession: MaterializationSession | undefined\n await expect(\n storage.transaction(async (tx) => {\n const leakedHeader = contractEditHeader(\"leaked-session\")\n await ensureContractExecution(tx, leakedHeader)\n leakedSession = await tx.ontology.materializations.begin(leakedHeader)\n })\n ).rejects.toThrow(\"unfinished materialization session\")\n if (!leakedSession) throw new Error(\"Expected an unfinished session handle\")\n const staleSession = leakedSession\n await storage.transaction(async (tx) => {\n await expect(\n tx.ontology.materializations.finalize({\n session: staleSession,\n finalization: {\n sourceActivations: [],\n result: contractEditResult(\"leaked-session\"),\n },\n })\n ).rejects.toThrow(\"inactive\")\n })\n })\n })\n\n test(\"stages insert-only source rows, seals counts, and fences stale execution tokens\", async () => {\n await withStorage(async (storage) => {\n const identity = replacementIdentity(\"01\")\n const claimed = await startTestProjectionRun(storage, {\n id: \"staging-run\",\n projectId: \"contract-project\",\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n const execution = claimed.execution\n const source = { projectionId: identity.projectionId }\n await expect(\n storage.ontology.sources.beginMaterialization({\n projectId: \"contract-project\",\n source,\n materializationId: \"mismatched-candidate\",\n execution,\n projectionKind: \"link\",\n protocol: \"replacement\",\n datasetVersion: identity.datasetVersion,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n ontologyRevision: identity.ontologyRevision,\n createdAt: \"2026-01-01T00:00:00.000Z\",\n })\n ).rejects.toThrow(\"identity\")\n await storage.ontology.sources.beginMaterialization({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: identity.datasetVersion,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n ontologyRevision: identity.ontologyRevision,\n createdAt: \"2026-01-01T00:00:00.000Z\",\n })\n expect(\n await storage.ontology.sources.getActive({ projectId: \"contract-project\", source })\n ).toBeNull()\n\n const row = {\n root: {\n kind: \"object\" as const,\n ref: { objectTypeId: \"ContractDevice\", primaryId: \"one\" },\n },\n assertion: {\n kind: \"object\" as const,\n ref: { objectTypeId: \"ContractDevice\", primaryId: \"one\" },\n properties: { name: \"one\" },\n },\n stagingOrdinal: 0,\n }\n expect(\n await storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [row],\n })\n ).toEqual({ inserted: 1, unchanged: 0 })\n expect(\n await storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [row],\n })\n ).toEqual({ inserted: 0, unchanged: 1 })\n await expect(\n storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [\n {\n ...row,\n assertion: { ...row.assertion, properties: { name: \"different\" } },\n },\n ],\n })\n ).rejects.toThrow()\n\n const ready = await storage.ontology.sources.markReady({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rootCount: 1,\n assertionCount: 1,\n readyAt: \"2026-01-01T00:01:00.000Z\",\n })\n expect(ready).toMatchObject({ status: \"ready\", rootCount: 1, assertionCount: 1 })\n\n const reclaimed = await storage.projectionRuns.startOrReclaim({\n id: claimed.run.id,\n projectId: claimed.run.projectId,\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n await expect(\n storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [],\n })\n ).rejects.toMatchObject({ kind: \"execution-lost\" })\n await expect(\n storage.ontology.sources.markReady({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rootCount: 1,\n assertionCount: 1,\n readyAt: \"2026-01-01T00:03:00.000Z\",\n })\n ).rejects.toMatchObject({ kind: \"execution-lost\" })\n await expect(\n storage.ontology.sources.abandon({\n kind: \"candidate\",\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n abandonedAt: \"2026-01-01T00:03:00.000Z\",\n })\n ).rejects.toMatchObject({ kind: \"execution-lost\" })\n const abandoned = await storage.ontology.sources.abandon({\n kind: \"reclaim\",\n projectId: \"contract-project\",\n source,\n execution: reclaimed.execution,\n abandonedAt: \"2026-01-01T00:02:00.000Z\",\n })\n expect(abandoned).toMatchObject({ status: \"abandoned\", executionToken: null })\n expect(\n await storage.ontology.sources.summarizeTerminal({ projectId: \"contract-project\" })\n ).toEqual({ count: 1, oldestTerminalAt: \"2026-01-01T00:02:00.000Z\" })\n\n expect(\n await storage.ontology.sources.cleanupTerminal({\n projectId: \"contract-project\",\n terminalBefore: \"2026-02-01T00:00:00.000Z\",\n limit: 1,\n })\n ).toEqual({ rowsDeleted: 1, materializationsDeleted: 0 })\n expect(\n await storage.ontology.sources.cleanupTerminal({\n projectId: \"contract-project\",\n terminalBefore: \"2026-02-01T00:00:00.000Z\",\n limit: 1,\n })\n ).toEqual({ rowsDeleted: 0, materializationsDeleted: 1 })\n expect(\n await storage.ontology.sources.summarizeTerminal({ projectId: \"contract-project\" })\n ).toEqual({ count: 0, oldestTerminalAt: null })\n })\n })\n\n test(\"atomically activates explicit empty candidates and rejects competing stale heads\", async () => {\n await withStorage(async (storage) => {\n const first = await createReadyEmptyCandidate(storage, \"run-one\", \"candidate-one\", \"01\")\n await activateEmptyCandidate(\n storage,\n first,\n null,\n \"commit-source-one\",\n \"2026-01-03T00:00:00.000Z\"\n )\n const activeOne = await storage.ontology.sources.getActive({\n projectId: \"contract-project\",\n source: first.source,\n })\n expect(activeOne).toMatchObject({\n materializationId: first.materializationId,\n status: \"active\",\n rootCount: 0,\n assertionCount: 0,\n executionToken: null,\n })\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"contract-project\",\n origin: { kind: \"projection\", projectionRunId: first.execution.projectionRunId },\n })\n ).toMatchObject({ id: \"commit-source-one\" })\n await expect(\n activateEmptyCandidate(\n storage,\n first,\n activeOne,\n \"duplicate-projection-origin\",\n \"2026-01-03T01:00:00.000Z\"\n )\n ).rejects.toMatchObject({ kind: \"run-correlation\" })\n\n const left = await createReadyEmptyCandidate(storage, \"run-left\", \"candidate-left\", \"02\")\n const right = await createReadyEmptyCandidate(storage, \"run-right\", \"candidate-right\", \"03\")\n await activateEmptyCandidate(\n storage,\n left,\n activeOne!,\n \"commit-source-left\",\n \"2026-01-04T00:00:00.000Z\"\n )\n await expect(\n activateEmptyCandidate(\n storage,\n right,\n activeOne!,\n \"commit-source-right\",\n \"2026-01-05T00:00:00.000Z\"\n )\n ).rejects.toMatchObject({ kind: \"projection-fence\" })\n const currentActive = await storage.ontology.sources.getActive({\n projectId: \"contract-project\",\n source: first.source,\n })\n expect(currentActive).toMatchObject({ materializationId: left.materializationId })\n\n const stale = await createReadyEmptyCandidate(\n storage,\n \"run-stale-activation\",\n \"candidate-stale-activation\",\n \"04\"\n )\n const reclaimed = await storage.projectionRuns.startOrReclaim({\n id: stale.execution.projectionRunId,\n projectId: \"contract-project\",\n identity: stale.identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n await expect(\n activateEmptyCandidate(\n storage,\n stale,\n currentActive,\n \"commit-stale-activation\",\n \"2026-01-06T00:00:00.000Z\"\n )\n ).rejects.toThrow(\"execution token is stale\")\n await storage.ontology.sources.abandon({\n kind: \"reclaim\",\n projectId: \"contract-project\",\n source: stale.source,\n execution: reclaimed.execution,\n abandonedAt: \"2026-01-06T00:01:00.000Z\",\n })\n\n const cleanup = await storage.ontology.sources.cleanupTerminal({\n projectId: \"contract-project\",\n terminalBefore: \"2026-02-01T00:00:00.000Z\",\n limit: 10,\n })\n expect(cleanup.materializationsDeleted).toBeGreaterThanOrEqual(1)\n expect(\n await storage.ontology.sources.getActive({\n projectId: \"contract-project\",\n source: first.source,\n })\n ).toMatchObject({ materializationId: left.materializationId })\n expect(\n await storage.ontology.sources.abandon({\n kind: \"candidate\",\n projectId: \"contract-project\",\n source: right.source,\n materializationId: right.materializationId,\n execution: right.execution,\n abandonedAt: \"2026-02-02T00:00:00.000Z\",\n })\n ).toMatchObject({ status: \"abandoned\" })\n })\n })\n\n test(\"rolls back exact rows, commits, and outbox writes through one transaction facade\", async () => {\n await withStorage(async (storage) => {\n await expect(\n commitExactObject(storage, \"rolled-back\", { throwAfterFinalize: true })\n ).rejects.toThrow(\"contract rollback\")\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"rolled-back\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"rolled-back\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2027-01-01T00:00:00.000Z\",\n limit: 10,\n leaseId: \"rollback-check\",\n leaseExpiresAt: \"2027-01-01T01:00:00.000Z\",\n })\n ).toEqual([])\n\n await commitExactObject(storage, \"committed\")\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"committed\",\n })\n ).toMatchObject({ properties: { name: \"committed\" }, lastCommitId: \"committed\" })\n\n await expect(\n commitExactObject(storage, \"stale-object-cas\", { primaryId: \"committed\" })\n ).rejects.toThrow(\"to be absent\")\n expect(\n await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"stale-object-cas\",\n })\n ).toBeNull()\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"committed\",\n })\n ).toMatchObject({ properties: { name: \"committed\" }, lastCommitId: \"committed\" })\n })\n })\n\n test(\"leases outbox rows exclusively, reclaims expiry, fences stale workers, and purges\", async () => {\n await withStorage(async (storage) => {\n const outboxB = await commitExactObject(storage, \"outbox-b\")\n const outboxA = await commitExactObject(storage, \"outbox-a\")\n await expect(\n storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-02T19:00:00-05:00\",\n limit: 1,\n leaseId: \"noncanonical-lease\",\n leaseExpiresAt: \"2026-01-03T01:00:00.000Z\",\n })\n ).rejects.toThrow(\"canonical UTC\")\n const first = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T00:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-one\",\n leaseExpiresAt: \"2026-01-03T01:00:00.000Z\",\n })\n expect(first).toHaveLength(1)\n expect(first[0]).toMatchObject({ attempts: 1, leaseId: \"lease-one\" })\n expect(first[0].envelope.id).toBe([outboxA.eventId, outboxB.eventId].sort()[0])\n const concurrent = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T00:30:00.000Z\",\n limit: 10,\n leaseId: \"lease-concurrent\",\n leaseExpiresAt: \"2026-01-03T01:30:00.000Z\",\n })\n expect(concurrent).toHaveLength(1)\n expect(concurrent[0].envelope.id).not.toBe(first[0].envelope.id)\n\n const reclaimed = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T02:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-two\",\n leaseExpiresAt: \"2026-01-03T03:00:00.000Z\",\n })\n expect(reclaimed[0].envelope.id).toBe(first[0].envelope.id)\n await expect(\n storage.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: [first[0].envelope.id],\n leaseId: \"lease-one\",\n publishedAt: \"2026-01-03T02:10:00.000Z\",\n })\n ).rejects.toThrow(\"lease does not match\")\n await storage.ontology.outbox.reschedule({\n projectId: \"contract-project\",\n ids: [reclaimed[0].envelope.id],\n leaseId: \"lease-two\",\n availableAt: \"2026-01-04T00:00:00.000Z\",\n failure: ontologyOutboxFailure(\"broker unavailable\"),\n })\n const retried = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-04T00:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-three\",\n leaseExpiresAt: \"2026-01-04T01:00:00.000Z\",\n })\n expect(retried[0]).toMatchObject({\n attempts: 3,\n lastFailure: ontologyOutboxFailure(\"broker unavailable\"),\n })\n await storage.ontology.outbox.reschedule({\n projectId: \"contract-project\",\n ids: [retried[0].envelope.id],\n leaseId: \"lease-three\",\n availableAt: \"2026-01-04T00:15:00.000Z\",\n })\n const lifecycleRescheduled = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-04T00:15:00.000Z\",\n limit: 1,\n leaseId: \"lease-four\",\n leaseExpiresAt: \"2026-01-04T01:15:00.000Z\",\n })\n expect(lifecycleRescheduled[0]).toMatchObject({\n attempts: 4,\n lastFailure: ontologyOutboxFailure(\"broker unavailable\"),\n })\n expect(\n await storage.ontology.outbox.summarize({ projectId: \"contract-project\" })\n ).toMatchObject({ pendingCount: 2, retryingCount: 2, maxAttempts: 4 })\n await storage.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: [lifecycleRescheduled[0].envelope.id],\n leaseId: \"lease-four\",\n publishedAt: \"2026-01-04T00:30:00.000Z\",\n })\n expect(\n await storage.ontology.outbox.purgePublished({\n projectId: \"contract-project\",\n publishedBefore: \"2026-01-05T00:00:00.000Z\",\n limit: 1,\n })\n ).toBe(1)\n })\n })\n\n test(\"keeps batch outbox settlement atomic when callers catch a stale lease\", async () => {\n await withStorage(async (storage) => {\n await commitExactObject(storage, \"lease-atomic-a\")\n await commitExactObject(storage, \"lease-atomic-b\")\n const claimed = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T00:00:00.000Z\",\n limit: 10,\n leaseId: \"lease-atomic-old\",\n leaseExpiresAt: \"2026-01-03T01:00:00.000Z\",\n })\n expect(claimed).toHaveLength(2)\n const [reclaimed] = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T02:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-atomic-new\",\n leaseExpiresAt: \"2026-01-03T03:00:00.000Z\",\n })\n const untouched = claimed.find((row) => row.envelope.id !== reclaimed!.envelope.id)!\n\n let conflict: unknown\n await storage.transaction(async (tx) => {\n try {\n await tx.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: claimed.map((row) => row.envelope.id),\n leaseId: \"lease-atomic-old\",\n publishedAt: \"2026-01-03T02:10:00.000Z\",\n })\n } catch (error) {\n conflict = error\n }\n })\n expect(conflict).toMatchObject({ kind: \"outbox-lease\" })\n\n await storage.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: [untouched.envelope.id],\n leaseId: \"lease-atomic-old\",\n publishedAt: \"2026-01-03T02:20:00.000Z\",\n })\n })\n })\n\n test(\"rolls back a telemetry checkpoint with its authoritative ontology commit\", async () => {\n await withStorage(async (storage) => {\n const identity: ProjectionMaterializationIdentity = {\n projectionId: \"contract.telemetry\",\n projectionKind: \"telemetry\",\n protocol: \"telemetry\",\n datasetVersion: {\n datasetId: \"contract.readings\",\n versionId: \"telemetry-version\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n },\n ontologyRevision: \"ontology-contract-revision\",\n projectionRevision: \"telemetry-contract-revision\",\n ownershipHash: \"telemetry-contract-ownership\",\n }\n const run = await startTestProjectionRun(storage, {\n id: \"telemetry-run\",\n projectId: \"contract-project\",\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n fixedBatchSize: 2,\n })\n const execute = async (throwAfter: boolean) => {\n await storage.transaction(async (tx) => {\n if (!tx.projectionRuns) {\n throw new Error(\"Contract transaction omitted required storage facades.\")\n }\n const header = telemetryHeader(identity, run.run.id, run.run.executionId)\n const session = await tx.ontology.materializations.begin(header)\n await tx.ontology.materializations.finalize({\n session,\n finalization: {\n sourceActivations: [],\n result: {\n kind: \"telemetry\",\n commitId: header.commit.id,\n created: true,\n eventCount: 0,\n committedAt: header.commit.committedAt,\n pointsCreated: 0,\n pointsUpdated: 0,\n pointsUnchanged: 0,\n latestObjectsChanged: 0,\n },\n },\n })\n await tx.projectionRuns.advanceTelemetryCheckpoint({\n id: run.run.id,\n projectId: run.run.projectId,\n identity,\n executionToken: run.execution.executionToken,\n batchOrdinal: 0,\n batchRowCount: 2,\n batchRowsSkipped: 2,\n inputExhausted: true,\n })\n if (throwAfter) throw new Error(\"telemetry rollback\")\n })\n }\n\n await expect(execute(true)).rejects.toThrow(\"telemetry rollback\")\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"contract-project\",\n origin: { kind: \"telemetry\", projectionRunId: run.run.id, batchOrdinal: 0 },\n })\n ).toBeNull()\n expect(\n await storage.projectionRuns.getById({ projectId: run.run.projectId, id: run.run.id })\n ).toMatchObject({\n telemetryCheckpoint: { nextBatchOrdinal: 0, nextRowOffset: 0, inputExhausted: false },\n })\n\n await execute(false)\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"contract-project\",\n origin: { kind: \"telemetry\", projectionRunId: run.run.id, batchOrdinal: 0 },\n })\n ).toMatchObject({ id: \"telemetry-commit\" })\n expect(\n await storage.projectionRuns.getById({ projectId: run.run.projectId, id: run.run.id })\n ).toMatchObject({\n telemetryCheckpoint: { nextBatchOrdinal: 1, nextRowOffset: 2, inputExhausted: true },\n })\n })\n })\n })\n}\n\nasync function createReadyEmptyCandidate(\n storage: OntologyStorageContractStorage,\n runId: string,\n materializationId: string,\n versionId: string\n): Promise<ReadyCandidate> {\n const identity = replacementIdentity(versionId)\n const run = await startTestProjectionRun(storage, {\n id: runId,\n projectId: \"contract-project\",\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n const execution = run.execution\n const source = { projectionId: identity.projectionId }\n await storage.ontology.sources.beginMaterialization({\n projectId: run.run.projectId,\n source,\n materializationId,\n execution,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: identity.datasetVersion,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n ontologyRevision: identity.ontologyRevision,\n createdAt: identity.datasetVersion.createdAt,\n })\n await storage.ontology.sources.markReady({\n projectId: run.run.projectId,\n source,\n materializationId,\n execution,\n rootCount: 0,\n assertionCount: 0,\n readyAt: new Date(Date.parse(identity.datasetVersion.createdAt) + 1_000).toISOString(),\n })\n return { identity, execution, materializationId, source, executionId: run.run.executionId }\n}\n\nasync function activateEmptyCandidate(\n storage: OntologyStorageContractStorage,\n candidate: ReadyCandidate,\n expectedActive: OntologySourceRecord | null,\n commitId: string,\n committedAt: string\n): Promise<void> {\n const expected = {\n source: candidate.source,\n activeMaterializationId: expectedActive?.materializationId ?? null,\n lastCommitId: expectedActive?.lastCommitId ?? null,\n }\n const header: MaterializationPlanHeader = {\n commit: {\n projectId: \"contract-project\",\n id: commitId,\n idempotencyKey: `projection:${commitId}`,\n requestHash: `hash:${commitId}`,\n executionId: candidate.executionId,\n origin: {\n kind: \"projection\",\n projectionId: candidate.source.projectionId,\n projectionRunId: candidate.execution.projectionRunId,\n datasetId: candidate.identity.datasetVersion.datasetId,\n datasetVersionId: candidate.identity.datasetVersion.versionId,\n },\n ontologyRevision: candidate.identity.ontologyRevision,\n projectionRevision: candidate.identity.projectionRevision,\n ownershipHash: candidate.identity.ownershipHash,\n intent: {\n kind: \"projection\",\n source: candidate.source,\n datasetVersion: candidate.identity.datasetVersion,\n },\n committedAt,\n },\n expected: { sources: [expected], objects: [], links: [], linkScopes: [], points: [] },\n }\n const finalization: MaterializationPlanFinalization = {\n sourceActivations: [\n {\n source: candidate.source,\n materializationId: candidate.materializationId,\n execution: candidate.execution,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: candidate.identity.datasetVersion,\n projectionRevision: candidate.identity.projectionRevision,\n ownershipHash: candidate.identity.ownershipHash,\n ontologyRevision: candidate.identity.ontologyRevision,\n expected,\n lastCommitId: commitId,\n updatedAt: committedAt,\n },\n ],\n result: {\n kind: \"projection\",\n commitId,\n created: true,\n eventCount: 0,\n committedAt,\n counts: emptyProjectionCounts,\n },\n }\n await storage.transaction(async (tx) => {\n if (!tx.projectionRuns) {\n throw new Error(\"Contract transaction omitted required storage facades.\")\n }\n await tx.projectionRuns.lockForMaterialization({\n id: candidate.execution.projectionRunId,\n projectId: header.commit.projectId,\n identity: candidate.identity,\n executionToken: candidate.execution.executionToken,\n })\n const session = await tx.ontology.materializations.begin(header)\n for (const entityKind of [\"object\", \"link\"] as const) {\n for await (const _page of tx.ontology.materializations.streamSourceReplacementState({\n session,\n source: candidate.source,\n candidateMaterializationId: candidate.materializationId,\n entityKind,\n pageRows: 1,\n })) {\n // Empty output intentionally has no classifications or exact writes.\n }\n }\n await tx.ontology.materializations.finalize({ session, finalization })\n })\n}\n\nfunction telemetryHeader(\n identity: ProjectionMaterializationIdentity,\n projectionRunId: string,\n executionId: string\n): MaterializationPlanHeader {\n if (identity.protocol !== \"telemetry\") throw new Error(\"Expected telemetry identity\")\n return {\n commit: {\n projectId: \"contract-project\",\n id: \"telemetry-commit\",\n idempotencyKey: \"telemetry:telemetry-run:0\",\n requestHash: \"hash:telemetry-run:0\",\n executionId,\n origin: {\n kind: \"telemetry\",\n source: {\n kind: \"projection\",\n projectionId: identity.projectionId,\n projectionRunId,\n datasetId: identity.datasetVersion.datasetId,\n datasetVersionId: identity.datasetVersion.versionId,\n batchOrdinal: 0,\n },\n },\n ontologyRevision: identity.ontologyRevision,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n intent: {\n kind: \"telemetry\",\n source: {\n kind: \"projection\",\n projection: { projectionId: identity.projectionId },\n datasetVersion: identity.datasetVersion,\n batchOrdinal: 0,\n sourceRowCount: 2,\n sourceRowsSkipped: 2,\n inputExhausted: true,\n },\n pointCount: 0,\n inputPointCount: 0,\n },\n committedAt: \"2026-01-02T00:00:00.000Z\",\n },\n expected: { sources: [], objects: [], links: [], linkScopes: [], points: [] },\n }\n}\n",
|
|
26
31
|
"import type { TrustedPrimitiveRef } from \"../execution\"\nimport type { PipelineRunRecord, QueuePipelineRunInput, Storage } from \"../storage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution required by a Pipeline-run storage fixture. */\nexport async function createTestPipelineExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly pipelineId: string\n readonly runId: string\n readonly executionId?: string\n }\n): Promise<string> {\n const executionId = input.executionId ?? `test_pipeline_execution:${input.runId}`\n const existing = await executions.getById({ projectId: input.projectId, id: executionId })\n if (existing) return executionId\n\n const primitive: TrustedPrimitiveRef = {\n kind: \"pipeline\",\n id: input.pipelineId,\n runId: input.runId,\n }\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${input.runId}` },\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n return executionId\n}\n\n/** Queue a Pipeline run with the valid durable execution fixture required by every provider. */\nexport async function queueTestPipelineRun(\n storage: Pick<Storage, \"pipelineRuns\" | \"executions\">,\n input: Omit<QueuePipelineRunInput, \"executionId\">\n): Promise<PipelineRunRecord> {\n if (!storage.pipelineRuns)\n throw new Error(\"Pipeline run storage is not configured for this test.\")\n const executionId = await createTestPipelineExecution(storage.executions, {\n projectId: input.projectId,\n pipelineId: input.pipelineId,\n runId: input.id,\n })\n return storage.pipelineRuns.queue({ ...input, executionId })\n}\n\n/** Start a Pipeline run after creating its durable execution and queued state. */\nexport async function startTestPipelineRun(\n storage: Pick<Storage, \"pipelineRuns\" | \"executions\">,\n input: Omit<QueuePipelineRunInput, \"executionId\" | \"queuedAt\"> & {\n readonly startedAt?: Date\n }\n): Promise<PipelineRunRecord> {\n const { startedAt, ...queuedRun } = input\n await queueTestPipelineRun(storage, { ...queuedRun, queuedAt: startedAt })\n return storage.pipelineRuns!.start({\n id: input.id,\n projectId: input.projectId,\n startedAt,\n })\n}\n",
|
|
27
32
|
"import { describe, expect, test } from \"bun:test\"\nimport type { SixbFailure } from \"../errors/types\"\nimport type { ProjectionMaterializationIdentity } from \"../materialization/model\"\nimport type { ExecutionStorage } from \"../storage/executions\"\nimport type {\n ProjectionRunClaim,\n ProjectionRunFailureCode,\n ProjectionRunStorage,\n QueueProjectionRunInput,\n StartOrReclaimProjectionRunInput,\n} from \"../storage/projection-runs\"\n\nexport interface ProjectionRunStorageContractContext<\n TStorage extends ProjectionRunStorage = ProjectionRunStorage,\n> {\n readonly projectionRuns: TStorage\n readonly executions: ExecutionStorage\n}\n\nexport interface ProjectionRunStorageContractSuiteOptions<\n TStorage extends ProjectionRunStorage = ProjectionRunStorage,\n> {\n /** Factory that returns one isolated execution + projection-run store for each test. */\n readonly createStorage: () =>\n | ProjectionRunStorageContractContext<TStorage>\n | Promise<ProjectionRunStorageContractContext<TStorage>>\n readonly setup?: (context: ProjectionRunStorageContractContext<TStorage>) => void | Promise<void>\n readonly cleanup?: (\n context: ProjectionRunStorageContractContext<TStorage>\n ) => void | Promise<void>\n}\n\nconst projectId = \"contract-project\"\nconst objectTarget = { objectTypeId: \"Device\" } as const\n\nconst failure = {\n code: \"internal.unexpected\",\n message: \"Projection failed\",\n retryable: false,\n at: \"2026-06-01T12:00:00.000Z\",\n details: { projectionId: \"contract.devices\", runId: \"failed-run\" },\n} as const satisfies SixbFailure<ProjectionRunFailureCode>\n\nconst replacementIdentity = {\n projectionId: \"contract.devices\",\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: {\n datasetId: \"contract.devices\",\n versionId: \"version-1\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n },\n ontologyRevision: \"ontology-1\",\n projectionRevision: \"projection-1\",\n ownershipHash: \"ownership-1\",\n} as const satisfies ProjectionMaterializationIdentity\n\nconst telemetryIdentity = {\n projectionId: \"contract.temperatures\",\n projectionKind: \"telemetry\",\n protocol: \"telemetry\",\n datasetVersion: {\n datasetId: \"contract.readings\",\n versionId: \"version-1\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n },\n ontologyRevision: \"ontology-1\",\n projectionRevision: \"projection-telemetry-1\",\n ownershipHash: \"ownership-telemetry-1\",\n} as const satisfies ProjectionMaterializationIdentity\n\n/** Runs the single durable, fenced projection-run lifecycle against a provider. */\nexport function runProjectionRunStorageContractSuite<TStorage extends ProjectionRunStorage>(\n label: string,\n options: ProjectionRunStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (\n body: (context: ProjectionRunStorageContractContext<TStorage>) => Promise<void>\n ): Promise<void> => {\n const context = await options.createStorage()\n try {\n await options.setup?.(context)\n await body(context)\n } finally {\n await options.cleanup?.(context)\n }\n }\n\n describe(label, () => {\n test(\"admits a queued run only after its durable execution exists\", async () => {\n await withStorage(async (context) => {\n const input = replacementInput(\"queued-run\")\n await expect(\n context.projectionRuns.queue({\n ...input,\n executionId: \"missing-execution\",\n })\n ).rejects.toThrow()\n\n const wrongSourceExecutionId = \"execution:wrong-source\"\n await context.executions.create({\n id: wrongSourceExecutionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: \"projection\", runId: input.id },\n source: { type: \"event\", eventId: \"wrong-source\" },\n correlationId: input.id,\n authorizationRef: {\n type: \"trustedPrimitive\",\n primitive: { kind: \"projection\", id: input.identity.projectionId, runId: input.id },\n },\n })\n await expect(\n context.projectionRuns.queue({\n ...input,\n executionId: wrongSourceExecutionId,\n })\n ).rejects.toThrow(\"does not authorize Projection run\")\n\n const admission = await admitProjectionRun(context, input)\n await expect(\n context.projectionRuns.getById({ projectId: input.projectId, id: input.id })\n ).resolves.toMatchObject({\n id: input.id,\n executionId: admission.executionId,\n status: \"queued\",\n attempt: 0,\n })\n })\n })\n\n test(\"requeues the same admission after an enqueue failure\", async () => {\n await withStorage(async (context) => {\n const input = replacementInput(\"enqueue-retry-run\")\n const admission = await admitProjectionRun(context, input)\n await expect(\n context.projectionRuns.failEnqueue({\n id: input.id,\n projectId: input.projectId,\n error: {\n code: \"queue.enqueue_failed\",\n message: \"queue unavailable\",\n retryable: true,\n at: \"2026-06-01T12:00:00.000Z\",\n details: { projectionId: input.identity.projectionId, runId: input.id },\n },\n })\n ).resolves.toMatchObject({\n status: \"failed\",\n error: { code: \"queue.enqueue_failed\", message: \"queue unavailable\" },\n })\n\n await expect(context.projectionRuns.queue(admission)).resolves.toMatchObject({\n executionId: admission.executionId,\n status: \"queued\",\n attempt: 0,\n })\n })\n })\n\n test(\"keeps one run while reclaim rotates its execution\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n const input = replacementInput(\"replacement-run\")\n await admitProjectionRun(context, input)\n const first = await storage.startOrReclaim(input)\n const second = await storage.startOrReclaim(input)\n\n expect(first.run).toMatchObject({ id: input.id, attempt: 1, status: \"running\" })\n expect(second.run).toMatchObject({ id: input.id, attempt: 2, status: \"running\" })\n expect(second.execution.executionToken).not.toBe(first.execution.executionToken)\n expect(second.run).not.toHaveProperty(\"executionToken\")\n expect(await storage.getById({ projectId, id: input.id })).toMatchObject({\n identity: replacementIdentity,\n target: objectTarget,\n progress: { sourceRowsRead: 0, sourceRowsSkipped: 0 },\n })\n })\n })\n\n test(\"fences every stale lock, progress, and terminal write\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n const input = replacementInput(\"fenced-run\")\n await admitProjectionRun(context, input)\n const stale = await storage.startOrReclaim(input)\n const current = await storage.startOrReclaim(input)\n\n await expect(storage.lockForMaterialization(executionInput(stale))).rejects.toThrow(\n \"execution token is stale\"\n )\n await expect(\n storage.update({\n ...executionInput(stale),\n progress: { sourceRowsRead: 1 },\n })\n ).rejects.toThrow(\"execution token is stale\")\n await expect(\n storage.finish({\n ...executionInput(stale),\n protocol: \"replacement\",\n status: \"cancelled\",\n })\n ).rejects.toThrow(\"execution token is stale\")\n\n await expect(\n storage.update({\n ...executionInput(current),\n progress: { sourceRowsRead: 3 },\n })\n ).resolves.toMatchObject({ progress: { sourceRowsRead: 3 } })\n })\n })\n\n test(\"rejects immutable identity and target drift\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n const input = replacementInput(\"identity-run\")\n await admitProjectionRun(context, input)\n const claim = await storage.startOrReclaim(input)\n const changedIdentity = { ...replacementIdentity, ownershipHash: \"different-ownership\" }\n\n await expect(\n storage.startOrReclaim({ ...input, identity: changedIdentity })\n ).rejects.toThrow(\"identity does not match\")\n await expect(\n storage.startOrReclaim({ ...input, target: { objectTypeId: \"OtherDevice\" } })\n ).rejects.toThrow(\"target object types do not match\")\n await expect(\n storage.lockForMaterialization({\n ...executionInput(claim),\n identity: changedIdentity,\n })\n ).rejects.toThrow(\"identity does not match\")\n })\n })\n\n test(\"keeps physical progress monotone and internally consistent\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n await admitProjectionRun(context, replacementInput(\"progress-run\"))\n const claim = await storage.startOrReclaim(replacementInput(\"progress-run\"))\n const execution = executionInput(claim)\n await expect(\n storage.update({\n ...execution,\n progress: { sourceRowsRead: 1, sourceRowsSkipped: 2 },\n })\n ).rejects.toThrow(\"sourceRowsSkipped must not exceed sourceRowsRead\")\n await storage.update({\n ...execution,\n progress: { sourceRowsRead: 5, sourceRowsSkipped: 1 },\n })\n await expect(\n storage.update({ ...execution, progress: { sourceRowsRead: 4 } })\n ).rejects.toThrow(\"must not decrease\")\n })\n })\n\n test(\"rejects immutable dataset-version metadata reuse\", async () => {\n await withStorage(async (context) => {\n await admitProjectionRun(context, replacementInput(\"dataset-metadata-first\"))\n await expect(\n admitProjectionRun(context, {\n ...replacementInput(\"dataset-metadata-conflict\"),\n identity: {\n ...replacementIdentity,\n datasetVersion: {\n ...replacementIdentity.datasetVersion,\n createdAt: \"2026-01-02T00:00:00.000Z\",\n },\n },\n })\n ).rejects.toThrow(\"immutable dataset version id with different metadata\")\n })\n })\n\n test(\"advances telemetry in contiguous fixed physical batches\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n const input = {\n id: \"telemetry-run\",\n projectId,\n identity: telemetryIdentity,\n target: objectTarget,\n fixedBatchSize: 3,\n } as const\n await admitProjectionRun(context, input)\n const claim = await storage.startOrReclaim(input)\n const execution = executionInput(claim)\n expect(claim.run).toMatchObject({\n telemetryCheckpoint: {\n fixedBatchSize: 3,\n nextBatchOrdinal: 0,\n nextRowOffset: 0,\n inputExhausted: false,\n },\n })\n await expect(\n storage.update({ ...execution, progress: { sourceRowsRead: 1 } })\n ).rejects.toThrow(\"can only advance with its checkpoint\")\n\n await storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 0,\n batchRowCount: 3,\n batchRowsSkipped: 1,\n inputExhausted: false,\n })\n await expect(\n storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 2,\n batchRowCount: 1,\n batchRowsSkipped: 0,\n inputExhausted: true,\n })\n ).rejects.toThrow(\"expected batch ordinal 1\")\n await expect(\n storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 1,\n batchRowCount: 1,\n batchRowsSkipped: 0,\n inputExhausted: false,\n })\n ).rejects.toThrow(\"partial non-final batch\")\n\n const exhausted = await storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 1,\n batchRowCount: 2,\n batchRowsSkipped: 1,\n inputExhausted: true,\n })\n expect(exhausted).toMatchObject({\n progress: { sourceRowsRead: 5, sourceRowsSkipped: 2 },\n telemetryCheckpoint: { nextBatchOrdinal: 2, nextRowOffset: 5, inputExhausted: true },\n })\n })\n })\n\n test(\"keeps a missing target until the batch it blocks commits\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n const input = {\n id: \"telemetry-missing-target-run\",\n projectId,\n identity: telemetryIdentity,\n target: objectTarget,\n fixedBatchSize: 2,\n } as const\n await admitProjectionRun(context, input)\n const claim = await storage.startOrReclaim(input)\n const execution = executionInput(claim)\n const firstSeenAt = new Date(\"2026-06-01T12:00:00.000Z\")\n const missingTarget = {\n objectTypeId: \"Device\",\n objectId: \"missing-device\",\n batchOrdinal: 0,\n firstSeenAt,\n }\n\n const waiting = await storage.recordMissingTarget({ ...execution, missingTarget })\n expect(waiting.missingTarget).toEqual(missingTarget)\n expect(\n (await storage.getById({ projectId, id: \"telemetry-missing-target-run\" }))?.missingTarget\n ).toEqual(missingTarget)\n\n // A wait anchored to a batch the run has already passed would outlive the progress that\n // resolved it, so it is refused rather than stored.\n await expect(\n storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, batchOrdinal: 1 },\n })\n ).rejects.toThrow(\"cannot wait on batch 1\")\n\n // A run can only wait on the object type it writes: nothing else can appear in its\n // telemetry. Refused here so an adapter never has to rely on its own CHECK for it.\n await expect(\n storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, objectTypeId: \"Building\" },\n })\n ).rejects.toThrow(\"cannot wait on 'Building'\")\n\n // The whole wait or none of it. A half-written one reads as waiting since the epoch, or\n // waiting for nothing, and both decide a run's fate.\n for (const partial of [\n { objectId: \"\" },\n { objectTypeId: \"\" },\n { firstSeenAt: new Date(Number.NaN) },\n ]) {\n await expect(\n storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, ...partial },\n })\n ).rejects.toThrow()\n }\n\n // The write is last-wins; keeping the original start is the worker's rule, which only\n // records when the object or the batch changes. An adapter that merged instead would\n // make that rule unenforceable.\n const rerecorded = await storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, firstSeenAt: new Date(\"2026-06-01T12:01:00.000Z\") },\n })\n expect(rerecorded.missingTarget?.firstSeenAt).toEqual(new Date(\"2026-06-01T12:01:00.000Z\"))\n\n const advanced = await storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 0,\n batchRowCount: 2,\n batchRowsSkipped: 0,\n inputExhausted: true,\n })\n expect(advanced.missingTarget).toBeUndefined()\n })\n })\n\n test(\"requires and records explicit telemetry EOF with terminal success\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n const input = {\n id: \"empty-telemetry-run\",\n projectId,\n identity: telemetryIdentity,\n target: objectTarget,\n fixedBatchSize: 10,\n } as const\n await admitProjectionRun(context, input)\n const claim = await storage.startOrReclaim(input)\n\n await expect(\n storage.finish({\n ...executionInput(claim),\n protocol: \"telemetry\",\n status: \"succeeded\",\n } as Parameters<ProjectionRunStorage[\"finish\"]>[0])\n ).rejects.toThrow(\"cannot succeed before input exhaustion\")\n await expect(storage.getById({ projectId, id: claim.run.id })).resolves.toMatchObject({\n status: \"running\",\n telemetryCheckpoint: { inputExhausted: false },\n })\n\n const finished = await storage.finish({\n ...executionInput(claim),\n protocol: \"telemetry\",\n status: \"succeeded\",\n inputExhausted: true,\n })\n expect(finished).toMatchObject({\n status: \"succeeded\",\n progress: { sourceRowsRead: 0 },\n telemetryCheckpoint: { inputExhausted: true },\n })\n await expect(storage.lockForMaterialization(executionInput(claim))).rejects.toThrow(\n \"already terminal\"\n )\n })\n })\n\n test(\"validates, detaches, and persists scoped failures\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n await admitProjectionRun(context, replacementInput(\"failed-run\"))\n const claim = await storage.startOrReclaim(replacementInput(\"failed-run\"))\n const finished = await storage.finish({\n ...executionInput(claim),\n protocol: \"replacement\",\n status: \"failed\",\n finishedAt: new Date(failure.at),\n error: failure,\n })\n\n expect(finished).toMatchObject({\n status: \"failed\",\n finishedAt: new Date(failure.at),\n error: failure,\n })\n expect(finished.error).not.toBe(failure)\n await expect(storage.getById({ projectId, id: \"failed-run\" })).resolves.toMatchObject({\n error: failure,\n })\n\n await admitProjectionRun(context, replacementInput(\"invalid-failure-run\"))\n const invalid = await storage.startOrReclaim(replacementInput(\"invalid-failure-run\"))\n await expect(\n storage.finish({\n ...executionInput(invalid),\n protocol: \"replacement\",\n status: \"failed\",\n error: { ...failure, code: \"dataset.not_found\" } as never,\n })\n ).rejects.toThrow(\"code is not allowed by this failure contract\")\n })\n })\n\n test(\"keeps equal run ids isolated by project\", async () => {\n await withStorage(async (context) => {\n const storage = context.projectionRuns\n const projectA = { ...replacementInput(\"shared-id\"), projectId: \"project-a\" } as const\n const projectB = { ...replacementInput(\"shared-id\"), projectId: \"project-b\" } as const\n await admitProjectionRun(context, projectA)\n await admitProjectionRun(context, projectB)\n await storage.startOrReclaim(projectA)\n await storage.startOrReclaim(projectB)\n\n expect(await storage.getById({ projectId: \"project-a\", id: \"shared-id\" })).not.toBeNull()\n expect(await storage.getById({ projectId: \"project-b\", id: \"shared-id\" })).not.toBeNull()\n expect(await storage.getById({ projectId: \"project-c\", id: \"shared-id\" })).toBeNull()\n })\n })\n })\n}\n\nasync function admitProjectionRun<TStorage extends ProjectionRunStorage>(\n context: ProjectionRunStorageContractContext<TStorage>,\n input: StartOrReclaimProjectionRunInput\n): Promise<QueueProjectionRunInput> {\n const executionId = `execution:${input.projectId}:${input.id}`\n await context.executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: \"projection\", runId: input.id },\n source: {\n type: \"datasetVersion\",\n datasetId: input.identity.datasetVersion.datasetId,\n versionId: input.identity.datasetVersion.versionId,\n },\n correlationId: input.id,\n authorizationRef: {\n type: \"trustedPrimitive\",\n primitive: { kind: \"projection\", id: input.identity.projectionId, runId: input.id },\n },\n })\n const admission = {\n ...input,\n executionId,\n queuedAt: new Date(\"2026-01-01T00:00:01.000Z\"),\n } satisfies QueueProjectionRunInput\n await context.projectionRuns.queue(admission)\n return admission\n}\n\nfunction replacementInput(id: string) {\n return { id, projectId, identity: replacementIdentity, target: objectTarget } as const\n}\n\nfunction executionInput(claim: ProjectionRunClaim) {\n return {\n id: claim.run.id,\n projectId: claim.run.projectId,\n identity: claim.run.identity,\n executionToken: claim.execution.executionToken,\n }\n}\n",
|
|
28
|
-
"import { describe, expect, test } from \"bun:test\"\nimport { QueueError } from \"../queues/errors\"\nimport type { PipelineQueueJobFailureCode, QueueJobFailure, Queues } from \"../queues/types\"\n\nconst TERMINAL_FAILURE = {\n code: \"internal.unexpected\",\n retryable: false,\n message: \"boom\",\n at: \"2026-01-01T00:00:00.000Z\",\n details: { pipelineId: \"p-1\" },\n} as const satisfies QueueJobFailure<PipelineQueueJobFailureCode>\n\nexport interface QueueContractSuiteOptions {\n /** Factory that produces a fresh `Queues` instance for each test case. */\n readonly createQueues: () => Queues | Promise<Queues>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (queues: Queues) => void | Promise<void>\n /**\n * Lease duration used in lease-expiry redelivery assertions. Providers with a stalled-check\n * interval (e.g., BullMQ) need a larger value than in-memory providers. Defaults to 20ms.\n */\n readonly shortLeaseMs?: number\n /**\n * Time to wait for a claim to become re-visible after its lease expires. Defaults to\n * `shortLeaseMs + 10`; providers that rely on a periodic checker must add that interval.\n */\n readonly leaseExpiryRedeliveryMs?: number\n /**\n * Time to wait for a delayed retry to become visible again. Defaults to `shortLeaseMs + 15`.\n */\n readonly retryRedeliveryMs?: number\n}\n\n/**\n * Runs the shared `Queues` contract against any provider.\n *\n * Every provider must exhibit the same enqueue/claim/complete/retry/fail/renewLease behavior\n * described here, which is the authoritative specification for Sixb queues — each test is\n * written in Arrange/Act/Assert form, with timing parameters exposed for providers that need\n * them (short lease durations, periodic checker intervals).\n */\nexport function runQueueContractSuite(label: string, options: QueueContractSuiteOptions): void {\n const shortLeaseMs = options.shortLeaseMs ?? 20\n const leaseExpiryRedeliveryMs = options.leaseExpiryRedeliveryMs ?? shortLeaseMs + 10\n const retryRedeliveryMs = options.retryRedeliveryMs ?? shortLeaseMs + 15\n\n const withQueues = async (body: (queues: Queues) => Promise<void>): Promise<void> => {\n const queues = await options.createQueues()\n try {\n await body(queues)\n } finally {\n await options.teardown?.(queues)\n }\n }\n\n describe(label, () => {\n describe(\"enqueue\", () => {\n test(\"returns envelopes with generated id, createdAt, availableAt, attempt=0\", async () => {\n await withQueues(async (queues) => {\n const before = Date.now()\n\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"sync.run.requested\",\n payload: { runId: \"sync-1\" },\n },\n ],\n })\n\n expect(job?.id).toMatch(/^[0-9a-f-]{36}$/)\n expect(job?.projectId).toBe(\"project-a\")\n expect(job?.attempt).toBe(0)\n expect(job?.type).toBe(\"sync.run.requested\")\n expect(job?.payload.runId).toBe(\"sync-1\")\n expect(Date.parse(job!.createdAt)).toBeGreaterThanOrEqual(before)\n expect(job?.availableAt).toBe(job?.createdAt)\n })\n })\n\n test(\"deduplicates repeated enqueue with a caller-supplied id\", async () => {\n await withQueues(async (queues) => {\n const input = {\n id: \"dispatch-run-1\",\n type: \"sync.run.requested\" as const,\n payload: { runId: \"sync-1\" },\n }\n const [[first], [second]] = await Promise.all([\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n ])\n\n expect(first?.id).toBe(input.id)\n expect(second?.id).toBe(input.id)\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"worker-1\", limit: 2 })\n ).resolves.toHaveLength(1)\n })\n })\n\n test(\"treats caller-supplied ids as opaque across the job lifecycle\", async () => {\n await withQueues(async (queues) => {\n const id = \"workflow:review-meeting:node:0\"\n const input = {\n id,\n type: \"sync.run.requested\" as const,\n payload: { runId: \"sync-1\" },\n }\n\n const [[first], [duplicate]] = await Promise.all([\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n ])\n const [claimed] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: 2,\n })\n\n expect(first?.id).toBe(id)\n expect(duplicate?.id).toBe(id)\n expect(claimed?.job.id).toBe(id)\n if (queues.syncRuns.renewLease) {\n await expect(\n queues.syncRuns.renewLease({\n projectId: \"project-a\",\n jobId: id,\n leaseId: claimed!.leaseId,\n leaseMs: shortLeaseMs * 10,\n })\n ).resolves.toMatchObject({ job: { id } })\n }\n await queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: id,\n leaseId: claimed!.leaseId,\n })\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"worker-2\" })\n ).resolves.toHaveLength(0)\n })\n })\n\n test(\"returns empty array when no jobs are passed\", async () => {\n await withQueues(async (queues) => {\n const result = await queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [] })\n\n expect(result).toEqual([])\n })\n })\n\n test(\"rejects empty projectId with QueueError\", async () => {\n await withQueues(async (queues) => {\n await expect(\n queues.syncRuns.enqueue({\n projectId: \" \",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"sync-1\" } }],\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"claim\", () => {\n test(\"increments attempt to 1 on first successful claim\", async () => {\n await withQueues(async (queues) => {\n await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { runId: \"p-1\" } }],\n })\n\n const [claimed] = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n expect(claimed?.job.attempt).toBe(1)\n expect(claimed?.job.payload.runId).toBe(\"p-1\")\n expect(claimed?.leaseId).toBeTruthy()\n expect(Date.parse(claimed!.leaseExpiresAt)).toBeGreaterThan(\n Date.parse(claimed!.claimedAt)\n )\n })\n })\n\n test(\"returns empty array when limit is 0 or negative\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n\n const zero = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: 0,\n })\n const negative = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: -5,\n })\n\n expect(zero).toEqual([])\n expect(negative).toEqual([])\n })\n })\n\n test(\"rejects non-positive leaseMs with QueueError\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"w-1\", leaseMs: 0 })\n ).rejects.toBeInstanceOf(QueueError)\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"w-1\", leaseMs: -1 })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n\n test(\"respects delayed visibility via availableAt\", async () => {\n await withQueues(async (queues) => {\n const availableAt = new Date(Date.now() + shortLeaseMs + 20).toISOString()\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" }, availableAt }],\n })\n\n const before = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n await Bun.sleep(shortLeaseMs + 40)\n const after = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n expect(before).toHaveLength(0)\n expect(after).toHaveLength(1)\n expect(after[0]?.job.availableAt).toBe(availableAt)\n })\n })\n\n test(\"isolates jobs across distinct projectIds\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"a-1\" } }],\n })\n await queues.syncRuns.enqueue({\n projectId: \"project-b\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"b-1\" } }],\n })\n\n const claimedB = await queues.syncRuns.claim({\n projectId: \"project-b\",\n workerId: \"worker-b\",\n limit: 10,\n })\n\n expect(claimedB).toHaveLength(1)\n expect(claimedB[0]?.job.payload.runId).toBe(\"b-1\")\n expect(claimedB[0]?.job.projectId).toBe(\"project-b\")\n })\n })\n\n test(\"keeps syncRuns, pipelines, projections, workflows, and actions lanes independent\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { runId: \"p-1\" } }],\n })\n await queues.projections.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"projection.run.requested\",\n payload: { runId: \"projection-run-1\" },\n },\n ],\n })\n await queues.workflows.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"workflow.run.requested\",\n payload: { runId: \"workflow-run-1\" },\n },\n ],\n })\n await queues.actions.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"action.run.requested\",\n payload: {\n runId: \"act_1\",\n },\n },\n ],\n })\n\n const crossLane = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-1\",\n limit: 10,\n })\n const projectionLane = await queues.projections.claim({\n projectId: \"project-a\",\n workerId: \"projection-worker-1\",\n limit: 10,\n })\n const workflowLane = await queues.workflows.claim({\n projectId: \"project-a\",\n workerId: \"workflow-worker-1\",\n limit: 10,\n })\n const actionLane = await queues.actions.claim({\n projectId: \"project-a\",\n workerId: \"action-worker-1\",\n limit: 10,\n })\n const sameLane = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"sync-worker-1\",\n limit: 10,\n })\n\n expect(crossLane).toHaveLength(1)\n expect(crossLane[0]?.job.payload.runId).toBe(\"p-1\")\n expect(projectionLane).toHaveLength(1)\n expect(projectionLane[0]?.job.payload.runId).toBe(\"projection-run-1\")\n expect(workflowLane).toHaveLength(1)\n expect(workflowLane[0]?.job.payload.runId).toBe(\"workflow-run-1\")\n expect(actionLane).toHaveLength(1)\n expect(actionLane[0]?.job.payload.runId).toBe(\"act_1\")\n expect(sameLane).toHaveLength(1)\n })\n })\n })\n\n describe(\"complete\", () => {\n test(\"removes the job from the lane permanently\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n await queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n })\n\n const later = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n limit: 10,\n })\n expect(later).toHaveLength(0)\n })\n })\n\n test(\"rejects a wrong leaseId with QueueError\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n await expect(\n queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: \"not-the-right-lease\",\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"retry\", () => {\n test(\"reschedules the job and bumps attempt on next claim\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [firstClaim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n const retryAt = new Date(Date.now() + retryRedeliveryMs).toISOString()\n await queues.syncRuns.retry({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: firstClaim!.leaseId,\n availableAt: retryAt,\n })\n await Bun.sleep(retryRedeliveryMs + 30)\n const [secondClaim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n leaseMs: shortLeaseMs,\n })\n\n expect(secondClaim?.job.id).toBe(job?.id)\n expect(secondClaim?.job.attempt).toBe(2)\n })\n })\n\n test(\"rejects invalid availableAt with QueueError\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n await expect(\n queues.syncRuns.retry({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n availableAt: \"not-a-timestamp\",\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"fail\", () => {\n test(\"marks the job as terminally failed\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { runId: \"p-1\" } }],\n })\n const [claim] = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-1\",\n })\n\n await queues.pipelines.fail({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n failure: TERMINAL_FAILURE,\n })\n\n const later = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-2\",\n limit: 10,\n })\n expect(later).toHaveLength(0)\n })\n })\n })\n\n describe(\"renewLease\", () => {\n test(\"extends the lease and returns an updated claim\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs + 20,\n })\n\n const renewed = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n leaseMs: shortLeaseMs * 5,\n })\n\n expect(renewed?.job.id).toBe(job?.id)\n expect(renewed?.leaseId).toBe(claim?.leaseId)\n expect(Date.parse(renewed!.leaseExpiresAt)).toBeGreaterThan(\n Date.parse(claim!.leaseExpiresAt)\n )\n })\n })\n\n test(\"returns null for unknown jobId\", async () => {\n await withQueues(async (queues) => {\n const result = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: \"00000000-0000-0000-0000-000000000000\",\n leaseId: \"no-such-lease\",\n leaseMs: shortLeaseMs,\n })\n\n expect(result).toBeNull()\n })\n })\n\n test(\"returns null when the leaseId does not match\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n const renewed = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: \"not-the-right-lease\",\n leaseMs: shortLeaseMs,\n })\n\n expect(renewed).toBeNull()\n })\n })\n })\n\n describe(\"redelivery\", () => {\n test(\"redelivers after lease expiry with attempt incremented\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [first] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n await Bun.sleep(leaseExpiryRedeliveryMs)\n const [second] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n leaseMs: shortLeaseMs,\n })\n\n expect(first?.job.attempt).toBe(1)\n expect(second?.job.id).toBe(job?.id)\n expect(second!.job.attempt).toBeGreaterThanOrEqual(2)\n })\n })\n\n test(\"rejects complete on an already-expired lease\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n await Bun.sleep(leaseExpiryRedeliveryMs)\n\n await expect(\n queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"health\", () => {\n // `sixb check` reports its queues row from this call. While the method was absent, that row\n // was a literal the command printed green.\n test(\"resolves against a reachable backend\", async () => {\n await withQueues(async (queues) => {\n await expect(queues.health()).resolves.toBeUndefined()\n })\n })\n })\n\n describe(\"scope\", () => {\n // Asserted rather than left to the type checker: a provider that declares the wrong scope is\n // a deployment that looks healthy and claims nothing.\n test(\"declares whether it can be shared across processes\", async () => {\n await withQueues(async (queues) => {\n expect([\"process\", \"shared\"]).toContain(queues.scope)\n })\n })\n })\n })\n}\n",
|
|
33
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { QueueError } from \"../queues/errors\"\nimport type { PipelineQueueJobFailureCode, QueueJobFailure, Queues } from \"../queues/types\"\n\nconst TERMINAL_FAILURE = {\n code: \"internal.unexpected\",\n retryable: false,\n message: \"boom\",\n at: \"2026-01-01T00:00:00.000Z\",\n details: { pipelineId: \"p-1\" },\n} as const satisfies QueueJobFailure<PipelineQueueJobFailureCode>\n\nexport interface QueueContractSuiteOptions {\n /** Factory that produces a fresh `Queues` instance for each test case. */\n readonly createQueues: () => Queues | Promise<Queues>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (queues: Queues) => void | Promise<void>\n /**\n * Lease duration used in lease-expiry redelivery assertions. Providers with a stalled-check\n * interval (e.g., BullMQ) need a larger value than in-memory providers. Defaults to 20ms.\n */\n readonly shortLeaseMs?: number\n /**\n * Time to wait for a claim to become re-visible after its lease expires. Defaults to\n * `shortLeaseMs + 10`; providers that rely on a periodic checker must add that interval.\n */\n readonly leaseExpiryRedeliveryMs?: number\n /**\n * Time to wait for a delayed retry to become visible again. Defaults to `shortLeaseMs + 15`.\n */\n readonly retryRedeliveryMs?: number\n}\n\n/**\n * Runs the shared `Queues` contract against any provider.\n *\n * Every provider must exhibit the same enqueue/claim/complete/retry/fail/renewLease behavior\n * described here, which is the authoritative specification for Sixb queues — each test is\n * written in Arrange/Act/Assert form, with timing parameters exposed for providers that need\n * them (short lease durations, periodic checker intervals).\n */\nexport function runQueueContractSuite(label: string, options: QueueContractSuiteOptions): void {\n const shortLeaseMs = options.shortLeaseMs ?? 20\n const leaseExpiryRedeliveryMs = options.leaseExpiryRedeliveryMs ?? shortLeaseMs + 10\n const retryRedeliveryMs = options.retryRedeliveryMs ?? shortLeaseMs + 15\n\n const withQueues = async (body: (queues: Queues) => Promise<void>): Promise<void> => {\n const queues = await options.createQueues()\n try {\n await body(queues)\n } finally {\n await options.teardown?.(queues)\n }\n }\n\n describe(label, () => {\n describe(\"enqueue\", () => {\n test(\"returns envelopes with generated id, createdAt, availableAt, attempt=0\", async () => {\n await withQueues(async (queues) => {\n const before = Date.now()\n\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"sync.run.requested\",\n payload: { runId: \"sync-1\" },\n },\n ],\n })\n\n expect(job?.id).toMatch(/^[0-9a-f-]{36}$/)\n expect(job?.projectId).toBe(\"project-a\")\n expect(job?.attempt).toBe(0)\n expect(job?.type).toBe(\"sync.run.requested\")\n expect(job?.payload.runId).toBe(\"sync-1\")\n expect(Date.parse(job!.createdAt)).toBeGreaterThanOrEqual(before)\n expect(job?.availableAt).toBe(job?.createdAt)\n })\n })\n\n test(\"deduplicates repeated enqueue with a caller-supplied id\", async () => {\n await withQueues(async (queues) => {\n const input = {\n id: \"dispatch-run-1\",\n type: \"sync.run.requested\" as const,\n payload: { runId: \"sync-1\" },\n }\n const [[first], [second]] = await Promise.all([\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n ])\n\n expect(first?.id).toBe(input.id)\n expect(second?.id).toBe(input.id)\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"worker-1\", limit: 2 })\n ).resolves.toHaveLength(1)\n })\n })\n\n test(\"treats caller-supplied ids as opaque across the job lifecycle\", async () => {\n await withQueues(async (queues) => {\n const id = \"workflow:review-meeting:node:0\"\n const input = {\n id,\n type: \"sync.run.requested\" as const,\n payload: { runId: \"sync-1\" },\n }\n\n const [[first], [duplicate]] = await Promise.all([\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n ])\n const [claimed] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: 2,\n })\n\n expect(first?.id).toBe(id)\n expect(duplicate?.id).toBe(id)\n expect(claimed?.job.id).toBe(id)\n if (queues.syncRuns.renewLease) {\n await expect(\n queues.syncRuns.renewLease({\n projectId: \"project-a\",\n jobId: id,\n leaseId: claimed!.leaseId,\n leaseMs: shortLeaseMs * 10,\n })\n ).resolves.toMatchObject({ job: { id } })\n }\n await queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: id,\n leaseId: claimed!.leaseId,\n })\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"worker-2\" })\n ).resolves.toHaveLength(0)\n })\n })\n\n test(\"returns empty array when no jobs are passed\", async () => {\n await withQueues(async (queues) => {\n const result = await queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [] })\n\n expect(result).toEqual([])\n })\n })\n\n test(\"rejects empty projectId with QueueError\", async () => {\n await withQueues(async (queues) => {\n await expect(\n queues.syncRuns.enqueue({\n projectId: \" \",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"sync-1\" } }],\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"claim\", () => {\n test(\"increments attempt to 1 on first successful claim\", async () => {\n await withQueues(async (queues) => {\n await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { runId: \"p-1\" } }],\n })\n\n const [claimed] = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n expect(claimed?.job.attempt).toBe(1)\n expect(claimed?.job.payload.runId).toBe(\"p-1\")\n expect(claimed?.leaseId).toBeTruthy()\n expect(Date.parse(claimed!.leaseExpiresAt)).toBeGreaterThan(\n Date.parse(claimed!.claimedAt)\n )\n })\n })\n\n test(\"returns empty array when limit is 0 or negative\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n\n const zero = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: 0,\n })\n const negative = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: -5,\n })\n\n expect(zero).toEqual([])\n expect(negative).toEqual([])\n })\n })\n\n test(\"rejects non-positive leaseMs with QueueError\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"w-1\", leaseMs: 0 })\n ).rejects.toBeInstanceOf(QueueError)\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"w-1\", leaseMs: -1 })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n\n test(\"respects delayed visibility via availableAt\", async () => {\n await withQueues(async (queues) => {\n const availableAt = new Date(Date.now() + shortLeaseMs + 20).toISOString()\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" }, availableAt }],\n })\n\n const before = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n await Bun.sleep(shortLeaseMs + 40)\n const after = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n expect(before).toHaveLength(0)\n expect(after).toHaveLength(1)\n expect(after[0]?.job.availableAt).toBe(availableAt)\n })\n })\n\n test(\"isolates jobs across distinct projectIds\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"a-1\" } }],\n })\n await queues.syncRuns.enqueue({\n projectId: \"project-b\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"b-1\" } }],\n })\n\n const claimedB = await queues.syncRuns.claim({\n projectId: \"project-b\",\n workerId: \"worker-b\",\n limit: 10,\n })\n\n expect(claimedB).toHaveLength(1)\n expect(claimedB[0]?.job.payload.runId).toBe(\"b-1\")\n expect(claimedB[0]?.job.projectId).toBe(\"project-b\")\n })\n })\n\n test(\"keeps every worker lane independent\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { runId: \"p-1\" } }],\n })\n await queues.projections.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"projection.run.requested\",\n payload: { runId: \"projection-run-1\" },\n },\n ],\n })\n await queues.workflows.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"workflow.run.requested\",\n payload: { runId: \"workflow-run-1\" },\n },\n ],\n })\n await queues.actions.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"action.run.requested\",\n payload: {\n runId: \"act_1\",\n },\n },\n ],\n })\n await queues.agents.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"agent.run.requested\",\n payload: { runId: \"agent-run-1\" },\n },\n ],\n })\n await queues.agentChildren.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"agent.subagent-run.requested\",\n payload: { runId: \"child-run-1\" },\n },\n ],\n })\n\n const crossLane = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-1\",\n limit: 10,\n })\n const projectionLane = await queues.projections.claim({\n projectId: \"project-a\",\n workerId: \"projection-worker-1\",\n limit: 10,\n })\n const workflowLane = await queues.workflows.claim({\n projectId: \"project-a\",\n workerId: \"workflow-worker-1\",\n limit: 10,\n })\n const actionLane = await queues.actions.claim({\n projectId: \"project-a\",\n workerId: \"action-worker-1\",\n limit: 10,\n })\n const agentLane = await queues.agents.claim({\n projectId: \"project-a\",\n workerId: \"agent-worker-1\",\n limit: 10,\n })\n const childLane = await queues.agentChildren.claim({\n projectId: \"project-a\",\n workerId: \"child-agent-worker-1\",\n limit: 10,\n })\n const sameLane = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"sync-worker-1\",\n limit: 10,\n })\n\n expect(crossLane).toHaveLength(1)\n expect(crossLane[0]?.job.payload.runId).toBe(\"p-1\")\n expect(projectionLane).toHaveLength(1)\n expect(projectionLane[0]?.job.payload.runId).toBe(\"projection-run-1\")\n expect(workflowLane).toHaveLength(1)\n expect(workflowLane[0]?.job.payload.runId).toBe(\"workflow-run-1\")\n expect(actionLane).toHaveLength(1)\n expect(actionLane[0]?.job.payload.runId).toBe(\"act_1\")\n expect(agentLane).toHaveLength(1)\n expect(agentLane[0]?.job).toMatchObject({\n type: \"agent.run.requested\",\n payload: { runId: \"agent-run-1\" },\n })\n expect(childLane).toHaveLength(1)\n expect(childLane[0]?.job.payload.runId).toBe(\"child-run-1\")\n expect(sameLane).toHaveLength(1)\n })\n })\n })\n\n describe(\"complete\", () => {\n test(\"removes the job from the lane permanently\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n await queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n })\n\n const later = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n limit: 10,\n })\n expect(later).toHaveLength(0)\n })\n })\n\n test(\"rejects a wrong leaseId with QueueError\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n await expect(\n queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: \"not-the-right-lease\",\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"retry\", () => {\n test(\"reschedules the job and bumps attempt on next claim\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [firstClaim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n const retryAt = new Date(Date.now() + retryRedeliveryMs).toISOString()\n await queues.syncRuns.retry({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: firstClaim!.leaseId,\n availableAt: retryAt,\n })\n await Bun.sleep(retryRedeliveryMs + 30)\n const [secondClaim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n leaseMs: shortLeaseMs,\n })\n\n expect(secondClaim?.job.id).toBe(job?.id)\n expect(secondClaim?.job.attempt).toBe(2)\n })\n })\n\n test(\"rejects invalid availableAt with QueueError\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n await expect(\n queues.syncRuns.retry({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n availableAt: \"not-a-timestamp\",\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"fail\", () => {\n test(\"marks the job as terminally failed\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { runId: \"p-1\" } }],\n })\n const [claim] = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-1\",\n })\n\n await queues.pipelines.fail({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n failure: TERMINAL_FAILURE,\n })\n\n const later = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-2\",\n limit: 10,\n })\n expect(later).toHaveLength(0)\n })\n })\n })\n\n describe(\"renewLease\", () => {\n test(\"extends the lease and returns an updated claim\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs + 20,\n })\n\n const renewed = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n leaseMs: shortLeaseMs * 5,\n })\n\n expect(renewed?.job.id).toBe(job?.id)\n expect(renewed?.leaseId).toBe(claim?.leaseId)\n expect(Date.parse(renewed!.leaseExpiresAt)).toBeGreaterThan(\n Date.parse(claim!.leaseExpiresAt)\n )\n })\n })\n\n test(\"returns null for unknown jobId\", async () => {\n await withQueues(async (queues) => {\n const result = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: \"00000000-0000-0000-0000-000000000000\",\n leaseId: \"no-such-lease\",\n leaseMs: shortLeaseMs,\n })\n\n expect(result).toBeNull()\n })\n })\n\n test(\"returns null when the leaseId does not match\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n const renewed = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: \"not-the-right-lease\",\n leaseMs: shortLeaseMs,\n })\n\n expect(renewed).toBeNull()\n })\n })\n })\n\n describe(\"redelivery\", () => {\n test(\"redelivers after lease expiry with attempt incremented\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [first] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n await Bun.sleep(leaseExpiryRedeliveryMs)\n const [second] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n leaseMs: shortLeaseMs,\n })\n\n expect(first?.job.attempt).toBe(1)\n expect(second?.job.id).toBe(job?.id)\n expect(second!.job.attempt).toBeGreaterThanOrEqual(2)\n })\n })\n\n test(\"rejects complete on an already-expired lease\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { runId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n await Bun.sleep(leaseExpiryRedeliveryMs)\n\n await expect(\n queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"health\", () => {\n // `sixb check` reports its queues row from this call. While the method was absent, that row\n // was a literal the command printed green.\n test(\"resolves against a reachable backend\", async () => {\n await withQueues(async (queues) => {\n await expect(queues.health()).resolves.toBeUndefined()\n })\n })\n })\n\n describe(\"scope\", () => {\n // Asserted rather than left to the type checker: a provider that declares the wrong scope is\n // a deployment that looks healthy and claims nothing.\n test(\"declares whether it can be shared across processes\", async () => {\n await withQueues(async (queues) => {\n expect([\"process\", \"shared\"]).toContain(queues.scope)\n })\n })\n })\n })\n}\n",
|
|
29
34
|
"import { afterEach, beforeEach, describe, expect, test } from \"bun:test\"\nimport { realpath } from \"node:fs/promises\"\nimport { type SandboxFactory, SandboxNotRunningError } from \"../sandboxes\"\n\n/**\n * Capability flags letting a provider declare which contract slices are\n * meaningful for it. Tests gated by an unsupported capability are skipped.\n */\nexport interface SandboxesContractCapabilities {\n /** network.mode=\"none\" actually blocks outbound network access. */\n readonly networkBlocking?: boolean\n /** readOnlyPaths/readWritePaths actually restrict filesystem writes. */\n readonly readOnlyEnforcement?: boolean\n /** Strong isolation, such as process namespaces, is in effect. */\n readonly isolation?: boolean\n}\n\nexport interface SandboxesContractSuiteOptions {\n /** Factory under test. Called once per describe block. */\n readonly createFactory: () => SandboxFactory | Promise<SandboxFactory>\n /** Optional cleanup invoked once per test after factory-created sandboxes are destroyed. */\n readonly teardown?: (factory: SandboxFactory) => void | Promise<void>\n readonly capabilities?: SandboxesContractCapabilities\n /**\n * Timeout in milliseconds used by the timeout/abort tests. Bump on slow CI.\n * Default 200ms.\n */\n readonly shortTimeoutMs?: number\n}\n\nconst SLEEP_BUDGET_SECONDS = 5\n\n/**\n * Provider-independent contract for Sandbox and SandboxFactory. Concrete\n * providers wire this into their tests via runSandboxesContractSuite(...).\n */\nexport function runSandboxesContractSuite(\n label: string,\n options: SandboxesContractSuiteOptions\n): void {\n const shortTimeoutMs = options.shortTimeoutMs ?? 200\n const capabilities = options.capabilities ?? {}\n\n describe(label, () => {\n let factory: SandboxFactory\n\n beforeEach(async () => {\n factory = await options.createFactory()\n })\n\n afterEach(async () => {\n await options.teardown?.(factory)\n })\n\n describe(\"lifecycle\", () => {\n test(\"create returns a running sandbox with a non-empty id\", async () => {\n const sandbox = await factory.create()\n try {\n expect(sandbox.status).toBe(\"running\")\n expect(sandbox.id.length).toBeGreaterThan(0)\n expect(sandbox.workingDirectory.length).toBeGreaterThan(0)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"runCommand returns exit code 0 and captured stdout for echo\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"echo\", [\"hello\"])\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(\"hello\")\n expect(result.stderr).toBe(\"\")\n expect(result.durationMs).toBeGreaterThanOrEqual(0)\n expect(result.timedOut).not.toBe(true)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"nonexistent binary resolves with non-zero exit code\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"does-not-exist-xyz-sixb-test\", [])\n expect(result.exitCode).not.toBe(0)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"captures stdout and stderr as separate streams\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"/bin/sh\", [\n \"-c\",\n \"echo out-line; echo err-line >&2; exit 0\",\n ])\n expect(result.exitCode).toBe(0)\n expect(result.stdout).toContain(\"out-line\")\n expect(result.stderr).toContain(\"err-line\")\n expect(result.stdout).not.toContain(\"err-line\")\n expect(result.stderr).not.toContain(\"out-line\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"stop transitions status and rejects subsequent runCommand\", async () => {\n const sandbox = await factory.create()\n try {\n await sandbox.stop()\n expect(sandbox.status).toBe(\"stopped\")\n await expect(sandbox.runCommand(\"echo\", [\"nope\"])).rejects.toBeInstanceOf(\n SandboxNotRunningError\n )\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"destroy is idempotent\", async () => {\n const sandbox = await factory.create()\n await sandbox.destroy()\n await sandbox.destroy()\n await expect(sandbox.runCommand(\"echo\", [\"x\"])).rejects.toBeInstanceOf(\n SandboxNotRunningError\n )\n })\n })\n\n describe(\"working directory\", () => {\n test(\"pwd reflects the configured workingDirectory\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"pwd\")\n const expected = await realpath(sandbox.workingDirectory)\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(expected)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"per-call cwd overrides the sandbox-level workingDirectory\", async () => {\n const sandbox = await factory.create()\n try {\n const expected = await realpath(\"/tmp\")\n const result = await sandbox.runCommand(\"pwd\", [], { cwd: \"/tmp\" })\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(expected)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n\n describe(\"env merging\", () => {\n test(\"sandbox-level env is visible to commands\", async () => {\n const sandbox = await factory.create({ env: { SIXB_TEST_A: \"alpha\" } })\n try {\n const result = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_A\"])\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(\"alpha\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"per-call env wins on collision and adds new keys\", async () => {\n const sandbox = await factory.create({\n env: { SIXB_TEST_A: \"alpha\", SIXB_TEST_B: \"beta\" },\n })\n try {\n const a = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_A\"], {\n env: { SIXB_TEST_A: \"alpha2\", SIXB_TEST_C: \"gamma\" },\n })\n const b = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_B\"], {\n env: { SIXB_TEST_A: \"alpha2\", SIXB_TEST_C: \"gamma\" },\n })\n const c = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_C\"], {\n env: { SIXB_TEST_A: \"alpha2\", SIXB_TEST_C: \"gamma\" },\n })\n expect(a.stdout.trim()).toBe(\"alpha2\")\n expect(b.stdout.trim()).toBe(\"beta\")\n expect(c.stdout.trim()).toBe(\"gamma\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"host secrets are not leaked into the sandbox\", async () => {\n const secretKey = \"SIXB_HOST_SECRET_DO_NOT_LEAK\"\n const previous = process.env[secretKey]\n process.env[secretKey] = \"host-only-value\"\n try {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"printenv\", [secretKey])\n expect(result.exitCode).not.toBe(0)\n expect(result.stdout).not.toContain(\"host-only-value\")\n } finally {\n await sandbox.destroy()\n }\n } finally {\n if (previous === undefined) {\n delete process.env[secretKey]\n } else {\n process.env[secretKey] = previous\n }\n }\n })\n })\n\n describe(\"timeout and abort\", () => {\n test(\"sleep beyond timeout marks the result timedOut and exits non-zero\", async () => {\n const sandbox = await factory.create()\n try {\n const start = Date.now()\n const result = await sandbox.runCommand(\"sleep\", [String(SLEEP_BUDGET_SECONDS)], {\n timeout: shortTimeoutMs,\n })\n const elapsed = Date.now() - start\n expect(result.timedOut).toBe(true)\n expect(result.exitCode).not.toBe(0)\n expect(elapsed).toBeLessThan(SLEEP_BUDGET_SECONDS * 1000)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"abort signal aborts an in-flight command\", async () => {\n const sandbox = await factory.create()\n try {\n const ac = new AbortController()\n setTimeout(() => ac.abort(), shortTimeoutMs)\n const start = Date.now()\n const result = await sandbox.runCommand(\"sleep\", [String(SLEEP_BUDGET_SECONDS)], {\n signal: ac.signal,\n })\n const elapsed = Date.now() - start\n expect(result.exitCode).not.toBe(0)\n expect(elapsed).toBeLessThan(SLEEP_BUDGET_SECONDS * 1000)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"per-call timeout overrides sandbox-level timeout\", async () => {\n const sandbox = await factory.create({ timeout: SLEEP_BUDGET_SECONDS * 1000 })\n try {\n const result = await sandbox.runCommand(\"sleep\", [String(SLEEP_BUDGET_SECONDS)], {\n timeout: shortTimeoutMs,\n })\n expect(result.timedOut).toBe(true)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n\n describe(\"file materialization\", () => {\n test(\"writeFiles materializes files a subsequent command can read\", async () => {\n const sandbox = await factory.create()\n try {\n const flat = `${sandbox.workingDirectory}/materialized.txt`\n const nested = `${sandbox.workingDirectory}/nested/dir/deep.txt`\n await sandbox.writeFiles([\n { path: flat, contents: \"flat-contents\" },\n { path: nested, contents: \"nested-contents\" },\n ])\n\n const flatResult = await sandbox.runCommand(\"cat\", [flat])\n expect(flatResult.exitCode).toBe(0)\n expect(flatResult.stdout).toContain(\"flat-contents\")\n\n // A nested path proves writeFiles creates missing parent directories.\n const nestedResult = await sandbox.runCommand(\"cat\", [nested])\n expect(nestedResult.exitCode).toBe(0)\n expect(nestedResult.stdout).toContain(\"nested-contents\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writeFiles round-trips binary contents faithfully\", async () => {\n const sandbox = await factory.create()\n try {\n const path = `${sandbox.workingDirectory}/binary.dat`\n const bytes = new Uint8Array([0x00, 0x01, 0xfe, 0xff, 0x0a, 0x7f])\n await sandbox.writeFiles([{ path, contents: bytes }])\n\n const size = await sandbox.runCommand(\"wc\", [\"-c\", path])\n expect(size.exitCode).toBe(0)\n expect(size.stdout.trim().split(/\\s+/)[0]).toBe(String(bytes.length))\n\n // od proves the exact bytes survived transport (e.g. a provider's base64 round-trip).\n const hex = await sandbox.runCommand(\"od\", [\"-An\", \"-v\", \"-tx1\", path])\n expect(hex.exitCode).toBe(0)\n expect(hex.stdout.replace(/\\s+/g, \" \").trim()).toBe(\"00 01 fe ff 0a 7f\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writeFiles applies an explicit file mode\", async () => {\n const sandbox = await factory.create()\n try {\n const path = `${sandbox.workingDirectory}/run.sh`\n await sandbox.writeFiles([{ path, contents: \"#!/bin/sh\\necho ran\\n\", mode: 0o755 }])\n\n // The exec bit is observable, proving mode was honored (not silently dropped).\n const result = await sandbox.runCommand(\"/bin/sh\", [\"-c\", `test -x ${path} && echo yes`])\n expect(result.exitCode).toBe(0)\n expect(result.stdout).toContain(\"yes\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writeFiles after stop rejects\", async () => {\n const sandbox = await factory.create()\n await sandbox.stop()\n try {\n await expect(\n sandbox.writeFiles([{ path: `${sandbox.workingDirectory}/x.txt`, contents: \"x\" }])\n ).rejects.toThrow(SandboxNotRunningError)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n\n if (capabilities.networkBlocking) {\n describe(\"network isolation\", () => {\n test('network.mode=\"none\" blocks outbound DNS / TCP', async () => {\n const sandbox = await factory.create({ network: { mode: \"none\" } })\n try {\n const result = await sandbox.runCommand(\"curl\", [\n \"-sS\",\n \"--max-time\",\n \"2\",\n \"https://example.com\",\n ])\n expect(result.exitCode).not.toBe(0)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test('network.mode=\"all\" permits outbound traffic', async () => {\n const sandbox = await factory.create({ network: { mode: \"all\" } })\n try {\n const result = await sandbox.runCommand(\"curl\", [\n \"-sS\",\n \"--max-time\",\n \"5\",\n \"https://example.com\",\n ])\n expect(result.exitCode).not.toBe(6)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n }\n\n // Restricted per-origin egress is intentionally NOT covered here: the only provider that enforces\n // it (smolvm) can be verified only by a live in-VM network call, which needs a network-capable\n // guest image and outbound internet — infrastructure this suite deliberately avoids so it stays\n // hermetic. smolvm's allow-list flag construction is unit-tested in its network-argv tests\n // instead. Add a conformance slice here once a provider can enforce egress under hermetic tests.\n\n if (capabilities.readOnlyEnforcement) {\n describe(\"filesystem isolation\", () => {\n test(\"writing inside readWritePaths succeeds\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"/bin/sh\", [\n \"-c\",\n `echo content > ${sandbox.workingDirectory}/probe.txt && cat ${sandbox.workingDirectory}/probe.txt`,\n ])\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(\"content\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writing outside readWritePaths fails\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"/bin/sh\", [\n \"-c\",\n \"echo nope > /etc/sixb-sandbox-must-not-write\",\n ])\n expect(result.exitCode).not.toBe(0)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n }\n })\n}\n",
|
|
35
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { CreateShareGrantInput, ShareGrantStorage } from \"../storage/share-grants\"\n\nexport interface ShareGrantStorageContractSuiteOptions<\n TStorage extends ShareGrantStorage = ShareGrantStorage,\n> {\n /** Returns an isolated provider capability for every test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"share-grant-contract\"\nconst createdAt = new Date(\"2026-08-19T12:00:00.000Z\")\nconst expiresAt = new Date(\"2026-08-20T12:00:00.000Z\")\n\n/** Provider-neutral lifecycle and isolation contract for durable Share grants. */\nexport function runShareGrantStorageContractSuite<TStorage extends ShareGrantStorage>(\n label: string,\n options: ShareGrantStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (run: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await run(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"stores derived authority and returns defensive copies\", async () => {\n await withStorage(async (storage) => {\n const input = grantInput()\n const created = await storage.create(input)\n\n ;(input.target as { primaryId: string }).primaryId = \"mutated-input\"\n ;(input.issuedBy as { id: string }).id = \"mutated-input\"\n input.createdAt.setUTCFullYear(2040)\n attemptMutation(() => {\n ;(created.target as { primaryId: string }).primaryId = \"mutated-result\"\n })\n created.createdAt.setUTCFullYear(2041)\n const viewGrant = created.authoritySnapshot.access.grants[0]\n if (!viewGrant || viewGrant.kind !== \"object.view\") {\n throw new Error(\"Share grant storage fixture must contain an object.view grant.\")\n }\n attemptMutation(() => {\n ;(viewGrant.selection.roots[0]!.anchor as { primaryId: string }).primaryId =\n \"mutated-result\"\n })\n\n const stored = await storage.getById({ projectId, id: \"shr_1\" })\n expect(stored).toMatchObject({\n id: \"shr_1\",\n target: { objectTypeId: \"Report\", primaryId: \"report-1\" },\n issuedBy: { type: \"user\", id: \"usr_1\" },\n authoritySnapshot: { version: 1 },\n destinationPath: \"/reports/report-1\",\n createdAt,\n expiresAt,\n })\n expect(stored?.authorityDigest).toMatch(/^[0-9a-f]{64}$/)\n expect(stored?.tokenHash).toBe(\"a\".repeat(64))\n })\n })\n\n test(\"enforces id and token-hash uniqueness per project\", async () => {\n await withStorage(async (storage) => {\n await storage.create(grantInput())\n await expect(\n storage.create(grantInput({ tokenHash: \"b\".repeat(64) }))\n ).rejects.toMatchObject({ code: \"duplicate\" })\n await expect(storage.create(grantInput({ id: \"shr_2\" }))).rejects.toMatchObject({\n code: \"duplicate\",\n })\n\n await expect(\n storage.create(grantInput({ projectId: \"other-project\" }))\n ).resolves.toMatchObject({ id: \"shr_1\", projectId: \"other-project\" })\n })\n })\n\n test(\"lists a bounded deterministic page with total and hasMore\", async () => {\n await withStorage(async (storage) => {\n await storage.create(grantInput({ id: \"shr_a\", tokenHash: \"b\".repeat(64) }))\n await storage.create(grantInput({ id: \"shr_z\", tokenHash: \"c\".repeat(64) }))\n await storage.create(\n grantInput({\n id: \"shr_newer\",\n tokenHash: \"d\".repeat(64),\n createdAt: new Date(\"2026-08-19T13:00:00.000Z\"),\n })\n )\n\n await expect(\n storage.list({ projectId, now: createdAt, limit: 2, offset: 0 })\n ).resolves.toMatchObject({\n grants: [{ id: \"shr_newer\" }, { id: \"shr_z\" }],\n total: 3,\n hasMore: true,\n })\n await expect(\n storage.list({ projectId, now: createdAt, limit: 2, offset: 2 })\n ).resolves.toMatchObject({\n grants: [{ id: \"shr_a\" }],\n total: 3,\n hasMore: false,\n })\n })\n })\n\n test(\"filters by project, definition, target, expiry, and revocation\", async () => {\n await withStorage(async (storage) => {\n await storage.create(grantInput({ id: \"active\", tokenHash: \"b\".repeat(64) }))\n await storage.create(\n grantInput({\n id: \"other-target\",\n tokenHash: \"c\".repeat(64),\n targetPrimaryId: \"report-2\",\n destinationPath: \"/reports/report-2\",\n })\n )\n await storage.create(\n grantInput({ id: \"other-definition\", tokenHash: \"d\".repeat(64), definitionId: \"other\" })\n )\n await storage.create(\n grantInput({\n id: \"expired\",\n tokenHash: \"e\".repeat(64),\n expiresAt: new Date(\"2026-08-19T12:30:00.000Z\"),\n })\n )\n await storage.create(grantInput({ id: \"revoked\", tokenHash: \"f\".repeat(64) }))\n await storage.revoke({\n projectId,\n id: \"revoked\",\n revokedAt: new Date(\"2026-08-19T12:15:00.000Z\"),\n revokedBy: { type: \"user\", id: \"usr_revoker\" },\n })\n await storage.create(grantInput({ projectId: \"other-project\" }))\n\n const filter = {\n projectId,\n definitionId: \"published-report\",\n target: { objectTypeId: \"Report\", primaryId: \"report-1\" },\n now: new Date(\"2026-08-19T13:00:00.000Z\"),\n }\n await expect(storage.list(filter)).resolves.toMatchObject({\n grants: [{ id: \"active\" }],\n total: 1,\n hasMore: false,\n })\n const allStates = await storage.list({\n ...filter,\n includeExpired: true,\n includeRevoked: true,\n })\n expect(allStates.grants.map((grant) => grant.id)).toEqual([\"revoked\", \"expired\", \"active\"])\n })\n })\n\n test(\"treats the exact expiry instant as inactive\", async () => {\n await withStorage(async (storage) => {\n await storage.create(grantInput())\n await expect(storage.list({ projectId, now: expiresAt })).resolves.toMatchObject({\n grants: [],\n total: 0,\n })\n await expect(\n storage.list({ projectId, now: expiresAt, includeExpired: true })\n ).resolves.toMatchObject({ grants: [{ id: \"shr_1\" }], total: 1 })\n })\n })\n\n test(\"keeps the first concurrent revocation and makes later calls idempotent\", async () => {\n await withStorage(async (storage) => {\n await storage.create(grantInput())\n const left = {\n projectId,\n id: \"shr_1\",\n revokedAt: new Date(\"2026-08-19T13:00:00.000Z\"),\n revokedBy: { type: \"user\" as const, id: \"usr_left\" },\n }\n const right = {\n projectId,\n id: \"shr_1\",\n revokedAt: new Date(\"2026-08-19T14:00:00.000Z\"),\n revokedBy: { type: \"system\" as const, id: \"system\" },\n }\n\n const [first, second] = await Promise.all([storage.revoke(left), storage.revoke(right)])\n expect(first).toEqual(second)\n expect(\n await storage.revoke({ ...right, revokedAt: new Date(\"2026-08-19T15:00:00.000Z\") })\n ).toEqual(first)\n await expect(storage.revoke({ ...left, id: \"missing\" })).resolves.toBeNull()\n })\n })\n\n test(\"rejects invalid records and list windows consistently\", async () => {\n await withStorage(async (storage) => {\n const foreignAuthority = grantInput().authoritySnapshot\n const foreignViewGrant = foreignAuthority.access.grants[0]\n if (!foreignViewGrant || foreignViewGrant.kind !== \"object.view\") {\n throw new Error(\"Share grant storage fixture must contain an object.view grant.\")\n }\n ;(foreignViewGrant.selection.roots[0]!.anchor as { primaryId: string }).primaryId = \"other\"\n\n const invalid: CreateShareGrantInput[] = [\n grantInput({ projectId: \"\" }),\n grantInput({ tokenHash: \"not-a-hash\" }),\n grantInput({ destinationPath: \"https://example.com/report\" }),\n grantInput({ destinationPath: \"/reports//report-1\" }),\n grantInput({ destinationPath: \"/reports?id=1\" }),\n grantInput({ destinationPath: \"/shared\" }),\n grantInput({ destinationPath: \"/shared/report-1\" }),\n grantInput({ destinationPath: \"/shared%2Freport-1\" }),\n grantInput({ destinationPath: \"/shared%5Creport-1\" }),\n grantInput({ destinationPath: \"/%73hared/report-1\" }),\n grantInput({ expiresAt: new Date(createdAt) }),\n grantInput({ createdAt: new Date(\"invalid\") }),\n grantInput({ issuedBy: { type: \"system\", id: \"system\" } as never }),\n grantInput({ authoritySnapshot: foreignAuthority }),\n ]\n for (const input of invalid) {\n await expect(storage.create(input)).rejects.toMatchObject({ code: \"invalid_input\" })\n }\n await expect(storage.create(null as never)).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n await expect(storage.getById(null as never)).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n\n await expect(storage.list({ projectId, now: createdAt, limit: 201 })).rejects.toMatchObject(\n { code: \"invalid_input\" }\n )\n await expect(storage.list({ projectId, now: new Date(\"invalid\") })).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n })\n })\n\n test(\"rejects a revocation before creation without changing the grant\", async () => {\n await withStorage(async (storage) => {\n await storage.create(grantInput())\n await expect(\n storage.revoke({\n projectId,\n id: \"shr_1\",\n revokedAt: new Date(\"2026-08-19T11:59:59.999Z\"),\n revokedBy: { type: \"user\", id: \"usr_1\" },\n })\n ).rejects.toMatchObject({ code: \"invalid_input\" })\n const unchanged = await storage.getById({ projectId, id: \"shr_1\" })\n expect(unchanged).not.toBeNull()\n expect(unchanged).not.toHaveProperty(\"revokedAt\")\n expect(unchanged).not.toHaveProperty(\"revokedBy\")\n })\n })\n })\n}\n\nfunction grantInput(\n overrides: Partial<CreateShareGrantInput> & { readonly targetPrimaryId?: string } = {}\n): CreateShareGrantInput {\n const targetPrimaryId = overrides.targetPrimaryId ?? \"report-1\"\n const target = overrides.target ?? { objectTypeId: \"Report\", primaryId: targetPrimaryId }\n const base: CreateShareGrantInput = {\n id: \"shr_1\",\n projectId,\n definitionId: \"published-report\",\n target,\n issuedBy: { type: \"user\", id: \"usr_1\" },\n authoritySnapshot: authoritySnapshot(target.objectTypeId, target.primaryId),\n tokenHash: \"a\".repeat(64),\n destinationPath: \"/reports/report-1\",\n createdAt: new Date(createdAt),\n expiresAt: new Date(expiresAt),\n }\n const { targetPrimaryId: _targetPrimaryId, ...recordOverrides } = overrides\n return { ...base, ...recordOverrides }\n}\n\nfunction authoritySnapshot(\n objectTypeId: string,\n primaryId: string\n): CreateShareGrantInput[\"authoritySnapshot\"] {\n return {\n version: 1,\n access: {\n grants: [\n {\n kind: \"object.view\",\n selection: {\n kind: \"selected\",\n roots: [\n {\n anchor: { objectTypeId, primaryId },\n node: {\n objects: [{ objectTypeId, propertyIds: [\"id\", \"title\"] }],\n links: [],\n },\n },\n ],\n },\n },\n ],\n },\n }\n}\n\nexport function createShareGrantStorageContractInput(\n overrides: Partial<CreateShareGrantInput> = {}\n): CreateShareGrantInput {\n return grantInput(overrides)\n}\n\nfunction attemptMutation(mutate: () => void): void {\n try {\n mutate()\n } catch (error) {\n expect(error).toBeInstanceOf(TypeError)\n }\n}\n",
|
|
36
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type {\n CreateShareSessionInput,\n RenewShareSessionIfValidInput,\n ShareSessionStorage,\n} from \"../storage/share-sessions\"\n\nexport interface ShareSessionStorageContractSuiteOptions<\n TStorage extends ShareSessionStorage = ShareSessionStorage,\n> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"share-session-contract\"\nconst createdAt = new Date(\"2026-08-20T12:00:00.000Z\")\nconst expiresAt = new Date(\"2026-08-20T12:05:00.000Z\")\nconst absoluteExpiresAt = new Date(\"2026-08-20T12:20:00.000Z\")\n\n/** Provider-neutral lifecycle, monotonic-renewal, and isolation contract for Share sessions. */\nexport function runShareSessionStorageContractSuite<TStorage extends ShareSessionStorage>(\n label: string,\n options: ShareSessionStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (run: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await run(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"stores normalized records and returns defensive copies\", async () => {\n await withStorage(async (storage) => {\n const input = sessionInput()\n const created = await storage.create(input)\n input.createdAt.setUTCFullYear(2040)\n input.expiresAt.setUTCFullYear(2040)\n input.absoluteExpiresAt.setUTCFullYear(2040)\n created.createdAt.setUTCFullYear(2041)\n\n await expect(storage.getById({ projectId, id: \"shs_1\" })).resolves.toEqual(sessionInput())\n })\n })\n\n test(\"scopes identity and token-hash uniqueness to one project\", async () => {\n await withStorage(async (storage) => {\n await storage.create(sessionInput())\n await storage.create(sessionInput({ projectId: \"other-project\" }))\n\n await expect(\n storage.create(sessionInput({ tokenHash: \"b\".repeat(64) }))\n ).rejects.toMatchObject({ code: \"duplicate\" })\n await expect(storage.create(sessionInput({ id: \"shs_2\" }))).rejects.toMatchObject({\n code: \"duplicate\",\n })\n await expect(\n storage.getById({ projectId: \"other-project\", id: \"shs_1\" })\n ).resolves.toMatchObject({ projectId: \"other-project\" })\n })\n })\n\n test(\"rejects a session whose Share grant does not exist\", async () => {\n await withStorage(async (storage) => {\n await expect(storage.create(sessionInput({ grantId: \"missing\" }))).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n })\n })\n\n test(\"authenticates exact session identity and active deadlines\", async () => {\n await withStorage(async (storage) => {\n await storage.create(sessionInput())\n const valid = renewalInput({ expiresAt: new Date(\"2026-08-20T12:10:00.000Z\") })\n await expect(storage.renewIfValid(valid)).resolves.toMatchObject({\n id: \"shs_1\",\n expiresAt: new Date(\"2026-08-20T12:10:00.000Z\"),\n })\n await expect(storage.renewIfValid({ ...valid, id: \"missing\" })).resolves.toBeNull()\n await expect(storage.renewIfValid({ ...valid, grantId: \"shr_other\" })).resolves.toBeNull()\n await expect(\n storage.renewIfValid({ ...valid, tokenHash: \"b\".repeat(64) })\n ).resolves.toBeNull()\n await expect(\n storage.renewIfValid({ ...valid, now: new Date(\"2026-08-20T11:59:59.999Z\") })\n ).resolves.toBeNull()\n })\n })\n\n test(\"never shortens, resurrects, or exceeds the absolute deadline\", async () => {\n await withStorage(async (storage) => {\n await storage.create(sessionInput())\n\n await expect(\n storage.renewIfValid(renewalInput({ expiresAt: new Date(\"2026-08-20T12:04:00.000Z\") }))\n ).resolves.toMatchObject({ expiresAt })\n await expect(\n storage.renewIfValid(renewalInput({ expiresAt: new Date(\"2026-08-20T13:00:00.000Z\") }))\n ).resolves.toMatchObject({ expiresAt: absoluteExpiresAt })\n await expect(\n storage.renewIfValid(\n renewalInput({\n now: new Date(absoluteExpiresAt),\n expiresAt: new Date(\"2026-08-20T13:00:00.000Z\"),\n })\n )\n ).resolves.toBeNull()\n })\n })\n\n test(\"treats the exact inactivity expiry as expired\", async () => {\n await withStorage(async (storage) => {\n await storage.create(sessionInput())\n await expect(\n storage.renewIfValid(\n renewalInput({\n now: new Date(expiresAt),\n expiresAt: new Date(\"2026-08-20T12:10:00.000Z\"),\n })\n )\n ).resolves.toBeNull()\n })\n })\n\n test(\"keeps concurrent renewals monotonic\", async () => {\n await withStorage(async (storage) => {\n await storage.create(sessionInput())\n await Promise.all([\n storage.renewIfValid(renewalInput({ expiresAt: new Date(\"2026-08-20T12:09:00.000Z\") })),\n storage.renewIfValid(renewalInput({ expiresAt: new Date(\"2026-08-20T12:14:00.000Z\") })),\n ])\n await expect(storage.getById({ projectId, id: \"shs_1\" })).resolves.toMatchObject({\n expiresAt: new Date(\"2026-08-20T12:14:00.000Z\"),\n })\n })\n })\n\n test(\"keeps the first concurrent revocation and blocks renewal\", async () => {\n await withStorage(async (storage) => {\n await storage.create(sessionInput())\n const left = {\n projectId,\n id: \"shs_1\",\n revokedAt: new Date(\"2026-08-20T12:02:00.000Z\"),\n }\n const right = {\n projectId,\n id: \"shs_1\",\n revokedAt: new Date(\"2026-08-20T12:03:00.000Z\"),\n }\n const [first, second] = await Promise.all([storage.revoke(left), storage.revoke(right)])\n expect(first).toEqual(second)\n await expect(storage.revoke(right)).resolves.toEqual(first)\n await expect(storage.renewIfValid(renewalInput())).resolves.toBeNull()\n await expect(storage.revoke({ ...left, id: \"missing\" })).resolves.toBeNull()\n })\n })\n\n test(\"rejects malformed inputs and impossible timestamps consistently\", async () => {\n await withStorage(async (storage) => {\n const invalid: CreateShareSessionInput[] = [\n sessionInput({ id: \"\" }),\n sessionInput({ projectId: \"\" }),\n sessionInput({ grantId: \"\" }),\n sessionInput({ tokenHash: \"not-a-hash\" }),\n sessionInput({ createdAt: new Date(\"invalid\") }),\n sessionInput({ expiresAt: new Date(createdAt) }),\n sessionInput({ absoluteExpiresAt: new Date(createdAt) }),\n sessionInput({ absoluteExpiresAt: new Date(\"2026-08-20T12:04:00.000Z\") }),\n ]\n for (const input of invalid) {\n await expect(storage.create(input)).rejects.toMatchObject({ code: \"invalid_input\" })\n }\n await expect(storage.create(null as never)).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n await expect(storage.getById(null as never)).rejects.toMatchObject({\n code: \"invalid_input\",\n })\n await expect(\n storage.renewIfValid(renewalInput({ expiresAt: new Date(\"2026-08-20T12:01:00.000Z\") }))\n ).rejects.toMatchObject({ code: \"invalid_input\" })\n })\n })\n\n test(\"rejects revocation before creation without changing the session\", async () => {\n await withStorage(async (storage) => {\n await storage.create(sessionInput())\n await expect(\n storage.revoke({\n projectId,\n id: \"shs_1\",\n revokedAt: new Date(\"2026-08-20T11:59:59.999Z\"),\n })\n ).rejects.toMatchObject({ code: \"invalid_input\" })\n expect(await storage.getById({ projectId, id: \"shs_1\" })).not.toHaveProperty(\"revokedAt\")\n })\n })\n })\n}\n\nexport function createShareSessionStorageContractInput(\n overrides: Partial<CreateShareSessionInput> = {}\n): CreateShareSessionInput {\n return sessionInput(overrides)\n}\n\nfunction sessionInput(overrides: Partial<CreateShareSessionInput> = {}): CreateShareSessionInput {\n return {\n id: \"shs_1\",\n projectId,\n grantId: \"shr_1\",\n tokenHash: \"a\".repeat(64),\n createdAt: new Date(createdAt),\n expiresAt: new Date(expiresAt),\n absoluteExpiresAt: new Date(absoluteExpiresAt),\n ...overrides,\n }\n}\n\nfunction renewalInput(\n overrides: Partial<RenewShareSessionIfValidInput> = {}\n): RenewShareSessionIfValidInput {\n return {\n projectId,\n id: \"shs_1\",\n grantId: \"shr_1\",\n tokenHash: \"a\".repeat(64),\n now: new Date(\"2026-08-20T12:01:00.000Z\"),\n expiresAt: new Date(\"2026-08-20T12:08:00.000Z\"),\n ...overrides,\n }\n}\n",
|
|
30
37
|
"import type { TrustedPrimitiveRef } from \"../execution\"\nimport type { QueueSyncRunInput, Storage, SyncRunRecord } from \"../storage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution required by a Sync-run storage fixture. */\nexport async function createTestSyncExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly syncId: string\n readonly runId: string\n readonly executionId?: string\n }\n): Promise<string> {\n const executionId = input.executionId ?? `test_sync_execution:${input.runId}`\n const existing = await executions.getById({ projectId: input.projectId, id: executionId })\n if (existing) return executionId\n\n const primitive: TrustedPrimitiveRef = {\n kind: \"sync\",\n id: input.syncId,\n runId: input.runId,\n }\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"event\", eventId: `test_event:${input.runId}` },\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n return executionId\n}\n\n/** Queue a Sync run with the valid durable execution fixture required by every provider. */\nexport async function queueTestSyncRun(\n storage: Pick<Storage, \"syncRuns\" | \"executions\">,\n input: Omit<QueueSyncRunInput, \"executionId\">\n): Promise<SyncRunRecord> {\n if (!storage.syncRuns) throw new Error(\"Sync run storage is not configured for this test.\")\n const executionId = await createTestSyncExecution(storage.executions, {\n projectId: input.projectId,\n syncId: input.syncId,\n runId: input.id,\n })\n return storage.syncRuns.queue({ ...input, executionId })\n}\n\n/** Start a Sync run after creating its durable execution and queued state. */\nexport async function startTestSyncRun(\n storage: Pick<Storage, \"syncRuns\" | \"executions\">,\n input: Omit<QueueSyncRunInput, \"executionId\" | \"queuedAt\"> & { readonly startedAt?: Date }\n): Promise<SyncRunRecord> {\n const { startedAt, ...queuedRun } = input\n await queueTestSyncRun(storage, { ...queuedRun, queuedAt: startedAt })\n return storage.syncRuns!.start({\n id: input.id,\n projectId: input.projectId,\n startedAt,\n })\n}\n",
|
|
31
38
|
"import type { TrustedPrimitiveRef } from \"../execution\"\nimport type { StartWebhookRunInput, Storage, WebhookRunRecord } from \"../storage\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution required by a Webhook-run storage fixture. */\nexport async function createTestWebhookExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly route: string\n readonly runId: string\n readonly executionId?: string\n }\n): Promise<string> {\n const executionId = input.executionId ?? `test_webhook_execution:${input.runId}`\n const existing = await executions.getById({ projectId: input.projectId, id: executionId })\n if (existing) return executionId\n\n const primitive: TrustedPrimitiveRef = {\n kind: \"webhook\",\n id: input.route,\n runId: input.runId,\n }\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"webhook\", deliveryId: input.runId },\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n return executionId\n}\n\n/** Start a Webhook run with the valid durable execution fixture required by every provider. */\nexport async function startTestWebhookRun(\n storage: Pick<Storage, \"webhookRuns\" | \"executions\">,\n input: Omit<StartWebhookRunInput, \"executionId\">\n): Promise<WebhookRunRecord> {\n if (!storage.webhookRuns) throw new Error(\"Webhook run storage is not configured for this test.\")\n const executionId = await createTestWebhookExecution(storage.executions, {\n projectId: input.projectId,\n route: input.route,\n runId: input.id,\n })\n return storage.webhookRuns.start({ ...input, executionId })\n}\n",
|
|
32
|
-
"import { describe, expect, test } from \"bun:test\"\nimport type { SixbFailure } from \"../errors/types\"\nimport type { CreateExecutionInput, Storage } from \"../storage\"\nimport type { WebhookRunFailureCode } from \"../storage/webhook-runs\"\nimport { startTestWebhookRun } from \"./webhook-execution\"\n\nexport type WebhookRunStorageContractStorage = Storage & {\n readonly webhookRuns: NonNullable<Storage[\"webhookRuns\"]>\n}\n\nexport interface WebhookRunStorageContractSuiteOptions<\n TStorage extends WebhookRunStorageContractStorage = WebhookRunStorageContractStorage,\n> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"webhook-contract\"\nconst route = \"/api/webhooks/github/events\"\nconst bodySha256 = \"0\".repeat(64)\nconst finishedAt = new Date(\"2026-06-01T12:01:00.000Z\")\nconst retryableFailure = {\n code: \"webhook.delivery_failed\",\n message: \"Webhook delivery failed.\",\n retryable: true,\n at: finishedAt.toISOString(),\n details: { connectorId: \"github\", webhookId: \"events\", runId: \"delivery-retry\" },\n} as const satisfies SixbFailure<WebhookRunFailureCode>\nconst rejectedFailure = {\n code: \"webhook.delivery_rejected\",\n message: \"Webhook delivery was rejected.\",\n retryable: false,\n at: finishedAt.toISOString(),\n} as const satisfies SixbFailure<WebhookRunFailureCode>\n\n/** Runs the durable Webhook delivery contract against one complete storage provider. */\nexport function runWebhookRunStorageContractSuite<\n TStorage extends WebhookRunStorageContractStorage,\n>(label: string, options: WebhookRunStorageContractSuiteOptions<TStorage>): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"round-trips the immutable execution and delivery identity\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"delivery-1\", \"provider-1\"))\n expect(run).toMatchObject({\n id: \"delivery-1\",\n projectId,\n executionId: \"test_webhook_execution:delivery-1\",\n connectorId: \"github\",\n webhookId: \"events\",\n status: \"running\",\n route,\n requestBodyBytes: 12,\n requestBodySha256: bodySha256,\n idempotencyKey: \"provider-1\",\n })\n await expect(\n storage.webhookRuns.getByDelivery({\n projectId,\n connectorId: \"github\",\n webhookId: \"events\",\n idempotencyKey: \"provider-1\",\n })\n ).resolves.toEqual(run)\n })\n })\n\n test(\"rejects missing or mismatched execution authority\", async () => {\n await withStorage(async (storage) => {\n const missing = runInput(\"missing-execution\")\n await expect(\n storage.webhookRuns.start({ ...missing, executionId: \"missing\" })\n ).rejects.toMatchObject({ code: \"invalid_execution\" })\n\n await storage.executions.create(disabledRequestExecution(\"wrong-execution\"))\n await expect(\n storage.webhookRuns.start({ ...missing, executionId: \"wrong-execution\" })\n ).rejects.toMatchObject({ code: \"invalid_execution\" })\n })\n })\n\n test(\"enforces one run per provider delivery key\", async () => {\n await withStorage(async (storage) => {\n await startTestWebhookRun(storage, runInput(\"delivery-first\", \"provider-shared\"))\n await expect(\n startTestWebhookRun(storage, runInput(\"delivery-second\", \"provider-shared\"))\n ).rejects.toMatchObject({ code: \"duplicate_run\" })\n })\n })\n\n test(\"restarts only retryable failures without changing execution identity\", async () => {\n await withStorage(async (storage) => {\n const started = await startTestWebhookRun(\n storage,\n runInput(\"delivery-retry\", \"provider-retry\")\n )\n await storage.webhookRuns.finish({\n projectId,\n id: started.id,\n status: \"failed\",\n finishedAt,\n responseStatus: 503,\n error: retryableFailure,\n })\n const restarted = await storage.webhookRuns.restart({ projectId, id: started.id })\n expect(restarted).toMatchObject({\n id: started.id,\n executionId: started.executionId,\n status: \"running\",\n })\n expect(restarted.finishedAt).toBeUndefined()\n expect(restarted.responseStatus).toBeUndefined()\n expect(restarted.error).toBeUndefined()\n\n await storage.webhookRuns.finish({\n projectId,\n id: started.id,\n status: \"succeeded\",\n responseStatus: 202,\n })\n await expect(\n storage.webhookRuns.restart({ projectId, id: started.id })\n ).rejects.toMatchObject({ code: \"invalid_transition\" })\n })\n })\n\n test(\"does not reopen a terminal client rejection\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"delivery-rejected\"))\n await storage.webhookRuns.finish({\n projectId,\n id: run.id,\n status: \"failed\",\n finishedAt,\n responseStatus: 422,\n error: rejectedFailure,\n })\n await expect(storage.webhookRuns.restart({ projectId, id: run.id })).rejects.toMatchObject({\n code: \"invalid_transition\",\n })\n })\n })\n\n test(\"persists a validated, detached failure through get and list\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"failed-run\", \"failed-key\"))\n const failedRunFailure = {\n ...retryableFailure,\n details: { ...retryableFailure.details, runId: run.id },\n }\n const mutableFailure = {\n code: \"webhook.delivery_failed\" as const,\n message: String(failedRunFailure.message),\n retryable: true as const,\n at: failedRunFailure.at,\n details: {\n connectorId: String(failedRunFailure.details.connectorId),\n webhookId: String(failedRunFailure.details.webhookId),\n runId: String(failedRunFailure.details.runId),\n },\n }\n const finished = await storage.webhookRuns.finish({\n projectId,\n id: run.id,\n status: \"failed\",\n finishedAt,\n responseStatus: 503,\n error: mutableFailure,\n })\n\n mutableFailure.details.runId = \"mutated-after-write\"\n expect(finished.error).toEqual(failedRunFailure)\n await expect(storage.webhookRuns.getById({ projectId, id: run.id })).resolves.toMatchObject(\n {\n error: failedRunFailure,\n }\n )\n await expect(\n storage.webhookRuns.list({\n projectId,\n statuses: [\"failed\"],\n idempotencyKey: \"failed-key\",\n })\n ).resolves.toMatchObject({ runs: [{ id: run.id, error: failedRunFailure }], total: 1 })\n })\n })\n\n test(\"rejects failures outside the Webhook run contract without finishing\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"invalid-failure\"))\n await expect(\n storage.webhookRuns.finish({\n projectId,\n id: run.id,\n status: \"failed\",\n finishedAt,\n error: { ...retryableFailure, code: \"runtime.cancelled\" } as never,\n })\n ).rejects.toThrow(\"code is not allowed by this failure contract\")\n const unchanged = await storage.webhookRuns.getById({ projectId, id: run.id })\n expect(unchanged?.status).toBe(\"running\")\n expect(unchanged?.error).toBeUndefined()\n })\n })\n })\n}\n\nfunction runInput(id: string, idempotencyKey?: string) {\n return {\n id,\n projectId,\n connectorId: \"github\",\n webhookId: \"events\",\n method: \"POST\",\n route,\n requestBodyBytes: 12,\n requestBodySha256: bodySha256,\n ...(idempotencyKey === undefined ? {} : { idempotencyKey }),\n startedAt: new Date(\"2026-06-01T12:00:00.000Z\"),\n }\n}\n\nfunction disabledRequestExecution(id: string): CreateExecutionInput {\n return {\n id,\n projectId,\n executor: { type: \"request\", requestId: id },\n source: { type: \"http\", requestId: id },\n correlationId: `correlation:${id}`,\n authorizationRef: { type: \"disabled\" },\n }\n}\n"
|
|
33
|
-
"import type { AuthorizablePrincipal, TrustedPrimitiveRef } from \"../execution\"\nimport type { ExecutionStorage } from \"../storage/executions\"\n\n/** Create the durable execution chain required by a workflow-run storage fixture. */\nexport async function createTestWorkflowExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly workflowId: string\n readonly runId: string\n readonly executionId?: string\n readonly requestedBy?: AuthorizablePrincipal\n }\n): Promise<string> {\n const parentExecutionId = `test_request_execution:${input.runId}`\n const executionId = input.executionId ?? `test_workflow_execution:${input.runId}`\n const primitive: TrustedPrimitiveRef = {\n kind: \"workflow\",\n id: input.workflowId,\n runId: input.runId,\n }\n\n await executions.create({\n id: parentExecutionId,\n projectId: input.projectId,\n executor: { type: \"request\", requestId: `test_request:${input.runId}` },\n source: { type: \"http\", requestId: `test_request:${input.runId}` },\n ...(input.requestedBy === undefined ? {} : { requestedBy: structuredClone(input.requestedBy) }),\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef:\n input.requestedBy === undefined\n ? { type: \"disabled\" }\n : { type: \"principal\", principal: structuredClone(input.requestedBy) },\n })\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: { type: \"execution\", executionId: parentExecutionId },\n ...(input.requestedBy === undefined ? {} : { requestedBy: structuredClone(input.requestedBy) }),\n correlationId: `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n\n return executionId\n}\n\n/** Create a root workflow execution as produced by an automatic trigger. */\nexport async function createTestAutomaticWorkflowExecution(\n executions: ExecutionStorage,\n input: {\n readonly projectId: string\n readonly workflowId: string\n readonly runId: string\n readonly executionId?: string\n readonly source?: { readonly type: \"schedule\" | \"event\"; readonly eventId: string }\n readonly correlationId?: string\n }\n): Promise<string> {\n const executionId = input.executionId ?? `test_workflow_execution:${input.runId}`\n const primitive: TrustedPrimitiveRef = {\n kind: \"workflow\",\n id: input.workflowId,\n runId: input.runId,\n }\n\n await executions.create({\n id: executionId,\n projectId: input.projectId,\n executor: { type: \"primitive\", kind: primitive.kind, runId: primitive.runId },\n source: input.source ?? { type: \"event\", eventId: `test_event:${input.runId}` },\n correlationId: input.correlationId ?? `test_correlation:${input.runId}`,\n authorizationRef: { type: \"trustedPrimitive\", primitive },\n })\n\n return executionId\n}\n"
|
|
39
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { SixbFailure } from \"../errors/types\"\nimport type { CreateExecutionInput, Storage } from \"../storage\"\nimport type { WebhookRunFailureCode } from \"../storage/webhook-runs\"\nimport { startTestWebhookRun } from \"./webhook-execution\"\n\nexport type WebhookRunStorageContractStorage = Storage & {\n readonly webhookRuns: NonNullable<Storage[\"webhookRuns\"]>\n}\n\nexport interface WebhookRunStorageContractSuiteOptions<\n TStorage extends WebhookRunStorageContractStorage = WebhookRunStorageContractStorage,\n> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"webhook-contract\"\nconst route = \"/api/webhooks/github/events\"\nconst bodySha256 = \"0\".repeat(64)\nconst finishedAt = new Date(\"2026-06-01T12:01:00.000Z\")\nconst retryableFailure = {\n code: \"webhook.delivery_failed\",\n message: \"Webhook delivery failed.\",\n retryable: true,\n at: finishedAt.toISOString(),\n details: { connectorId: \"github\", webhookId: \"events\", runId: \"delivery-retry\" },\n} as const satisfies SixbFailure<WebhookRunFailureCode>\nconst rejectedFailure = {\n code: \"webhook.delivery_rejected\",\n message: \"Webhook delivery was rejected.\",\n retryable: false,\n at: finishedAt.toISOString(),\n} as const satisfies SixbFailure<WebhookRunFailureCode>\n\n/** Runs the durable Webhook delivery contract against one complete storage provider. */\nexport function runWebhookRunStorageContractSuite<\n TStorage extends WebhookRunStorageContractStorage,\n>(label: string, options: WebhookRunStorageContractSuiteOptions<TStorage>): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"round-trips the immutable execution and delivery identity\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"delivery-1\", \"provider-1\"))\n expect(run).toMatchObject({\n id: \"delivery-1\",\n projectId,\n executionId: \"test_webhook_execution:delivery-1\",\n connectorId: \"github\",\n webhookId: \"events\",\n status: \"running\",\n route,\n requestBodyBytes: 12,\n requestBodySha256: bodySha256,\n idempotencyKey: \"provider-1\",\n })\n await expect(\n storage.webhookRuns.getByDelivery({\n projectId,\n connectorId: \"github\",\n webhookId: \"events\",\n idempotencyKey: \"provider-1\",\n })\n ).resolves.toEqual(run)\n })\n })\n\n test(\"rejects missing or mismatched execution authority\", async () => {\n await withStorage(async (storage) => {\n const missing = runInput(\"missing-execution\")\n await expect(\n storage.webhookRuns.start({ ...missing, executionId: \"missing\" })\n ).rejects.toMatchObject({ code: \"invalid_execution\" })\n\n await storage.executions.create(disabledRequestExecution(\"wrong-execution\"))\n await expect(\n storage.webhookRuns.start({ ...missing, executionId: \"wrong-execution\" })\n ).rejects.toMatchObject({ code: \"invalid_execution\" })\n })\n })\n\n test(\"enforces one run per provider delivery key\", async () => {\n await withStorage(async (storage) => {\n await startTestWebhookRun(storage, runInput(\"delivery-first\", \"provider-shared\"))\n await expect(\n startTestWebhookRun(storage, runInput(\"delivery-second\", \"provider-shared\"))\n ).rejects.toMatchObject({ code: \"duplicate_run\" })\n })\n })\n\n test(\"restarts only retryable failures without changing execution identity\", async () => {\n await withStorage(async (storage) => {\n const started = await startTestWebhookRun(\n storage,\n runInput(\"delivery-retry\", \"provider-retry\")\n )\n await storage.webhookRuns.finish({\n projectId,\n id: started.id,\n status: \"failed\",\n finishedAt,\n responseStatus: 503,\n error: retryableFailure,\n })\n const restarted = await storage.webhookRuns.restart({ projectId, id: started.id })\n expect(restarted).toMatchObject({\n id: started.id,\n executionId: started.executionId,\n status: \"running\",\n })\n expect(restarted.finishedAt).toBeUndefined()\n expect(restarted.responseStatus).toBeUndefined()\n expect(restarted.error).toBeUndefined()\n\n await storage.webhookRuns.finish({\n projectId,\n id: started.id,\n status: \"succeeded\",\n responseStatus: 202,\n })\n await expect(\n storage.webhookRuns.restart({ projectId, id: started.id })\n ).rejects.toMatchObject({ code: \"invalid_transition\" })\n })\n })\n\n test(\"does not reopen a terminal client rejection\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"delivery-rejected\"))\n await storage.webhookRuns.finish({\n projectId,\n id: run.id,\n status: \"failed\",\n finishedAt,\n responseStatus: 422,\n error: rejectedFailure,\n })\n await expect(storage.webhookRuns.restart({ projectId, id: run.id })).rejects.toMatchObject({\n code: \"invalid_transition\",\n })\n })\n })\n\n test(\"persists a validated, detached failure through get and list\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"failed-run\", \"failed-key\"))\n const failedRunFailure = {\n ...retryableFailure,\n details: { ...retryableFailure.details, runId: run.id },\n }\n const mutableFailure = {\n code: \"webhook.delivery_failed\" as const,\n message: String(failedRunFailure.message),\n retryable: true as const,\n at: failedRunFailure.at,\n details: {\n connectorId: String(failedRunFailure.details.connectorId),\n webhookId: String(failedRunFailure.details.webhookId),\n runId: String(failedRunFailure.details.runId),\n },\n }\n const finished = await storage.webhookRuns.finish({\n projectId,\n id: run.id,\n status: \"failed\",\n finishedAt,\n responseStatus: 503,\n error: mutableFailure,\n })\n\n mutableFailure.details.runId = \"mutated-after-write\"\n expect(finished.error).toEqual(failedRunFailure)\n await expect(storage.webhookRuns.getById({ projectId, id: run.id })).resolves.toMatchObject(\n {\n error: failedRunFailure,\n }\n )\n await expect(\n storage.webhookRuns.list({\n projectId,\n statuses: [\"failed\"],\n idempotencyKey: \"failed-key\",\n })\n ).resolves.toMatchObject({ runs: [{ id: run.id, error: failedRunFailure }], total: 1 })\n })\n })\n\n test(\"rejects failures outside the Webhook run contract without finishing\", async () => {\n await withStorage(async (storage) => {\n const run = await startTestWebhookRun(storage, runInput(\"invalid-failure\"))\n await expect(\n storage.webhookRuns.finish({\n projectId,\n id: run.id,\n status: \"failed\",\n finishedAt,\n error: { ...retryableFailure, code: \"runtime.cancelled\" } as never,\n })\n ).rejects.toThrow(\"code is not allowed by this failure contract\")\n const unchanged = await storage.webhookRuns.getById({ projectId, id: run.id })\n expect(unchanged?.status).toBe(\"running\")\n expect(unchanged?.error).toBeUndefined()\n })\n })\n })\n}\n\nfunction runInput(id: string, idempotencyKey?: string) {\n return {\n id,\n projectId,\n connectorId: \"github\",\n webhookId: \"events\",\n method: \"POST\",\n route,\n requestBodyBytes: 12,\n requestBodySha256: bodySha256,\n ...(idempotencyKey === undefined ? {} : { idempotencyKey }),\n startedAt: new Date(\"2026-06-01T12:00:00.000Z\"),\n }\n}\n\nfunction disabledRequestExecution(id: string): CreateExecutionInput {\n return {\n id,\n projectId,\n executor: { type: \"request\", requestId: id },\n source: { type: \"http\", requestId: id },\n correlationId: `correlation:${id}`,\n authorizationRef: { type: \"disabled\" },\n }\n}\n"
|
|
34
40
|
],
|
|
35
|
-
"mappings": "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",
|
|
36
|
-
"debugId": "
|
|
41
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,eAAsB,yBAAyB,CAC7C,YACA,OAMiB;AAAA,EACjB,MAAM,oBAAoB,0BAA0B,MAAM;AAAA,EAC1D,MAAM,cAAc,MAAM,eAAe,yBAAyB,MAAM;AAAA,EACxE,MAAM,YAAiC;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,WAAW,MAAM,WAAW,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,YAAY,CAAC;AAAA,EACzF,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,MAAM,SAAS,MAAM,WAAW,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,kBAAkB,CAAC;AAAA,EAC7F,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,WAAW,OAAO;AAAA,MACtB,IAAI;AAAA,MACJ,WAAW,MAAM;AAAA,MACjB,UAAU,EAAE,MAAM,WAAW,WAAW,gBAAgB,MAAM,QAAQ;AAAA,MACtE,QAAQ,EAAE,MAAM,QAAQ,WAAW,gBAAgB,MAAM,QAAQ;AAAA,MACjE,eAAe,oBAAoB,MAAM;AAAA,MACzC,kBAAkB,EAAE,MAAM,WAAW;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EACA,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,aAAa,aAAa,kBAAkB;AAAA,IAC5D,eAAe,oBAAoB,MAAM;AAAA,IACzC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA,EAED,OAAO;AAAA;AAIT,eAAsB,kBAAkB,CACtC,SACA,OAC0B;AAAA,EAC1B,IAAI,CAAC,QAAQ;AAAA,IAAY,MAAM,IAAI,MAAM,qDAAqD;AAAA,EAC9F,MAAM,cAAc,MAAM,0BAA0B,QAAQ,YAAY;AAAA,IACtE,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB,OAAO,MAAM;AAAA,EACf,CAAC;AAAA,EACD,OAAO,QAAQ,WAAW,MAAM,KAAK,OAAO,YAAY,CAAC;AAAA;;ACpD3D,eAAsB,wBAAwB,CAC5C,SACA,OASiB;AAAA,EACjB,MAAM,YAAY,MAAM,cAAc,MAAM,YAAY,YAAY,cAAc;AAAA,EAClF,IAAI,cAAc,aAAa,MAAM,YAAY,WAAW;AAAA,IAC1D,MAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AAAA,EACA,MAAM,mBAAmB,MAAM,UAAU,sBAAsB,MAAM,OAAO,IAAI;AAAA,EAChF,IAAI,cAAc,WAAW;AAAA,IAC3B,MAAM,OAAO,QAAQ;AAAA,IACrB,IAAI,CAAC;AAAA,MAAM,MAAM,IAAI,MAAM,wDAAwD;AAAA,IACnF,MAAM,iBAAiB,MAAM,KAAK,gBAAgB,QAAQ;AAAA,MACxD,WAAW,MAAM;AAAA,MACjB,IAAI;AAAA,IACN,CAAC;AAAA,IACD,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,MAAM,IAAI;AAAA,MAChB,IAAI;AAAA,QACF,MAAM,KAAK,gBAAgB,OAAO;AAAA,UAChC,IAAI;AAAA,UACJ,WAAW,MAAM;AAAA,UACjB,MAAM,cAAc,MAAM;AAAA,UAC1B,aAAa,mCAAmC,MAAM;AAAA,UACtD,QAAQ;AAAA,UACR,oBAAoB;AAAA,UACpB,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QACD,OAAO,OAAO;AAAA,QACd,IAAI,EAAE,iBAAiB,qBAAqB,MAAM,SAAS,6BAA6B;AAAA,UACtF,MAAM;AAAA,QACR;AAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEA,MAAM,oBAAoB,MAAM,qBAAqB,0BAA0B,MAAM;AAAA,EACrF,MAAM,cAAc,MAAM,eAAe,wBAAwB,MAAM;AAAA,EACvE,MAAM,WAAW,MAAM,QAAQ,WAAW,QAAQ;AAAA,IAChD,WAAW,MAAM;AAAA,IACjB,IAAI;AAAA,EACN,CAAC;AAAA,EACD,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,IAAI,SAAS,MAAM,QAAQ,WAAW,QAAQ;AAAA,IAC5C,WAAW,MAAM;AAAA,IACjB,IAAI;AAAA,EACN,CAAC;AAAA,EACD,IAAI,CAAC,QAAQ;AAAA,IACX,SAAS,MAAM,QAAQ,WAAW,OAAO;AAAA,MACvC,IAAI;AAAA,MACJ,WAAW,MAAM;AAAA,MACjB,UAAU,EAAE,MAAM,WAAW,WAAW,gBAAgB,MAAM,QAAQ;AAAA,MACtE,QAAQ,EAAE,MAAM,QAAQ,WAAW,gBAAgB,MAAM,QAAQ;AAAA,MACjE,eAAe,oBAAoB,MAAM;AAAA,MACzC,kBAAkB,EAAE,MAAM,WAAW;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EACA,MAAM,QAAQ,WAAW,OAAO;AAAA,IAC9B,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,SAAS,OAAO,MAAM,MAAM;AAAA,IAC9C,QAAQ,EAAE,MAAM,aAAa,aAAa,kBAAkB;AAAA,OACxD,OAAO,gBAAgB,YACvB,CAAC,IACD,EAAE,aAAa,gBAAgB,OAAO,WAAW,EAAE;AAAA,IACvD,eAAe,OAAO;AAAA,IACtB,kBACE,cAAc,cACV,gBAAgB,OAAO,gBAAgB,IACvC;AAAA,MACE,MAAM;AAAA,MACN,WAAW,EAAE,MAAM,kBAAkB,IAAI,iBAAkB;AAAA,IAC7D;AAAA,EACR,CAAC;AAAA,EACD,OAAO;AAAA;;AC3FT;AAoCA,IAAM,YAAY;AAClB,IAAM,iBAAiB;AACvB,IAAM,QAAmB,EAAE,MAAM,QAAQ,IAAI,QAAQ;AACrD,IAAM,iBAA0E;AAAA,EAC9E,MAAM;AAAA,EACN,IAAI;AACN;AAEA,SAAS,OAAO,CACd,SACA,IACA,OAA4B,uBACM;AAAA,EAClC,OAAO,EAAE,MAAM,SAAS,WAAW,OAAO,GAAG;AAAA;AAG/C,SAAS,EAAE,CAAC,OAAqB;AAAA,EAC/B,OAAO,IAAI,KAAK,KAAK;AAAA;AAGvB,eAAe,gBAAgB,CAC7B,SACA,MACe;AAAA,EACf,MAAM,OAAO,OAAO,EAAE,QAAQ,eAAe,iBAAiB;AAAA,EAC9D,MAAM,OAAO,OAAO,EAAE,QAAQ,cAAc,EAAE,KAAK,CAAC;AAAA;AAGtD,SAAS,WAAW,CAAC,YAA6C,CAAC,GAA2B;AAAA,EAC5F,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,IAChB,WAAW,GAAG,0BAA0B;AAAA,OACrC;AAAA,EACL;AAAA;AAGF,SAAS,SAAS,CAChB,OACA,sBAAsB,GAAG,0BAA0B,GAChC;AAAA,EACnB,OAAO,EAAE,OAAO,oBAAoB;AAAA;AAStC,SAAS,QAAQ,CAAC,YAAmC,CAAC,GAAiB;AAAA,EACrE,MAAM,QAAQ;AAAA,IACZ,IAAI;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,MAAM,EAAE,OAAO,EAAE,UAAU,QAAQ,SAAS,QAAQ,EAAE;AAAA,IACtD,aAAa;AAAA,IACb,mBAAmB,CAAC,WAAW,eAAe,SAAS;AAAA,IACvD,WAAW,UAAU,QAAQ;AAAA,IAC7B,WAAW,GAAG,0BAA0B;AAAA,OACrC;AAAA,EACL;AAAA,EACA,OAAO;AAAA,OACF;AAAA,IACH,aAAa,UAAU,eAAe,wBAAwB,MAAM;AAAA,EACtE;AAAA;AAGF,SAAS,aAAa,CACpB,sBACA,YAA6C,CAAC,GACtB;AAAA,EACxB,MAAM,KAAK,UAAU,MAAM;AAAA,EAC3B,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,UAAU,eAAe,wBAAwB;AAAA,IAC9D,aAAa;AAAA,IACb;AAAA,IACA,UAAU;AAAA,IACV,MAAM;AAAA,MACJ,OAAO,EAAE,UAAU,QAAQ,SAAS,QAAQ;AAAA,MAC5C,WAAW;AAAA,MACX,MAAM;AAAA,MACN,WAAW,CAAC,eAAe;AAAA,MAC3B,UAAU;AAAA,IACZ;AAAA,IACA,mBAAmB;AAAA,IACnB,WAAW,GAAG,0BAA0B;AAAA,OACrC;AAAA,EACL;AAAA;AAGF,eAAe,mBAAmB,CAChC,SACA,SACe;AAAA,EACf,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,gBAAgB,CAAC,CAAC;AAAA,EACjE,MAAM,SAAS,SAAS;AAAA,IACtB,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,WAAW,UAAU,cAAc;AAAA,EACrC,CAAC;AAAA,EACD,MAAM,yBAAyB,SAAS;AAAA,IACtC;AAAA,IACA,OAAO,OAAO;AAAA,IACd,aAAa,OAAO;AAAA,IACpB,WAAW;AAAA,EACb,CAAC;AAAA,EACD,MAAM,QAAQ,KAAK,OAAO,MAAM;AAAA,EAChC,MAAM,QAAQ,KAAK,MAAM;AAAA,IACvB;AAAA,IACA,IAAI,OAAO;AAAA,IACX,SAAS;AAAA,IACT,WAAW,OAAO;AAAA,EACpB,CAAC;AAAA;AAGH,eAAe,cAAc,CAC3B,SACA,SACA,YAA6C,CAAC,GAC9C;AAAA,EACA,MAAM,QAAQ,cAAc,gBAAgB,SAAS;AAAA,EACrD,MAAM,SAAS,MAAM,QAAQ,KAAK,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,MAAM,YAAY,CAAC;AAAA,EAC/F,IAAI,CAAC,UAAU,OAAO,SAAS;AAAA,IAAgB,MAAM,IAAI,MAAM,+BAA+B;AAAA,EAC9F,MAAM,yBAAyB,SAAS;AAAA,IACtC,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM;AAAA,IACnB,mBAAmB,OAAO;AAAA,IAC1B,WAAW;AAAA,EACb,CAAC;AAAA,EACD,OAAO,QAAQ,KAAK,eAAe,KAAK;AAAA;AAG1C,SAAS,eAAe,CACtB,YAAwD,CAAC,GACtB;AAAA,EACnC,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,8BAA8B;AAAA,IAC9B,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,4BAA4B;AAAA,IAC5B,2BAA2B;AAAA,IAC3B,gBAAgB;AAAA,IAChB,WAAW,GAAG,0BAA0B;AAAA,OACrC;AAAA,EACL;AAAA;AAGF,eAAe,iBAAiB,CAC9B,SACA,SACA,OAC6D;AAAA,EAC7D,MAAM,UAAU,SAAS,SAAS,KAAK;AAAA,EACvC,OAAO,QAAQ,KAAK,MAAM;AAAA,IACxB,IAAI,MAAM;AAAA,IACV,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,EACnB,CAAC;AAAA;AAGH,eAAe,SAAS,CACtB,SACA,SACA,OACA;AAAA,EACA,MAAM,yBAAyB,SAAS;AAAA,IACtC,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,aAAa,MAAM;AAAA,IACnB,WAAW;AAAA,EACb,CAAC;AAAA,EACD,OAAO,QAAQ,KAAK,OAAO,KAAK;AAAA;AAGlC,eAAe,0BAA0B,CACvC,SACA,SACe;AAAA,EACf,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,EAC1C,MAAM,QAAQ,SAAS,OAAO;AAAA,IAC5B,IAAI;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,EACvC,CAAC;AAAA,EACD,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,EACnE,MAAM,QAAQ,SAAS,OAAO;AAAA,IAC5B,IAAI;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,EACvC,CAAC;AAAA,EACD,MAAM,QAAQ,KAAK,OAAO;AAAA,IACxB,IAAI;AAAA,IACJ;AAAA,IACA,gBAAgB;AAAA,IAChB,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,MAAM,QAAQ,SAAS,OAAO;AAAA,IAC5B,IAAI;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,EACzC,CAAC;AAAA,EACD,MAAM,kBACJ,SACA,SACA,SAAS,EAAE,IAAI,SAAS,kBAAkB,MAAM,WAAW,UAAU,QAAQ,EAAE,CAAC,CAClF;AAAA;AAUK,SAAS,4BAA0E,CACxF,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAClB,SACkB;AAAA,IAClB,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,QAAQ,QAAQ,OAAO;AAAA,cAClC;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,SAAS,OAAO,MAAM;AAAA,IAGpB,KAAK,iEAAiE,YAAY;AAAA,MAChF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,OAAO,cAAc,CAAC,CAAC;AAAA,QACjF,OAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,cAAc;AAAA,QAChB,CAAC;AAAA,QACD,OAAO,OAAO,cAAc,EAAE,QAAQ,KAAK;AAAA,QAE3C,MAAM,iBAAiB,QAAQ,QAAQ,OAAO,YAAY,CAAC,GAAG,cAAc;AAAA,QAG5E,MAAM,OACJ,QAAQ,QAAQ,OAAO,YAAY,EAAE,WAAW,eAAe,CAAC,CAAC,CACnE,EAAE,SAAS,cAAc,EAAE,WAAW,eAAe,CAAC;AAAA,QACtD,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,OACJ,QAAQ,QAAQ,QAAQ,EAAE,WAAW,QAAQ,IAAI,QAAQ,CAAC,CAC5D,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,KAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OACpB,YAAY,EAAE,IAAI,SAAS,WAAW,GAAG,0BAA0B,EAAE,CAAC,CACxE;AAAA,QACA,MAAM,QAAQ,QAAQ,OACpB,YAAY;AAAA,UACV,IAAI;AAAA,UACJ,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,QAAQ,OACpB,YAAY;AAAA,UACV,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,aAAa,WAAW,eAAe,CAAC,CAAC;AAAA,QAExF,MAAM,MAAM,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,OAAO,MAAM,CAAC;AAAA,QAClE,OAAO,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC;AAAA,QAClF,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QACxB,OAAO,IAAI,OAAO,EAAE,KAAK,KAAK;AAAA,QAE9B,MAAM,SAAS,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,UAAU,CAAC,QAAQ,GAAG,OAAO,MAAM,CAAC;AAAA,QAC3F,OAAO,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAE5E,MAAM,YAAY,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,QAClF,OAAO,UAAU,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAC/E,OAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,QACnC,OAAO,UAAU,KAAK,EAAE,KAAK,CAAC;AAAA,QAE9B,MAAM,aAAa,MAAM,QAAQ,QAAQ,KAAK;AAAA,UAC5C;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,OAAO,WAAW,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,QACvE,OAAO,WAAW,OAAO,EAAE,KAAK,KAAK;AAAA,OACtC;AAAA,KACF;AAAA,IAID,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,SAAS,MAAM,UAAU,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC1E,OAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU;AAAA,UACV,MAAM,EAAE,OAAO,EAAE,UAAU,QAAQ,SAAS,QAAQ,EAAE;AAAA,QACxD,CAAC;AAAA,QACD,OAAO,OAAO,SAAS,EAAE,cAAc;AAAA,QACvC,OAAO,OAAO,SAAS,EAAE,cAAc;AAAA,QACvC,MAAM,OAAO,QAAQ,KAAK,KAAK,EAAE,WAAW,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,cAC5E;AAAA,UACE,MAAM,CAAC,EAAE,IAAI,SAAS,QAAQ,SAAS,CAAC;AAAA,UACxC,OAAO;AAAA,QACT,CACF;AAAA,QACA,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAM;AAAA,UACvC;AAAA,UACA,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,WAAW,UAAU,QAAQ;AAAA,UAC7B,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,OAAO,OAAO,EAAE,cAAc,EAAE,QAAQ,WAAW,SAAS,GAAG,SAAS,aAAa,CAAC;AAAA,QACtF,OAAO,QAAQ,SAAS,EAAE,QAAQ,UAAU,QAAQ,CAAC;AAAA,QACrD,OAAO,QAAQ,WAAW,EAAE,KAAK,4BAA4B;AAAA,QAC7D,OAAO,QAAQ,WAAW,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,OACzE;AAAA,KACF;AAAA,IAED,KAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,cAAc,MAAM,yBAAyB,SAAS;AAAA,UAC1D;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,iBACJ,QAAQ,KAAK,OAAO,SAAS,EAAE,IAAI,SAAS,YAAY,CAAC,CAAC,GAC1D,eACF;AAAA,QACA,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,iDAAiD,YAAY;AAAA,MAChE,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,UAAU,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAE3D,MAAM,YAAY,MAAM,QAAQ,KAAK,aAAa;AAAA,UAChD;AAAA,UACA,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO,QACL,8BACA,4BACA,mBACF;AAAA,UACA,aAAa,GAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QACD,OAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO,QACL,8BACA,4BACA,mBACF;AAAA,QACF,CAAC;AAAA,QACD,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,KAAK,MAAM;AAAA,UACjB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,UAAU,QAAQ;AAAA,QAC/B,CAAC,GACD,eACF;AAAA,QAEA,MAAM,UAAU,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC3D,MAAM,OACJ,QAAQ,KAAK,aAAa;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO,QAAQ,wBAAwB,0BAA0B;AAAA,UACjE,aAAa,GAAG,0BAA0B;AAAA,QAC5C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO,QAAQ,wBAAwB,0BAA0B;AAAA,QACnE,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAID,KAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,oBAAoB,SAAS,OAAO;AAAA,QAC1C,MAAM,QAAQ,cAAc,cAAc;AAAA,QAC1C,MAAM,QAAQ,MAAM,eAAe,SAAS,OAAO;AAAA,QAEnD,OAAO,KAAK,EAAE,cAAc;AAAA,UAC1B,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,mBAAmB,CAAC,eAAe,SAAS;AAAA,UAC5C,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,QACD,OAAO,KAAK,EAAE,IAAI,eAAe,UAAU;AAAA,QAC3C,MAAM,OAAO,QAAQ,KAAK,eAAe,KAAK,CAAC,EAAE,SAAS,QAAQ,KAAK;AAAA,QACvE,MAAM,iBACJ,QAAQ,KAAK,eAAe;AAAA,aACvB;AAAA,UACH,MAAM,KAAK,MAAM,MAAM,MAAM,6BAA6B;AAAA,QAC5D,CAAC,GACD,cACF;AAAA,QAEA,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAK;AAAA,UACrC;AAAA,UACA,OAAO,CAAC,UAAU;AAAA,UAClB,aAAa;AAAA,QACf,CAAC;AAAA,QACD,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC;AAAA,QAC5D,MAAM,OACJ,QAAQ,KAAK,KAAK,EAAE,WAAW,OAAO,CAAC,cAAc,EAAE,CAAC,CAC1D,EAAE,SAAS,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI,WAAW,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,QACjE,MAAM,OACJ,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,gBAAgB,CAAC,CAC5D,EAAE,SAAS,cAAc,EAAE,aAAa,WAAW,CAAC;AAAA,OACrD;AAAA,KACF;AAAA,IAED,KAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,oBAAoB,SAAS,OAAO;AAAA,QAC1C,MAAM,eAAe,cAAc,gBAAgB;AAAA,UACjD,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,MAAM,yBAAyB,SAAS;AAAA,UACtC;AAAA,UACA,OAAO,aAAa;AAAA,UACpB,aAAa,aAAa;AAAA,UAC1B,mBAAmB;AAAA,UACnB,WAAW;AAAA,QACb,CAAC;AAAA,QACD,MAAM,iBAAiB,QAAQ,KAAK,eAAe,YAAY,GAAG,eAAe;AAAA,QAEjF,MAAM,QAAQ,cAAc,oBAAoB;AAAA,QAChD,MAAM,yBAAyB,SAAS;AAAA,UACtC;AAAA,UACA,OAAO,MAAM;AAAA,UACb,aAAa,MAAM;AAAA,UACnB,mBAAmB;AAAA,UACnB,WAAW;AAAA,QACb,CAAC;AAAA,QACD,MAAM,iBAAiB,QAAQ,KAAK,eAAe,KAAK,GAAG,gBAAgB;AAAA,QAE3E,MAAM,QAAQ,KAAK,OAAO;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,KAAK,eAAe,KAAK,OAAO,sBAAsB,eAAe,CAAC,GAC9E,eACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,8CAA8C,YAAY;AAAA,MAC7D,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,oBAAoB,SAAS,OAAO;AAAA,QAC1C,MAAM,SAAS,CAAC,WAAW,SAAS,EAAE,IAAI,CAAC,OACzC,cAAc,gBAAgB;AAAA,UAC5B;AAAA,UACA,aAAa,wBAAwB;AAAA,UACrC,UAAU;AAAA,UACV,mBAAmB;AAAA,QACrB,CAAC,CACH;AAAA,QACA,WAAW,SAAS,QAAQ;AAAA,UAC1B,MAAM,yBAAyB,SAAS;AAAA,YACtC;AAAA,YACA,OAAO,MAAM;AAAA,YACb,aAAa,MAAM;AAAA,YACnB,mBAAmB;AAAA,YACnB,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,QAEA,MAAM,UAAU,MAAM,QAAQ,WAC5B,OAAO,IAAI,CAAC,UAAU,QAAQ,KAAK,eAAe,KAAK,CAAC,CAC1D;AAAA,QACA,OAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,WAAW,CAAC,EAAE,aAAa,CAAC;AAAA,QAChF,MAAM,WAAW,QAAQ,OACvB,CAAC,WAA4C,OAAO,WAAW,UACjE;AAAA,QACA,OAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,QAC/B,OAAO,SAAS,IAAI,MAAM,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAAA,OACzE;AAAA,KACF;AAAA,IAED,KAAK,sDAAsD,YAAY;AAAA,MACrE,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,oBAAoB,SAAS,OAAO;AAAA,QAC1C,MAAM,eAAe,SAAS,OAAO;AAAA,QACrC,MAAM,QAAQ,KAAK,MAAM;AAAA,UACvB;AAAA,UACA,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,WAAW,UAAU,aAAa;AAAA,QACpC,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC,GACD,eACF;AAAA,QACA,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,QAAQ,CAAC;AAAA,QACX,CAAC,GACD,eACF;AAAA,QAEA,MAAM,SAAS;AAAA,UACb,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,cACE,QAAQ,QAAQ,IAAI,OAAO,EAAE;AAAA,cAC7B,QAAQ,UAAU,IAAI,OAAO,EAAE;AAAA,cAC/B,UAAU;AAAA,cACV,WAAW;AAAA,cACX,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAM,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,UAC1C;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAAA,QACD,OAAO,SAAS,EAAE,cAAc,EAAE,QAAQ,aAAa,OAAO,CAAC;AAAA,QAC/D,MAAM,OAAO,QAAQ,KAAK,QAAQ,EAAE,WAAW,IAAI,UAAU,CAAC,CAAC,EAAE,SAAS,QAAQ,SAAS;AAAA,OAC5F;AAAA,KACF;AAAA,IAID,KAAK,yCAAyC,YAAY;AAAA,MACxD,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,MAAM,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC/E,OAAO,GAAG,EAAE,cAAc,EAAE,QAAQ,WAAW,SAAS,GAAG,UAAU,QAAQ,CAAC;AAAA,QAC9E,OAAO,IAAI,WAAW,EAAE,KAAK,4BAA4B;AAAA,QACzD,OAAO,IAAI,iBAAiB,EAAE,QAAQ,CAAC,eAAe,SAAS,CAAC;AAAA,QAChE,OAAO,IAAI,WAAW,KAAK,EAAE,KAAK,QAAQ;AAAA,QAC1C,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,iBACJ,kBACE,SACA,SACA,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAC1D,GACA,mBACF;AAAA,QAGA,MAAM,iBACJ,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,SAAS,UAAU,QAAQ,CAAC,CAAC,GAChF,kBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,UACvC,kBACE,SACA,SACA,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAC1D;AAAA,UACA,kBACE,SACA,SACA,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAC1D;AAAA,QACF,CAAC;AAAA,QACD,MAAM,YAAY,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,WAAW;AAAA,QAC1E,MAAM,WAAW,QAAQ,OACvB,CAAC,WAA4C,OAAO,WAAW,UACjE;AAAA,QACA,OAAO,SAAS,EAAE,aAAa,CAAC;AAAA,QAChC,OAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,QAC/B,OAAO,SAAS,GAAG,MAAM,EAAE,eAAe,iBAAiB;AAAA,QAC3D,OAAO,SAAS,GAAG,OAAO,IAAI,EAAE,KAAK,mBAAmB;AAAA,OACzD;AAAA,KACF;AAAA,IAID,KAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEnE,MAAM,YAAY,MAAM,QAAQ,KAAK,QAAQ;AAAA,UAC3C;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,UAAU,QAAQ;AAAA,QAC/B,CAAC;AAAA,QACD,OAAO,SAAS,EAAE,cAAc,EAAE,QAAQ,WAAW,SAAS,EAAE,CAAC;AAAA,QACjE,OAAO,UAAU,WAAW,KAAK,EAAE,KAAK,QAAQ;AAAA,QAEhD,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC,GACD,gBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,gFAAgF,YAAY;AAAA,MAC/F,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,WAAW,UAAU,UAAU,GAAG,0BAA0B,CAAC;AAAA,QAC/D,CAAC,CACH;AAAA,QAEA,MAAM,YAAY,MAAM,QAAQ,KAAK,0BAA0B;AAAA,UAC7D;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,qBAAqB,GAAG,0BAA0B;AAAA,QACpD,CAAC;AAAA,QACD,OAAO,UAAU,WAAW,oBAAoB,YAAY,CAAC,EAAE,KAC7D,0BACF;AAAA,QAEA,MAAM,QAAQ,MAAM,QAAQ,KAAK,0BAA0B;AAAA,UACzD;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,qBAAqB,GAAG,0BAA0B;AAAA,QACpD,CAAC;AAAA,QACD,OAAO,MAAM,WAAW,oBAAoB,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAE1F,MAAM,QAAQ,KAAK,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,UAAU,UAAU,GAAG,0BAA0B,CAAC;AAAA,QAC/D,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,KAAK,0BAA0B;AAAA,UACrC;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,qBAAqB,GAAG,0BAA0B;AAAA,QACpD,CAAC,GACD,gBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,gDAAgD,YAAY;AAAA,MAC/D,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,MAAM,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAE/E,MAAM,mBAAmB,IAAI;AAAA,QAG7B,IAAI,kBAAkB;AAAA,UACpB,iBAAiB,QAAQ;AAAA,UACzB,iBAAiB,oBAAoB,QAAQ,CAAC;AAAA,QAChD;AAAA,QACE,IAAI,kBAA+B,KAAK,SAAS;AAAA,QACnD,MAAM,SAAS,MAAM,QAAQ,KAAK,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC;AAAA,QACpE,OAAO,QAAQ,WAAW,KAAK,EAAE,KAAK,QAAQ;AAAA,QAC9C,OAAO,QAAQ,iBAAiB,EAAE,QAAQ,CAAC,eAAe,SAAS,CAAC;AAAA,OACrE;AAAA,KACF;AAAA,IAID,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACzD,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACzD,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,SAAS,UAAU,QAAQ,CAAC,CAAC;AAAA,QACtF,MAAM,kBACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,UAAU,QAAQ;AAAA,QAC/B,CAAC,CACH;AAAA,QAEA,MAAM,QAAQ,KAAK,OAAO;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,QAED,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEnE,MAAM,WAAW,MAAM,QAAQ,KAAK,OAAO;AAAA,UACzC;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,cAAc;AAAA,UACd,aAAa;AAAA,YACX;AAAA,cACE,MAAM;AAAA,cACN,UAAU;AAAA,cACV,OAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,UACA,aAAa,GAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QACD,OAAO,QAAQ,EAAE,cAAc;AAAA,UAC7B,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,cAAc;AAAA,QAChB,CAAC;AAAA,QACD,OAAO,SAAS,WAAW,EAAE,QAAQ;AAAA,UACnC;AAAA,YACE,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,QACD,MAAM,OACJ,QAAQ,KAAK,SAAS,EAAE,WAAW,KAAK,CAAC,SAAS,WAAW,OAAO,EAAE,CAAC,CACzE,EAAE,SAAS,QAAQ,CAAC,QAAQ,CAAC;AAAA,QAC7B,OAAO,SAAS,SAAS,EAAE,cAAc;AAAA,QACzC,OAAO,SAAS,aAAa,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAG3E,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QACD,MAAM,OACJ,kBACE,SACA,SACA,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAC1D,CACF,EAAE,SAAS,cAAc,EAAE,QAAQ,UAAU,CAAC;AAAA,OAC/C;AAAA,KACF;AAAA,IAED,KAAK,2EAA2E,YAAY;AAAA,MAC1F,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEnE,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,OAAO,QAAQ,QAAQ,0BAA0B;AAAA,QACnD,CAAC,GACD,gBACF;AAAA,QAEA,MAAM,SAAS,MAAM,QAAQ,KAAK,OAAO;AAAA,UACvC;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,OAAO,QAAQ,uBAAuB,0BAA0B;AAAA,UAChE,aAAa,GAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QACD,OAAO,OAAO,MAAM,EAAE,KAAK,QAAQ;AAAA,QACnC,OAAO,OAAO,KAAK,EAAE,QAAQ,QAAQ,uBAAuB,0BAA0B,CAAC;AAAA,QAGvF,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC,GACD,eACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACzD,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEzD,MAAM,kBACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,KAAK,OAAO;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,kBACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,UAAU,QAAQ;AAAA,UAC7B,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,kBACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,UAAU,QAAQ;AAAA,UAC7B,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QAEA,MAAM,aAAa,MAAM,QAAQ,KAAK,KAAK,EAAE,WAAW,UAAU,SAAS,OAAO,MAAM,CAAC;AAAA,QACzF,OAAO,WAAW,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAEvE,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,EAAE,WAAW,UAAU,CAAC,SAAS,GAAG,OAAO,MAAM,CAAC;AAAA,QAC1F,OAAO,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAEpE,MAAM,MAAM,MAAM,QAAQ,KAAK,KAAK,EAAE,WAAW,OAAO,OAAO,CAAC;AAAA,QAChE,OAAO,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC;AAAA,OAC1E;AAAA,KACF;AAAA,IAED,KAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,aAAa,CAAC,CAAC;AAAA,QAC9D,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,aAAa,CAAC,CAAC;AAAA,QAC9D,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,YAAY,CAAC,CAAC;AAAA,QAE7D,MAAM,UACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,UACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,UACJ,SACA,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QAEA,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAK;AAAA,UACrC;AAAA,UACA,UAAU,CAAC,QAAQ;AAAA,UACnB,cAAc,GAAG,0BAA0B;AAAA,UAC3C,eAAe,GAAG,0BAA0B;AAAA,UAC5C,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,QAC/D,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,OAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,OAClC;AAAA,KACF;AAAA,IAID,KAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,cAAc,MAAM,QAAQ,SAAS,OAAO;AAAA,UAChD,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,cAAc,CAAC;AAAA,UAC7C,iBAAiB;AAAA,UACjB,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,OAAO,WAAW,EAAE,cAAc;AAAA,UAChC,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,OAAO,YAAY,eAAe,EAAE,QAAQ,KAAK;AAAA,QAEjD,MAAM,MAAM,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC/E,OAAO,IAAI,WAAW,EAAE,KAAK,4BAA4B;AAAA,QACzD,MAAM,mBAAmB,MAAM,QAAQ,SAAS,OAAO;AAAA,UACrD,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,iBAAiB;AAAA,UACjB,OAAO;AAAA,YACL,EAAE,MAAM,aAAa,MAAM,oBAAoB;AAAA,YAC/C;AAAA,cACE,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,OAAO,EAAE,KAAK,KAAK;AAAA,cACnB,OAAO;AAAA,cACP,QAAQ;AAAA,YACV;AAAA,YACA,EAAE,MAAM,QAAQ,MAAM,qBAAqB;AAAA,UAC7C;AAAA,UACA,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,OAAO,gBAAgB,EAAE,cAAc,EAAE,KAAK,GAAG,MAAM,aAAa,OAAO,QAAQ,CAAC;AAAA,QACpF,OAAO,iBAAiB,eAAe,EAAE,QAAQ,cAAc;AAAA,QAE/D,MAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC;AAAA,QACvE,OAAO,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAAA,QAChD,OAAO,QAAQ,eAAe,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAG5E,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,EAAE,WAAW,IAAI,aAAa,CAAC;AAAA,QAC7E,OAAO,QAAQ,GAAG,EAAE,KAAK,CAAC;AAAA,QAC1B,OAAO,QAAQ,KAAK,EAAE,QAAQ;AAAA,UAC5B,EAAE,MAAM,aAAa,MAAM,oBAAoB;AAAA,UAC/C;AAAA,YACE,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,OAAO,EAAE,KAAK,KAAK;AAAA,YACnB,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,UACA,EAAE,MAAM,QAAQ,MAAM,qBAAqB;AAAA,QAC7C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAW,CAAC;AAAA,UAC1C,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACnE,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,YACL,EAAE,MAAM,QAAQ,MAAM,iBAAiB;AAAA,YACvC;AAAA,cACE,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,OAAO,EAAE,OAAO,OAAO;AAAA,cACvB,OAAO;AAAA,cACP,QAAQ,EAAE,SAAS,EAAE;AAAA,YACvB;AAAA,UACF;AAAA,UACA,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,OACJ,QAAQ,SAAS,cAAc,EAAE,WAAW,UAAU,SAAS,OAAO,QAAQ,CAAC,CACjF,EAAE,SAAS,KAAK,CAAC;AAAA,QACjB,MAAM,OAAO,QAAQ,SAAS,QAAQ,EAAE,WAAW,IAAI,aAAa,CAAC,CAAC,EAAE,SAAS,SAAS;AAAA,QAE1F,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK,EAAE,WAAW,UAAU,QAAQ,CAAC;AAAA,QAC7E,OAAO,SAAS,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,QAC7E,OAAO,SAAS,KAAK,EAAE,KAAK,CAAC;AAAA,QAC7B,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,cAAc;AAAA,UACd,eAAe,GAAG,0BAA0B;AAAA,QAC9C,CAAC;AAAA,QAED,MAAM,OACJ,QAAQ,SAAS,cAAc,EAAE,WAAW,UAAU,SAAS,OAAO,QAAQ,CAAC,CACjF,EAAE,SAAS,KAAK,CAAC;AAAA,QACjB,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,cAAc;AAAA,UACd,eAAe,GAAG,0BAA0B;AAAA,QAC9C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,UACrC,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,kBAAkB,SAAS,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACnE,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,UACrC,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,UACvC,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,MAAM,MAAM,QAAQ,SAAS,KAAK,EAAE,WAAW,UAAU,SAAS,OAAO,MAAM,CAAC;AAAA,QACtF,OAAO,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,QAC5E,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QAExB,MAAM,OAAO,MAAM,QAAQ,SAAS,KAAK,EAAE,WAAW,UAAU,SAAS,OAAO,OAAO,CAAC;AAAA,QACxF,OAAO,KAAK,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,QAE7E,MAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK;AAAA,UACxC;AAAA,UACA,UAAU;AAAA,UACV,OAAO,CAAC,MAAM;AAAA,UACd,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,MAAM,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,QAExE,MAAM,eAAe,MAAM,QAAQ,SAAS,KAAK;AAAA,UAC/C;AAAA,UACA,UAAU;AAAA,UACV,UAAU;AAAA,UACV,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,aAAa,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,QAC/E,OAAO,aAAa,KAAK,EAAE,KAAK,CAAC;AAAA,QAEjC,MAAM,YAAY,MAAM,QAAQ,SAAS,KAAK;AAAA,UAC5C;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,UAAU,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,QAC5E,OAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,OACpC;AAAA,KACF;AAAA,IAED,KAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,iBACJ,QAAQ,SAAS,OAAO;AAAA,UACtB,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACtC,CAAC,GACD,kBACF;AAAA,QAEA,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACtC,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,SAAS,OAAO;AAAA,UACtB,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,QACvC,CAAC,GACD,cACF;AAAA,QACA,MAAM,iBACJ,QAAQ,SAAS,OAAO;AAAA,UACtB,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACtC,CAAC,GACD,eACF;AAAA,OACD;AAAA,KACF;AAAA,IAID,KAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,2BAA2B,SAAS,OAAO;AAAA,QACjD,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEzD,MAAM,eAAe,MAAM,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC;AAAA,QAC7E,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI;AAAA,UAC5C,QAAQ,YAAY,OAAO,gBAAgB,CAAC;AAAA,UAC5C,QAAQ,YAAY,OAAO,gBAAgB,CAAC;AAAA,QAC9C,CAAC;AAAA,QAED,OAAO,QAAQ,EAAE,QAAQ,OAAO;AAAA,QAChC,OAAO,OAAO,EAAE,cAAc;AAAA,UAC5B,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB,CAAC;AAAA,QACD,OAAO,MAAM,QAAQ,YAAY,UAAU,EAAE,WAAW,UAAU,QAAQ,CAAC,CAAC,EAAE,QAC5E,OACF;AAAA,QACA,OACE,MAAM,QAAQ,YAAY,UAAU,EAAE,WAAW,gBAAgB,UAAU,QAAQ,CAAC,CACtF,EAAE,SAAS;AAAA,QACX,OAAO,MAAM,QAAQ,YAAY,UAAU,EAAE,WAAW,UAAU,QAAQ,CAAC,CAAC,EAAE,SAAS;AAAA,QACvF,MAAM,OACJ,QAAQ,YAAY,YAAY;AAAA,UAC9B;AAAA,UACA,QAAQ,CAAC,SAAS,WAAW,OAAO;AAAA,QACtC,CAAC,CACH,EAAE,SAAS,QAAQ,CAAC,OAAO,CAAC;AAAA,QAC5B,MAAM,OACJ,QAAQ,YAAY,YAAY;AAAA,UAC9B,WAAW;AAAA,UACX,QAAQ,CAAC,OAAO;AAAA,QAClB,CAAC,CACH,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,QAErB,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK;AAAA,UAC3C;AAAA,UACA,UAAU;AAAA,UACV,UAAU,QAAQ;AAAA,UAClB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,SAAS,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC;AAAA,QAErE,MAAM,WAAW,MAAM,QAAQ,SAAS,KAAK;AAAA,UAC3C;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,SAAS,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,QACjF,OAAO,MAAM,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,QAAQ,YAAY;AAAA,OACvF;AAAA,KACF;AAAA,IAED,KAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,2BAA2B,SAAS,OAAO;AAAA,QACjD,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEzD,MAAM,iBACJ,QAAQ,YAAY,OAAO,gBAAgB,EAAE,UAAU,QAAQ,CAAC,CAAC,GACjE,eACF;AAAA,QAEA,MAAM,QAAQ,KAAK,OAAO;AAAA,UACxB,IAAI;AAAA,UACJ;AAAA,UACA,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,iBAAiB,QAAQ,YAAY,OAAO,gBAAgB,CAAC,GAAG,eAAe;AAAA,QACrF,OAAO,MAAM,QAAQ,YAAY,UAAU,EAAE,WAAW,UAAU,QAAQ,CAAC,CAAC,EAAE,SAAS;AAAA,OACxF;AAAA,KACF;AAAA,IAED,KAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,2BAA2B,SAAS,OAAO;AAAA,QACjD,MAAM,WAAW,IAAI,MAAM,qBAAqB;AAAA,QAEhD,MAAM,OACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,IAAI,CAAC,GAAG;AAAA,YAAQ,MAAM,IAAI,MAAM,wCAAwC;AAAA,UACxE,MAAM,UAAU,MAAM,GAAG,OAAO,YAAY,OAAO,gBAAgB,CAAC;AAAA,UACpE,OAAO,MAAM,GAAG,OAAO,YAAY,UAAU,EAAE,WAAW,UAAU,QAAQ,CAAC,CAAC,EAAE,QAC9E,OACF;AAAA,UACA,MAAM;AAAA,SACP,CACH,EAAE,QAAQ,KAAK,QAAQ;AAAA,QAEvB,OAAO,MAAM,QAAQ,YAAY,UAAU,EAAE,WAAW,UAAU,QAAQ,CAAC,CAAC,EAAE,SAAS;AAAA,OACxF;AAAA,KACF;AAAA,IAED,KAAK,+EAA+E,YAAY;AAAA,MAC9F,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,2BAA2B,SAAS,OAAO;AAAA,QAEjD,MAAM,iBACJ,QAAQ,YAAY,OAAO,gBAAgB,EAAE,gBAAgB,QAAQ,CAAC,CAAC,GACvE,gBACF;AAAA,QACA,MAAM,iBACJ,QAAQ,YAAY,OAClB,gBAAgB,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,sBAAsB,EAAE,CAAC,CACrF,GACA,eACF;AAAA,QACA,MAAM,iBACJ,QAAQ,YAAY,OAClB,gBAAgB,EAAE,8BAA8B,qBAAqB,CAAC,CACxE,GACA,eACF;AAAA,QACA,MAAM,iBACJ,QAAQ,YAAY,OAAO,gBAAgB,EAAE,sBAAsB,EAAE,CAAC,CAAC,GACvE,eACF;AAAA,QAEA,MAAM,QAAQ,KAAK,QAAQ;AAAA,UACzB,IAAI;AAAA,UACJ;AAAA,UACA,WAAW,UAAU,kBAAkB;AAAA,QACzC,CAAC;AAAA,QACD,MAAM,iBAAiB,QAAQ,YAAY,OAAO,gBAAgB,CAAC,GAAG,gBAAgB;AAAA,QAEtF,MAAM,iBAAiB,gBAAgB,EAAE,gBAAgB,mBAAmB,CAAC;AAAA,QAC7E,MAAM,QAAQ,YAAY,OAAO,cAAc;AAAA,QAC/C,MAAM,iBACJ,QAAQ,YAAY,OAAO,KAAK,gBAAgB,SAAS,YAAY,CAAC,GACtE,eACF;AAAA,QACA,MAAM,iBAAiB,QAAQ,YAAY,OAAO,gBAAgB,CAAC,GAAG,gBAAgB;AAAA,QACtF,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QACxC,CAAC;AAAA,QACD,MAAM,iBAAiB,QAAQ,YAAY,OAAO,cAAc,GAAG,eAAe;AAAA,OACnF;AAAA,KACF;AAAA,IAED,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,QAC5C,MAAM,2BAA2B,SAAS,OAAO;AAAA,QACjD,MAAM,QAAQ,YAAY,OAAO,gBAAgB,CAAC;AAAA,QAClD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QACxC,CAAC;AAAA,QACD,MAAM,QAAQ,KAAK,OAAO;AAAA,UACxB,IAAI;AAAA,UACJ;AAAA,UACA,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QACxC,CAAC;AAAA,QACD,MAAM,kBACJ,SACA,SACA,SAAS,EAAE,IAAI,SAAS,kBAAkB,MAAM,WAAW,UAAU,QAAQ,EAAE,CAAC,CAClF;AAAA,QAEA,MAAM,iBACJ,QAAQ,YAAY,OAClB,gBAAgB;AAAA,UACd,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,8BAA8B;AAAA,UAC9B,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,UAChB,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB,CAAC,CACH,GACA,eACF;AAAA,QAEA,MAAM,SAAS,MAAM,QAAQ,YAAY,OACvC,gBAAgB;AAAA,UACd,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,8BAA8B;AAAA,UAC9B,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,UAChB,SAAS;AAAA,UACT,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,UACjB,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,OAAO,OAAO,oBAAoB,EAAE,KAAK,cAAc;AAAA,QACvD,OAAO,MAAM,QAAQ,YAAY,UAAU,EAAE,WAAW,UAAU,QAAQ,CAAC,CAAC,EAAE,QAC5E,MACF;AAAA,OACD;AAAA,KACF;AAAA,GACF;AAAA;;ACj9CH,qBAAS,qBAAU,iBAAQ;AAY3B,IAAM,aAAY;AAClB,IAAM,cAAc;AACpB,IAAM,mBAAmB;AAEzB,SAAS,WAAW,CAAC,OAAe;AAAA,EAClC,OAAO;AAAA,IACL,UAAU;AAAA,IACV,eAAe;AAAA,IACf,eAAe;AAAA,IACf,WAAW;AAAA,IACX,YAAY,IAAI,KAAK,0BAA0B;AAAA,EACjD;AAAA;AAGF,SAAS,SAAS,CAChB,gBAAgB,WAChB,YAA0E,CAAC,GACtB;AAAA,EACrD,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,iBAAiB,EAAE,YAAY,UAAU,SAAS,eAAe;AAAA,IACjE,gBAAgB,CAAC;AAAA,IACjB,aAAa,YAAY,qBAAqB;AAAA,IAC9C,OAAO,EAAE,UAAU,OAAO,aAAa,QAAQ;AAAA,IAC/C,YAAY;AAAA,MACV;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,2BAA2B;AAAA,QAC3B,mBAAmB;AAAA,MACrB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,2BAA2B;AAAA,QAC3B,mBAAmB;AAAA,MACrB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,2BAA2B;AAAA,QAC3B,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,IACA,SAAS,IAAI,KAAK,0BAA0B;AAAA,OACzC;AAAA,EACL;AAAA;AAGF,SAAS,eAAe,GAA8D;AAAA,EACpF,OAAO;AAAA,IACL;AAAA,IACA,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,iBAAiB,EAAE,YAAY,UAAU,SAAS,iBAAiB;AAAA,IACnE,gBAAgB,CAAC;AAAA,IACjB,QAAQ;AAAA,IACR,SAAS,IAAI,KAAK,0BAA0B;AAAA,EAC9C;AAAA;AAGK,SAAS,6BAA6D,CAC3E,MACA,SACM;AAAA,EACN,UAAS,MAAM,MAAM;AAAA,IACnB,eAAe,OAAO,GAAsB;AAAA,MAC1C,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,MAC5C,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7B,OAAO;AAAA;AAAA,IAGT,MAAK,yCAAyC,YAAY;AAAA,MACxD,MAAM,UAAU,MAAM,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,QAAO,QAAQ,oBAAoB,UAAU,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,QAC9E,MAAM,QAAO,QAAQ,oBAAoB,UAAU,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,QAC9E,MAAM,QACJ,QAAQ,eAAe;AAAA,UACrB;AAAA,UACA,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,IAAI,IAAI,KAAK,0BAA0B;AAAA,UACvC,iBAAiB;AAAA,QACnB,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,OAAO;AAAA,UACP,OAAO;AAAA,YACL;AAAA,cACE,OAAO;AAAA,gBACL,IAAI;AAAA,cACN;AAAA,cACA,MAAM,UAAU;AAAA,cAChB,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,gBACD;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MAEvF,MAAM,UAAU,MAAM,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,OAAO,MAAM,QAAQ,eAAe;AAAA,UACxC;AAAA,UACA,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,IAAI,IAAI,KAAK,0BAA0B;AAAA,QACzC,CAAC;AAAA,QACD,QAAO,KAAK,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,IAAI,MAAM,kBAAkB,CAAC,CAAC,EAAE,QAAQ;AAAA,UAClF,CAAC,WAAW,MAAM;AAAA,UAClB,CAAC,WAAW,EAAE,cAAc,KAAM,CAAC;AAAA,UACnC,CAAC,WAAW,SAAS;AAAA,QACvB,CAAC;AAAA,gBACD;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,IAED,MAAK,8EAA8E,YAAY;AAAA,MAE7F,MAAM,UAAU,MAAM,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,QAAQ,UAAU;AAAA,QACxB,MAAM,WAAW;AAAA,UACf,QAAQ;AAAA,UACR,OAAO,MAAM;AAAA,UACb,YAAY,MAAM;AAAA,QACpB;AAAA,QACA,MAAM,SAAgC;AAAA,aACjC;AAAA,UACH,QAAQ;AAAA,UACR,OAAO,EAAE,UAAU,OAAO,aAAa,QAAQ;AAAA,UAC/C,YAAY,CAAC;AAAA,UACb,aAAa,KAAK,YAAY,cAAc,GAAG,UAAU,oBAAoB;AAAA,UAC7E;AAAA,QACF;AAAA,QACA,MAAM,QAAQ,IAAI;AAAA,UAChB,QAAQ,oBAAoB,MAAM;AAAA,UAClC,QAAQ,oBAAoB,MAAM;AAAA,QACpC,CAAC;AAAA,QACD,SACG,MAAM,QAAQ,oBAAoB,EAAE,uBAAW,cAAc,CAAC,WAAW,EAAE,CAAC,GAAG,IAC5E,OACN,EAAE,QAAQ,CAAC,EAAE,UAAU,OAAO,aAAa,QAAQ,CAAC,CAAC;AAAA,QACrD,MAAM,OAAO,MAAM,QAAQ,eAAe;AAAA,UACxC;AAAA,UACA,MAAM,IAAI,KAAK,YAAY;AAAA,UAC3B,IAAI,IAAI,KAAK,YAAY;AAAA,UACzB,iBAAiB;AAAA,QACnB,CAAC;AAAA,QACD,QAAO,KAAK,MAAM,IAAI,IAAI,EAAE,cAAc;AAAA,UACxC,OAAO,EAAE,aAAa,QAAQ;AAAA,UAC9B;AAAA,QACF,CAAC;AAAA,gBACD;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,IAED,MAAK,2DAA2D,YAAY;AAAA,MAC1E,MAAM,UAAU,MAAM,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,iBAAwC;AAAA,UAC5C;AAAA,UACA,eAAe;AAAA,UACf,QAAQ;AAAA,UACR,iBAAiB,EAAE,YAAY,UAAU,SAAS,QAAQ;AAAA,UAC1D,gBAAgB,EAAE,cAAc,aAAa;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS,IAAI,KAAK,0BAA0B;AAAA,QAC9C;AAAA,QAGA,MAAM,QAAQ,oBAAoB;AAAA,aAC7B,gBAAgB;AAAA,UACnB,aAAa,KAAK,YAAY,oBAAoB,GAAG,UAAU,oBAAoB;AAAA,QACrF,CAAC;AAAA,QACD,MAAM,QAAQ,oBAAoB,cAAc;AAAA,QAChD,MAAM,QACJ,QAAQ,eAAe;AAAA,UACrB;AAAA,UACA,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,IAAI,IAAI,KAAK,0BAA0B;AAAA,UACvC,iBAAiB;AAAA,QACnB,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,OAAO;AAAA,UACP,OAAO,CAAC,EAAE,MAAM,gBAAgB,iBAAiB,cAAc,CAAC;AAAA,QAClE,CAAC;AAAA,gBACD;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,IAED,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,UAAU,MAAM,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,QAAQ,oBAAoB,UAAU,CAAC;AAAA,QAC7C,MAAM,QAAQ,oBAAoB,gBAAgB,CAAC;AAAA,QACnD,MAAM,QACJ,QAAQ,oBAAoB,EAAE,uBAAW,cAAc,CAAC,WAAW,EAAE,CAAC,CACxE,EAAE,SAAS,QAAQ;AAAA,UACjB;AAAA,YACE,SAAS,CAAC,EAAE,UAAU,OAAO,aAAa,QAAQ,CAAC;AAAA,YACnD,gBAAgB;AAAA,YAChB,sBAAsB;AAAA,YACtB,mBAAmB;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,QAED,MAAM,WAAW,MAAM,QAAQ,qBAAqB;AAAA,UAClD;AAAA,UACA,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,IAAI,IAAI,KAAK,0BAA0B;AAAA,UACvC,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,SAAS,MAAM,EAAE,QAAQ;AAAA,UAC9B,gBAAgB;AAAA,UAChB,OAAO;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,iBAAiB;AAAA,UACnB;AAAA,UACA,OAAO;AAAA,YACL,SAAS,CAAC,EAAE,UAAU,OAAO,aAAa,QAAQ,CAAC;AAAA,YACnD,gBAAgB;AAAA,YAChB,sBAAsB;AAAA,YACtB,mBAAmB;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,QACD,QAAO,SAAS,MAAM,EAAE,cAAc,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAAA,QAC7D,QAAO,SAAS,MAAM,EAAE,cAAc;AAAA,UACpC,EAAE,YAAY,WAAW,SAAS,gBAAgB,gBAAgB,EAAE;AAAA,UACpE,EAAE,YAAY,WAAW,SAAS,kBAAkB,gBAAgB,EAAE;AAAA,QACxE,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,qBAAqB;AAAA,UAC3B;AAAA,UACA,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,IAAI,IAAI,KAAK,0BAA0B;AAAA,UACvC,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,SAAS;AAAA,QACX,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,CAAC;AAAA,QAC1D,MAAM,QACJ,QAAQ,eAAe;AAAA,UACrB;AAAA,UACA,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,IAAI,IAAI,KAAK,0BAA0B;AAAA,UACvC,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,CAAC;AAAA,QACtC,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,eAAe;AAAA,UACrB;AAAA,UACA,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,IAAI,IAAI,KAAK,0BAA0B;AAAA,UACvC,iBAAiB;AAAA,QACnB,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,GAAG,iBAAiB,cAAc,CAAC;AAAA,QACtE,CAAC;AAAA,gBACD;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,IAED,MAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,UAAU,MAAM,QAAQ;AAAA,MAC9B,IAAI;AAAA,QACF,MAAM,UAAU,UAAU,SAAS;AAAA,QACnC,MAAM,eAAe,MAAM,QAAQ,oBAAoB,OAAO,EAAE,MAAM,CAAC,UAAU,KAAK;AAAA,QACtF,QAAO,YAAY,EAAE,eAAe,kBAAkB;AAAA,QACtD,QAAQ,aAAoC,IAAI,EAAE,KAAK,eAAe;AAAA,QAEtE,MAAM,OAAO,UAAU;AAAA,QACvB,MAAM,WAAW,UAAU,WAAW;AAAA,UACpC,OAAO,EAAE,UAAU,OAAO,aAAa,QAAQ;AAAA,UAC/C,YAAY;AAAA,YACV,KAAK,KAAK,WAAW,IAAK,UAAU,MAAM,mBAAmB,QAAQ;AAAA,YACrE,GAAG,KAAK,WAAW,MAAM,CAAC;AAAA,UAC5B;AAAA,QACF,CAAC;AAAA,QACD,MAAM,gBAAgB,MAAM,QAAQ,oBAAoB,QAAQ,EAAE,MAAM,CAAC,UAAU,KAAK;AAAA,QACxF,QAAO,aAAa,EAAE,eAAe,kBAAkB;AAAA,QACvD,QAAQ,cAAqC,IAAI,EAAE,KAAK,eAAe;AAAA,QAEvE,MAAM,QACJ,QAAQ,oBAAoB;AAAA,aACvB;AAAA,UACH,OAAO,EAAE,UAAU,OAAO,aAAa,IAAI;AAAA,UAC3C,YAAY,CAAC;AAAA,UACb,aAAa,KAAK,KAAK,aAAa,UAAU,oBAAoB;AAAA,UAClE,UAAU,EAAE,QAAQ,SAAS,OAAO,SAAS,OAAO,YAAY,SAAS,WAAW;AAAA,QACtF,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAAA,gBACjD;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,GACF;AAAA;AAIH,eAAsB,8BAA8B,CAClD,YACA,OACe;AAAA,EACf,WAAW,WAAW;AAAA,IACpB,EAAE,uBAAW,YAAY;AAAA,IACzB,EAAE,uBAAW,aAAa,iBAAiB;AAAA,EAC7C,GAAG;AAAA,IACD,IAAI,MAAM,WAAW,QAAQ,EAAE,WAAW,QAAQ,WAAW,IAAI,QAAQ,YAAY,CAAC;AAAA,MACpF;AAAA,IACF,MAAM,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO,QAAQ;AAAA,IACjB;AAAA,IACA,MAAM,WAAW,OAAO;AAAA,MACtB,IAAI,QAAQ;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,MAC5E,QAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,QAAQ,cAAc;AAAA,MACtE,eAAe,oBAAoB,QAAQ;AAAA,MAC3C,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,WAAW;AAAA,IACpB,EAAE,IAAI,WAAW,OAAO,gBAAgB,OAAO,IAAI,QAAQ,GAAG,WAAW,OAAgB;AAAA,IACzF;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,EAAE,cAAc,KAAM;AAAA,IACnC;AAAA,IACA,EAAE,IAAI,WAAW,OAAO,gBAAgB,OAAO,GAAG,QAAQ,GAAG,WAAW,UAAU;AAAA,EACpF,GAAG;AAAA,IACD,MAAM,MAAM,gBAAgB;AAAA,MAC1B,IAAI,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,QAAQ,QAAQ;AAAA,MACxB,mBAAmB,CAAC;AAAA,MACpB,YAAY;AAAA,MACZ,kBAAkB,QAAQ;AAAA,SACtB,QAAQ,cAAc,YAAY,CAAC,IAAI,EAAE,oBAAoB,QAAQ,UAAU;AAAA,MACnF,YAAY,YAAY,cAAa,QAAQ;AAAA,MAC7C,OAAO;AAAA,QACL,aAAa,QAAQ;AAAA,QACrB,cAAc,QAAQ;AAAA,WAClB,QAAQ,OAAO,YACf,EAAE,qBAAqB,QAAQ,OAAO,sBAAsB,EAAE,IAC9D,CAAC;AAAA,MACP;AAAA,MACA,YAAY,IAAI,KAAK,0BAA0B;AAAA,MAC/C,YAAY,IAAI,KAAK,0BAA0B;AAAA,IACjD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,gBAAgB;AAAA,IAC1B,IAAI;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,mBAAmB,CAAC;AAAA,IACpB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,aAAa;AAAA,MACb,cAAc;AAAA,MACd,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,IACxB;AAAA,IACA,YAAY,IAAI,KAAK,0BAA0B;AAAA,IAC/C,YAAY,IAAI,KAAK,0BAA0B;AAAA,EACjD,CAAC;AAAA;;ACtZH,qBAAS,qBAAU,iBAAQ;AAiC3B,IAAM,aAAY;AAClB,IAAM,eAAc;AAEpB,IAAM,UAA0B,EAAE,MAAM,UAAU;AAClD,IAAM,UAA0B,EAAE,MAAM,SAAS,IAAI,UAAU;AAC/D,IAAM,OAAO,EAAE,MAAM,QAAiB,IAAI,SAAS;AAEnD,SAAS,GAAE,CAAC,OAAqB;AAAA,EAC/B,OAAO,IAAI,KAAK,KAAK;AAAA;AAGvB,SAAS,WAAW,CAClB,QACA,QACA,YAA8C,CAAC,GACtB;AAAA,EACzB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,UAAU,CAAC,SAAS,IAAI;AAAA,IACxB,WAAW,CAAC,EAAE,OAAO,gBAAgB,QAAQ,OAAO,CAAC;AAAA,IACrD,YAAY,IAAG,0BAA0B;AAAA,OACtC;AAAA,EACL;AAAA;AAIK,SAAS,8BAA8E,CAC5F,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,oCAAoC,QAAQ,MAAM,QAAQ,UAAU;AAAA,MAC1E,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7B,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,2DAA2D,MAAM;AAAA,MACpE,QAAO,qBAAqB,IAAG,+BAA+B,CAAC,CAAC,EAAE,QAAQ;AAAA,QACxE,MAAM;AAAA,QACN,OAAO,IAAG,0BAA0B;AAAA,QACpC,KAAK,IAAG,0BAA0B;AAAA,QAClC,SAAS,IAAG,0BAA0B;AAAA,MACxC,CAAC;AAAA,KACF;AAAA,IAED,MAAK,sFAAsF,YAAY;AAAA,MACrG,MAAM,YAAY,SAAS,eAAe;AAAA,QACxC,MAAM,UAAU,MAAM,SAAS,aAAa;AAAA,UAC1C,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,IAAI;AAAA,UAC5C,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,OAAO,EAAE,cAAc,EAAE,SAAS,MAAM,QAAQ,gBAAgB,CAAC;AAAA,QACxE,MAAM,QACJ,SAAS,aAAa;AAAA,UACpB,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,IAAI;AAAA,QAC9C,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAAA,QAEpD,MAAM,QACJ,SAAS,aAAa;AAAA,UACpB;AAAA,UACA,IAAI,QAAQ;AAAA,UACZ,OAAO,EAAE,OAAO,gBAAgB,QAAQ,IAAI;AAAA,UAC5C,SAAS;AAAA,UACT,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,OAAO,EAAE,QAAQ,IAAI,GAAG,SAAS,MAAM,CAAC;AAAA,QACnE,MAAM,QAAO,SAAS,aAAa,EAAE,sBAAU,CAAC,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,QACtE,MAAM,QACJ,SAAS,aAAa,EAAE,uBAAW,iBAAiB,KAAK,CAAC,CAC5D,EAAE,SAAS,aAAa,CAAC;AAAA,QACzB,MAAM,QAAO,SAAS,aAAa,EAAE,uBAAW,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI;AAAA,QACrF,MAAM,QAAO,SAAS,aAAa,EAAE,uBAAW,IAAI,QAAQ,GAAG,CAAC,CAAC,EAAE,SAAS,KAAK,KAAK;AAAA,QACtF,MAAM,QACJ,SAAS,aAAa;AAAA,UACpB,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,EAAE,UAAU,OAAO,aAAa,sBAAsB;AAAA,UAChE;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,QAAQ,6BAA6B;AAAA,QAC/C,MAAM,QACJ,SAAS,aAAa;AAAA,UACpB,IAAI;AAAA,UACJ;AAAA,UACA,SAAS,EAAE,MAAM,SAAS,IAAI,SAAS;AAAA,UACvC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,EAAE,UAAU,OAAO,aAAa,MAAM;AAAA,UAChD;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,QAAQ,+CAA+C;AAAA,OAClE;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,SAAS,eAAe;AAAA,QACxC,YAAY,IAAI,SAAS,WAAW;AAAA,UAClC,CAAC,WAAW,SAAS,EAAE;AAAA,UACvB,CAAC,WAAW,SAAS,CAAC;AAAA,UACtB,CAAC,QAAQ,MAAM,GAAG;AAAA,QACpB,GAAY;AAAA,UACV,MAAM,SAAS,aAAa;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO,EAAE,OAAO,gBAAgB,OAAO;AAAA,UACzC,CAAC;AAAA,QACH;AAAA,QACA,MAAM,SAAS,MAAM,SAAS,iBAAiB,YAAY,UAAU,EAAE,CAAC;AAAA,QACxE,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,QAAQ;AAAA,UACR,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC;AAAA,UAChF,SAAS,IAAG,0BAA0B;AAAA,QACxC,CAAC;AAAA,QACD,MAAM,WAAW,MAAM,SAAS,mBAAmB;AAAA,UACjD;AAAA,UACA,IAAI,IAAG,0BAA0B;AAAA,UACjC,kBAAkB,CAAC;AAAA,QACrB,CAAC;AAAA,QACD,QAAO,SAAS,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,SAAS,GAAG,QAAQ,EAAE,KAAK,IAAI;AAAA,QACrF,QAAO,SAAS,MAAM,CAAC,WAAW,OAAO,YAAY,SAAS,WAAW,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,OACvF;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,SAAS,eAAe;AAAA,QACxC,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,IAAI;AAAA,UAChC,SAAS,iBAAiB,YAAY,UAAU,CAAC,CAAC;AAAA,UAClD,SAAS,iBAAiB,YAAY,UAAU,CAAC,CAAC;AAAA,QACpD,CAAC;AAAA,QACD,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,UAAU,UAAU,CAAC;AAAA,QACpF,OAAO,UAAU,MAAM,SAAS,mBAAmB,EAAE,uBAAW,IAAI,IAAG,aAAa,EAAE,CAAC;AAAA,QACvF,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,UACxC,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,UAAU,EAAE,QAAQ,EAAE;AAAA,UACtB,SAAS,EAAE,QAAQ,EAAE;AAAA,UACrB,WAAW,EAAE,QAAQ,EAAE;AAAA,QACzB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAID,WAAW,eAAe,CAAC,OAAO,IAAI,GAAG;AAAA,MACvC,MAAK,+DAA+D,gBAAgB,YAAY;AAAA,QAC9F,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,YAClC,IAAI;AAAA,YACJ;AAAA,YACA,SAAS;AAAA,YACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,UAC7C,CAAC;AAAA,UACD,IAAI,aAAa;AAAA,YACf,MAAM,QAAQ,SAAS,mBAAmB,EAAE,uBAAW,IAAI,IAAG,aAAa,EAAE,CAAC;AAAA,UAChF;AAAA,UACA,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,YACtC,MAAM,SAAS,GAAG;AAAA,YAClB,MAAM,UAAU,MAAM,QAAQ,IAAI;AAAA,cAChC,OAAO,iBAAiB,YAAY,UAAU,CAAC,CAAC;AAAA,cAChD,OAAO,iBAAiB,YAAY,UAAU,CAAC,CAAC;AAAA,YAClD,CAAC;AAAA,YACD,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,UAAU,UAAU,CAAC;AAAA,YACpF,OAAO,UAAU,MAAM,OAAO,mBAAmB,EAAE,uBAAW,IAAI,IAAG,aAAa,EAAE,CAAC;AAAA,YACrF,QAAO,QAAQ,YAAY,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,YAClD,QAAO,QAAQ,YAAY,UAAU,MAAM,EAAE,KAAK,CAAC;AAAA,WACpD;AAAA,SACF;AAAA,OACF;AAAA,IACH;AAAA,IAEA,MAAK,iFAAiF,YAAY;AAAA,MAChG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,UACtC,MAAM,SAAS,GAAG;AAAA,UAClB,MAAM,WAAW,YAAY,UAAU,CAAC;AAAA,UACxC,MAAM,UAAU,MAAM,QAAQ,IAAI;AAAA,YAChC,OAAO,iBAAiB,QAAQ;AAAA,YAChC,OAAO,iBAAiB,QAAQ;AAAA,UAClC,CAAC;AAAA,UACD,QAAO,OAAO,EAAE,cAAc;AAAA,YAC5B,EAAE,QAAQ,YAAY,SAAS,KAAK;AAAA,YACpC,EAAE,QAAQ,YAAY,SAAS,MAAM;AAAA,UACvC,CAAC;AAAA,UACD,MAAM,QAAO,OAAO,iBAAiB,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,YACpF,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,QAAQ,IAAI;AAAA,YAChB,OAAO,uBAAuB,QAAQ;AAAA,YACtC,OAAO,uBAAuB,QAAQ;AAAA,UACxC,CAAC;AAAA,UACD,OAAO,UAAU,MAAM,OAAO,mBAAmB,EAAE,uBAAW,IAAI,IAAG,aAAa,EAAE,CAAC;AAAA,UACrF,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,YACxC,UAAU,EAAE,QAAQ,EAAE;AAAA,YACtB,SAAS,EAAE,QAAQ,EAAE;AAAA,YACrB,WAAW,EAAE,QAAQ,EAAE;AAAA,UACzB,CAAC;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,MAAM,QAAQ,IAAI;AAAA,YAChB,GAAG,SAAU,iBAAiB,YAAY,WAAW,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;AAAA,YACvE,GAAG,SAAU,iBAAiB,YAAY,UAAU,CAAC,CAAC;AAAA,UACxD,CAAC;AAAA,SACF,CACH,EAAE,QAAQ,eAAe,SAAS;AAAA,QAClC,OAAO,UAAU,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACzD;AAAA,UACA,IAAI,IAAG,aAAa;AAAA,QACtB,CAAC;AAAA,QACD,QAAO,QAAQ,YAAY,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,QAClD,MAAM,QACJ,QAAQ,SAAS,iBAAiB,YAAY,UAAU,CAAC,CAAC,CAC5D,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oDAAoD,YAAY;AAAA,MACnE,MAAM,YAAY,SAAS,eAAe;AAAA,QACxC,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,IAAI;AAAA,QAC9C,CAAC;AAAA,QACD,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,EAAE,UAAU,OAAO,aAAa,MAAM;AAAA,UAChD;AAAA,QACF,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,SAAS,iBAC5B,YAAY,iBAAiB,GAAG;AAAA,UAC9B,WAAW;AAAA,YACT,EAAE,OAAO,gBAAgB,QAAQ,EAAE;AAAA,YACnC;AAAA,cACE,OAAO;AAAA,cACP,QAAQ,EAAE,UAAU,OAAO,aAAa,IAAI;AAAA,YAC9C;AAAA,UACF;AAAA,QACF,CAAC,CACH;AAAA,QACA,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,QAAQ;AAAA,UACR,aAAa;AAAA,YACX,SAAS;AAAA,cACP,EAAE,SAAS,SAAS,UAAU,EAAE,OAAO,gBAAgB,QAAQ,EAAE,EAAE;AAAA,cACnE;AAAA,gBACE,SAAS;AAAA,gBACT,UAAU;AAAA,kBACR,OAAO;AAAA,kBACP,QAAQ,EAAE,UAAU,OAAO,aAAa,IAAI;AAAA,gBAC9C;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,6EAA6E,YAAY;AAAA,MAC5F,MAAM,YAAY,SAAS,eAAe;AAAA,QACxC,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,IAAI;AAAA,QAC9C,CAAC;AAAA,QACD,MAAM,QAAQ,MAAM,SAAS,iBAAiB,YAAY,UAAU,CAAC,CAAC;AAAA,QACtE,MAAM,SAAS,MAAM,SAAS,iBAAiB,YAAY,UAAU,CAAC,CAAC;AAAA,QACvE,QAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,YAAY,SAAS,KAAK,CAAC;AAAA,QACjE,QAAO,MAAM,EAAE,cAAc,EAAE,QAAQ,YAAY,SAAS,MAAM,CAAC;AAAA,QACnE,MAAM,QAAO,SAAS,iBAAiB,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,UACtF,MAAM;AAAA,QACR,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oDAAoD,YAAY;AAAA,MACnE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,QAAQ,aAAa;AAAA,QACrB,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,WAAW,YAAY,mBAAmB,CAAC;AAAA,QACjD,MAAM,SAAS,iBAAiB,QAAQ;AAAA,QACxC,MAAM,YAAY,QAAQ,SAAS,kBAAkB,SAAS,QAAQ,CAAC;AAAA,QACvE,MAAM,SAAS,uBAAuB;AAAA,UACpC;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AAAA,QACD,MAAM,SAAS,mBAAmB,KAAK,UAAU,eAAe,iBAAiB,CAAC;AAAA,QAClF,MAAM,QAAO,SAAS,iBAAiB,QAAQ,CAAC,EAAE,SAAS,cAAc;AAAA,UACvE,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,aAAa,EAAE,OAAO,aAAa;AAAA,QACrC,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,SAAS,eAAe;AAAA,QACxC,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,SAAS,iBAC5B,YAAY,oBAAoB,GAAG;AAAA,UACjC,WAAW;AAAA,YACT;AAAA,cACE,OAAO;AAAA,cACP,QAAQ,EAAE,UAAU,OAAO,aAAa,IAAI;AAAA,YAC9C;AAAA,UACF;AAAA,QACF,CAAC,CACH;AAAA,QACA,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,QAAQ;AAAA,UACR,qBAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE,CAAC;AAAA,UAClD,SAAS,CAAC,iBAAiB;AAAA,QAC7B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,QAAQ,aAAa;AAAA,QACrB,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,SAAS,iBAAiB,YAAY,aAAa,EAAE,CAAC;AAAA,QAC5D,MAAM,YAAY,QAAQ,SAAS,mBAAmB,aAAa,CAAC;AAAA,QACpE,MAAM,SAAS,uBAAuB;AAAA,UACpC;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AAAA,QACD,MAAM,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,cAAc,IAAG,0BAA0B;AAAA,QAC7C;AAAA,QACA,MAAM,QAAO,SAAS,mBAAmB,KAAK,CAAC,EAAE,SAAS,cAAc;AAAA,UACtE,OAAO;AAAA,UACP,eAAe;AAAA,QACjB,CAAC;AAAA,QACD,MAAM,QAAO,SAAS,mBAAmB,KAAK,CAAC,EAAE,SAAS,cAAc;AAAA,UACtE,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QACJ,SAAS,mBAAmB,KAAK,OAAO,eAAe,gBAAgB,CAAC,CAC1E,EAAE,QAAQ,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAAA,QAC3D,OAAO,UAAU,MAAM,SAAS,mBAAmB,EAAE,uBAAW,IAAI,MAAM,aAAa,CAAC;AAAA,QACxF,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,UACxC,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,UAAU,EAAE,QAAQ,EAAE;AAAA,UACtB,SAAS,EAAE,QAAQ,EAAE;AAAA,UACrB,WAAW,EAAE,QAAQ,GAAG;AAAA,QAC1B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,IAAI;AAAA,QAC9C,CAAC;AAAA,QACD,MAAM,WAAW,YAAY,iBAAiB,CAAC;AAAA,QAC/C,MAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAAA,QAChD,MAAM,YAAY,QAAQ,SAAS,oBAAoB,kBAAkB,CAAC;AAAA,QAC1E,MAAM,QACJ,QAAQ,SAAS,mBAAmB;AAAA,aAC/B;AAAA,UACH,eAAe;AAAA,QACjB,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAAA,OACnD;AAAA,KACF;AAAA,IAED,MAAK,iFAAiF,YAAY;AAAA,MAChG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,WAAW,YAAY,0BAA0B,CAAC;AAAA,QACxD,MAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAAA,QAChD,MAAM,iBAAiB,QAAQ,SAAS;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ,SAAS;AAAA,UACjB,OAAO,EAAE,aAAa,EAAE;AAAA,QAC1B,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,uBAAuB;AAAA,UAC5C;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,SAAS,mBAAmB;AAAA,aAC/B;AAAA,UACH,eAAe;AAAA,QACjB,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,OAAO,aAAa,CAAC;AAAA,QAChD,OAAO,UAAU,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACzD;AAAA,UACA,IAAI,SAAS;AAAA,QACf,CAAC;AAAA,QACD,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,kBAAkB;AAAA,UAClB,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,EAAE;AAAA,QACjE,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,iBAAiB,QAAQ,SAAS;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO,EAAE,aAAa,EAAE;AAAA,QAC1B,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,OAAO,UAAU,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACzD;AAAA,UACA,IAAI,IAAG,0BAA0B;AAAA,QACnC,CAAC;AAAA,QACD,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,kBAAkB;AAAA,UAClB,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;AAAA,QACvC,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,SAAS,iBAAiB,YAAY,iBAAiB,CAAC,CAAC,CACnE,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS,CAAC,sBAAsB;AAAA,QAClC,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,kDAAkD,YAAY;AAAA,MACjE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,WAAW,YAAY,kBAAkB,IAAI;AAAA,UACjD,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAAA,QAChD,MAAM,YAAY,QAAQ,SAAS,wBAAwB,kBAAkB,GAAG;AAAA,UAC9E,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,uBAAuB;AAAA,UAC5C;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,SAAS,mBAAmB;AAAA,aAC/B;AAAA,UACH,eAAe;AAAA,UACf,cAAc,IAAG,0BAA0B;AAAA,QAC7C,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,OAAO,aAAa,CAAC;AAAA,QAChD,OAAO,UAAU,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACzD;AAAA,UACA,IAAI,IAAG,0BAA0B;AAAA,QACnC,CAAC;AAAA,QACD,OAAO,aAAa,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UAC5D;AAAA,UACA,IAAI,IAAG,0BAA0B;AAAA,QACnC,CAAC;AAAA,QACD,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,UACxC,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,UAAU,EAAE,QAAQ,EAAE;AAAA,QACxB,CAAC;AAAA,QACD,QAAO,WAAW,WAAW,EAAE,cAAc;AAAA,UAC3C,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,WAAW,EAAE,QAAQ,GAAG;AAAA,QAC1B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,iDAAiD,YAAY;AAAA,MAChE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,QAAQ,aAAa;AAAA,QACrB,MAAM,SAAS,aAAa;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,WAAW,YAAY,WAAW,CAAC;AAAA,QACzC,MAAM,SAAS,iBAAiB,QAAQ;AAAA,QACxC,MAAM,SAAS,uBAAuB,KAAK,UAAU,UAAU,IAAG,mBAAmB,EAAE,CAAC;AAAA,QACxF,KAAK,UAAU,MAAM,SAAS,mBAAmB,EAAE,uBAAW,IAAI,SAAS,WAAW,CAAC;AAAA,QACvF,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,UACxC,UAAU,EAAE,QAAQ,EAAE;AAAA,UACtB,SAAS,EAAE,QAAQ,EAAE;AAAA,UACrB,WAAW,EAAE,QAAQ,EAAE;AAAA,QACzB,CAAC;AAAA,QACD,MAAM,YAAY,QAAQ,SAAS,iBAAiB,SAAS,QAAQ,CAAC;AAAA,QACtE,MAAM,SAAS,uBAAuB,EAAE,uBAAW,eAAe,gBAAgB,CAAC;AAAA,QACnF,MAAM,SAAS,mBAAmB;AAAA,aAC7B;AAAA,UACH,eAAe;AAAA,UACf,cAAc,IAAG,mBAAmB;AAAA,QACtC,CAAC;AAAA,QACA,CAAC,MAAM,IAAI,MAAM,SAAS,mBAAmB,EAAE,uBAAW,IAAI,SAAS,WAAW,CAAC;AAAA,QACpF,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,UACxC,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,SAAS,EAAE,QAAQ,EAAE;AAAA,UACrB,WAAW,EAAE,QAAQ,EAAE;AAAA,QACzB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,uFAAuF,YAAY;AAAA,MACtG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,YAAY,iBAAiB,EAAE;AAAA,QAChD,MAAM,YAAY,QAAQ,SAAS,uBAAuB,iBAAiB,CAAC;AAAA,QAC5E,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,KAAK,UAAU,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACvD;AAAA,UACA,IAAI,SAAS;AAAA,QACf,CAAC;AAAA,QACD,QAAO,QAAQ,YAAY,MAAM,EAAE,QAAQ,EAAE,OAAO,gBAAgB,QAAQ,EAAE,CAAC;AAAA,QAC/E,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC;AAAA,UACA,IAAI;AAAA,UACJ,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,aAAa,EAAE,uBAAW,IAAI,oBAAoB,CAAC;AAAA,QAC1E,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACA,CAAC,MAAM,IAAI,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACpD;AAAA,UACA,IAAI,SAAS;AAAA,QACf,CAAC;AAAA,QACD,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,UACxC,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,WAAW,EAAE,QAAQ,GAAG;AAAA,QAC1B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,iFAAiF,YAAY;AAAA,MAChG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,cAAc,EAAE,MAAM,SAAkB,IAAI,cAAc;AAAA,QAChE,MAAM,kBAAiB,EAAE,MAAM,kBAA2B,IAAI,aAAa;AAAA,QAC3E,MAAM,YAAY,QAAQ,SAAS,sBAAsB,gBAAgB,GAAG;AAAA,UAC1E,mBAAmB,CAAC,WAAW,aAAa;AAAA,QAC9C,CAAC;AAAA,QAED,MAAM,qBAAqB;AAAA,QAC3B,MAAM,uBACJ,QAAQ,MACR,QAAQ,YACR,oBACA,eACF;AAAA,QACA,MAAM,YAAY,QAAQ,SAAS,yBAAyB,mBAAmB,GAAG;AAAA,UAChF,aAAa;AAAA,UACb,mBAAmB,CAAC;AAAA,QACtB,CAAC;AAAA,QAED,YAAY,IAAI,YAAY;AAAA,UAC1B,CAAC,mBAAmB,OAAO;AAAA,UAC3B,CAAC,mBAAmB,OAAO;AAAA,UAC3B,CAAC,uBAAuB,WAAW;AAAA,UACnC,CAAC,gBAAgB,IAAI;AAAA,UACrB,CAAC,2BAA2B,eAAc;AAAA,QAC5C,GAAY;AAAA,UACV,MAAM,QAAQ,SAAS,aAAa;AAAA,YAClC;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,UAC7C,CAAC;AAAA,QACH;AAAA,QACA,MAAM,SAAS,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACvD;AAAA,UACA,IAAI,IAAG,0BAA0B;AAAA,QACnC,CAAC;AAAA,QACD,QACE,OAAO,YACL,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,OAAO,IAAI,OAAO,YAAY,OAAO,MAAM,CAAC,CAC7E,CACF,EAAE,QAAQ;AAAA,UACR,uBAAuB;AAAA,UACvB,mBAAmB;AAAA,UACnB,2BAA2B;AAAA,UAC3B,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,YAAY,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UAC1D;AAAA,UACA,IAAI,IAAG,0BAA0B;AAAA,QACnC,CAAC;AAAA,QACD,QAAO,UAAU,IAAI,CAAC,WAAW,OAAO,YAAY,OAAO,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAAA,OAC5F;AAAA,KACF;AAAA,IAED,MAAK,sEAAsE,YAAY;AAAA,MACrF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,EAAE,UAAU,OAAO,aAAa,aAAa;AAAA,UACvD;AAAA,QACF,CAAC;AAAA,QACD,MAAM,WAAW,YAAY,QAAQ,GAAG;AAAA,UACtC,WAAW;AAAA,YACT;AAAA,cACE,OAAO;AAAA,cACP,QAAQ,EAAE,UAAU,OAAO,aAAa,YAAY;AAAA,YACtD;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAAA,QAC/D,QAAO,OAAO,MAAM,EAAE,KAAK,UAAU;AAAA,QACrC,MAAM,YAAY,QAAQ,SAAS,cAAc,QAAQ,CAAC;AAAA,QAC1D,MAAM,QAAQ,QAAQ,oBAAoB,WAAU,cAAc,WAAW,CAAC;AAAA,QAC9E,MAAM,QAAQ,SAAS,uBAAuB;AAAA,UAC5C;AAAA,UACA,eAAe;AAAA,QACjB,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,SAAS,mBAAmB;AAAA,aAC/B;AAAA,UACH,eAAe;AAAA,QACjB,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,OAAO,aAAa,CAAC;AAAA,QAChD,OAAO,UAAU,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACzD;AAAA,UACA,IAAI,IAAG,0BAA0B;AAAA,QACnC,CAAC;AAAA,QACD,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,kBAAkB;AAAA,UAClB,aAAa;AAAA,YACX,QAAQ,EAAE,QAAQ,EAAE,UAAU,OAAO,aAAa,YAAY,EAAE;AAAA,YAChE,UAAU,EAAE,QAAQ,EAAE,UAAU,OAAO,aAAa,IAAI,EAAE;AAAA,YAC1D,WAAW,EAAE,QAAQ,EAAE,UAAU,OAAO,aAAa,YAAY,EAAE;AAAA,UACrE;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAID,WAAW,eAAe,CAAC,OAAO,IAAI,GAAG;AAAA,MACvC,WAAW,OAAO,CAAC,UAAU,WAAW,GAAY;AAAA,QAClD,MAAK,0CAA0C,oBAAoB,gBAAgB,YAAY;AAAA,UAC7F,MAAM,YAAY,OAAO,YAAY;AAAA,YACnC,MAAM,OAAO,CAAC,iBAA0C;AAAA,cACtD,OAAO;AAAA,cACP,QAAQ,EAAE,UAAU,OAAO,YAAY;AAAA,YACzC;AAAA,YACA,MAAM,UAAU,CAAC,QAAgB,WAC/B,YAAY,QAAQ,GAAG,EAAE,WAAW,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,YACtD,MAAM,WAAW,MACf,QAAQ,SAAS,mBAAmB;AAAA,cAClC;AAAA,cACA,IAAI,IAAG,0BAA0B;AAAA,YACnC,CAAC;AAAA,YACH,MAAM,QAAQ,SAAS,aAAa;AAAA,cAClC,IAAI;AAAA,cACJ;AAAA,cACA,SAAS;AAAA,cACT,OAAO,KAAK,MAAM;AAAA,YACpB,CAAC;AAAA,YACD,IAAI,aAAa;AAAA,cACf,SACG,MAAM,QAAQ,SAAS,iBAAiB,QAAQ,UAAU,KAAK,CAAC,GAAG,MACtE,EAAE,KAAK,UAAU;AAAA,cACjB,SACG,MAAM,QAAQ,SAAS,iBAAiB,QAAQ,WAAW,KAAK,CAAC,GAAG,MACvE,EAAE,KAAK,UAAU;AAAA,cACjB,MAAM,QAAQ,SAAS,uBAAuB,QAAQ,WAAW,KAAK,CAAC;AAAA,YACzE;AAAA,YACA,WAAW,MAAM,CAAC,aAAa,WAAW,GAAG;AAAA,cAC3C,MAAM,YAAY,QAAQ,SAAS,IAAI,IAAI,CAAC;AAAA,cAC5C,IAAI,aAAa;AAAA,gBACf,MAAM,QAAQ,SAAS,uBAAuB,EAAE,uBAAW,eAAe,GAAG,CAAC;AAAA,cAChF;AAAA,YACF;AAAA,YACA,SAAQ,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,KAAK,aAAa;AAAA,YAClE,MAAM,QAAQ,QAAQ,oBAAoB,WAAU,aAAa,KAAK,CAAC;AAAA,YACvE,SAAQ,MAAM,SAAS,GAAG,EAAE,EAAE,cAAc;AAAA,cAC1C,kBAAkB;AAAA,cAClB,aAAa,EAAE,QAAQ,KAAK,KAAK,EAAE;AAAA,YACrC,CAAC;AAAA,YACD,MAAM,QACJ,QAAQ,SAAS,iBAAiB,QAAQ,oBAAoB,GAAG,CAAC,CACpE,EAAE,SAAS,cAAc,EAAE,QAAQ,eAAe,SAAS,CAAC,sBAAsB,EAAE,CAAC;AAAA,YAErF,MAAM,QACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,cAChC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG;AAAA,gBAAU,MAAM,IAAI,MAAM,6BAA6B;AAAA,cAC9E,MAAM,GAAG,QAAQ,oBAAoB,WAAU,aAAa,IAAI,CAAC;AAAA,cACjE,OAAO,UAAU,MAAM,GAAG,SAAS,mBAAmB;AAAA,gBACpD;AAAA,gBACA,IAAI,IAAG,0BAA0B;AAAA,cACnC,CAAC;AAAA,cACD,QAAO,QAAQ,gBAAgB,EAAE,KAAK,UAAU;AAAA,cAChD,MAAM,IAAI,MAAM,6BAA6B;AAAA,aAC9C,CACH,EAAE,QAAQ,QAAQ,6BAA6B;AAAA,YAC/C,SAAQ,MAAM,SAAS,GAAG,IAAI,gBAAgB,EAAE,KAAK,aAAa;AAAA,YAIlE,MAAM,QAAQ,QAAQ,oBAAoB,WAAU,aAAa,IAAI,CAAC;AAAA,YACtE,IAAI,QAAQ,aAAa;AAAA,cACvB,MAAM,QACJ,QAAQ,SAAS,iBAAiB,QAAQ,aAAa,MAAM,CAAC,CAChE,EAAE,SAAS,cAAc,EAAE,QAAQ,SAAS,CAAC;AAAA,YAC/C;AAAA,YACA,SAAS,OAAO,EAAG,OAAO,GAAG,QAAQ;AAAA,cACnC,SAAQ,MAAM,SAAS,GAAG,EAAE,EAAE,cAAc;AAAA,gBAC1C,kBAAkB;AAAA,gBAClB,aAAa;AAAA,kBACX,QAAQ,KAAK,KAAK;AAAA,kBAClB,UAAU,KAAK,cAAc,QAAQ,GAAG;AAAA,kBACxC,SAAS,KAAK,cAAc,QAAQ,GAAG;AAAA,kBACvC,WAAW,KAAK,cAAc,QAAQ,KAAK;AAAA,gBAC7C;AAAA,cACF,CAAC;AAAA,YACH;AAAA,YACA,MAAM,YAAY,QAAQ,SAAS,eAAe,eAAe,CAAC;AAAA,YAClE,MAAM,QAAQ,QAAQ,oBAAoB,WAAU,eAAe,IAAI,CAAC;AAAA,YACxE,MAAM,QAAQ,SAAS,uBAAuB;AAAA,cAC5C;AAAA,cACA,eAAe;AAAA,YACjB,CAAC;AAAA,YACD,MAAM,YAAY,cAAc,MAAM;AAAA,YACtC,MAAM,QACJ,QAAQ,SAAS,iBAAiB,QAAQ,eAAe,OAAO,YAAY,CAAC,CAAC,CAAC,CACjF,EAAE,SAAS,cAAc,EAAE,QAAQ,SAAS,CAAC;AAAA,YAC7C,MAAM,QACJ,QAAQ,SAAS,iBAAiB,QAAQ,QAAQ,OAAO,SAAS,CAAC,CAAC,CACtE,EAAE,SAAS,cAAc,EAAE,QAAQ,WAAW,CAAC;AAAA,WAChD;AAAA,SACF;AAAA,MACH;AAAA,IACF;AAAA,IAEA,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,YAAY,QAAQ,SAAS,kBAAkB,YAAY,CAAC;AAAA,QAClE,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ,EAAE,UAAU,OAAO,aAAa,aAAa;AAAA,UACvD;AAAA,QACF,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,SAAS,iBACf,YAAY,kBAAkB,GAAG;AAAA,UAC/B,WAAW;AAAA,YACT;AAAA,cACE,OAAO;AAAA,cACP,QAAQ,EAAE,UAAU,OAAO,aAAa,IAAI;AAAA,YAC9C;AAAA,UACF;AAAA,QACF,CAAC,CACH,CACF,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS,CAAC,sBAAsB;AAAA,QAClC,CAAC;AAAA,QAED,MAAM,QAAQ,QAAQ,oBAAoB,iBAAgB,gBAAgB,CAAC;AAAA,QAC3E,MAAM,QACJ,QAAQ,SAAS,iBACf,YAAY,qBAAqB,GAAG;AAAA,UAClC,WAAW;AAAA,YACT;AAAA,cACE,OAAO;AAAA,cACP,QAAQ,EAAE,UAAU,OAAO,aAAa,IAAI;AAAA,YAC9C;AAAA,UACF;AAAA,QACF,CAAC,CACH,CACF,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS,CAAC,sBAAsB;AAAA,QAClC,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,6EAA6E,YAAY;AAAA,MAC5F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,MAAM,SAAS,GAAG;AAAA,UAClB,IAAI,CAAC;AAAA,YAAQ,MAAM,IAAI,MAAM,0CAA0C;AAAA,UACvE,MAAM,OAAO,aAAa;AAAA,YACxB,IAAI;AAAA,YACJ;AAAA,YACA,SAAS;AAAA,YACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,UAC7C,CAAC;AAAA,UACD,MAAM,OAAO,iBAAiB,YAAY,eAAe,CAAC,CAAC;AAAA,UAC3D,MAAM,IAAI,MAAM,UAAU;AAAA,SAC3B,CACH,EAAE,QAAQ,QAAQ,UAAU;AAAA,QAC5B,MAAM,QACJ,QAAQ,SAAS,UAAU,EAAE,uBAAW,IAAI,cAAc,CAAC,CAC7D,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,SAAS,iBAAiB,YAAY,kBAAkB,EAAE,CAAC,CACrE,EAAE,SAAS,QAAQ,EAAE,QAAQ,cAAc,CAAC;AAAA,OAC7C;AAAA,KACF;AAAA,IAED,MAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClC,IAAI;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,UACT,OAAO,EAAE,OAAO,gBAAgB,QAAQ,GAAG;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,WAAW,YAAY,4BAA4B,CAAC;AAAA,QAC1D,MAAM,QAAQ,SAAS,iBAAiB,QAAQ;AAAA,QAEhD,MAAM,QACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,UAAU;AAAA,YAC/B,MAAM,IAAI,MAAM,yDAAyD;AAAA,UAC3E;AAAA,UACA,MAAM,YAAY,GAAG,SAAS,kCAAkC,SAAS,QAAQ,CAAC;AAAA,UAClF,MAAM,GAAG,SAAS,uBAAuB;AAAA,YACvC;AAAA,YACA,eAAe;AAAA,UACjB,CAAC;AAAA,UACD,MAAM,GAAG,SAAS,mBAAmB;AAAA,eAChC;AAAA,YACH,eAAe;AAAA,UACjB,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,qBAAqB;AAAA,SACtC,CACH,EAAE,QAAQ,QAAQ,qBAAqB;AAAA,QAEvC,MAAM,QACJ,QAAQ,QAAQ,mBAAmB,EAAE,uBAAW,0BAAY,CAAC,CAC/D,EAAE,SAAS,cAAc,EAAE,gBAAgB,EAAE,CAAC;AAAA,QAC9C,OAAO,UAAU,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACzD;AAAA,UACA,IAAI,SAAS;AAAA,QACf,CAAC;AAAA,QACD,QAAO,QAAQ,WAAW,EAAE,cAAc;AAAA,UACxC,QAAQ,EAAE,QAAQ,EAAE;AAAA,UACpB,UAAU,EAAE,QAAQ,EAAE;AAAA,UACtB,WAAW,EAAE,QAAQ,EAAE;AAAA,QACzB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAsB,mCAAmC,CACvD,MACA,YACe;AAAA,EACf,IAAI,CAAE,MAAM,KAAK,MAAM,QAAQ,EAAE,uBAAW,IAAI,KAAK,GAAG,CAAC,GAAI;AAAA,IAC3D,MAAM,KAAK,MAAM,OAAO;AAAA,MACtB,IAAI,KAAK;AAAA,MACT;AAAA,MACA,OAAO;AAAA,MACP,WAAW,IAAG,0BAA0B;AAAA,MACxC,WAAW,IAAG,0BAA0B;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EACA,IAAI,MAAM,WAAW,QAAQ,EAAE,uBAAW,IAAI,aAAY,CAAC;AAAA,IAAG;AAAA,EAC9D,MAAM,YAAY,EAAE,MAAM,YAAqB,IAAI,qBAAqB,OAAO,aAAY;AAAA,EAC3F,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,eAAc;AAAA,IAC9D,eAAe,oBAAoB;AAAA,IACnC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA;AAGH,eAAe,sBAAsB,CACnC,MACA,YACA,IACA,WAGe;AAAA,EACf,IAAI,UAAU,SAAS,kBAAkB;AAAA,IACvC,IAAI,CAAE,MAAM,KAAK,gBAAgB,QAAQ,EAAE,uBAAW,IAAI,UAAU,GAAG,CAAC,GAAI;AAAA,MAC1E,MAAM,KAAK,gBAAgB,OAAO;AAAA,QAChC,IAAI,UAAU;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN,WAAW,IAAG,0BAA0B;AAAA,QACxC,WAAW,IAAG,0BAA0B;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,IAAI,MAAM,WAAW,QAAQ,EAAE,uBAAW,GAAG,CAAC;AAAA,IAAG;AAAA,EACjD,MAAM,YAAY,EAAE,MAAM,YAAqB,IAAI,qBAAqB,OAAO,GAAG;AAAA,EAClF,MAAM,WAAW,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,KAAK;AAAA,IACrD,eAAe,oBAAoB;AAAA,IACnC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA;AAGH,eAAe,WAAW,CACxB,SACA,IACA,QACA,aACA,YAII,CAAC,GACU;AAAA,EACf,MAAM,iBAAiB,SAAS;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,aAAa,UAAU;AAAA,IACvB,mBAAmB,UAAU;AAAA,IAC7B,YAAY,UAAU;AAAA,IACtB,OAAO,EAAE,aAAa,aAAa,cAAc,EAAE;AAAA,EACrD,CAAC;AAAA;AAGH,eAAe,gBAAgB,CAC7B,SACA,OAQe;AAAA,EACf,MAAM,QAAQ,gBAAgB;AAAA,IAC5B,IAAI,MAAM;AAAA,IACV;AAAA,IACA,aAAa,MAAM,eAAe;AAAA,IAClC,SAAS;AAAA,IACT,QAAQ,MAAM;AAAA,IACd,mBAAmB,MAAM,qBAAqB,CAAC,SAAS;AAAA,IACxD,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,YAAY,YAAY,MAAM;AAAA,IAC9B,OAAO,MAAM;AAAA,IACb,YAAY,MAAM,cAAc,IAAG,0BAA0B;AAAA,IAC7D,YAAY,IAAG,0BAA0B;AAAA,EAC3C,CAAC;AAAA;AAGH,SAAS,UAAS,CAAC,eAAuB,aAA4C;AAAA,EACpF,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,iBAAiB,EAAE,YAAY,QAAQ,SAAS,aAAa;AAAA,IAC7D,gBAAgB,CAAC;AAAA,IACjB,aAAa;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,MACX,YAAY,IAAG,0BAA0B;AAAA,IAC3C;AAAA,IACA,OAAO,EAAE,UAAU,OAAO,YAAY;AAAA,IACtC,YAAY;AAAA,MACV;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,4BAA4B,OAAO,WAAW,IAAI,UAAY,SAAS;AAAA,QACvE,mBAAmB;AAAA,MACrB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,UAAU;AAAA,QACV,2BAA2B;AAAA,QAC3B,mBAAmB;AAAA,MACrB;AAAA,IACF;AAAA,IACA,SAAS,IAAG,0BAA0B;AAAA,EACxC;AAAA;AAGF,SAAS,gBAAe,CAAC,eAA8C;AAAA,EACrE,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,iBAAiB,EAAE,YAAY,QAAQ,SAAS,aAAa;AAAA,IAC7D,gBAAgB,CAAC;AAAA,IACjB,aAAa;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,MACX,YAAY,IAAG,0BAA0B;AAAA,IAC3C;AAAA,IACA,QAAQ;AAAA,IACR,SAAS,IAAG,0BAA0B;AAAA,EACxC;AAAA;;AC5mCF,qBAAS,qBAAU,iBAAQ;;;ACI3B,eAAsB,2BAA2B,CAC/C,YACA,OAOiB;AAAA,EACjB,MAAM,oBAAoB,0BAA0B,MAAM;AAAA,EAC1D,MAAM,eAAc,MAAM,eAAe,2BAA2B,MAAM;AAAA,EAC1E,MAAM,YAAiC;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,WAAW,WAAW,gBAAgB,MAAM,QAAQ;AAAA,IACtE,QAAQ,EAAE,MAAM,QAAQ,WAAW,gBAAgB,MAAM,QAAQ;AAAA,OAC7D,MAAM,gBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,gBAAgB,MAAM,WAAW,EAAE;AAAA,IAC7F,eAAe,oBAAoB,MAAM;AAAA,IACzC,kBACE,MAAM,gBAAgB,YAClB,EAAE,MAAM,WAAW,IACnB,EAAE,MAAM,aAAa,WAAW,gBAAgB,MAAM,WAAW,EAAE;AAAA,EAC3E,CAAC;AAAA,EACD,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,aAAa,aAAa,kBAAkB;AAAA,OACxD,MAAM,gBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,gBAAgB,MAAM,WAAW,EAAE;AAAA,IAC7F,eAAe,oBAAoB,MAAM;AAAA,IACzC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA,EAED,OAAO;AAAA;AAIT,eAAsB,oCAAoC,CACxD,YACA,OAQiB;AAAA,EACjB,MAAM,eAAc,MAAM,eAAe,2BAA2B,MAAM;AAAA,EAC1E,MAAM,YAAiC;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,MAAM,UAAU,EAAE,MAAM,SAAS,SAAS,cAAc,MAAM,QAAQ;AAAA,IAC9E,eAAe,MAAM,iBAAiB,oBAAoB,MAAM;AAAA,IAChE,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA,EAED,OAAO;AAAA;;;ADhET,IAAM,aAAY;AAClB,IAAM,QAAQ;AAAA,EACZ;AAAA,EACA,MAAM,IAAI,KAAK,sBAAsB;AAAA,EACrC,IAAI,IAAI,KAAK,sBAAsB;AACrC;AAGO,SAAS,iCAA6E,CAC3F,MACA,SACM;AAAA,EACN,UAAS,MAAM,MAAM;AAAA,IACnB,MAAK,oFAAoF,YAAY;AAAA,MACnG,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,MAC5C,IAAI;AAAA,QACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,QAC7B,YAAY,OAAO,eAAe,CAAC,WAAW,WAAW,UAAU,EAAE,QAAQ,GAAG;AAAA,UAC9E,MAAM,iBAAiB,SAAS,YAAY,gBAAgB,OAAO;AAAA,QACrE;AAAA,QACA,MAAM,WAAW,MAAM,QAAQ,QAAQ,qBAAqB,KAAK,OAAO,QAAQ,MAAM,CAAC;AAAA,QAGvF,QACE,SAAS,OAAO,IAAI,CAAC,WAAW;AAAA,UAC9B,MAAM,MAAM;AAAA,UACZ,gBAAgB,MAAM;AAAA,aAClB,MAAM,SAAS,kBACf,EAAE,YAAY,MAAM,YAAY,aAAa,MAAM,YAAY,IAC/D,CAAC;AAAA,QACP,EAAE,CACJ,EAAE,QAAQ;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,QACD,QAAO,SAAS,OAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,OAAO,aAAa,KAAK,CAAC,CAAC;AAAA,QACtF,MAAM,QAAQ,MAAM,QAAQ,QAAQ,eAAe,KAAK;AAAA,QACxD,MAAM,SAAS,MAAM,QAAQ,QAAQ,oBAAoB,KAAK;AAAA,QAC9D,QAAO,MAAM,KAAK,EAAE,KAAK,CAAC;AAAA,QAC1B,QAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,WAAW,QAAQ,MAAM,OAAO;AAAA,UAC9B,MAAM,QAAQ,KAAK,MAAM;AAAA,UACzB,MAAM,aAAa,UAAU,mBAAmB,aAAa;AAAA,UAC7D,MAAM,cAAc;AAAA,YAClB,MAAM;AAAA,YACN;AAAA,YACA,aAAa;AAAA,YACb,eAAe;AAAA,YACf,WAAW,GAAG;AAAA,UAChB;AAAA,UACA,QAAO,KAAK,WAAW,EAAE,QAAQ,WAAW;AAAA,UAC5C,MAAM,QAAQ,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,gBAAgB,KAAK,MAAM,WAAW;AAAA,UACrF,QAAO,OAAO,WAAW,EAAE,QAAQ,WAAW;AAAA,UAC9C,QAAO,OAAO,WAAW,IAAI,WAAW,EAAE,QAAQ,WAAW;AAAA,QAC/D;AAAA,gBACA;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,IAED,MAAK,gFAAgF,YAAY;AAAA,MAC/F,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,MAC5C,IAAI;AAAA,QACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,QAC7B,MAAM,KAAK,OAAO;AAAA,QAClB,MAAM,QAAQ,MAAM,QAAQ,QAAQ,oBAAoB,KAAK,OAAO,OAAO,EAAE,CAAC;AAAA,QAC9E,QAAO,KAAK,EAAE,cAAc;AAAA,UAC1B,OAAO;AAAA,UACP,SAAS;AAAA,UACT,OAAO,CAAC,EAAE,aAAa,eAAe,gBAAgB,EAAE,CAAC;AAAA,QAC3D,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,QAAQ,QAAQ,oBAAoB,KAAK,OAAO,OAAO,GAAG,QAAQ,EAAE,CAAC;AAAA,QAC1F,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,OAAO;AAAA,UACP,SAAS;AAAA,UACT,OAAO;AAAA,YACL;AAAA,cACE,aAAa;AAAA,cACb,gBAAgB;AAAA,cAChB,aAAa,EAAE,MAAM,SAAS,YAAY,UAAU,UAAU,SAAS;AAAA,cACvE,OAAO;AAAA,gBACL,SAAS;AAAA,kBACP,EAAE,UAAU,OAAO,aAAa,IAAI;AAAA,kBACpC,EAAE,UAAU,OAAO,aAAa,MAAM;AAAA,gBACxC;AAAA,gBACA,gBAAgB;AAAA,gBAChB,mBAAmB;AAAA,cACrB;AAAA,cACA,YAAY;AAAA,gBACV,EAAE,aAAa,eAAe,gBAAgB,GAAG,aAAa,EAAE;AAAA,gBAChE;AAAA,kBACE,aAAa;AAAA,kBACb,gBAAgB;AAAA,kBAChB,aAAa,EAAE,MAAM,YAAY,aAAa,UAAU,eAAe,QAAQ;AAAA,gBACjF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,QAAO,OAAO,MAAM,IAAI,WAAW,EAAE,cAAc;AAAA,QACnD,MAAM,WAAW,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,aACtD;AAAA,UACH,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,iBAAiB;AAAA,QACnB,CAAC;AAAA,QACD,QAAO,QAAQ,EAAE,cAAc;AAAA,UAC7B,OAAO;AAAA,UACP,OAAO;AAAA,YACL;AAAA,cACE,aAAa;AAAA,cACb,gBAAgB;AAAA,cAChB,aAAa;AAAA,cACb,OAAO;AAAA,gBACL,SAAS,CAAC,EAAE,UAAU,OAAO,aAAa,MAAM,CAAC;AAAA,gBACjD,gBAAgB;AAAA,gBAChB,mBAAmB;AAAA,cACrB;AAAA,cACA,YAAY,CAAC,EAAE,aAAa,cAAc,gBAAgB,GAAG,CAAC;AAAA,YAChE;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,QAAO,SAAS,MAAM,IAAI,UAAU,EAAE,aAAa,CAAC;AAAA,QACpD,MAAM,OAAO,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,aAClD;AAAA,UACH,MAAM,IAAI,KAAK,sBAAsB;AAAA,UACrC,IAAI,IAAI,KAAK,sBAAsB;AAAA,QACrC,CAAC;AAAA,QACD,QAAO,IAAI,EAAE,cAAc;AAAA,UACzB,OAAO;AAAA,UACP,OAAO,CAAC,EAAE,aAAa,eAAe,gBAAgB,GAAG,CAAC;AAAA,QAC5D,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,aACrD;AAAA,UACH,iBAAiB;AAAA,UACjB,SAAS;AAAA,QACX,CAAC;AAAA,QACD,QAAO,QAAQ,MAAM,IAAI,MAAM,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,QAClD,QAAO,QAAQ,MAAM,IAAI,WAAW,EAAE,cAAc;AAAA,QACpD,QACE,MAAM,QAAQ,QAAQ,oBAAoB,KAAK,OAAO,WAAW,gBAAgB,CAAC,CACpF,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,OAAO,GAAG,SAAS,MAAM,CAAC;AAAA,QACjD,QAAO,MAAM,QAAQ,QAAQ,oBAAoB,KAAK,OAAO,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ;AAAA,UAClF,OAAO,CAAC;AAAA,UACR,OAAO;AAAA,UACP,SAAS;AAAA,QACX,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,QAAQ,oBAAoB,KAAK,OAAO,OAAO,IAAI,CAAC,CAC9D,EAAE,QAAQ,QAAQ;AAAA,QAClB,MAAM,QACJ,QAAQ,QAAQ,oBAAoB,KAAK,OAAO,IAAI,MAAM,KAAK,CAAC,CAClE,EAAE,QAAQ,QAAQ;AAAA,gBAClB;AAAA,QACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,KAElC;AAAA,GACF;AAAA;AAGH,eAAe,gBAAgB,CAC7B,SACA,YACA,OACA;AAAA,EACA,MAAM,oBAAoB,MAAM,4BAA4B,QAAQ,YAAY;AAAA,IAC9E;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,QAAQ,aAAa,MAAM;AAAA,IAC/B;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,OAAO,CAAC;AAAA,IACR,mBAAmB,CAAC;AAAA,EACtB,CAAC;AAAA,EACD,MAAM,QAAQ,aAAa,MAAM,EAAE,uBAAW,IAAI,MAAM,CAAC;AAAA,EACzD,MAAM,YAAY,GAAG;AAAA,EACrB,MAAM,QAAQ,aAAa,MAAM,MAAM;AAAA,IACrC;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,IACA,eAAe;AAAA,IACf,WAAW;AAAA,IACX,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO,CAAC;AAAA,EACV,CAAC;AAAA,EACD,MAAM,UAAU,yBAAyB,YAAY,QAAQ;AAAA,EAC7D,MAAM,eAAc,MAAM,yBAAyB,SAAS;AAAA,IAC1D;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,QAAQ,aAAa,WAAW,OAAO;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,QAAQ,WAAW,MAAM,QAAQ,QAAQ,gBAAgB;AAAA,IACvD;AAAA,IACA,IAAI,SAAS;AAAA,IACb;AAAA,IACA,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,mBAAmB,CAAC;AAAA,IACpB,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE;AAAA,IAC1C,YAAY,IAAI,KAAK,sBAAsB;AAAA,EAC7C,CAAC;AAAA,EACD,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,IACxC;AAAA,IACA,eAAe,OAAO;AAAA,IACtB,QAAQ;AAAA,IACR,gBAAgB,CAAC;AAAA,IACjB,aAAa;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,eAAe;AAAA,MACf,YAAY,IAAI,KAAK,sBAAsB;AAAA,IAC7C;AAAA,IACA,YAAY,CAAC;AAAA,IACb,iBAAiB,EAAE,YAAY,QAAQ,SAAS,QAAQ;AAAA,IACxD,OAAO,EAAE,UAAU,OAAO,aAAa,KAAK;AAAA,IAC5C,SAAS,IAAI,KAAK,sBAAsB;AAAA,EAC1C,CAAC;AAAA;AAGH,eAAe,IAAI,CAAC,SAA2C;AAAA,EAC7D,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAAA,IAClC,IAAI;AAAA,IACJ;AAAA,IACA,gBAAgB,EAAE,MAAM,QAAQ,IAAI,OAAO;AAAA,EAC7C,CAAC;AAAA,EACD,WAAW,SAAS,CAAC,UAAU,QAAQ,GAAG;AAAA,IACxC,MAAM,eAAc,MAAM,yBAAyB,SAAS;AAAA,MAC1D;AAAA,MACA;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,WAAW;AAAA,IACb,CAAC;AAAA,IACD,MAAM,QAAQ,OAAO,KAAK,OAAO;AAAA,MAC/B,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,kBAAkB,WAAW;AAAA,MAC7B,MAAM,EAAE,OAAO,EAAE,UAAU,mBAAmB,SAAS,QAAQ,EAAE;AAAA,MACjE,mBAAmB,CAAC;AAAA,IACtB,CAAC;AAAA,IACD,MAAM,QAAQ,OAAO,KAAK,MAAM;AAAA,MAC9B,IAAI;AAAA,MACJ;AAAA,MACA,WAAW,EAAE,OAAO,OAAO,qBAAqB,IAAI,KAAK,sBAAsB,EAAE;AAAA,IACnF,CAAC;AAAA,IACD,IAAI,UAAU,UAAU;AAAA,MACtB,MAAM,iBAAiB,MAAM,yBAAyB,SAAS;AAAA,QAC7D;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,WAAW;AAAA,MACb,CAAC;AAAA,MACD,MAAM,QAAQ,OAAO,KAAK,eAAe;AAAA,QACvC,IAAI;AAAA,QACJ;AAAA,QACA,aAAa;AAAA,QACb,aAAa;AAAA,QACb,sBAAsB;AAAA,QACtB,UAAU;AAAA,QACV,MAAM;AAAA,UACJ,OAAO,EAAE,UAAU,kBAAkB,SAAS,QAAQ;AAAA,UACtD,MAAM;AAAA,UACN,WAAW,CAAC;AAAA,UACZ,UAAU;AAAA,QACZ;AAAA,QACA,mBAAmB;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,QAAQ,OAAO,KAAK,OAAO;AAAA,MAC/B,IAAI;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,MAChB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EACA,SAAS,QAAQ,EAAG,QAAQ,IAAI,SAAS;AAAA,IACvC,MAAM,QAAQ,QAAQ,KAAK,QAAQ;AAAA,IACnC,MAAM,SAAS,MAAM,QAAQ,QAAQ,gBAAgB;AAAA,MACnD,IAAI,SAAS;AAAA,MACb;AAAA,MACA,aAAa,UAAU,IAAI,gBAAgB,QAAQ,eAAe;AAAA,MAClE,SAAS;AAAA,MACT,QAAQ,QAAQ;AAAA,MAChB,mBAAmB,CAAC;AAAA,MACpB,YAAY,QAAQ,mBAAmB;AAAA,MACvC,kBAAkB,QAAQ,UAAU;AAAA,MACpC,YAAY,YAAY;AAAA,MACxB,OAAO,UAAU,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,MAC7D,YAAY,IAAI,KAAK,KAAK,MAAM,sBAAsB,IAAI,QAAQ,IAAI;AAAA,IACxE,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAI;AAAA,IACjB,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,MACxC;AAAA,MACA,eAAe,OAAO,OAAO;AAAA,MAC7B,QAAQ;AAAA,MACR,iBAAiB;AAAA,QACf,YAAY,QAAQ,mBAAmB;AAAA,QACvC,SAAS,QAAQ,UAAU;AAAA,MAC7B;AAAA,MACA,gBAAgB,CAAC;AAAA,MACjB,aAAa;AAAA,QACX,UAAU;AAAA,QACV,eAAe,QAAQ;AAAA,QACvB,eAAe;AAAA,QACf,YAAY,IAAI,KAAK,sBAAsB;AAAA,MAC7C;AAAA,MACA,YAAY,CAAC;AAAA,MACb,OAAO,EAAE,UAAU,UAAU,IAAI,QAAQ,OAAO,aAAa,UAAU,IAAI,MAAM,KAAK;AAAA,MACtF,SAAS,IAAI,KAAK,sBAAsB;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA;;AE/VF,qBAAS,qBAAU,iBAAQ;AAiB3B,IAAM,aAAY;AAClB,IAAM,mBAAmB;AACzB,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAE5B,SAAS,GAAE,CAAC,OAAqB;AAAA,EAC/B,OAAO,IAAI,KAAK,KAAK;AAAA;AAGvB,SAAS,cAAc,CAAC,YAA6C,CAAC,GAA2B;AAAA,EAC/F,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,mBAAmB,CAAC,WAAW,aAAa;AAAA,IAC5C,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,oBAAoB,EAAE,cAAc,KAAM;AAAA,IAC1C,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,aAAa;AAAA,MACb,cAAc;AAAA,MACd,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,uBAAuB;AAAA,MACvB,kBAAkB;AAAA,MAClB,uBAAuB;AAAA,IACzB;AAAA,IACA,UAAU,EAAE,cAAc,IAAI,eAAe,EAAE;AAAA,IAC/C,YAAY,IAAG,0BAA0B;AAAA,IACzC,YAAY,IAAG,0BAA0B;AAAA,OACtC;AAAA,EACL;AAAA;AAIK,SAAS,8BAA+D,CAC7E,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7B,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,uDAAuD,YAAY;AAAA,MAEtE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,cAAc;AAAA,UAClB,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB;AAAA,QACA,MAAM,QAAQ,gBAAgB,eAAe,EAAE,YAAY,CAAC,CAAC;AAAA,QAC7D,MAAM,SAAS,MAAM,QAAQ,sBAAsB;AAAA,UACjD;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AAAA,QACD,QAAO,QAAQ,WAAW,EAAE,QAAQ,WAAW;AAAA,QAC/C,MAAM,SAAS,MAAM,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAC7D,QAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QACjC,QAAO,OAAO,OAAO,WAAW,EAAE,QAAQ,WAAW;AAAA,QACrD,MAAM,QAAQ,gBACZ,eAAe,EAAE,IAAI,UAAU,QAAQ,UAAU,YAAY,IAAG,sBAAsB,EAAE,CAAC,CAC3F;AAAA,QACA,SACG,MAAM,QAAQ,sBAAsB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,IAC7E,WACN,EAAE,cAAc;AAAA,QAChB,MAAM,QACJ,QAAQ,gBAAgB,eAAe,EAAE,aAAa,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,CAC7E,EAAE,QAAQ,QAAQ,WAAW;AAAA,OAC9B;AAAA,KACF;AAAA,IACD,MAAK,sEAAsE,YAAY;AAAA,MACrF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,QAAQ,gBAC3B,eAAe;AAAA,UACb,mBAAmB,CAAC,WAAW,eAAe,SAAS;AAAA,QACzD,CAAC,CACH;AAAA,QAEA,QAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,QAChC,QAAO,OAAO,MAAM,EAAE,QAAQ;AAAA,aACzB,eAAe;AAAA,UAClB,mBAAmB,CAAC,eAAe,SAAS;AAAA,UAC5C,OAAO;AAAA,eACF,eAAe,EAAE;AAAA,YACpB,aAAa;AAAA,YACb,iBAAiB;AAAA,UACnB;AAAA,UACA,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAC5D,MAAM,SAAS,MAAM,QAAQ,gBAC3B,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,mBAAmB,CAAC,iBAAiB;AAAA,UACrC,OAAO,EAAE,aAAa,KAAK,cAAc,EAAE;AAAA,QAC7C,CAAC,CACH;AAAA,QAEA,QAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,QAC/B,QAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QACjC,QAAO,OAAO,MAAM,EAAE,QAAQ,MAAM,MAAM;AAAA,OAC3C;AAAA,KACF;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAC9C,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,OAAO;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,qBAAqB;AAAA,YACrB,sBAAsB;AAAA,YACtB,uBAAuB;AAAA,YACvB,kBAAkB;AAAA,YAClB,uBAAuB;AAAA,UACzB;AAAA,QACF,CAAC,CACH;AAAA,QAEA,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,qBAAqB;AAAA,YACrB,sBAAsB;AAAA,YACtB,uBAAuB;AAAA,YACvB,kBAAkB;AAAA,YAClB,uBAAuB;AAAA,YACvB,iBAAiB;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,uDAAuD,YAAY;AAAA,MACtE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QACJ,QAAQ,sBAAsB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CAC5E,EAAE,SAAS,SAAS;AAAA,QAEpB,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,CACH;AAAA,QAEA,MAAM,QACJ,QAAQ,sBAAsB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CAC5E,EAAE,SAAS,cAAc,EAAE,IAAI,eAAe,YAAY,iBAAiB,CAAC;AAAA,QAC5E,MAAM,QACJ,QAAQ,sBAAsB;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa;AAAA,QACf,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,0EAA0E,YAAY;AAAA,MAGzF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAC9C,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,OAAO;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,qBAAqB;AAAA,YACrB,sBAAsB;AAAA,YACtB,uBAAuB;AAAA,YACvB,kBAAkB;AAAA,YAClB,uBAAuB;AAAA,UACzB;AAAA,QACF,CAAC,CACH;AAAA,QAEA,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,qBAAqB;AAAA,YACrB,sBAAsB;AAAA,YACtB,uBAAuB;AAAA,YACvB,kBAAkB;AAAA,YAClB,uBAAuB;AAAA,YACvB,iBAAiB;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,sDAAsD,YAAY;AAAA,MACrE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,MAAM,QAAQ,IAAI;AAAA,UAChC,QAAQ,gBAAgB,eAAe,CAAC;AAAA,UACxC,QAAQ,gBAAgB,eAAe,EAAE,IAAI,cAAc,CAAC,CAAC;AAAA,QAC/D,CAAC;AAAA,QAED,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC;AAAA,QAC5E,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,qBAAqB;AAAA,YACrB,sBAAsB;AAAA,YACtB,uBAAuB;AAAA,YACvB,kBAAkB;AAAA,YAClB,uBAAuB;AAAA,YACvB,iBAAiB;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,mDAAmD,YAAY;AAAA,MAClE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,OAAO,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,QAC3C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,aAAa;AAAA,UACb,OAAO,EAAE,aAAa,KAAK,cAAc,IAAI;AAAA,QAC/C,CAAC,CACH;AAAA,QAEA,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,oBAAoB,CAAC,CAC5E,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO;AAAA,YACL,aAAa;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,iBAAiB;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO,EAAE,iBAAiB,cAAc;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,mBAAmB;AAAA,UACzB;AAAA,UACA,aAAa;AAAA,QACf,CAAC,CACH,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO,EAAE,iBAAiB,cAAc;AAAA,QAC1C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,mFAAmF,YAAY;AAAA,MAClG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAO,QAAQ,oBAAoB,EAAE,uBAAW,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,QAClF,CAAC,CACH;AAAA,QAEA,MAAM,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAC9C,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,QAC3C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,QAC3C,CAAC,CACH;AAAA,QAEA,MAAM,QACJ,QAAQ,oBAAoB;AAAA,UAC1B;AAAA,UACA,cAAc;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC,CACH,EAAE,SAAS,QAAQ;AAAA,UACjB;AAAA,YACE,gBAAgB;AAAA,YAChB,OAAO;AAAA,cACL,aAAa;AAAA,cACb,cAAc;AAAA,cACd,aAAa;AAAA,cACb,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,UACA,EAAE,gBAAgB,GAAG,OAAO,EAAE,iBAAiB,cAAc,EAAE;AAAA,UAC/D;AAAA,YACE,gBAAgB;AAAA,YAChB,OAAO;AAAA,cACL,aAAa;AAAA,cACb,cAAc;AAAA,cACd,aAAa;AAAA,cACb,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,UACA;AAAA,YACE,gBAAgB;AAAA,YAChB,OAAO;AAAA,cACL,aAAa;AAAA,cACb,cAAc;AAAA,cACd,aAAa;AAAA,cACb,qBAAqB;AAAA,cACrB,sBAAsB;AAAA,cACtB,uBAAuB;AAAA,cACvB,kBAAkB;AAAA,cAClB,uBAAuB;AAAA,cACvB,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,UACA;AAAA,YACE,gBAAgB;AAAA,YAChB,OAAO;AAAA,cACL,aAAa;AAAA,cACb,cAAc;AAAA,cACd,aAAa;AAAA,cACb,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,mEAAmE,YAAY;AAAA,MAGlF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO,EAAE,iBAAiB,cAAc;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,gBAC3B,eAAe,EAAE,OAAO,CAAC,GAAG,UAAU,UAAU,CAAC,CACnD;AAAA,QAEA,QAAO,OAAO,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,cAAc,CAAC;AAAA,QACtE,QAAO,OAAO,OAAO,QAAQ,EAAE,cAAc;AAAA,QAC7C,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO,EAAE,iBAAiB,cAAc;AAAA,QAC1C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,yDAAyD,YAAY;AAAA,MAGxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,QAAQ,gBAC3B,eAAe;AAAA,UACb,YAAY,IAAG,+BAA+B;AAAA,UAC9C,YAAY,IAAG,+BAA+B;AAAA,QAChD,CAAC,CACH;AAAA,QAEA,QAAO,OAAO,OAAO,WAAW,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAC9E,QAAO,OAAO,OAAO,WAAW,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,OAC/E;AAAA,KACF;AAAA,IAED,MAAK,yEAAyE,YAAY;AAAA,MACxF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBACZ,eAAe,EAAE,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,EAAE,CAAC,CAChE;AAAA,QACA,MAAM,QAAQ,gBACZ,eAAe;AAAA,UACb,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO,EAAE,aAAa,EAAE;AAAA,QAC1B,CAAC,CACH;AAAA,QAEA,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO;AAAA,YACL,aAAa;AAAA,YACb,iBAAiB;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,oBAAoB,CAAC,SAAS;AAAA,QACpC,MAAM,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;AAAA,QACzC,MAAM,aAAa,IAAG,0BAA0B;AAAA,QAChD,MAAM,QAAQ,eAAe,EAAE,mBAAmB,UAAU,WAAW,CAAC;AAAA,QACxE,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,KAAK;AAAA,QAEjD,kBAAkB,KAAK,eAAe;AAAA,QACtC,SAAS,OAAO,SAAS;AAAA,QACzB,WAAW,QAAQ,CAAC;AAAA,QAEpB,MAAM,iBAAiB,MAAM,OAAO;AAAA,QACpC,eAAe,KAAK,gBAAgB;AAAA,QACpC,MAAM,cAAc,MAAM,OAAO;AAAA,QACjC,YAAY,OAAO,SAAS;AAAA,QAC5B,MAAM,OAAO,WAAW,QAAQ,CAAC;AAAA,QAEjC,MAAM,SAAS,MAAM,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAC7D,QAAO,OAAO,OAAO,iBAAiB,EAAE,QAAQ,CAAC,SAAS,CAAC;AAAA,QAC3D,QAAO,OAAO,OAAO,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC;AAAA,QAChE,QAAO,OAAO,OAAO,WAAW,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,OAC/E;AAAA,KACF;AAAA,IAED,MAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBAAgB,eAAe,CAAC;AAAA,QAE9C,MAAM,QAAQ,QAAQ,gBACpB,eAAe,EAAE,QAAQ,UAAU,YAAY,aAAa,CAAC,CAC/D;AAAA,QACA,MAAM,QAAO,KAAK,EAAE,QAAQ,eAAe,mBAAmB;AAAA,QAC9D,MAAM,QAAO,KAAK,EAAE,QAAQ,cAAc,EAAE,MAAM,eAAe,CAAC;AAAA,QAClE,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,cAAc;AAAA,UACvB,gBAAgB;AAAA,UAChB,OAAO,EAAE,aAAa,IAAI,cAAc,GAAG,aAAa,GAAG;AAAA,QAC7D,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,gBACpB,eAAe,EAAE,IAAI,iBAAiB,aAAa,eAAe,CAAC,CACrE;AAAA,QACA,MAAM,QAAO,KAAK,EAAE,QAAQ,eAAe,mBAAmB;AAAA,QAC9D,MAAM,QAAO,KAAK,EAAE,QAAQ,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAAA,OACxE;AAAA,KACF;AAAA,IAED,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBAA0C;AAAA,UAC9C,eAAe,EAAE,SAAS,EAAE,CAAC;AAAA,UAC7B,eAAe,EAAE,YAAY,IAAI,CAAC;AAAA,UAClC,eAAe,EAAE,mBAAmB,CAAC,EAAE,EAAE,CAAC;AAAA,UAC1C,eAAe,EAAE,OAAO,EAAE,aAAa,GAAG,EAAE,CAAC;AAAA,UAC7C,eAAe,EAAE,YAAY,IAAI,KAAK,OAAO,GAAG,EAAE,CAAC;AAAA,UACnD,eAAe,EAAE,UAAU,EAAE,SAAS,UAAU,EAAW,CAAC;AAAA,UAC5D,eAAe,EAAE,oBAAoB,EAAE,cAAc,GAAG,EAAE,CAAC;AAAA,UAC3D,eAAe,EAAE,aAAa,GAAG,CAAC;AAAA,QACpC;AAAA,QAEA,WAAW,SAAS,eAAe;AAAA,UACjC,MAAM,QAAO,QAAQ,gBAAgB,KAAK,CAAC,EAAE,QAAQ,QAAQ;AAAA,QAC/D;AAAA,QACA,MAAM,QACJ,QAAQ,oBAAoB;AAAA,UAC1B;AAAA,UACA,cAAc,CAAC,EAAE;AAAA,QACnB,CAAC,CACH,EAAE,QAAQ,QAAQ;AAAA,QAClB,MAAM,QACJ,QAAQ,mBAAmB,EAAE,uBAAW,aAAa,iBAAiB,CAAC,CACzE,EAAE,SAAS,QAAQ;AAAA,UACjB,gBAAgB;AAAA,UAChB,OAAO,EAAE,iBAAiB,cAAc;AAAA,QAC1C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAIH,eAAsB,oCAAoC,CACxD,YACe;AAAA,EACf,WAAW,WAAW;AAAA,IACpB,EAAE,uBAAW,aAAa,iBAAiB;AAAA,IAC3C,EAAE,uBAAW,aAAa,sBAAsB;AAAA,IAChD,EAAE,uBAAW,aAAa,oBAAoB;AAAA,IAC9C,EAAE,WAAW,iBAAiB,aAAa,oBAAoB;AAAA,EACjE,GAAG;AAAA,IACD,MAAM,WAAW,MAAM,WAAW,QAAQ;AAAA,MACxC,WAAW,QAAQ;AAAA,MACnB,IAAI,QAAQ;AAAA,IACd,CAAC;AAAA,IACD,IAAI;AAAA,MAAU;AAAA,IACd,MAAM,YAAY;AAAA,MAChB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO,QAAQ;AAAA,IACjB;AAAA,IACA,MAAM,WAAW,OAAO;AAAA,MACtB,IAAI,QAAQ;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,MAC5E,QAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,QAAQ,cAAc;AAAA,MACtE,eAAe,oBAAoB,QAAQ;AAAA,MAC3C,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA;;AChlBF,qBAAS,qBAAU,iBAAQ;AAgB3B,IAAM,aAAY;AAClB,IAAM,kBAAiB;AAEvB,SAAS,GAAE,CAAC,OAAqB;AAAA,EAC/B,OAAO,IAAI,KAAK,KAAK;AAAA;AAGvB,SAAS,YAAY,CACnB,IACA,YAAY,GAAG,WACf,WAAiD,SACjD,mBAC0B;AAAA,EAC1B,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,IAAG,0BAA0B;AAAA,IACxC,WAAW,IAAG,0BAA0B;AAAA,IACxC;AAAA,EACF;AAAA;AAGF,eAAe,eAAe,CAC5B,SACA,MACe;AAAA,EACf,MAAM,QAAO,OAAO,EAAE,QAAQ,eAAe,gBAAgB;AAAA,EAC7D,MAAM,QAAO,OAAO,EAAE,QAAQ,cAAc,EAAE,KAAK,CAAC;AAAA;AAGtD,eAAe,UAAU,CACvB,SACA,QAKI,CAAC,GACgB;AAAA,EACrB,OAAO,QAAQ,MAAM,OAAO;AAAA,IAC1B,IAAI,MAAM,MAAM;AAAA,IAChB,WAAW,MAAM,aAAa;AAAA,IAC9B,OAAO,MAAM,SAAS;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,WAAW,IAAG,0BAA0B;AAAA,EAC1C,CAAC;AAAA;AAUI,SAAS,2BAAyD,CACvE,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAO,MAAM,WAAW,SAAS;AAAA,UACrC,OAAO;AAAA,QACT,CAAC;AAAA,QAED,QAAO,MAAK,KAAK,EAAE,KAAK,cAAc;AAAA,QACtC,MAAM,gBACJ,QAAQ,MAAM,OAAO;AAAA,UACnB,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,gBACF;AAAA,QAEA,MAAM,QACJ,QAAQ,MAAM,OAAO;AAAA,UACnB,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,OAAO;AAAA,UACP,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,EAAE,uBAAW,UAAU,CAAC,QAAQ,EAAE,CAAC;AAAA,QACzE,QAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,OAC1D;AAAA,KACF;AAAA,IAED,MAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,YAAY,OAAO,eAAe,CAAC;AAAA,QAEnE,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,eAAe;AAAA,UAChC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9C;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,uBAAuB;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,QAAQ,MAAM,EAAE,QAAQ,EAAE,OAAO,uBAAuB,CAAC;AAAA,QAChE,MAAM,QAAO,QAAQ,MAAM,QAAQ,EAAE,uBAAW,IAAI,WAAW,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACxF,OAAO;AAAA,QACT,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,iFAAiF,YAAY;AAAA,MAChG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC1C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC3C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAID,QAAO,MAAM,SAAS,EAAE,cAAc;AAAA,QACtC,QAAO,OAAO,SAAS,EAAE,cAAc;AAAA,QACvC,MAAM,cAAc,MAAM,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,QAAQ,CAAC;AAAA,QAC7E,QAAO,aAAa,SAAS,EAAE,cAAc;AAAA,QAE7C,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QACxC,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QACxC,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAGpB,MAAM,QACJ,QAAQ,SAAS,kBAAkB;AAAA,UACjC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QAExC,MAAM,UAAU,MAAM,QAAQ,SAAS,MAAM;AAAA,UAC3C;AAAA,UACA,IAAI,OAAO;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,QAAO,QAAQ,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACzE,QAAO,QAAQ,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAGvE,MAAM,aAAa,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC/C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,WAAW,SAAS,EAAE,cAAc;AAAA,QAC3C,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAGpB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QAIxC,MAAM,UAAU,MAAM,QAAQ,SAAS,oBAAoB;AAAA,UACzD;AAAA,UACA,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,QAAQ,IAAI,CAAC,UAAU,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,CAAC;AAAA,QAC5E,MAAM,QACJ,QAAQ,SAAS,kBAAkB;AAAA,UACjC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,SAAS,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC3C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,UACxC,mBAAmB,IAAG,0BAA0B;AAAA,QAClD,CAAC;AAAA,QACD,MAAM,WAAW,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,OAAO,mBAAmB,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAC/E,QAAO,SAAS,iBAAiB,EAAE,cAAc;AAAA,QACjD,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI,OAAO;AAAA,UACX,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,OAAO,GAAG,CAAC;AAAA,QAC1C,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI,OAAO;AAAA,UACX,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,SAAS,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACvD;AAAA,UACA,QAAQ;AAAA,UACR,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC;AAAA,QACD,QAAO,OAAO,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;AAAA,QACjE,MAAM,QACJ,QAAQ,SAAS,kBAAkB;AAAA,UACjC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,SAAS,oBAAoB;AAAA,UACnC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,OACtB;AAAA,KACF;AAAA,IAED,MAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,UACxC,mBAAmB,IAAG,0BAA0B;AAAA,QAClD,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClD;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,SAAS,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACxE,QAAO,SAAS,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAE1E,MAAM,YAAY,MAAM,QAAQ,SAAS,aAAa;AAAA,UACpD;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,WAAW,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAE1E,MAAM,QACJ,QAAQ,SAAS,aAAa;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,SAAS,aAAa;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAEpB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,IAAI;AAAA,UAChB,QAAQ,SAAS,aAAa;AAAA,YAC5B;AAAA,YACA,IAAI;AAAA,YACJ,UAAU;AAAA,YACV,WAAW;AAAA,YACX,KAAK,IAAG,0BAA0B;AAAA,YAClC,WAAW,IAAG,0BAA0B;AAAA,UAC1C,CAAC;AAAA,UACD,QAAQ,SAAS,aAAa;AAAA,YAC5B;AAAA,YACA,IAAI;AAAA,YACJ,UAAU;AAAA,YACV,WAAW;AAAA,YACX,KAAK,IAAG,0BAA0B;AAAA,YAClC,WAAW,IAAG,0BAA0B;AAAA,UAC1C,CAAC;AAAA,QACH,CAAC;AAAA,QACD,MAAM,aAAa,MAAM,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,iBAAiB,CAAC;AAAA,QACrF,QAAO,YAAY,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,MAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,aAAa,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC/C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAO,WAAW,SAAS,EAAE,KAAK,sBAAsB;AAAA,QACxD,QAAO,WAAW,SAAS,EAAE,KAAK,aAAa;AAAA,QAC/C,MAAM,QACJ,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,aAAa,CAAC,CAC1D,EAAE,SAAS,cAAc;AAAA,UACvB,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QAGD,MAAM,gBAAgB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAClD,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,cAAc,SAAS,EAAE,cAAc;AAAA,QAC9C,QAAO,cAAc,SAAS,EAAE,cAAc;AAAA,OAC/C;AAAA,KACF;AAAA,IAED,MAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,WAAW,SAAS,EAAE,IAAI,SAAS,OAAO,cAAc,CAAC;AAAA,QAC/D,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,QAAQ,SAAS,MAAM;AAAA,UAC3B;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACvD;AAAA,UACA,QAAQ;AAAA,UACR,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC;AAAA,QACD,QAAO,OAAO,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,OACvE;AAAA,KACF;AAAA,IAED,MAAK,oDAAoD,YAAY;AAAA,MACnE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC3D,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,YAAY;AAAA,UACvB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7D,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,SAAS;AAAA,UACpB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,QAAQ,EAAE,EAAE,KAAK,MAAM,EAAE;AAAA,QAChC,QAAO,QAAQ,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC;AAAA,QAC5C,MAAM,QACJ,QAAQ,YAAY,iBAAiB;AAAA,UACnC;AAAA,UACA,OAAO;AAAA,UACP,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QAExC,MAAM,QAAQ,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,YAAY,iBAAiB;AAAA,UACnC;AAAA,UACA,OAAO;AAAA,UACP,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,WAAW,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACrD;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,SAAS,MAAM,EAAE,KAAK,YAAY;AAAA,QACzC,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,QAAQ,CAAC,CACrE,EAAE,SAAS,aAAa,CAAC;AAAA,OAC1B;AAAA,KACF;AAAA,IAED,MAAK,+CAA+C,YAAY;AAAA,MAC9D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBACJ,QAAQ,iBAAiB,OAAO;AAAA,UAC9B;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,cACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpD;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC;AAAA,QACD,QAAO,OAAO,EAAE,cAAc;AAAA,UAC5B;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,QAAQ,CAAC,CACrE,EAAE,SAAS,aAAa,CAAC;AAAA,QAGzB,MAAM,QACJ,QAAQ,iBAAiB,OAAO,EAAE,uBAAW,QAAQ,SAAS,SAAS,aAAa,CAAC,CACvF,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,8DAA8D,YAAY;AAAA,MAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QACJ,QAAQ,iBAAiB,OAAO;AAAA,UAC9B;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,kBAAiB,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UAC1D,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,eAAc,EAAE,cAAc;AAAA,UACnC,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,QAED,MAAM,aAAa,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UACrE;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,WAAW,OAAO,EAAE,KAAK,YAAY;AAAA,QAC5C,MAAM,WAAW,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UACnE;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,SAAS,MAAM,EAAE,KAAK,QAAQ;AAAA,QAErC,MAAM,QACJ,QAAQ,+BAA+B,sBAAsB;AAAA,UAC3D;AAAA,UACA,kBAAkB;AAAA,QACpB,CAAC,CACH,EAAE,SAAS,aAAa,CAAC;AAAA,QACzB,MAAM,QACJ,QAAQ,+BAA+B,aAAa;AAAA,UAClD;AAAA,UACA,SAAS;AAAA,QACX,CAAC,CACH,EAAE,SAAS,cAAc,CAAC,EAAE,kBAAkB,aAAa,CAAC,CAAC;AAAA,QAE7D,MAAM,UAAU,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnD;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,OAAO,EAAE,cAAc;AAAA,UAC5B,MAAM;AAAA,UACN,aAAa;AAAA,UACb,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,gBAAgB,OAAO;AAAA,UAC7B;AAAA,UACA,IAAI;AAAA,UACJ,aAAa;AAAA,UACb,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,MAAM;AAAA,UACN,aAAa;AAAA,UACb,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,gBAAgB,KAAK,EAAE,uBAAW,UAAU,CAAC,WAAW,EAAE,CAAC,CACrE,EAAE,SAAS,cAAc;AAAA,UACvB,iBAAiB,CAAC,EAAE,IAAI,aAAa,CAAC;AAAA,UACtC,OAAO;AAAA,QACT,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBACJ,QAAQ,+BAA+B,OAAO;AAAA,UAC5C;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,yBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UAClD;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UAClD;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAQ,MAAM,QAAQ,+BAA+B,2BAA2B;AAAA,UACpF;AAAA,UACA,kBAAkB;AAAA,UAClB,UAAU,CAAC,iBAAiB,iBAAiB,KAAK;AAAA,UAClD,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UACjF,CAAC,iBAAiB,OAAO;AAAA,UACzB,CAAC,gBAAgB,QAAQ;AAAA,UACzB,CAAC,OAAO,OAAO;AAAA,QACjB,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,+BAA+B,2BAA2B;AAAA,UACrF;AAAA,UACA,kBAAkB;AAAA,UAClB,UAAU,CAAC,KAAK;AAAA,UAChB,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UAClF,CAAC,gBAAgB,QAAQ;AAAA,UACzB,CAAC,OAAO,OAAO;AAAA,QACjB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,WAAW,MAAM,QAAQ,aAAa,OAAO;AAAA,UACjD,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,UAAU,CAAC,cAAc,cAAc,SAAS;AAAA,UAChD,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,SAAS,QAAQ,EAAE,QAAQ,CAAC,cAAc,SAAS,CAAC;AAAA,QAC3D,MAAM,QACJ,QAAQ,aAAa,qBAAqB;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,eAAe,CAAC;AAAA,QAC/C,MAAM,QACJ,QAAQ,aAAa,qBAAqB;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAEpB,MAAM,UAAU,MAAM,QAAQ,aAAa,MAAM;AAAA,UAC/C;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,UACzC,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAO,QAAQ,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACzE,QAAO,QAAQ,iBAAiB,EAAE,KAAK,cAAc;AAAA,QAErD,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,aAAa,KAAK;AAAA,UACxB;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC;AAAA,UACpC,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,aAAa,qBAAqB;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,eAAe,OAAO,mBAAmB,CAAC;AAAA,QAC1E,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,aAAa;AAAA,UACjB,EAAE,MAAM,QAAQ,IAAI,cAAc;AAAA,UAClC,EAAE,MAAM,kBAAkB,IAAI,cAAc;AAAA,UAC5C,EAAE,MAAM,UAAU,IAAI,YAAY;AAAA,QACpC;AAAA,QAEA,YAAY,OAAO,cAAc,WAAW,QAAQ,GAAG;AAAA,UACrD,MAAM,YAAY,UAAU,UAAU;AAAA,UACtC,MAAM,iBAAiB,MAAM,QAAQ,gBAAgB,OAAO;AAAA,YAC1D,IAAI;AAAA,YACJ;AAAA,YACA,MAAM,sBAAsB,UAAU;AAAA,YACtC,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,YACpB,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,UACD,QAAO,eAAe,kBAAkB,EAAE,QAAQ,SAAS;AAAA,UAC3D,QAAO,eAAe,kBAAkB,EAAE,KAAK,aAAa;AAAA,UAC5D,MAAM,QACJ,QAAQ,gBAAgB,QAAQ,EAAE,uBAAW,IAAI,UAAU,CAAC,CAC9D,EAAE,SAAS,cAAc;AAAA,YACvB,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,UACtB,CAAC;AAAA,UAED,MAAM,UAAU,UAAU,UAAU;AAAA,UACpC,MAAM,eAAe,MAAM,QAAQ,aAAa,OAAO;AAAA,YACrD,IAAI;AAAA,YACJ;AAAA,YACA,MAAM,YAAY,UAAU;AAAA,YAC5B,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,YACX,WAAW,QAAQ;AAAA,YACnB,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,YACpB,WAAW,IAAG,kBAAkB,eAAe;AAAA,YAC/C,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,UACD,QAAO,aAAa,kBAAkB,EAAE,QAAQ,SAAS;AAAA,UACzD,QAAO,aAAa,kBAAkB,EAAE,KAAK,aAAa;AAAA,UAC1D,MAAM,QACJ,QAAQ,aAAa,QAAQ,EAAE,uBAAW,IAAI,QAAQ,CAAC,CACzD,EAAE,SAAS,cAAc;AAAA,YACvB,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,QAGA,MAAM,YAAY,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACrD,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,UAAU,kBAAkB,EAAE,cAAc;AAAA,QACnD,QAAO,UAAU,kBAAkB,EAAE,cAAc;AAAA,QACnD,MAAM,QACJ,QAAQ,gBAAgB,QAAQ,EAAE,uBAAW,IAAI,gBAAgB,CAAC,CACpE,EAAE,SAAS,cAAc,EAAE,IAAI,gBAAgB,CAAC;AAAA,OACjD;AAAA,KACF;AAAA,IAED,MAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAQ,MAAM,QAAQ,aAAa,MAAM;AAAA,UAC7C;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,UACzC,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAO,MAAM,iBAAiB,EAAE,KAAK,cAAc;AAAA,QACnD,QAAO,MAAM,iBAAiB,EAAE,KAAK,cAAc;AAAA,QAInD,MAAM,SAAS,MAAM,QAAQ,aAAa,MAAM;AAAA,UAC9C;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,QAAO,OAAO,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACxE,QAAO,OAAO,iBAAiB,EAAE,KAAK,cAAc;AAAA,QACpD,QAAO,OAAO,iBAAiB,EAAE,KAAK,cAAc;AAAA,QACpD,MAAM,QACJ,QAAQ,aAAa,QAAQ,EAAE,uBAAW,IAAI,YAAY,CAAC,CAC7D,EAAE,SAAS,cAAc;AAAA,UACvB,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,QACrB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,MAAM,CAAC,SAAS,SAAS,SAAS,OAAO;AAAA,QAC/C,YAAY,OAAO,OAAO,IAAI,QAAQ,GAAG;AAAA,UACvC,MAAM,QAAQ,aAAa,OAAO;AAAA,YAChC;AAAA,YACA;AAAA,YACA,MAAM,SAAS;AAAA,YACf,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,YACX,WAAW,QAAQ;AAAA,YACnB,WAAW,IAAG,kBAAkB,eAAe;AAAA,YAC/C,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,QACA,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,SAAS,MAAM,QAAQ,aAAa,KAAK,EAAE,sBAAU,CAAC;AAAA,QAC5D,QAAO,OAAO,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC;AAAA,QACxF,QAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,QAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QAGjC,MAAM,MAAM,MAAM,QAAQ,aAAa,KAAK,EAAE,uBAAW,gBAAgB,KAAK,CAAC;AAAA,QAC/E,QAAO,IAAI,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ;AAAA,UACxD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,QAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QAGxB,MAAM,aAAa,MAAM,QAAQ,aAAa,KAAK;AAAA,UACjD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,WAAW,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ;AAAA,UAC/D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QAGD,MAAM,YAAY,MAAM,QAAQ,aAAa,KAAK;AAAA,UAChD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,UAAU,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAClF,QAAO,UAAU,KAAK,EAAE,KAAK,CAAC;AAAA,QAC9B,QAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,QAGnC,MAAM,aAAa,MAAM,QAAQ,aAAa,KAAK;AAAA,UACjD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,WAAW,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QACnF,QAAO,WAAW,OAAO,EAAE,KAAK,KAAK;AAAA,QAGrC,MAAM,gBAAgB,MAAM,QAAQ,aAAa,KAAK;AAAA,UACpD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,cAAc,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,GAAG;AAAA,QACvE,QAAO,cAAc,OAAO,EAAE,KAAK,KAAK;AAAA,OACzC;AAAA,KACF;AAAA,IAED,MAAK,iDAAiD,YAAY;AAAA,MAChE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,MAAM,CAAC,SAAS,SAAS,OAAO;AAAA,QACtC,YAAY,OAAO,OAAO,IAAI,QAAQ,GAAG;AAAA,UACvC,MAAM,QAAQ,gBAAgB,OAAO;AAAA,YACnC;AAAA,YACA;AAAA,YACA,MAAM,mBAAmB;AAAA,YACzB,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,QAGA,MAAM,MAAM,MAAM,QAAQ,gBAAgB,KAAK,EAAE,sBAAU,CAAC;AAAA,QAC5D,QAAO,IAAI,gBAAgB,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG;AAAA,QACpE,QAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QACxB,QAAO,IAAI,OAAO,EAAE,KAAK,KAAK;AAAA,QAE9B,MAAM,YAAY,MAAM,QAAQ,gBAAgB,KAAK,EAAE,uBAAW,OAAO,EAAE,CAAC;AAAA,QAC5E,QAAO,UAAU,gBAAgB,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QACzF,QAAO,UAAU,KAAK,EAAE,KAAK,CAAC;AAAA,QAC9B,QAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,QAEnC,MAAM,aAAa,MAAM,QAAQ,gBAAgB,KAAK;AAAA,UACpD;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,WAAW,gBAAgB,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,QACjF,QAAO,WAAW,OAAO,EAAE,KAAK,KAAK;AAAA,OACtC;AAAA,KACF;AAAA,IAED,MAAK,yCAAyC,YAAY;AAAA,MACxD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,gBACJ,QAAQ,aAAa,OAAO;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,eACF;AAAA,QACA,MAAM,gBACJ,QAAQ,aAAa,OAAO;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,yBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,UAAU;AAAA,UACV,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,gBACJ,QAAQ,WAAW,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,oBACF;AAAA,QAEA,MAAM,QACJ,QAAQ,WAAW,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,gBACJ,QAAQ,WAAW,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,oBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,UAAU;AAAA,UACV,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,0BAA0B,QAAQ;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,sBACF;AAAA,QACA,MAAM,QACJ,QAAQ,0BAA0B,QAAQ;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,UAAU;AAAA,UACV,cAAc;AAAA,UACd,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,gBACJ,QAAQ,0BAA0B,QAAQ;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,sBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,qBAAqB,OAAO;AAAA,UACxC,IAAI;AAAA,UACJ;AAAA,UACA,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,gBAAgB,IAAG,0BAA0B;AAAA,UAC7C,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QACJ,QAAQ,qBAAqB,cAAc,EAAE,uBAAW,UAAU,YAAY,CAAC,CACjF,EAAE,SAAS,cAAc,EAAE,IAAI,SAAS,QAAQ,UAAU,CAAC;AAAA,QAC3D,MAAM,QAAQ,qBAAqB,QAAQ;AAAA,UACzC;AAAA,UACA,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QAED,MAAM,YAAY,MAAM,QAAQ,4BAA4B;AAAA,UAC1D;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,aAAa,IAAG,0BAA0B;AAAA,UAC1C,aAAa;AAAA,YACX,IAAI;AAAA,YACJ;AAAA,YACA,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,YACX,WAAW;AAAA,YACX,oBAAoB,EAAE,MAAM,QAAQ,IAAI,QAAQ;AAAA,YAChD,oBAAoB;AAAA,YACpB,WAAW,IAAG,0BAA0B;AAAA,YACxC,WAAW,IAAG,0BAA0B;AAAA,UAC1C;AAAA,QACF,CAAC;AAAA,QAED,QAAO,UAAU,aAAa,EAAE,cAAc,EAAE,QAAQ,WAAW,CAAC;AAAA,QACpE,QAAO,UAAU,WAAW,EAAE,cAAc,EAAE,IAAI,cAAc,WAAW,QAAQ,CAAC;AAAA,QACpF,MAAM,gBACJ,QAAQ,4BAA4B;AAAA,UAClC;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,aAAa,IAAG,0BAA0B;AAAA,UAC1C,aAAa;AAAA,YACX,IAAI;AAAA,YACJ;AAAA,YACA,MAAM;AAAA,YACN,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,YACX,WAAW;AAAA,YACX,oBAAoB;AAAA,YACpB,WAAW,IAAG,0BAA0B;AAAA,YACxC,WAAW,IAAG,0BAA0B;AAAA,UAC1C;AAAA,QACF,CAAC,GACD,8BACF;AAAA,QACA,MAAM,QACJ,QAAQ,aAAa,QAAQ,EAAE,uBAAW,IAAI,eAAe,CAAC,CAChE,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,WAAW,gBAAgB,SAAS,IAAG,0BAA0B,CAAC;AAAA,QAC1F,CAAC;AAAA,QAED,QAAO,OAAO,KAAK,EAAE,EAAE,KAAK,OAAO;AAAA,QACnC,QAAO,OAAO,OAAO,EAAE,cAAc;AAAA,UACnC,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,mBAAmB,IAAG,0BAA0B;AAAA,QAClD,CAAC;AAAA,QAGD,MAAM,aAAa,MAAM,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,UAAU,CAAC;AAAA,QAC9E,QAAO,YAAY,SAAS,EAAE,cAAc;AAAA,QAC5C,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,YAAY;AAAA,QACpC,CAAC,GACD,oBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,+EAA+E,YAAY;AAAA,MAC9F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,cAAc,SAAS;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,gBAAgB,CAAC,iBAAiB;AAAA,UAClC,SAAS,aAAa,SAAS;AAAA,QACjC,CAAC;AAAA,QAED,QAAO,OAAO,UAAU,EAAE,cAAc;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,cAAc,MAAM,QAAQ,iBAAiB,YAAY;AAAA,UAC7D;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,YAAY,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UACvF,CAAC,cAAc,YAAY;AAAA,UAC3B,CAAC,WAAW,YAAY;AAAA,UACxB,CAAC,mBAAmB,QAAQ;AAAA,QAC9B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,gBAAgB,OAAO,eAAe,CAAC;AAAA,QACvE,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,cAAc,SAAS;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAQ,wBAAwB;AAAA,UACpC;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,cAAc;AAAA,QACtC,CAAC;AAAA,QAED,MAAM,cAAc,MAAM,QAAQ,iBAAiB,YAAY;AAAA,UAC7D;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,YAAY,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UACvF,CAAC,cAAc,QAAQ;AAAA,UACvB,CAAC,WAAW,YAAY;AAAA,QAC1B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,yEAAyE,YAAY;AAAA,MACxF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,SAAS;AAAA,QACjC,CAAC,GACD,2BACF;AAAA,QACA,MAAM,QACJ,QAAQ,MAAM,WAAW,EAAE,uBAAW,OAAO,eAAe,CAAC,CAC/D,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,oCAAoC;AAAA,UACpC,gBAAgB,CAAC,iBAAiB;AAAA,UAClC,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,cAAc,CAAC,CAC3E,EAAE,SAAS,cAAc,CAAC,EAAE,SAAS,mBAAmB,QAAQ,SAAS,CAAC,CAAC;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS;AAAA,UACxB,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,oCAAoC;AAAA,UACpC,qCAAqC;AAAA,UACrC,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC,GACD,2BACF;AAAA,QACA,MAAM,QACJ,QAAQ,MAAM,WAAW,EAAE,uBAAW,OAAO,mBAAmB,CAAC,CACnE,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS;AAAA,UACxB,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,YAAY;AAAA,UACvB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,qCAAqC;AAAA,UACrC,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,OAAO,UAAU,EAAE,cAAc;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,iEAAiE,YAAY;AAAA,MAChF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,QAAQ,YAAY,CAAC;AAAA,QACjD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,SAAS;AAAA,QACjC,CAAC,GACD,gBACF;AAAA,QACA,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,uDAAuD,YAAY;AAAA,MACtE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,YAAY,OAAO,eAAe,CAAC;AAAA,QACnE,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,eAAe;AAAA,UAChC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,QAAQ,EAAE,OAAO,mBAAmB;AAAA,UACpC,WAAW;AAAA,UACX,SAAS,aAAa,UAAU;AAAA,QAClC,CAAC;AAAA,QAED,QAAO,OAAO,QAAQ,EAAE,cAAc;AAAA,UACpC,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,mBAAmB;AAAA,QACtC,CAAC;AAAA,QACD,MAAM,QAAO,QAAQ,MAAM,QAAQ,EAAE,uBAAW,IAAI,WAAW,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACxF,OAAO;AAAA,QACT,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,gBAAgB,OAAO,eAAe,CAAC;AAAA,QACvE,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,mBAAmB;AAAA,UACzB;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,yBAAyB;AAAA,UACzB,WAAW;AAAA,UACX,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC,GACD,wBACF;AAAA,QAEA,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,yBAAyB;AAAA,UACzB,WAAW;AAAA,UACX,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC;AAAA,QAED,QAAO,OAAO,KAAK,EAAE,EAAE,KAAK,cAAc;AAAA,QAC1C,QAAO,OAAO,QAAQ,EAAE,cAAc;AAAA,UACpC,QAAQ;AAAA,QACV,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,YAAY;AAAA,UACvB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,aAAa;AAAA,UACb,eAAe;AAAA,UACf,WAAW;AAAA,UACX,SAAS,aAAa,UAAU;AAAA,QAClC,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,aAAa;AAAA,QACf,CAAC;AAAA,QACD,QAAO,OAAO,UAAU,EAAE,cAAc;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,OAAO,QAAQ,EAAE,cAAc;AAAA,UACpC,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,WAAW,CAAC,CACxE,EAAE,SAAS,cAAc,CAAC,EAAE,SAAS,cAAc,QAAQ,aAAa,CAAC,CAAC;AAAA,OAC3E;AAAA,KACF;AAAA,IAED,MAAK,8EAA8E,YAAY;AAAA,MAC7F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,mBAAmB;AAAA,UACzB;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,WAAW;AAAA,UACX,SAAS,aAAa,UAAU;AAAA,QAClC,CAAC,GACD,2BACF;AAAA,QACA,MAAM,QACJ,QAAQ,MAAM,WAAW,EAAE,uBAAW,OAAO,eAAe,CAAC,CAC/D,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,oCAAoC;AAAA,UACpC,qCAAqC;AAAA,UACrC,gBAAgB,CAAC,iBAAiB;AAAA,UAClC,WAAW;AAAA,UACX,SAAS,aAAa,oBAAoB;AAAA,QAC5C,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,cAAc,CAAC,CAC3E,EAAE,SAAS,cAAc,CAAC,EAAE,SAAS,mBAAmB,QAAQ,SAAS,CAAC,CAAC;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,MAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,YAAY,MAAM,QAAQ,6BAA6B;AAAA,UAC3D;AAAA,UACA,QAAQ;AAAA,UACR,aAAa,IAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QAED,QAAO,UAAU,MAAM,EAAE,KAAK,WAAW;AAAA,QACzC,MAAM,QAAO,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACxF,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAO,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,UAAU,CAAC,CAAC,EAAE,SAAS,cAC5E;AAAA,UACE,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CACF;AAAA,OACD;AAAA,KACF;AAAA,GACF;AAAA;;AC/+DH,qBAAS,qBAAU,iBAAQ;AAYpB,SAAS,2BAAyD,CACvE,OACA,SACM;AAAA,EACN,MAAM,UAAU,IAAI;AAAA,EAEpB,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,2DAA2D,YAAY;AAAA,MAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,OAAO,IAAI,eAA2B;AAAA,UAC1C,KAAK,CAAC,YAAY;AAAA,YAChB,WAAW,QAAQ,QAAQ,OAAO,WAAW,CAAC;AAAA,YAC9C,WAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAAA,YACzC,WAAW,MAAM;AAAA;AAAA,QAErB,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,IAAI;AAAA,UAChC;AAAA,UACA,mBAAmB;AAAA,UACnB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,aAAa;AAAA,QACf,CAAC;AAAA,QAED,QAAO,QAAQ,SAAS,EAAE,KAAK,EAAE;AAAA,QACjC,QAAO,QAAQ,MAAM,EAAE,KAAK,iBAAiB,QAAQ,MAAM,CAAC;AAAA,QAC5D,QAAO,QAAQ,QAAQ,EAAE,KAAK,YAAY;AAAA,QAC1C,QAAO,QAAQ,SAAS,EAAE,KAAK,0BAA0B;AAAA,QACzD,QAAO,QAAQ,WAAW,EAAE,KAAK,oBAAoB;AAAA,QACrD,QAAO,MAAM,IAAI,SAAS,MAAM,QAAQ,KAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,eAAe;AAAA,OAC3F;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY;AAAA,QACzC,MAAM,SAAS,iBAAiB,kBAAkB,KAAK,CAAC;AAAA,QAExD,MAAM,QACJ,QAAQ,IAAI,EAAE,MAAM,OAAO,mBAAmB,MAAM,aAAa,EAAE,CAAC,CACtE,EAAE,QAAQ,QACR,gCAAgC,MAAM,aAAa,qBAAqB,MAAM,aAChF;AAAA,QACA,MAAM,QAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,SAAS,SAAS;AAAA,OACtD;AAAA,KACF;AAAA,IAED,MAAK,kCAAkC,YAAY;AAAA,MACjD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,OAAO,IAAI,eAA2B;AAAA,UAC1C,IAAI,CAAC,YAAY;AAAA,YACf,WAAW,MAAM;AAAA;AAAA,QAErB,CAAC;AAAA,QAED,MAAM,QAAO,QAAQ,IAAI,EAAE,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,QAAQ,QACjE,uDACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,2DAA2D,YAAY;AAAA,MAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,IAAI;AAAA,QAClB,IAAI,gBAAgB;AAAA,QACpB,MAAM,aAAa,QAAQ,OAAO,SAAS;AAAA,QAC3C,MAAM,SAAS,iBAAiB,kBAAkB,UAAU,CAAC;AAAA,QAC7D,MAAM,OAAO,IAAI,eAA2B;AAAA,UAC1C,KAAK,CAAC,YAAY;AAAA,YAChB,WAAW,QAAQ,UAAU;AAAA;AAAA,UAE/B,MAAM,GAAG;AAAA,YACP,gBAAgB;AAAA;AAAA,QAEpB,CAAC;AAAA,QAED,MAAM,MAAM,QAAQ,IAAI,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QACtD,MAAM,MAAM,IAAI,MAAM,iBAAiB,CAAC;AAAA,QAExC,MAAM,QAAO,GAAG,EAAE,QAAQ,QAAQ,iBAAiB;AAAA,QACnD,QAAO,aAAa,EAAE,KAAK,IAAI;AAAA,QAC/B,MAAM,QAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,SAAS,SAAS;AAAA,OACtD;AAAA,KACF;AAAA,GACF;AAAA;;AC1GH,qBAAS,qBAAU,iBAAQ;AAuC3B,IAAM,eAAuC,EAAE,IAAI,WAAW;AAC9D,IAAM,iBAAyC,EAAE,IAAI,cAAc,WAAW,EAAE,YAAY,EAAE,EAAE;AAUzF,SAAS,sBAA8C,CAC5D,OACA,SACM;AAAA,EACN,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,eAAe,QAAQ,gBAAgB,WAAW;AAAA,EACxD,MAAM,sBAAsB,QAAQ,uBAAuB;AAAA,EAC3D,MAAM,gCAAgC,QAAQ,iCAAiC;AAAA,EAC/E,MAAM,6BAA6B,QAAQ,8BAA8B;AAAA,EAEzE,MAAM,aAAa,OAAO,SAA4D;AAAA,IACpF,MAAM,SAAS,MAAM,QAAQ,aAAa;AAAA,IAC1C,IAAI;AAAA,MACF,MAAM,KAAK,MAAM;AAAA,cACjB;AAAA,MACA,MAAM,QAAQ,WAAW,MAAM;AAAA;AAAA;AAAA,EAInC,UAAS,OAAO,MAAM;AAAA,IACpB,UAAS,UAAU,MAAM;AAAA,MACvB,MAAK,sDAAsD,YAAY;AAAA,QACrE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,KAAK,IAAI;AAAA,UAExB,MAAM,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,SAAS,EAAE,cAAc,QAAQ,WAAW,SAAS;AAAA,cACvD;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UAED,QAAO,OAAO,EAAE,aAAa,CAAC;AAAA,UAC9B,QAAO,QAAQ,EAAE,EAAE,cAAc;AAAA,YAC/B,UAAU,aAAa;AAAA,YACvB,MAAM;AAAA,YACN,KAAK;AAAA,YACL,SAAS,EAAE,cAAc,QAAQ,WAAW,SAAS;AAAA,UACvD,CAAC;AAAA,UACD,QAAO,QAAQ,IAAI,MAAM,EAAE,WAAW;AAAA,UACtC,QAAO,KAAK,MAAM,QAAQ,GAAI,WAAW,CAAC,EAAE,uBAAuB,MAAM;AAAA,SAC1E;AAAA,OACF;AAAA,MAED,MAAK,+BAA+B,YAAY;AAAA,QAC9C,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,UAAU,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE;AAAA,UAE9C,OAAO,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,QAAQ,CAAC;AAAA,UACvB,CAAC;AAAA,UACD,QAAQ,OAAO,QAAQ;AAAA,UAEvB,QAAO,QAAQ,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,UAC/D,OAAO,YAAY,MAAM,YAAY,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,UACD,QAAO,UAAU,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,SAClE;AAAA,OACF;AAAA,MAED,MAAK,yCAAyC,YAAY;AAAA,QACxD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC;AAAA,UACZ,CAAC;AAAA,UAED,QAAO,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC3B;AAAA,OACF;AAAA,MAED,MAAK,yCAAyC,YAAY;AAAA,QACxD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC;AAAA,UACrC,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,UAEpC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,KAAK;AAAA,YACnB,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC;AAAA,UACrC,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,6CAA6C,YAAY;AAAA,QAC5D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP;AAAA,gBACE,SAAS;AAAA,kBACP,YAAY,IAAI,KAAK,0BAA0B;AAAA,gBACjD;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,UAEpC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,OAAO,IAAI,EAA0B,CAAC;AAAA,UACtE,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,OAAO,OAAO;AAAA,YACZ,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,QAAQ,MAAM;AAAA,MACrB,MAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,SAAS,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,cACrC,EAAE,MAAM,OAAO,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,cACrC,EAAE,MAAM,SAAS,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,YACzC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ;AAAA,YACxC,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,aAAa,OAAO;AAAA,UACtB,CAAC;AAAA,UAED,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,OAAO,CAAC;AAAA,SACtE;AAAA,OACF;AAAA,MAED,MAAK,uDAAuD,YAAY;AAAA,QACtE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,eAAe,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,cACjD,EAAE,MAAM,sBAAsB,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,cACxD,EAAE,MAAM,eAAe,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,YACnD;AAAA,UACF,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ;AAAA,YACxC,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO,CAAC,aAAa;AAAA,YACrB,OAAO;AAAA,UACT,CAAC;AAAA,UAED,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ;AAAA,YACtD,EAAE,IAAI,SAAS;AAAA,YACf,EAAE,IAAI,SAAS;AAAA,UACjB,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,MAAK,mEAAmE,YAAY;AAAA,QAClF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,eAAe,SAAS,EAAE,IAAI,SAAS,EAAE,CAAC;AAAA,UAC9D,CAAC;AAAA,UAED,QACE,MAAM,OAAO,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC,CACH,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,QAAQ,WAAW,SAAS,MAAM,CAAC;AAAA,UAC5D,QACE,MAAM,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,cAAc,OAAO,EAAE,CAAC,CACtF,EAAE,QAAQ,CAAC,CAAC;AAAA,UACZ,QACE,MAAM,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,cAAc,OAAO,GAAG,CAAC,CACvF,EAAE,QAAQ,CAAC,CAAC;AAAA,SACb;AAAA,OACF;AAAA,MAED,MAAK,iCAAiC,YAAY;AAAA,QAChD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,WAAW;AAAA,YACzB,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;AAAA,UACvC,CAAC;AAAA,UACD,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,WAAW;AAAA,YACzB,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;AAAA,UACvC,CAAC;AAAA,UACD,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,WAAW;AAAA,YACzB,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;AAAA,UACvC,CAAC;AAAA,UAED,QACE,MAAM,SACJ,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC,CAC5E,CACF,EAAE,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,UAC1B,QACE,MAAM,SACJ,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC,CAC5E,CACF,EAAE,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,UAC1B,QACE,MAAM,SACJ,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC,CAC5E,CACF,EAAE,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,SAC3B;AAAA,OACF;AAAA,MAED,MAAK,0DAA0D,YAAY;AAAA,QACzE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,WAAW,MAAM,cAAc,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,SAAS,EAAE;AAAA,cAC1B,EAAE,MAAM,OAAO,SAAS,EAAE;AAAA,YAC5B;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,OAAO,CAAC,SAAS;AAAA,YACjB,OAAO;AAAA,UACT,CAAC;AAAA,UAED,QAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,UAC/B,QAAO,KAAK,MAAM,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,MAAM;AAAA,UAChD,QAAO,KAAK,OAAO,EAAE,KAAK,KAAK;AAAA,SAChC;AAAA,OACF;AAAA,MAED,MAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,KAAK,UAAU,SAAS,KAAK;AAAA,cAC/B,EAAE,KAAK,UAAU,SAAS,IAAI;AAAA,cAC9B,EAAE,KAAK,UAAU,SAAS,KAAK;AAAA,YACjC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,MAAM,CAAC,QAAQ;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,SAC1E;AAAA,OACF;AAAA,MAED,MAAK,iEAAiE,YAAY;AAAA,QAChF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,KAAK,UAAU,SAAS,QAAQ;AAAA,cAClC,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,cACxC,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,YAC1C;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,MAAM,CAAC,QAAQ;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,UACtE,QAAO,KAAK,OAAO,EAAE,KAAK,KAAK;AAAA,SAChC;AAAA,OACF;AAAA,MAED,MAAK,kEAAkE,YAAY;AAAA,QACjF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,cACxC,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,cACxC,EAAE,KAAK,UAAU,SAAS,QAAQ;AAAA,YACpC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,MAAM,CAAC,QAAQ;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,UACtE,QAAO,KAAK,OAAO,EAAE,KAAK,KAAK;AAAA,SAChC;AAAA,OACF;AAAA,MAED,MAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;AAAA,UACzD,CAAC;AAAA,UAED,MAAM,SAAS,MAAM,OAAO,KAAK;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAA,UACrE,QAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,UAEhC,MAAM,QAAQ,MAAM,OAAO,KAAK;AAAA,YAC9B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,cAAc,OAAO;AAAA,YACrB,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAA,UACpE,QAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,SAChC;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,gBAAgB,MAAM;AAAA,MAC7B,MAAK,mDAAmD,YAAY;AAAA,QAClE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,QACE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,UAAU,UAAU,CAAC,CAC3E,EAAE,cAAc;AAAA,UAEhB,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,QAAQ,aAAa,CAAC;AAAA,UAC1E,QACE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,UAAU,aAAa,GAAG,CAAC,CACjF,EAAE,cAAc;AAAA,SACjB;AAAA,OACF;AAAA,MAED,MAAK,6CAA6C,YAAY;AAAA,QAC5D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,QAAQ,CAAC;AAAA,UACxE,CAAC;AAAA,UAED,QACE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,UAAU,eAAe,GAAG,CAAC,CACnF,EAAE,KAAK,QAAQ,GAAG,EAAE,GAAG,MAAM;AAAA,SAC9B;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,aAAa,MAAM;AAAA,MAC1B,MAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,OAAO,UAAU,EAAE,WAAW,aAAa,UAAU,UAAU,GAAG,MAAM,EAAE,CAC5E,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,oDAAoD,YAAY;AAAA,QACnE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,UAAU,SAAS,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,UAC5D,CAAC;AAAA,UAED,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBACJ,QACA,EAAE,WAAW,aAAa,QAAQ,aAAa,GAC/C,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,SAAS,SAAS,QAAQ,CAAC;AAAA,UAC/C,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,SACnC;AAAA,OACF;AAAA,MAED,MAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,SAAS,MAAM;AAAA,cAC9B,EAAE,MAAM,OAAO,SAAS,MAAM;AAAA,YAChC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBACJ,QACA,EAAE,WAAW,aAAa,QAAQ,cAAc,MAAM,WAAW,GACjE,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,SAAS,SAAS,QAAQ,CAAC;AAAA,UAC/C,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,OAAO,OAAO,OAAO,CAAC;AAAA,SACjD;AAAA,OACF;AAAA,MAED,MAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,SAAS,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,eAAe,KAAK,SAAS,SAAS,MAAM;AAAA,cACpD,EAAE,MAAM,sBAAsB,KAAK,UAAU,SAAS,MAAM;AAAA,cAC5D,EAAE,MAAM,eAAe,KAAK,UAAU,SAAS,QAAQ;AAAA,YACzD;AAAA,UACF,CAAC;AAAA,UAED,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBACJ,QACA;AAAA,YACE,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,aAAa,OAAO;AAAA,YACpB,OAAO,CAAC,aAAa;AAAA,YACrB,MAAM,CAAC,QAAQ;AAAA,UACjB,GACA,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UAEA,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,SACnC;AAAA,OACF;AAAA,MAED,MAAK,8BAA8B,YAAY;AAAA,QAC7C,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,cAAc,MAAM,iBACxB,QACA,EAAE,WAAW,aAAa,QAAQ,aAAa,GAC/C,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UAED,YAAY;AAAA,UACZ,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,KAAK,IAAI,KAAK,6BAA6B,CAAC;AAAA,UAE5D,QAAO,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,SACjC;AAAA,OACF;AAAA,MAED,MAAK,2BAA2B,YAAY;AAAA,QAC1C,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBAAiB,QAAQ,EAAE,WAAW,aAAa,QAAQ,aAAa,GAAG,MAAM;AAAA,YACrF,MAAM,IAAI,MAAM,mBAAmB;AAAA,WACpC;AAAA,UACD,MAAM,iBACJ,QACA,EAAE,WAAW,aAAa,QAAQ,aAAa,GAC/C,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC,CACH,EAAE,SAAS,aAAa,CAAC;AAAA,UACzB,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,SACjC;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,aAAa,MAAM;AAAA,MAC1B,MAAK,oCAAoC,YAAY;AAAA,QACnD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,EAAE,IAAI,mBAAmB,WAAW,EAAE,UAAU,KAAM,EAAE;AAAA,UACvE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,OAAO,CAAC;AAAA,UAE5D,MAAM,OAAO,OAAO;AAAA,YAClB,WAAW;AAAA,YACX,UAAU,OAAO;AAAA,YACjB,SAAS,CAAC,OAAO,OAAO,OAAO,EAAE,IAAI,CAAC,YAAW;AAAA,cAC/C,MAAM;AAAA,cACN,SAAS,EAAE,eAAO,MAAM,IAAI,OAAO,GAAG,EAAE;AAAA,YAC1C,EAAE;AAAA,UACJ,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,YAChC,WAAW;AAAA,YACX,UAAU,OAAO;AAAA,UACnB,CAAC;AAAA,UACD,QAAO,QAAQ,QAAQ,MAAM,EAAE,gBAAgB,CAAC;AAAA,UAChD,QAAO,QAAQ,QAAQ,MAAM,EAAE,aAAa,CAAC;AAAA,UAC7C,QAAO,QAAQ,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,OAAO;AAAA,SAClD;AAAA,OACF;AAAA,MAED,MAAK,sCAAsC,YAAY;AAAA,QACrD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,QAAQ,CAAC;AAAA,UACxE,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ;AAAA,YACxC,WAAW;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,UAED,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,OAAO,CAAC;AAAA,SACzE;AAAA,OACF;AAAA,MAED,MAAK,mEAAmE,YAAY;AAAA,QAClF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,SAAS,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,SAAS,MAAM;AAAA,cACjB,EAAE,SAAS,MAAM;AAAA,cACjB,EAAE,SAAS,QAAQ;AAAA,cACnB,EAAE,SAAS,OAAO;AAAA,YACpB;AAAA,UACF,CAAC;AAAA,UAED,MAAM,QACJ,YAAY,QAAQ;AAAA,YAClB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,aAAa,OAAO;AAAA,UACtB,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,UAEpC,MAAM,QACJ,OAAO,KAAK;AAAA,YACV,WAAW;AAAA,YACX,UAAU,eAAe;AAAA,YACzB,cAAc,OAAO;AAAA,UACvB,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,UAMpC,MAAM,QACJ,OAAO,UACL;AAAA,YACE,WAAW;AAAA,YACX,UAAU,eAAe;AAAA,YACzB,aAAa,OAAO;AAAA,UACtB,GACA,MAAG;AAAA,YAAG;AAAA,WACR,CACF,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,wCAAwC,YAAY;AAAA,QACvD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,EAAE,IAAI,kBAAkB,WAAW,EAAE,SAAS,EAAE;AAAA,UAC/D,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX;AAAA,YACA,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,YAAY;AAAA,UAE5B,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX;AAAA,YACA,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ,EAAE,WAAW,aAAa,OAAO,CAAC;AAAA,UAE5E,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,SAChE;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,QAAQ,CAAC,SAAwE;AAAA,EAC9F,QAAQ,MAAM,SAAS,IAAI,CAAC,WAAW,OAAO,OAAO;AAAA;AAGvD,eAAe,aAAa,CAC1B,QACA,QAKkC;AAAA,EAClC,MAAM,OAAO,aAAa,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO,CAAC;AAAA,EAChF,OAAO,OAAO,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,OAAO;AAAA,IACxB,SAAS,OAAO;AAAA,EAClB,CAAC;AAAA;AAGH,eAAe,WAAW,CACxB,QACA,QAQkC;AAAA,EAClC,MAAM,OAAO,aAAa,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO,CAAC;AAAA,EAChF,QACE,MAAM,OAAO,KAAK;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,OAAO;AAAA,IACxB,aAAa,OAAO;AAAA,IACpB,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,EACf,CAAC,GACD;AAAA;AAGJ,eAAe,gBAAgB,CAC7B,QACA,QAQA,SACqB;AAAA,EACrB,MAAM,OAAO,aAAa,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO,CAAC;AAAA,EAChF,OAAO,OAAO,UACZ;AAAA,IACE,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,OAAO;AAAA,IACxB,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,EACf,GACA,OACF;AAAA;AAGF,eAAe,SAAS,CACtB,WACA,SACe;AAAA,EACf,MAAM,WAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,EACtC,OAAO,KAAK,IAAI,IAAI,UAAU;AAAA,IAC5B,IAAI,UAAU,GAAG;AAAA,MACf;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MAAM,QAAQ,UAAU;AAAA,EACpC;AAAA,EACA,MAAM,IAAI,MAAM,GAAG,QAAQ,kBAAkB,QAAQ,aAAa;AAAA;;ACh0BpE,qBAAS,qBAAU,iBAAQ;AA6B3B,IAAM,aAAY;AAClB,IAAM,cAAc;AACpB,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,KAAK;AACP;AAGO,SAAS,0CAEf,CAAC,OAAe,SAAyE;AAAA,EACxF,MAAM,cAAc,OAClB,SACkB;AAAA,IAClB,MAAM,OAAO,MAAM,QAAQ,cAAc;AAAA,IACzC,IAAI;AAAA,MACF,MAAM,KAAK,KAAK,sBAAsB,IAAI;AAAA,cAC1C;AAAA,MACA,MAAM,QAAQ,WAAW,IAAI;AAAA;AAAA;AAAA,EAIjC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,sEAAsE,YAAY;AAAA,MACrF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,qBAAqB;AAAA,QACrC,MAAM,QAAO,QAAQ,2BAA2B,OAAO,CAAC,EAAE,SAAS,cAAc;AAAA,UAC/E,IAAI,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,UACA,wBAAwB,QAAQ;AAAA,QAClC,CAAC;AAAA,QAED,WAAW,mBAAmB;AAAA,UAC5B,EAAE,WAAW,YAAY;AAAA,UACzB,EAAE,aAAa,oBAAoB;AAAA,QACrC,GAAG;AAAA,UACD,MAAM,QACJ,QAAQ,4BAA4B;AAAA,eAC/B,gCAAgC;AAAA,eAChC;AAAA,UACL,CAAC,CACH,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,QACvD;AAAA,QAEA,MAAM,QACJ,QAAQ,4BAA4B,gCAAgC,CAAC,CACvE,EAAE,SAAS,cAAc;AAAA,UACvB,IAAI,QAAQ;AAAA,UACZ,wBAAwB,QAAQ;AAAA,QAClC,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,4BAA4B,gCAAgC,CAAC,CACvE,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,QACrD,MAAM,QACJ,QAAQ,2BAA2B,qBAAqB,CAAC,CAC3D,EAAE,SAAS,cAAc,EAAE,IAAI,YAAY,CAAC;AAAA,OAC7C;AAAA,KACF;AAAA,IAED,MAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,QAAQ;AAAA,QACd,MAAM,UAAU,MAAM,QAAQ,2BAA2B,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAAA,QACxF,QAAO,QAAQ,UAAU,QAAQ,IAAI,QAAQ,UAAU,QAAQ,CAAC,EAAE,KAAK,KAAK;AAAA,QAE5E,MAAM,QAAQ,YAAY,MAAM,KAAK;AAAA,QAErC,MAAM,QACJ,QAAQ,4BAA4B,gCAAgC,CAAC,CACvE,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,QACrD,MAAM,QACJ,QAAQ,2BAA2B,qBAAqB,CAAC,CAC3D,EAAE,SAAS,cAAc,EAAE,IAAI,YAAY,CAAC;AAAA,OAC7C;AAAA,KACF;AAAA,IAED,MAAK,kDAAkD,YAAY;AAAA,MACjE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,MAAM,QAAQ,2BAA2B,qBAAqB,CAAC;AAAA,QAC/E,OAAO,OAAO,QAAQ,cAAc,EAAE,YAAY,UAAU,CAAC;AAAA,QAE7D,MAAM,WAAW,MAAM,QAAQ,4BAC7B,gCAAgC,CAClC;AAAA,QACA,QAAO,SAAS,aAAa,UAAU,EAAE,KAAK,YAAY,UAAU;AAAA,OACrE;AAAA,KACF;AAAA,IAED,MAAK,2EAA2E,YAAY;AAAA,MAC1F,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,qBAAqB,iBAAiB,kBAAkB;AAAA,QAC9D,MAAM,mBAAmB,qBAAqB;AAAA,UAC5C,IAAI;AAAA,UACJ,wBAAwB,mBAAmB;AAAA,UAC3C,iBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB,CAAC;AAAA,QACD,MAAM,eAAe,cAAc;AAAA,UACjC,IAAI;AAAA,UACJ,wBAAwB,mBAAmB;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,KAAK,YACT,OAAO,OAAO;AAAA,UACZ,MAAM,GAAG,WAAW,OAAO,kBAAkB;AAAA,UAC7C,MAAM,cAAc,8BAA8B,EAAE;AAAA,UACpD,MAAM,YAAY,oBAAoB,YAAY;AAAA,UAClD,MAAM,YAAY,2BAA2B,gBAAgB;AAAA,WAE/D,EAAE,WAAW,eAAe,CAC9B;AAAA,QAEA,QACE,MAAM,KAAK,WAAW,QAAQ,EAAE,uBAAW,IAAI,mBAAmB,GAAG,CAAC,CACxE,EAAE,IAAI,SAAS;AAAA,QACf,MAAM,QACJ,QAAQ,iBAAiB,EAAE,uBAAW,aAAa,OAAO,aAAa,GAAG,CAAC,CAC7E,EAAE,SAAS,cAAc,EAAE,IAAI,aAAa,GAAG,CAAC;AAAA,QAChD,MAAM,QACJ,QAAQ,4BAA4B,gCAAgC,iBAAiB,EAAE,CAAC,CAC1F,EAAE,SAAS,cAAc,EAAE,IAAI,iBAAiB,GAAG,CAAC;AAAA,QAEpD,MAAM,sBAAsB,iBAAiB,oBAAoB;AAAA,QACjE,MAAM,oBAAoB,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ,wBAAwB,oBAAoB;AAAA,UAC5C,iBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB,CAAC;AAAA,QACD,MAAM,gBAAgB,cAAc;AAAA,UAClC,IAAI;AAAA,UACJ,wBAAwB,oBAAoB;AAAA,QAC9C,CAAC;AAAA,QACD,MAAM,WAAW,IAAI,MAAM,0CAA0C;AAAA,QACrE,MAAM,QACJ,KAAK,YACH,OAAO,OAAO;AAAA,UACZ,MAAM,GAAG,WAAW,OAAO,mBAAmB;AAAA,UAC9C,MAAM,cAAc,8BAA8B,EAAE;AAAA,UACpD,MAAM,YAAY,oBAAoB,aAAa;AAAA,UACnD,MAAM,YAAY,2BAA2B,iBAAiB;AAAA,UAC9D,MAAM;AAAA,WAER,EAAE,WAAW,eAAe,CAC9B,CACF,EAAE,QAAQ,KAAK,QAAQ;AAAA,QAEvB,QAAO,MAAM,KAAK,WAAW,QAAQ,EAAE,uBAAW,IAAI,oBAAoB,GAAG,CAAC,CAAC,EAAE,SAAS;AAAA,QAC1F,MAAM,QACJ,QAAQ,iBAAiB,EAAE,uBAAW,aAAa,OAAO,cAAc,GAAG,CAAC,CAC9E,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,4BAA4B,gCAAgC,kBAAkB,EAAE,CAAC,CAC3F,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,OACtD;AAAA,KACF;AAAA,IAED,MAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,kBAAkB;AAAA,UACtB,iBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB;AAAA,QAEA,MAAM,QACJ,QAAQ,2BAA2B,qBAAqB,eAAe,CAAC,CAC1E,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,QAErD,MAAM,QAAQ,oBAAoB,cAAc,CAAC;AAAA,QACjD,MAAM,QACJ,QAAQ,2BAA2B,qBAAqB,eAAe,CAAC,CAC1E,EAAE,SAAS,cAAc,EAAE,IAAI,aAAa,iBAAiB,QAAQ,CAAC;AAAA,QACtE,MAAM,QACJ,QAAQ,2BACN,qBAAqB,KAAK,iBAAiB,IAAI,YAAY,CAAC,CAC9D,CACF,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,OACtD;AAAA,KACF;AAAA,IAED,MAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,oBAAoB,cAAc,CAAC;AAAA,QACjD,MAAM,QAAQ,2BACZ,qBAAqB;AAAA,UACnB,iBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB,CAAC,CACH;AAAA,QAEA,MAAM,QACJ,QAAQ,2BACN,2BAA2B;AAAA,UACzB,qBAAqB;AAAA,QACvB,CAAC,CACH,CACF,EAAE,SAAS,SAAS;AAAA,QAEpB,MAAM,UAAU,MAAM,QAAQ,2BAC5B,2BAA2B;AAAA,UACzB,qBAAqB;AAAA,QACvB,CAAC,CACH;AAAA,QACA,QAAO,OAAO,EAAE,cAAc;AAAA,UAC5B,MAAM;AAAA,UACN,KAAK,EAAE,IAAI,SAAS,QAAQ,UAAU;AAAA,UACtC,SAAS,EAAE,IAAI,aAAa,iBAAiB,QAAQ;AAAA,UACrD,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,QAAO,WAAW,cAAc,QAAQ,GAAG,EAAE,KAAK,KAAK;AAAA,QACvD,MAAM,QACJ,QAAQ,2BACN,2BAA2B;AAAA,UACzB,qBAAqB;AAAA,QACvB,CAAC,CACH,CACF,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,iEAAiE,YAAY;AAAA,MAChF,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,QAAQ,oBAAoB,cAAc,CAAC;AAAA,QACjD,MAAM,QAAQ,2BACZ,qBAAqB;AAAA,UACnB,iBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,YAAY,MAAM,KAAM;AAAA,QAEtC,MAAM,QACJ,QAAQ,iBAAiB,EAAE,uBAAW,aAAa,OAAO,QAAQ,CAAC,CACrE,EAAE,SAAS,cAAc,EAAE,QAAQ,UAAU,CAAC;AAAA,QAC9C,MAAM,QACJ,QAAQ,2BACN,2BAA2B;AAAA,UACzB,qBAAqB;AAAA,QACvB,CAAC,CACH,CACF,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,8DAA8D,YAAY;AAAA,MAC7E,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,QAAQ,oBAAoB,cAAc,CAAC;AAAA,QACjD,MAAM,QAAQ,2BACZ,qBAAqB;AAAA,UACnB,iBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,qBAAqB;AAAA,QACvB,CAAC,CACH;AAAA,QACA,MAAM,UAAU,MAAM,QAAQ,2BAC5B,2BAA2B,EAAE,iBAAiB,KAAM,CAAC,CACvD;AAAA,QACA,IAAI,CAAC,WAAW,QAAQ,SAAS;AAAA,UAAW,MAAM,IAAI,MAAM,0BAA0B;AAAA,QACtF,MAAM,gBAAgB,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QACvF,MAAM,QACJ,QAAQ,iCAAiC;AAAA,UACvC;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,cAAc,QAAQ,IAAI;AAAA,UAC1B,iBAAiB,cAAc;AAAA,QACjC,CAAC,CACH,EAAE,SAAS,IAAI,SAAS;AAAA,QAExB,MAAM,QAAQ,YAAY,MAAM,IAAK;AAAA,QACrC,MAAM,QACJ,QAAQ,iBAAiB,EAAE,uBAAW,aAAa,OAAO,QAAQ,CAAC,CACrE,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,iBAAiB,cAAc;AAAA,UAC/B,OAAO,EAAE,MAAM,sBAAsB;AAAA,QACvC,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,iBAAiB,cAAc,EAAE,CAAC,CAC7D,EAAE,SAAS,cAAc,EAAE,QAAQ,qBAAqB,CAAC;AAAA,QACzD,MAAM,QACJ,QAAQ,oBAAoB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,cAAc,QAAQ,IAAI;AAAA,UAC1B,QAAQ;AAAA,QACV,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QAChF,MAAM,QAAQ,SAAS,QAAQ,gBAAgB,WAAW;AAAA,QAC1D,MAAM,UAAU,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QACjF,MAAM,mBAAmB,SAAS,OAAO;AAAA,QAEzC,MAAM,QACJ,QAAQ,qBAAqB;AAAA,UAC3B,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,SAAS,EAAE,IAAI,aAAa,OAAO,YAAY;AAAA,UAC/C,SAAS;AAAA,QACX,CAAC,CACH,EAAE,QAAQ,QAAQ,kCAAkC;AAAA,QACpD,QACE,MAAM,QAAQ,iBAAiB,EAAE,uBAAW,aAAa,OAAO,QAAQ,CAAC,CAC3E,EAAE,cAAc,EAAE,QAAQ,WAAW,YAAY,oBAAoB,CAAC;AAAA,QACtE,QAAO,MAAM,QAAQ,iBAAiB,iBAAiB,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,OAAO;AAAA,QAEpF,MAAM,WAAW,MAAM,QAAQ,qBAAqB;AAAA,UAClD,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,SAAS,EAAE,IAAI,aAAa,OAAO,YAAY;AAAA,UAC/C,SAAS;AAAA,QACX,CAAC;AAAA,QACD,QAAO,SAAS,GAAG,EAAE,cAAc,EAAE,QAAQ,YAAY,CAAC;AAAA,OAC3D;AAAA,KACF;AAAA,IAED,MAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QAC/E,MAAM,kBAAkB,MAAM,QAAQ,SAAS,OAAO,gBAAgB,WAAW;AAAA,QACjF,MAAM,SAAS,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QAEhF,MAAM,QAAO,QAAQ,SAAS,QAAQ,gBAAgB,WAAW,CAAC,EAAE,QAAQ,QAC1E,kCACF;AAAA,QACA,MAAM,WAAW,MAAM,QAAQ,cAAc;AAAA,UAC3C,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO;AAAA,UACxB,OAAO,EAAE,MAAM,UAAU;AAAA,UACzB,MAAM;AAAA,UACN,SAAS,EAAE,IAAI,aAAa,OAAO,UAAU;AAAA,UAC7C,SAAS;AAAA,QACX,CAAC;AAAA,QACD,QAAO,SAAS,WAAW,EAAE,EAAE,KAAK,gBAAgB,WAAW,EAAE;AAAA,QACjE,QAAO,SAAS,gCAAgC,EAAE,KAAK,MAAM,EAAE;AAAA,QAC/D,QAAO,MAAM,QAAQ,iBAAiB,iBAAiB,MAAM,EAAE,CAAC,CAAC,EAAE,cAAc;AAAA,UAC/E,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QACE,MAAM,QAAQ,cAAc;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,OAAO,EAAE,MAAM,UAAU;AAAA,UACzB,MAAM;AAAA,QACR,CAAC,CACH,EAAE,cAAc,EAAE,iBAAiB,OAAO,IAAI,SAAS,EAAE,IAAI,YAAY,EAAE,CAAC;AAAA,OAC7E;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QAC/E,MAAM,YAAY,MAAM,QAAQ,SAAS,OAAO,gBAAgB,WAAW;AAAA,QAE3E,MAAM,eAAe,MAAM,QAAQ,qBAAqB;AAAA,UACtD;AAAA,UACA;AAAA,UACA,cAAc,UAAU,WAAW;AAAA,QACrC,CAAC;AAAA,QACD,QAAO,YAAY,EAAE,cAAc;AAAA,UACjC,YAAY,EAAE,IAAI,UAAU,WAAW,IAAI,QAAQ,eAAe;AAAA,UAClE,eAAe,EAAE,QAAQ,qBAAqB;AAAA,UAC9C,kCAAkC,MAAM;AAAA,QAC1C,CAAC;AAAA,QACD,QACE,MAAM,QAAQ,cAAc;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,OAAO,EAAE,MAAM,UAAU;AAAA,UACzB,MAAM;AAAA,QACR,CAAC,CACH,EAAE,SAAS;AAAA,QACX,QACE,MAAM,QAAQ,kBAAkB;AAAA,UAC9B;AAAA,UACA;AAAA,UACA,cAAc,UAAU,WAAW;AAAA,QACrC,CAAC,CACH,EAAE,cAAc,EAAE,QAAQ,eAAe,CAAC;AAAA,QAE1C,MAAM,SAAS,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QAChF,MAAM,cAAc,MAAM,QAAQ,SAAS,QAAQ,kBAAkB,WAAW;AAAA,QAChF,QAAO,YAAY,UAAU,EAAE,cAAc;AAAA,UAC3C,IAAI,UAAU,WAAW;AAAA,UACzB,iBAAiB,OAAO;AAAA,UACxB,QAAQ;AAAA,QACV,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,sEAAsE,YAAY;AAAA,MACrF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QAChF,MAAM,WAAW,MAAM,QAAQ,SAAS,QAAQ,gBAAgB,WAAW;AAAA,QAC3E,MAAM,cAAc,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QAErF,MAAM,QAAO,QAAQ,SAAS,aAAa,gBAAgB,WAAW,CAAC,EAAE,QAAQ,QAC/E,kCACF;AAAA,QACA,QAAO,MAAM,QAAQ,iBAAiB,iBAAiB,YAAY,EAAE,CAAC,CAAC,EAAE,QACvE,WACF;AAAA,QAEA,MAAM,cAAc,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QACrF,MAAM,QACJ,QAAQ,cAAc;AAAA,UACpB,IAAI,SAAS,WAAW;AAAA,UACxB;AAAA,UACA;AAAA,UACA,iBAAiB,YAAY;AAAA,UAC7B,OAAO,EAAE,MAAM,UAAU;AAAA,UACzB,MAAM;AAAA,UACN,SAAS,EAAE,IAAI,aAAa,OAAO,UAAU;AAAA,UAC7C,SAAS;AAAA,QACX,CAAC,CACH,EAAE,QAAQ,QAAQ,8BAA8B;AAAA,QAChD,QAAO,MAAM,QAAQ,iBAAiB,iBAAiB,YAAY,EAAE,CAAC,CAAC,EAAE,QACvE,WACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,gBAAgB,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QACvF,MAAM,QAAQ,YAAY,MAAM,KAAM;AAAA,QAEtC,MAAM,QAAO,QAAQ,SAAS,eAAe,gBAAgB,WAAW,CAAC,EAAE,QAAQ,QACjF,0BACF;AAAA,QACA,MAAM,QACJ,QAAQ,iBAAiB,iBAAiB,cAAc,EAAE,CAAC,CAC7D,EAAE,SAAS,cAAc,EAAE,QAAQ,qBAAqB,CAAC;AAAA,OAC1D;AAAA,KACF;AAAA,IAED,MAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,gBAAgB,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QACvF,MAAM,mBAAmB,SAAS,aAAa;AAAA,QAC/C,MAAM,QAAQ,YAAY,MAAM,KAAM;AAAA,QAEtC,MAAM,QACJ,QAAQ,qBAAqB;AAAA,UAC3B,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,SAAS,EAAE,IAAI,aAAa,OAAO,YAAY;AAAA,UAC/C,SAAS;AAAA,QACX,CAAC,CACH,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,QACrD,MAAM,QACJ,QAAQ,iBAAiB,EAAE,uBAAW,aAAa,OAAO,QAAQ,CAAC,CACrE,EAAE,SAAS,cAAc,EAAE,QAAQ,UAAU,CAAC;AAAA,QAC9C,MAAM,QACJ,QAAQ,iBAAiB,iBAAiB,cAAc,EAAE,CAAC,CAC7D,EAAE,SAAS,cAAc,EAAE,QAAQ,qBAAqB,CAAC;AAAA,OAC1D;AAAA,KACF;AAAA,IAED,MAAK,uDAAuD,YAAY;AAAA,MACtE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBAAgB,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QACvF,MAAM,YAAY,MAAM,QAAQ,SAAS,eAAe,gBAAgB,WAAW;AAAA,QAEnF,QAAO,MAAM,QAAQ,iBAAiB,iBAAiB,cAAc,EAAE,CAAC,CAAC,EAAE,QACzE,UAAU,aACZ;AAAA,QACA,WAAW,SAAS;AAAA,UAClB,EAAE,WAAW,aAAa,YAAY;AAAA,UACtC,EAAE,uBAAW,aAAa,oBAAoB;AAAA,QAChD,GAAG;AAAA,UACD,QACE,MAAM,QAAQ,iBAAiB;AAAA,eAC1B;AAAA,YACH,iBAAiB,cAAc;AAAA,UACjC,CAAC,CACH,EAAE,SAAS;AAAA,UACX,QACE,MAAM,QAAQ,kBAAkB;AAAA,eAC3B;AAAA,YACH,cAAc,UAAU,WAAW;AAAA,UACrC,CAAC,CACH,EAAE,SAAS;AAAA,UACX,QACE,MAAM,QAAQ,+BAA+B;AAAA,eACxC;AAAA,YACH,iBAAiB,cAAc;AAAA,UACjC,CAAC,CACH,EAAE,QAAQ,CAAC,CAAC;AAAA,QACd;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;AAAA,QAC7D,WAAW,SAAS;AAAA,UAClB,EAAE,WAAW,aAAa,YAAY;AAAA,UACtC,EAAE,uBAAW,aAAa,oBAAoB;AAAA,QAChD,GAAG;AAAA,UACD,MAAM,QACJ,QAAQ,wBAAwB;AAAA,eAC3B;AAAA,YACH,iBAAiB,cAAc;AAAA,YAC/B,kBAAkB,cAAc;AAAA,YAChC,UAAU,EAAE,IAAI,cAAc,MAAM,WAAW,UAAU,WAAW;AAAA,YACpE,iBAAiB;AAAA,YACjB,oBAAoB;AAAA,UACtB,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACtB;AAAA,QAEA,MAAM,QAAQ,MAAM,QAAQ,wBAAwB;AAAA,UAClD;AAAA,UACA;AAAA,UACA,iBAAiB,cAAc;AAAA,UAC/B,kBAAkB,cAAc;AAAA,UAChC,UAAU,EAAE,IAAI,cAAc,MAAM,WAAW,UAAU,WAAW;AAAA,UACpE,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,QACtB,CAAC;AAAA,QACD,QAAO,KAAK,EAAE,IAAI,SAAS;AAAA,QAC3B,MAAM,UAAU,MAAO;AAAA,QACvB,MAAM,YAAY,MAAM,QAAQ,gCAAgC;AAAA,aAC3D,MAAM,OAAO;AAAA,UAChB,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,QAAO,WAAW,oBAAoB,KAAK,EAAE,KAAK,WAAW;AAAA,QAC7D,WAAW,SAAS;AAAA,UAClB,EAAE,WAAW,aAAa,YAAY;AAAA,UACtC,EAAE,uBAAW,aAAa,oBAAoB;AAAA,QAChD,GAAG;AAAA,UACD,MAAM,QACJ,QAAQ,mCAAmC;AAAA,eACtC,MAAM,OAAO;AAAA,eACb;AAAA,YACH,UAAU;AAAA,YACV;AAAA,YACA,QAAQ,CAAC;AAAA,UACX,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACtB;AAAA,QACA,MAAM,QACJ,QAAQ,mCAAmC;AAAA,aACtC,MAAM,OAAO;AAAA,UAChB,YAAY;AAAA,UACZ,UAAU;AAAA,UACV;AAAA,UACA,QAAQ,CAAC;AAAA,QACX,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAEpB,MAAM,SAAS,MAAM,QAAQ,mCAAmC;AAAA,aAC3D,MAAM,OAAO;AAAA,UAChB,UAAU;AAAA,UACV;AAAA,UACA,QAAQ,CAAC;AAAA,QACX,CAAC;AAAA,QACD,QAAO,QAAQ,oBAAoB,KAAK,EAAE,KAAK,eAAe;AAAA,QAC9D,MAAM,QACJ,QAAQ,gBAAgB,KAAK,MAAM,OAAO,GAAG,kBAAkB,QAAQ,WAAW,EAAE,CAAC,CACvF,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QAAO,QAAQ,gBAAgB,MAAM,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UAC3E,UAAU,QAAQ,WAAW;AAAA,UAC7B,oBAAoB;AAAA,QACtB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,2EAA2E,YAAY;AAAA,MAC1F,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;AAAA,QAC7D,MAAM,cAAc,SAAS,eAAe,qBAAqB,WAAW;AAAA,UAC1E,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,QACtB,CAAC;AAAA,QAED,MAAM,QAAQ,YAAY,MAAM,GAAM;AAAA,QACtC,MAAM,QACJ,QAAQ,iCAAiC,iBAAiB,cAAc,EAAE,CAAC,CAC7E,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,UAAU,cAAc;AAAA,UACxB,oBAAoB;AAAA,QACtB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oFAAoF,YAAY;AAAA,MACnG,WAAW,QAAQ,CAAC,WAAW,iBAAiB,GAAY;AAAA,QAC1D,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,UACzC,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;AAAA,UAC7D,MAAM,QAAQ,MAAM,cAAc,SAAS,eAAe,YAAY,QAAQ,MAAM;AAAA,YAClF,iBAAiB;AAAA,YACjB,oBAAoB;AAAA,UACtB,CAAC;AAAA,UACD,MAAM,cAAc,SAAS,MAAM,aAAa;AAAA,UAEhD,MAAM,QAAQ,YAAY,MAAM,GAAM;AAAA,UACtC,MAAM,QACJ,QAAQ,iCAAiC,iBAAiB,cAAc,EAAE,CAAC,CAC7E,EAAE,SAAS,cAAc;AAAA,YACvB,QAAQ;AAAA,YACR,UAAU,MAAM,cAAc,WAAW;AAAA,YACzC,oBAAoB;AAAA,UACtB,CAAC;AAAA,SACF;AAAA,MACH;AAAA,MAEA,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;AAAA,QAC7D,MAAM,QAAQ,MAAM,cAClB,SACA,eACA,uBACA,cACA,EAAE,iBAAiB,KAAQ,oBAAoB,MAAO,CACxD;AAAA,QACA,MAAM,cAAc,SAAS,MAAM,aAAa;AAAA,QAEhD,MAAM,QAAQ,YAAY,MAAM,GAAM;AAAA,QACtC,MAAM,YAAY,MAAM,QAAQ,iCAC9B,iBAAiB,cAAc,EAAE,CACnC;AAAA,QACA,QAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,QAAQ;AAAA,UACR,UAAU,MAAM,cAAc;AAAA,UAC9B,oBAAoB;AAAA,QACtB,CAAC;AAAA,QACD,IAAI,CAAC;AAAA,UAAW,MAAM,IAAI,MAAM,uCAAuC;AAAA,QACvE,MAAM,QACJ,cAAc,SAAS,WAAW,6BAA6B,YAAY,CAC7E,EAAE,SAAS,YAAY;AAAA,OACxB;AAAA,KACF;AAAA,IAED,MAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;AAAA,QAC7D,MAAM,QAAQ,MAAM,cAAc,SAAS,eAAe,mBAAmB,WAAW;AAAA,UACtF,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,QACtB,CAAC;AAAA,QACD,MAAM,YAAY,MAAM,cAAc,SAAS,MAAM,aAAa;AAAA,QAClE,MAAM,SAAS,MAAM,QAAQ,mCAAmC;AAAA,aAC3D,MAAM,SAAS;AAAA,UAClB,UAAU;AAAA,UACV,aAAa,KAAK,aAAa,YAAY,YAAY;AAAA,UACvD,QAAQ,CAAC,eAAe;AAAA,QAC1B,CAAC;AAAA,QACD,QAAO,QAAQ,oBAAoB,KAAK,EAAE,KAAK,eAAe;AAAA,QAE9D,MAAM,QAAQ,YAAY,MAAM,KAAM;AAAA,QACtC,MAAM,YAAY,MAAM,QAAQ,iCAC9B,iBAAiB,cAAc,EAAE,CACnC;AAAA,QACA,QAAO,WAAW,oBAAoB,KAAK,EAAE,KAAK,eAAe;AAAA,QACjE,IAAI,CAAC;AAAA,UAAW,MAAM,IAAI,MAAM,mCAAmC;AAAA,QACnE,MAAM,QAAO,QAAQ,gBAAgB,MAAM,SAAS,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UAC7E,QAAQ;AAAA,UACR,UAAU,cAAc,WAAW;AAAA,UACnC,QAAQ,CAAC,eAAe;AAAA,UACxB,oBAAoB;AAAA,QACtB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,SAAS,SAAS;AAAA,QACzC,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;AAAA,QAC7D,MAAM,QAAQ,MAAM,cAAc,SAAS,eAAe,kBAAkB,WAAW;AAAA,UACrF,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,QACtB,CAAC;AAAA,QACD,MAAM,YAAY,MAAM,cAAc,SAAS,MAAM,aAAa;AAAA,QAClE,MAAM,WAAW,UAAU,mBAAoB;AAAA,QAE/C,MAAM,QAAQ,YAAY,MAAM,IAAK;AAAA,QACrC,MAAM,UAAU,MAAM,QAAQ,wBAAwB;AAAA,aACjD,MAAM,SAAS;AAAA,UAClB,UAAU;AAAA,UACV,iBAAiB;AAAA,QACnB,CAAC;AAAA,QACD,QAAO,SAAS,oBAAoB,SAAS,EAAE,QAAQ,QAAQ;AAAA,QAE/D,MAAM,QAAQ,YAAY,MAAM,KAAM;AAAA,QACtC,MAAM,QACJ,QAAQ,iCAAiC,iBAAiB,cAAc,EAAE,CAAC,CAC7E,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,oBAAoB;AAAA,QACtB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBAAgB,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,QACvF,MAAM,QAAQ,MAAM,QAAQ,SAAS,eAAe,gBAAgB,WAAW;AAAA,QAC/E,MAAM,QAAQ,cAAc;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,iBAAiB,cAAc;AAAA,UAC/B,OAAO,EAAE,MAAM,UAAU;AAAA,UACzB,MAAM;AAAA,UACN,SAAS,EAAE,IAAI,aAAa,OAAO,UAAU;AAAA,UAC7C,SAAS;AAAA,QACX,CAAC;AAAA,QACD,MAAM,SAAU,MAAM,QAAQ,iBAAiB,iBAAiB,cAAc,EAAE,CAAC;AAAA,QACjF,MAAM,QAAQ,MAAM,QAAQ,wBAAwB;AAAA,UAClD;AAAA,UACA;AAAA,UACA,iBAAiB,cAAc;AAAA,UAC/B,kBAAkB,OAAO;AAAA,UACzB,UAAU,EAAE,IAAI,mBAAmB,MAAM,cAAc,UAAU,WAAW;AAAA,UAC5E,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,QACtB,CAAC;AAAA,QAED,QAAO,OAAO,cAAc,MAAM,EAAE,KAAK,oBAAoB;AAAA,QAC7D,QAAO,OAAO,aAAa,IAAI,CAAC,eAAe,WAAW,EAAE,EAAE,KAAK,CAAC,EAAE,QACpE,CAAC,MAAM,WAAW,IAAI,cAAc,EAAE,KAAK,CAC7C;AAAA,QACA,QACE,MAAM,QAAQ,+BAA+B,iBAAiB,cAAc,EAAE,CAAC,CACjF,EAAE,QAAQ,CAAC,CAAC;AAAA,QACZ,QACE,MAAM,QAAQ,+BAA+B;AAAA,UAC3C;AAAA,UACA;AAAA,UACA,cAAc,MAAM,WAAW;AAAA,QACjC,CAAC,CACH,EAAE,cAAc,EAAE,IAAI,cAAc,IAAI,QAAQ,qBAAqB,CAAC;AAAA,QAEtE,IAAI,CAAC;AAAA,UAAO,MAAM,IAAI,MAAM,qCAAqC;AAAA,QACjE,MAAM,YAAY,MAAM,cAAc,SAAS,MAAM,aAAa;AAAA,QAClE,MAAM,SAAS,MAAM,QAAQ,kCAAkC;AAAA,aAC1D,MAAM,SAAS;AAAA,UAClB,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,IAAI,CAAC;AAAA,UAAQ,MAAM,IAAI,MAAM,6BAA6B;AAAA,QAC1D,MAAM,UAAU,MAAM,QAAQ,mBAAmB,MAAM,MAAM,CAAC;AAAA,QAC9D,QAAO,OAAO,EAAE,cAAc;AAAA,UAC5B,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,QAAQ,CAAC;AAAA,UACT,UAAU,CAAC;AAAA,QACb,CAAC;AAAA,QACD,QAAO,MAAM,QAAQ,gBAAgB,EAAE,uBAAW,YAAY,CAAC,CAAC,EAAE,QAChE,QAAO,gBAAgB;AAAA,UACrB,QAAO,iBAAiB,EAAE,IAAI,MAAM,WAAW,IAAI,QAAQ,eAAe,CAAC;AAAA,UAC3E,QAAO,iBAAiB,EAAE,IAAI,gBAAgB,QAAQ,eAAe,CAAC;AAAA,QACxE,CAAC,CACH;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,8DAA8D,YAAY;AAAA,MAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;AAAA,QAC7D,MAAM,cAAc,MAAM,QAAQ,+BAChC,iBAAiB,cAAc,EAAE,CACnC;AAAA,QACA,MAAM,QAAQ,MAAM,QAAQ,wBAAwB;AAAA,UAClD;AAAA,UACA;AAAA,UACA,iBAAiB,cAAc;AAAA,UAC/B,kBAAkB,cAAc;AAAA,UAChC,UAAU;AAAA,YACR,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,UAAU;AAAA,UACZ;AAAA,UACA,uBAAuB,YAAY,IAAI,CAAC,eAAe,WAAW,EAAE;AAAA,UACpE,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,QACtB,CAAC;AAAA,QACD,QAAO,KAAK,EAAE,IAAI,SAAS;AAAA,QAE3B,MAAM,QACJ,QAAQ,qBAAqB;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,cAAc,YAAY,GAAG;AAAA,QAC/B,CAAC,CACH,EAAE,QAAQ,QAAQ,oBAAoB;AAAA,OACvC;AAAA,KACF;AAAA,GACF;AAAA;AAGH,SAAS,oBAAoB,CAC3B,YAA+D,CAAC,GACtB;AAAA,EAC1C,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO,EAAE,MAAM,UAAU;AAAA,IACzB,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,aAAa;AAAA,IACb,OAAO;AAAA,OACJ;AAAA,EACL;AAAA;AAGF,SAAS,aAAa,CACpB,YAAwD,CAAC,GACtB;AAAA,EACnC,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,OAAO,EAAE,MAAM,UAAU;AAAA,IACzB,MAAM;AAAA,IACN,wBAAwB;AAAA,IACxB,OAAO;AAAA,OACJ;AAAA,EACL;AAAA;AAGF,eAAe,kBAAkB,CAC/B,SACA,eACe;AAAA,EACf,MAAM,QAAQ,oBAAoB,cAAc,CAAC;AAAA,EACjD,MAAM,QAAQ,2BACZ,qBAAqB;AAAA,IACnB,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,qBAAqB;AAAA,EACvB,CAAC,CACH;AAAA,EACA,MAAM,UAAU,MAAM,QAAQ,2BAA2B,2BAA2B,CAAC;AAAA,EACrF,IAAI,CAAC,WAAW,QAAQ,SAAS;AAAA,IAAW,MAAM,IAAI,MAAM,0BAA0B;AAAA,EACtF,MAAM,WAAW,MAAM,QAAQ,iCAAiC;AAAA,IAC9D;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,cAAc,QAAQ,IAAI;AAAA,IAC1B,iBAAiB,cAAc;AAAA,EACjC,CAAC;AAAA,EACD,IAAI,CAAC;AAAA,IAAU,MAAM,IAAI,MAAM,mDAAmD;AAAA,EAClF,MAAM,UAAU,MAAM,QAAQ,8BAA8B;AAAA,IAC1D;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,cAAc,QAAQ,IAAI;AAAA,IAC1B,iBAAiB,cAAc;AAAA,IAC/B,WAAW,cAAc;AAAA,EAC3B,CAAC;AAAA,EACD,IAAI,CAAC;AAAA,IAAS,MAAM,IAAI,MAAM,iCAAiC;AAAA;AAGjE,SAAS,0BAA0B,CACjC,YAA+D,CAAC,GACtB;AAAA,EAC1C,OAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,aAAa;AAAA,IACb,cAAc;AAAA,IACd,iBAAiB;AAAA,OACd;AAAA,EACL;AAAA;AAGF,SAAS,gBAAgB,CACvB,iBACA,YAAmF,CAAC,GACpF;AAAA,EACA,OAAO,EAAE,uBAAW,aAAa,oBAAoB,UAAU;AAAA;AAGjE,SAAS,+BAA+B,CAAC,KAAK,aAAa;AAAA,EACzD,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA;AAGF,SAAS,gBAAgB,CAAC,IAAkC;AAAA,EAC1D,MAAM,YAAY,WAAW;AAAA,EAC7B,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,EAAE,MAAM,WAAW,UAAU;AAAA,IACvC,QAAQ,EAAE,MAAM,QAAQ,UAAU;AAAA,IAClC,eAAe,eAAe;AAAA,IAC9B,kBAAkB,EAAE,MAAM,WAAW;AAAA,EACvC;AAAA;AAGF,SAAS,6BAA6B,CAAC,SAA8C;AAAA,EACnF,IAAI,QAAQ;AAAA,IAAsB,OAAO,QAAQ;AAAA,EACjD,MAAM,IAAI,MAAM,sEAAsE;AAAA;AAGxF,eAAe,mBAAmB,CAChC,SACA,IACA,WACuC;AAAA,EACvC,OAAO,QAAQ,oBAAoB;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,EAAE,MAAM,QAAQ,IAAI,SAAS;AAAA,IAC3C;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC,EAAE,IAAI,WAAW,OAAO,UAAU,CAAC;AAAA,IAC9C,gBAAgB;AAAA,EAClB,CAAC;AAAA;AAGH,eAAe,yBAAyB,CACtC,SACuC;AAAA,EACvC,MAAM,gBAAgB,MAAM,oBAAoB,SAAS,mBAAmB,WAAW;AAAA,EACvF,MAAM,SAAS,MAAM,QAAQ,SAAS,eAAe,gBAAgB,WAAW;AAAA,EAChF,OAAO,OAAO;AAAA;AAGhB,SAAS,OAAO,CACd,SACA,eACA,cACA,WACA;AAAA,EACA,OAAO,QAAQ,cAAc;AAAA,IAC3B,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,iBAAiB,cAAc;AAAA,IAC/B,OAAO,EAAE,MAAM,UAAU;AAAA,IACzB,MAAM;AAAA,IACN,SAAS,EAAE,IAAI,WAAW,OAAO,UAAU;AAAA,IAC3C,SAAS;AAAA,EACX,CAAC;AAAA;AAGH,eAAe,aAAa,CAC1B,SACA,eACA,YACA,MACA,SAAoF;AAAA,EAClF,iBAAiB;AAAA,EACjB,oBAAoB;AACtB,GACiD;AAAA,EACjD,MAAM,wBACJ,SAAS,qBACJ,MAAM,QAAQ,+BAA+B,iBAAiB,cAAc,EAAE,CAAC,GAAG,IACjF,CAAC,eAAe,WAAW,EAC7B,IACA;AAAA,EACN,MAAM,QAAQ,MAAM,QAAQ,wBAAwB;AAAA,IAClD;AAAA,IACA;AAAA,IACA,iBAAiB,cAAc;AAAA,IAC/B,kBAAkB,cAAc;AAAA,IAChC,UAAU,EAAE,IAAI,YAAY,MAAM,UAAU,WAAW;AAAA,OACnD,0BAA0B,YAAY,CAAC,IAAI,EAAE,sBAAsB;AAAA,OACpE;AAAA,EACL,CAAC;AAAA,EACD,IAAI,CAAC;AAAA,IAAO,MAAM,IAAI,MAAM,aAAa,kCAAkC;AAAA,EAC3E,OAAO;AAAA;AAGT,eAAe,aAAa,CAC1B,SACA,eACuC;AAAA,EACvC,MAAM,YAAY,MAAM,QAAQ,gCAAgC;AAAA,OAC3D,MAAM,aAAa;AAAA,IACtB,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,IAAI,CAAC;AAAA,IAAW,MAAM,IAAI,MAAM,yCAAyC;AAAA,EACzE,OAAO;AAAA;AAGT,SAAS,KAAK,CAAC,eAA6C;AAAA,EAC1D,OAAO;AAAA,IACL,WAAW,cAAc;AAAA,IACzB,aAAa,cAAc;AAAA,IAC3B,iBAAiB,cAAc;AAAA,IAC/B,kBAAkB,cAAc;AAAA,IAChC,YAAY,cAAc,mBAAoB;AAAA,EAChD;AAAA;;AC1hCF,qBAAS,sBAAU,kBAAQ;;;AC8CpB,SAAS,6BAA6B,CAAC,OAKlB;AAAA,EAC1B,MAAM,cAAc,IAAI,mBAAmB;AAAA,IACzC,aAAa,CAAC;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,cAAc,IAAI;AAAA,EACpB,CAAC;AAAA,EACD,MAAM,eAAe,2BAA2B;AAAA,IAC9C,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB;AAAA,IACA,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,EACtB,CAAC,EAAE,UACD,mBAAmB;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,aAAa,kCAAkC,MAAM;AAAA,IACrD,WAAW,gCAAgC,MAAM;AAAA,IACjD,eAAe,oCAAoC,MAAM;AAAA,EAC3D,CAAC,CACH;AAAA,EACA,IAAI,iBAAiB;AAAA,EAErB,SAAS,aAAa,CAAC,MAAoC;AAAA,IACzD,kBAAkB;AAAA,IAClB,OAAO,wBAAwB,QAAQ;AAAA;AAAA,EAGzC,eAAe,MAAM,CAAC,YAAyE;AAAA,IAC7F,OAAO,aAAa,MAAM,OAAO;AAAA,MAC/B,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,WAAW,WAAW,cAAc,MAAM,EAAE;AAAA,MAC5D;AAAA,MACA,iBAAiB,CAAC;AAAA,MAClB,eAAe,CAAC;AAAA,MAChB,oBAAoB,CAAC;AAAA,IACvB,CAAC;AAAA;AAAA,EAGH,eAAe,eAAe,CAC5B,QACgC;AAAA,IAChC,OAAO,aAAa,UAAU,OAAO;AAAA,MACnC,QAAQ,EAAE,MAAM,WAAW,WAAW,cAAc,WAAW,EAAE;AAAA,MACjE;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,SACM,KAAI,CAAC,OAAM;AAAA,MACf,MAAM,aAAsC,CAAC;AAAA,MAC7C,WAAW,UAAU,MAAK,WAAW,CAAC,GAAG;AAAA,QACvC,WAAW,KAAK;AAAA,UACd,IAAI,eAAe,WAAW;AAAA,UAC9B,MAAM;AAAA,UACN,KAAK,OAAO;AAAA,UACZ,YAAY,OAAO;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,MACA,WAAW,SAAQ,MAAK,SAAS,CAAC,GAAG;AAAA,QACnC,WAAW,KAAK;AAAA,UACd,IAAI,aAAa,WAAW;AAAA,UAC5B,MAAM;AAAA,UACN,KAAK,MAAK;AAAA,aACN,MAAK,eAAe,YAAY,CAAC,IAAI,EAAE,YAAY,MAAK,WAAW;AAAA,QACzE,CAAC;AAAA,MACH;AAAA,MACA,IAAI,WAAW,SAAS;AAAA,QAAG,MAAM,OAAO,UAAU;AAAA,MAClD,IAAI,MAAK,aAAa,MAAK,UAAU,SAAS,GAAG;AAAA,QAC/C,MAAM,gBAAgB,MAAK,SAAS;AAAA,MACtC;AAAA;AAAA,EAEJ;AAAA;;;ADnHF,IAAM,aAAY;AAClB,IAAM,SAAS,iBAAiB;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,IACzC,KAAK,eAAe,UAAU,EAAE,MAAM,YAAY,CAAC;AAAA,EACrD;AAAA,EACA,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,aAAa,OAAO,CAAC,CAAC;AACrD,CAAC;AACD,IAAM,UAAU,iBAAiB;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,EAC3C;AAAA,EACA,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,aAAa,OAAO,CAAC,CAAC;AACjD,CAAC;AACD,IAAM,WAAW,iBAAiB;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,EAC3C;AAAA,EACA,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE,aAAa,OAAO,CAAC,CAAC;AACjD,CAAC;AACD,IAAM,WAAW,IAAI,iBAAiB,EAAE,SAAS,CAAC,QAAQ,SAAS,QAAQ,EAAE,CAAC;AAEvE,SAAS,gCAA0D,CACxE,MACA,UACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,SAAS,cAAc;AAAA,IAC7C,IAAI;AAAA,MACF,MAAM,mBAAmB,OAAO;AAAA,MAChC,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,SAAS,UAAU,OAAO;AAAA;AAAA;AAAA,EAIpC,WAAS,MAAM,MAAM;AAAA,IACnB,OAAK,oCAAoC,YAAY;AAAA,MACnD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,QAAQ,QAAQ,eAAe;AAAA,UAClD;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,QACb,CAAC;AAAA,QACD,SAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,YAAY,EAAE,IAAI,KAAK,MAAM,SAAS,aAAa,GAAG;AAAA,UACtD,SAAS;AAAA,QACX,CAAC;AAAA,QACD,SAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,QAAQ;AAAA,QAEjD,MAAM,QAAQ,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,UACtD;AAAA,UACA,OAAO;AAAA,YACL,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI;AAAA,YAC1C,EAAE,cAAc,OAAO,IAAI,WAAW,UAAU;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,QACD,SAAO,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,eAAe,OAAO,IAAI,GAAG,CAAC,CAAC;AAAA,QAElE,MAAM,qBAAqB,MAAM,QAAQ,QAAQ,wBAAwB;AAAA,UACvE;AAAA,UACA,OAAO;AAAA,YACL,EAAE,cAAc,OAAO,IAAI,WAAW,KAAK,YAAY,OAAO;AAAA,YAC9D,EAAE,cAAc,OAAO,IAAI,WAAW,KAAK,YAAY,mBAAmB;AAAA,YAC1E,EAAE,cAAc,OAAO,IAAI,WAAW,WAAW,YAAY,OAAO;AAAA,YACpE,EAAE,cAAc,OAAO,IAAI,WAAW,KAAK,YAAY,OAAO;AAAA,UAChE;AAAA,QACF,CAAC;AAAA,QACD,SAAO,kBAAkB,EAAE,QAAQ,CAAC,MAAM,MAAM,OAAO,IAAI,CAAC;AAAA,OAC7D;AAAA,KACF;AAAA,IAED,OAAK,kCAAkC,YAAY;AAAA,MACjD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,MAAM,QAAQ,QAAQ,UAAU;AAAA,UAC/C;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,SAAO,SAAS,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,QACrE,SAAO,SAAS,MAAM,CAAC,QAAQ,IAAI,aAAa,SAAS,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,QAEtE,MAAM,WAAW,MAAM,QAAQ,QAAQ,uBAAuB;AAAA,UAC5D;AAAA,UACA,OAAO,CAAC,EAAE,cAAc,OAAO,IAAI,UAAU,IAAI,CAAC;AAAA,QACpD,CAAC;AAAA,QACD,SAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,QAC/B,SAAO,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,KAAK,UAAU,IAAI,CAAC;AAAA,QAElE,MAAM,eAAe,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACxD;AAAA,UACA,OAAO,CAAC,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAAA,QACrE,CAAC;AAAA,QACD,SAAO,aAAa,IAAI,aAAa,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC;AAAA,QAE9E,MAAM,kBAAkB,MAAM,QAAQ,QAAQ,eAAe;AAAA,UAC3D;AAAA,UACA,WAAW;AAAA,UACX,OAAO,CAAC,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAAA,QACrE,CAAC;AAAA,QACD,SAAO,gBAAgB,IAAI,aAAa,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,EAAE,cAAc;AAAA,UAC/E,EAAE,UAAU,KAAK,UAAU,IAAI;AAAA,QACjC,CAAC;AAAA,QAED,MAAM,wBAAwB,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACjE;AAAA,UACA,WAAW;AAAA,UACX,OAAO;AAAA,YACL,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,QAAQ,QAAQ;AAAA,YAC1D,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,QAAQ,QAAQ;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QACD,SAAO,sBAAsB,IAAI,aAAa,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC;AAAA,QACvF,SAAO,sBAAsB,IAAI,aAAa,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,EAAE,cAAc;AAAA,UACrF,EAAE,UAAU,KAAK,UAAU,IAAI;AAAA,QACjC,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,oDAAoD,YAAY;AAAA,MACnE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,QAAQ,QAAQ,WAAW;AAAA,UAC7C;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI,CAAC;AAAA,UACxD,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,uBAAuB,CAAC,OAAO,EAAE;AAAA,UACjC,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,MAAM,MAAM,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;AAAA,QAC5D,SAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,QAE/B,MAAM,SAAS,MAAM,QAAQ,QAAQ,WAAW;AAAA,UAC9C;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI,CAAC;AAAA,UACxD,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,uBAAuB,CAAC,OAAO,EAAE;AAAA,UACjC,OAAO,iBAAiB,MAAM,MAAM,EAAE;AAAA,UACtC,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,OAAO,MAAM,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;AAAA,QAC7D,SAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QAEjC,MAAM,gBAAgB,MAAM,QAAQ,QAAQ,WAAW;AAAA,UACrD;AAAA,UACA,YAAY;AAAA,YACV,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI;AAAA,YAC1C,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI;AAAA,UAC5C;AAAA,UACA,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,cAAc,MAAM,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,QAEzE,MAAM,WAAW,MAAM,QAAQ,QAAQ,WAAW;AAAA,UAChD;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI,CAAC;AAAA,UACxD,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,SAAS,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,IAAI,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAAA,QAEtF,MAAM,iBAAiB,MAAM,QAAQ,QAAQ,WAAW;AAAA,UACtD;AAAA,UACA,YAAY;AAAA,YACV,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI;AAAA,YAC1C,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI;AAAA,UAC5C;AAAA,UACA,WAAW;AAAA,UACX,uBAAuB,CAAC,OAAO,EAAE;AAAA,UACjC,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,eAAe,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,IAAI,QAAQ,CAAC,CAAC,EAAE,QAAQ;AAAA,UAC9E,CAAC,KAAK,GAAG;AAAA,UACT,CAAC,KAAK,GAAG;AAAA,QACX,CAAC;AAAA,QAED,MAAM,eAAe,MAAM,QAAQ,QAAQ,WAAW;AAAA,UACpD;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI,CAAC;AAAA,UACxD,WAAW;AAAA,UACX,uBAAuB,CAAC;AAAA,UACxB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,MAAM,CAAC;AAAA,OAC3D;AAAA,KACF;AAAA,IAED,OAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,kBAAkB,GAAG;AAAA,QAC3B,MAAM,UAAU,8BAA8B;AAAA,UAC5C,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,MAAM,QAAQ,KAAK;AAAA,UACjB,SAAS;AAAA,YACP;AAAA,cACE,KAAK,EAAE,cAAc,QAAQ,IAAI,WAAW,MAAM;AAAA,cAClD,YAAY,EAAE,IAAI,OAAO,MAAM,QAAQ;AAAA,YACzC;AAAA,YACA;AAAA,cACE,KAAK,EAAE,cAAc,SAAS,IAAI,WAAW,IAAI;AAAA,cACjD,YAAY,EAAE,IAAI,KAAK,MAAM,SAAS;AAAA,YACxC;AAAA,UACF;AAAA,UACA,OAAO;AAAA,YACL;AAAA,cACE,KAAK;AAAA,gBACH,QAAQ,EAAE,cAAc,QAAQ,IAAI,WAAW,MAAM;AAAA,gBACrD,QAAQ;AAAA,gBACR,QAAQ,EAAE,cAAc,QAAQ,IAAI,WAAW,MAAM;AAAA,cACvD;AAAA,YACF;AAAA,YACA;AAAA,cACE,KAAK;AAAA,gBACH,QAAQ,EAAE,cAAc,SAAS,IAAI,WAAW,IAAI;AAAA,gBACpD,QAAQ;AAAA,gBACR,QAAQ,EAAE,cAAc,SAAS,IAAI,WAAW,IAAI;AAAA,cACtD;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,UACxD,WAAW;AAAA,UACX,OAAO;AAAA,YACL,EAAE,cAAc,QAAQ,IAAI,WAAW,MAAM;AAAA,YAC7C,EAAE,cAAc,SAAS,IAAI,WAAW,IAAI;AAAA,UAC9C;AAAA,QACF,CAAC;AAAA,QACD,SAAO,QAAQ,IAAI,eAAe,QAAQ,IAAI,KAAK,CAAC,GAAG,WAAW,IAAI,EAAE,KAAK,OAAO;AAAA,QACpF,SAAO,QAAQ,IAAI,eAAe,SAAS,IAAI,GAAG,CAAC,GAAG,WAAW,IAAI,EAAE,KAAK,QAAQ;AAAA,QAEpF,MAAM,QAAQ,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACjD,WAAW;AAAA,UACX,WAAW;AAAA,UACX,OAAO;AAAA,YACL,EAAE,cAAc,QAAQ,IAAI,UAAU,OAAO,QAAQ,IAAI;AAAA,YACzD,EAAE,cAAc,SAAS,IAAI,UAAU,KAAK,QAAQ,IAAI;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,QACD,SAAO,MAAM,IAAI,aAAa,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC;AAAA,QACtE,SAAO,MAAM,IAAI,aAAa,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC;AAAA,OACtE;AAAA,KACF;AAAA,IAED,OAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,qBAAqB,GAAG;AAAA,QAC9B,MAAM,gBAAgB;AAAA,QACtB,MAAM,gBAAgB,gBAAgB,OAAO;AAAA,QAC7C,MAAM,iBAAiB,GAAG,uBAAuB,OAAO;AAAA,QACxD,MAAM,iBAAiB;AAAA,QACvB,MAAM,UAAU,8BAA8B;AAAA,UAC5C,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,MAAM,QAAQ,KAAK;AAAA,UACjB,SAAS;AAAA,YACP,OAAO,eAAe,cAAc;AAAA,YACpC,OAAO,eAAe,cAAc;AAAA,YACpC,OAAO,gBAAgB,eAAe;AAAA,YACtC,OAAO,gBAAgB,eAAe;AAAA,UACxC;AAAA,UACA,OAAO,CAAC,KAAK,eAAe,aAAa,GAAG,KAAK,gBAAgB,cAAc,CAAC;AAAA,QAClF,CAAC;AAAA,QAED,MAAM,WAAW,MAAM,QAAQ,QAAQ,uBAAuB;AAAA,UAC5D,WAAW;AAAA,UACX,OAAO;AAAA,YACL,EAAE,cAAc,OAAO,IAAI,UAAU,cAAc;AAAA,YACnD,EAAE,cAAc,OAAO,IAAI,UAAU,eAAe;AAAA,UACtD;AAAA,QACF,CAAC;AAAA,QACD,MAAM,WAAW,SAAS,OACxB,CAAC,QAAQ,IAAI,aAAa,iBAAiB,IAAI,aAAa,cAC9D;AAAA,QAEA,SAAO,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC,EAAE,QACtE,SAAO,gBAAgB;AAAA,UACrB,CAAC,eAAe,SAAS,aAAa;AAAA,UACtC,CAAC,gBAAgB,SAAS,cAAc;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,SAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,OAChC;AAAA,KACF;AAAA,IAED,OAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,YAAY,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,UAC1D;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,UAAU,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,QACxE,SAAO,UAAU,aAAa,EAAE,KAAK,GAAG;AAAA,QACxC,MAAM,aAAa,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,UAC3D;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,gBAAgB,UAAU;AAAA,UAC1B,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,WAAW,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;AAAA,OACrE;AAAA,KACF;AAAA,IAED,OAAK,sCAAsC,YAAY;AAAA,MACrD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,aAAa,MAAM,QAAQ,WAAW,WAAW;AAAA,UACrD;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,WAAW,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,QAC3D,SAAO,OAAO,WAAW,IAAI,YAAY,EAAE,KAAK,QAAQ;AAAA,QAExD,MAAM,YAAY,MAAM,QAAQ,WAAW,gBAAgB;AAAA,UACzD;AAAA,UACA,QAAQ;AAAA,YACN,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,YAAY,cAAc;AAAA,YACpE,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,YAAY,cAAc;AAAA,UACtE;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,UAAU,IAAI,CAAC,WAAW,OAAO,OAAO,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,QAE3E,MAAM,SAAS,MAAM,QAAQ,WAAW,UAAU;AAAA,UAChD;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,UAAU;AAAA,UACV,YAAY;AAAA,QACd,CAAC;AAAA,QACD,SAAO,MAAM,EAAE,cAAc,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK,0BAA0B,EAAE,CAAC;AAAA,OACrF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,kBAAkB,CAAC,SAAiC;AAAA,EACjE,MAAM,UAAU,8BAA8B,EAAE,uBAAW,UAAU,QAAQ,CAAC;AAAA,EAC9E,MAAM,QAAQ,KAAK;AAAA,IACjB,SAAS,CAAC,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC;AAAA,IACzE,OAAO,CAAC,KAAK,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;AAAA,IACtC,WAAW;AAAA,MACT,YAAY,KAAK,IAAI,0BAA0B;AAAA,MAC/C,YAAY,KAAK,IAAI,0BAA0B;AAAA,MAC/C,YAAY,KAAK,IAAI,0BAA0B;AAAA,IACjD;AAAA,EACF,CAAC;AAAA;AAGH,SAAS,MAAM,CAAC,WAAmB,MAAc;AAAA,EAC/C,OAAO;AAAA,IACL,KAAK,EAAE,cAAc,OAAO,IAAI,UAAU;AAAA,IAC1C,YAAY,EAAE,IAAI,WAAW,KAAK;AAAA,EACpC;AAAA;AAGF,SAAS,IAAI,CAAC,UAAkB,UAAkB;AAAA,EAChD,OAAO;AAAA,IACL,KAAK;AAAA,MACH,QAAQ,EAAE,cAAc,OAAO,IAAI,WAAW,SAAS;AAAA,MACvD,QAAQ;AAAA,MACR,QAAQ,EAAE,cAAc,OAAO,IAAI,WAAW,SAAS;AAAA,IACzD;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAAC,UAAkB,OAAe,KAAY;AAAA,EAChE,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,QAAQ,EAAE,cAAc,OAAO,IAAI,WAAW,SAAS;AAAA,MACvD,YAAY;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;;AE1XK,SAAS,cAEf,CACC,eACA,UAAgC,CAAC,GACT;AAAA,EACxB,MAAM,OACJ,eAAe,gBAAgB,gBAAgB,IAAI,SAAS,aAAa;AAAA,EAC3E,MAAM,OAAO,KAAK,UAChB,mBAAmB;AAAA,IACjB,WAAW,KAAK;AAAA,OACZ,QAAQ,kBAAkB,YAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,cAAc;AAAA,OAC5E,QAAQ,gBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,QAAQ,YAAY;AAAA,OAC5E,QAAQ,cAAc,YAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,OACtE,QAAQ,kBAAkB,YAAY,CAAC,IAAI,EAAE,eAAe,QAAQ,cAAc;AAAA,EACxF,CAAC,CACH;AAAA,EACA,IAAI,CAAC,YAA8B,IAAI,GAAG;AAAA,IACxC,MAAM,IAAI,MAAM,8DAA8D;AAAA,EAChF;AAAA,EACA,OAAO;AAAA;;AC9CT,qBAAS,sBAAU,kBAAQ;AA0B3B,IAAM,aAAY;AAClB,IAAM,YAAY,IAAI,KAAK,0BAA0B;AACrD,IAAM,YAAY,IAAI,KAAK,0BAA0B;AAG9C,SAAS,gCAAkF,CAChG,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,QAAQ,IAAI;AAAA,QAC3B,MAAM,kBAAkB,OAAO;AAAA,QAE/B,MAAM,UAAU;AAAA,UACd,iBAAiB;AAAA,YACf,IAAI;AAAA,YACJ,YAAY,EAAE,MAAM,WAAW,IAAI,eAAe;AAAA,UACpD,CAAC;AAAA,UACD,iBAAiB;AAAA,YACf,IAAI;AAAA,YACJ,WAAW,EAAE,MAAM,kBAAkB,IAAI,cAAc;AAAA,YACvD,YAAY,EAAE,MAAM,eAAe,IAAI,gBAAgB;AAAA,UACzD,CAAC;AAAA,UACD,gBAAgB,kBAAkB;AAAA,UAClC,iBAAiB,mBAAmB;AAAA,UACpC,GAAG,sBAAsB,IAAI,CAAC,SAAS,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,IAAI,CAAC;AAAA,UACtF,eAAe,iBAAiB;AAAA,UAChC,gBAAgB,kBAAkB;AAAA,QACpC;AAAA,QAEA,WAAW,SAAS,SAAS;AAAA,UAC3B,MAAM,oBAAoB,IAAI;AAAA,UAC9B,MAAM,UAAU,MAAM,QAAQ,WAAW,OAAO,KAAK;AAAA,UACrD,QAAQ,WAAW,gBAAgB,mBAAmB;AAAA,UACtD,SAAO,cAAc,EAAE,QAAQ,KAAK;AAAA,UACpC,SAAO,OAAO,SAAS,YAAY,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,UACxD,SAAO,YAAY,QAAQ,CAAC,EAAE,uBAAuB,kBAAkB,QAAQ,CAAC;AAAA,UAChF,SACE,MAAM,QAAQ,WAAW,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,MAAM,GAAG,CAAC,CAC/E,EAAE,QAAQ,OAAO;AAAA,QACnB;AAAA,QAEA,MAAM,QAAQ,MAAM,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,oBAAoB,CAAC;AAAA,QACrF,IAAI,CAAC,SAAS,MAAM,iBAAiB,SAAS,aAAa;AAAA,UACzD,MAAM,IAAI,MAAM,sCAAsC;AAAA,QACxD;AAAA,QACA,MAAM,YAAY,gBAAgB,KAAK;AAAA,QACrC,MAAM,iBAAiB,UAA6B,KAAK;AAAA,QAC3D,MAAM,UAAU,eAAe,IAAI;AAAA,QACnC,SAAO,MAAM,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,SAAS;AAAA,OACxF;AAAA,KACF;AAAA,IAED,OAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBAAgB,WAAW;AAAA,QACzC,MAAM,QAAQ,WAAW,OAAO,KAAK;AAAA,QAErC,MAAM,SAAO,QAAQ,WAAW,OAAO,KAAK,CAAC,EAAE,QAAQ,cAAc;AAAA,UACnE,MAAM;AAAA,QACR,CAAC;AAAA,QAED,MAAM,eAAe,gBAAgB,aAAa,0BAA0B;AAAA,QAC5E,MAAM,SAAO,QAAQ,WAAW,OAAO,YAAY,CAAC,EAAE,SAAS,cAAc;AAAA,UAC3E,WAAW,aAAa;AAAA,QAC1B,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,WAAW,QAAQ,EAAE,WAAW,mBAAmB,IAAI,MAAM,GAAG,CAAC,CACjF,EAAE,SAAS;AAAA,QAEX,MAAM,YAAY,MAAM,QAAQ,WAAW,OAAO;AAAA,aAC7C,gBAAgB,kBAAkB;AAAA,UACrC,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAyB;AAAA,QACzB,SAAO,UAAU,UAAU,eAAe,CAAC,EAAE,IAAI,KAAK,IAAI;AAAA,OAC3D;AAAA,KACF;AAAA,IAED,OAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBAAgB,eAAe;AAAA,QAC7C,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,UACvC,QAAQ,WAAW,OAAO,KAAK;AAAA,UAC/B,QAAQ,WAAW,OAAO,KAAK;AAAA,QACjC,CAAC;AAAA,QAED,SAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,WAAW,CAAC,EAAE,aAAa,CAAC;AAAA,QAChF,OAAO,YAAY,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU;AAAA,QAC1E,SAAO,UAAU,MAAM,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAAA,OACvE;AAAA,KACF;AAAA,IAED,OAAK,iEAAiE,YAAY;AAAA,MAChF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,QAAQ,IAAI;AAAA,QAE3B,MAAM,gBAAiD;AAAA,UACrD;AAAA,eACK,gBAAgB,cAAc;AAAA,YACjC,QAAQ,EAAE,MAAM,SAAS,OAAO,WAAW,OAAO,QAAQ;AAAA,UAC5D;AAAA,UACA;AAAA,eACK,gBAAgB,sBAAsB;AAAA,YACzC,QAAQ,EAAE,MAAM,QAAQ,WAAW,oBAAoB;AAAA,UACzD;AAAA,UACA;AAAA,eACK,gBAAgB,6BAA6B;AAAA,YAChD,kBAAkB;AAAA,cAChB,MAAM;AAAA,cACN,WAAW,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,YAC5C;AAAA,UACF;AAAA,UACA;AAAA,eACK,iBAAiB,qBAAqB;AAAA,YACzC,kBAAkB,EAAE,MAAM,WAAW;AAAA,UACvC;AAAA,UACA;AAAA,eACK,eAAe,YAAY;AAAA,YAC9B,kBAAkB;AAAA,cAChB,MAAM;AAAA,cACN,WAAW,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,YAC5C;AAAA,UACF;AAAA,UACA;AAAA,eACK,gBAAgB,kBAAkB;AAAA,YACrC,aAAa,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,UAC9C;AAAA,QACF;AAAA,QAEA,WAAW,SAAS,eAAe;AAAA,UACjC,MAAM,SAAO,QAAQ,WAAW,OAAO,KAAK,CAAC,EAAE,QAAQ,cAAc;AAAA,YACnE,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,OACD;AAAA,KACF;AAAA,IAED,OAAK,8DAA8D,YAAY;AAAA,MAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,QAAQ,IAAI;AAAA,QAC3B,MAAM,kBAAkB,OAAO;AAAA,QAE/B,MAAM,SACJ,QAAQ,WAAW,OACjB,iBAAiB;AAAA,UACf,IAAI;AAAA,UACJ,WAAW,EAAE,MAAM,QAAQ,IAAI,eAAe;AAAA,QAChD,CAAC,CACH,CACF,EAAE,QAAQ,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAAA,QAErD,MAAM,SACJ,QAAQ,WAAW,OAAO;AAAA,aACrB,iBAAiB,wBAAwB;AAAA,UAC5C,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,cACN,SAAS;AAAA,cACT,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAAA,QAEtD,MAAM,SACJ,QAAQ,WAAW,OAAO;AAAA,aACrB,iBAAiB,oBAAoB;AAAA,UACxC,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,cACN,SAAS;AAAA,cACT,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAAA,QAEtD,MAAM,SACJ,QAAQ,WAAW,OACjB,iBAAiB;AAAA,UACf,IAAI;AAAA,UACJ,YAAY,EAAE,MAAM,WAAW,IAAI,kBAAkB;AAAA,QACvD,CAAC,CACH,CACF,EAAE,QAAQ,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAAA,QAEtD,MAAM,SACJ,QAAQ,WAAW,OACjB,iBAAiB;AAAA,UACf,IAAI;AAAA,UACJ,YAAY,EAAE,MAAM,WAAW,IAAI,gBAAgB;AAAA,QACrD,CAAC,CACH,CACF,EAAE,QAAQ,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAAA,QAEtD,MAAM,SACJ,QAAQ,WAAW,OAAO;AAAA,aACrB,iBAAiB,mBAAmB;AAAA,UACvC,aAAa,EAAE,MAAM,QAAQ,IAAI,eAAe;AAAA,QAClD,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAAA,OACtD;AAAA,KACF;AAAA,IAED,OAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,QAAQ,IAAI;AAAA,QAC3B,MAAM,QAAQ,WAAW,OAAO,iBAAiB,EAAE,IAAI,SAAS,CAAC,CAAC;AAAA,QAElE,MAAM,aAAa,iBAAiB,eAAe;AAAA,UACjD,eAAe;AAAA,UACf,QAAQ,EAAE,MAAM,aAAa,aAAa,SAAS;AAAA,QACrD,CAAC;AAAA,QACD,MAAM,cAAc,MAAM,QAAQ,WAAW,OAAO,UAAU;AAAA,QAC9D,SAAO,WAAW,EAAE,cAAc;AAAA,UAChC,QAAQ,EAAE,MAAM,aAAa,aAAa,SAAS;AAAA,QACrD,CAAC;AAAA,QACD,SAAO,WAAW,EAAE,IAAI,eAAe,mBAAmB;AAAA,QAE1D,MAAM,kBAA6D;AAAA,UACjE;AAAA,YACE,iBAAiB,kBAAkB;AAAA,cACjC,QAAQ,EAAE,MAAM,aAAa,aAAa,iBAAiB;AAAA,YAC7D,CAAC;AAAA,YACD;AAAA,UACF;AAAA,UACA;AAAA,YACE,iBAAiB,qBAAqB;AAAA,cACpC,eAAe;AAAA,cACf,QAAQ,EAAE,MAAM,aAAa,aAAa,SAAS;AAAA,YACrD,CAAC;AAAA,YACD;AAAA,UACF;AAAA,UACA;AAAA,YACE,iBAAiB,mBAAmB;AAAA,cAClC,aAAa,EAAE,MAAM,QAAQ,IAAI,aAAa;AAAA,cAC9C,QAAQ,EAAE,MAAM,aAAa,aAAa,SAAS;AAAA,YACrD,CAAC;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,QAEA,YAAY,OAAO,SAAS,iBAAiB;AAAA,UAC3C,MAAM,SAAO,QAAQ,WAAW,OAAO,KAAK,CAAC,EAAE,QAAQ,cAAc,EAAE,KAAK,CAAC;AAAA,QAC/E;AAAA,OACD;AAAA,KACF;AAAA,IAED,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,MAAM,GAAG,WAAW,OAAO,gBAAgB,aAAa,CAAC;AAAA,UACzD,MAAM,IAAI,MAAM,UAAU;AAAA,SAC3B,CACH,EAAE,QAAQ,QAAQ,UAAU;AAAA,QAC5B,SAAO,MAAM,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,cAAc,CAAC,CAAC,EAAE,SAAS;AAAA,QAEpF,MAAM,QAAQ,YAAY,CAAC,OAAO,GAAG,WAAW,OAAO,gBAAgB,WAAW,CAAC,CAAC;AAAA,QACpF,SAAO,MAAM,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,SAAS;AAAA,OACvF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,QAAQ,CAAC,MAAkC;AAAA,EACxD,MAAM,KAAK,MAAM,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EACD,MAAM,KAAK,MAAM,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EACD,MAAM,KAAK,gBAAgB,OAAO;AAAA,IAChC,IAAI;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAAA,EACD,MAAM,KAAK,SAAS,OAAO;AAAA,IACzB,IAAI;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,KAAK,SAAS,OAAO;AAAA,IACzB,IAAI;AAAA,IACJ;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,KAAK,aAAa,OAAO;AAAA,IAC7B,IAAI;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF,CAAC;AAAA;AAGH,eAAe,iBAAiB,CAAC,SAAyD;AAAA,EACxF,WAAW,MAAM,CAAC,aAAa,WAAW,GAAY;AAAA,IACpD,MAAM,QAAQ,YAAY,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,QAAQ,EAAE,cAAc,kBAAkB,WAAW,GAAG;AAAA,MACxD,UAAU,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,MACzC,mBAAmB,EAAE,SAAS,GAAG,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;AAAA,MACxD,WAAW,OAAO,cAAc,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE;AAAA,MAC9D,iBAAiB,aAAa;AAAA,MAC9B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,MAAM,QAAQ,cAAc,OAAO;AAAA,IACjC,IAAI;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,WAAW,IAAI,OAAO,EAAE;AAAA,IACxB;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB,CAAC;AAAA;AAGH,SAAS,gBAAgB,CAAC,OAMD;AAAA,EACvB,MAAM,YAAY,MAAM,aAAc,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,EACrE,OAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV;AAAA,IACA,aAAa;AAAA,IACb,UAAU,EAAE,MAAM,WAAW,WAAW,WAAW,MAAM,KAAK;AAAA,IAC9D,QAAQ,EAAE,MAAM,QAAQ,WAAW,WAAW,MAAM,KAAK;AAAA,IACzD,eAAe,MAAM,OAAO,WAAW,uBAAuB,eAAe,MAAM;AAAA,IACnF,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,SACI,MAAM,eAAe,YAAY,CAAC,IAAI,EAAE,YAAY,MAAM,WAAW;AAAA,IAC3E;AAAA,EACF;AAAA;AAGF,SAAS,eAAe,CAAC,IAAY,iBAAiB,YAAiC;AAAA,EACrF,OAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,UAAU,EAAE,MAAM,WAAW,WAAW,WAAW,KAAK;AAAA,IACxD,QAAQ,EAAE,MAAM,QAAQ,WAAW,WAAW,KAAK;AAAA,IACnD,eAAe,eAAe;AAAA,IAC9B,kBAAkB,EAAE,MAAM,WAAW;AAAA,EACvC;AAAA;AAGF,SAAS,gBAAgB,CAAC,IAAkC;AAAA,EAC1D,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,EAAE,MAAM,WAAW,WAAW,WAAW,KAAK;AAAA,IACxD,QAAQ,EAAE,MAAM,QAAQ,WAAW,WAAW,KAAK;AAAA,IACnD,eAAe,eAAe;AAAA,IAC9B,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,gBAAgB,CACvB,IACA,YAA6F,CAAC,GAC9F,OAA6B,UACP;AAAA,EACtB,MAAM,QAAQ,OAAO;AAAA,EACrB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,IAC5C,UAAU,EAAE,MAAM,aAAa,MAAM,MAAM;AAAA,IAC3C,QAAQ,uBAAuB,MAAM,EAAE;AAAA,IACvC,eAAe,eAAe;AAAA,IAC9B,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,WAAW,EAAE,MAAM,IAAI,YAAY,QAAQ,MAAM;AAAA,IACnD;AAAA,OACG;AAAA,EACL;AAAA;AAGF,SAAS,sBAAsB,CAC7B,MACA,IACgC;AAAA,EAChC,IAAI,SAAS,YAAY;AAAA,IACvB,OAAO,EAAE,MAAM,YAAY,SAAS,kBAAkB,KAAK;AAAA,EAC7D;AAAA,EACA,IAAI,SAAS,cAAc;AAAA,IACzB,OAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX,WAAW,WAAW;AAAA,IACxB;AAAA,EACF;AAAA,EACA,IAAI,SAAS,WAAW;AAAA,IACtB,OAAO,EAAE,MAAM,WAAW,YAAY,YAAY,KAAK;AAAA,EACzD;AAAA,EACA,OAAO,EAAE,MAAM,SAAS,SAAS,SAAS,KAAK;AAAA;AAGjD,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,cAAc,CAAC,IAAkC;AAAA,EACxD,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,EAAE,MAAM,QAAQ,IAAI,WAAW;AAAA,IAC5C,UAAU,EAAE,MAAM,SAAS,OAAO,OAAO,KAAK;AAAA,IAC9C,QAAQ,EAAE,MAAM,aAAa,aAAa,oBAAoB;AAAA,IAC9D,eAAe;AAAA,IACf,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,WAAW,EAAE,MAAM,kBAAkB,IAAI,cAAc;AAAA,IACzD;AAAA,EACF;AAAA;AAGF,SAAS,eAAe,CAAC,IAAkC;AAAA,EACzD,MAAM,YAAY,EAAE,MAAM,oBAAoB,YAAY,YAAY,KAAK;AAAA,EAC3E,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,EAAE,MAAM,UAAU,UAAU;AAAA,IACtC,QAAQ,EAAE,MAAM,SAAS,SAAS,SAAS,KAAK;AAAA,IAChD,eAAe,eAAe;AAAA,IAC9B,kBAAkB,EAAE,MAAM,UAAU,UAAU;AAAA,EAChD;AAAA;;AChgBF,qBAAS,sBAAU,kBAAQ;;;ACA3B,qBAAS,sBAAU,kBAAQ;AAY3B,IAAM,UAAU,cAAc,yBAAyB;AAAA,EACrD,QAAQ;AAAA,IACN,IAAI,MAAM,QAAQ;AAAA,IAClB,IAAI,YAAY,OAAO;AAAA,IACvB,IAAI,QAAQ,QAAQ;AAAA,IACpB,IAAI,WAAW,QAAQ,EAAE,UAAU,KAAK,CAAC;AAAA,EAC3C;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AACd,CAAC;AACD,IAAM,SAAS,CAAC,UAA2B,OAAO,OAAO,KAAK,SAC5D,OAAO,OAAO,EAAE,IAAI,UAAU,KAAK,CAAC;AAEtC,eAAe,KAAK,CAClB,SACA,SACA,aAAgC,SAChC;AAAA,EACA,MAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,SAAS,WAAW,CAAC;AAAA,EAChE,IAAI;AAAA,IACF,MAAM,QAAQ,aAAa,OAAO;AAAA,IAClC,OAAO,MAAM,QAAQ,OAAO;AAAA,IAC5B,OAAO,OAAO;AAAA,IACd,MAAM,QAAQ,MAAM;AAAA,IACpB,MAAM;AAAA;AAAA;AAIV,eAAe,IAAI,CAAC,SAAsB,aAAgC,SAAS;AAAA,EACjF,MAAM,SAAuB,CAAC;AAAA,EAC9B,iBAAiB,OAAO,QAAQ,SAAS,EAAE,WAAW,WAAW,GAAG,CAAC;AAAA,IAAG,OAAO,KAAK,GAAG;AAAA,EACvF,OAAO;AAAA;AAGF,SAAS,0BAAwD,CACtE,SACM;AAAA,EACN,MAAM,cAAc,OAAO,QAA8C;AAAA,IACvE,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,QAAQ,cAAc,OAAO;AAAA,MACnC,MAAM,IAAI,OAAO;AAAA,cACjB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,WAAS,mBAAmB,MAAM;AAAA,IAChC,OAAK,gFAAgF,YAAY;AAAA,MAG/F,IAAI,UAAU,MAAM,QAAQ,cAAc;AAAA,MAC1C,MAAM,WAAW,MACf,aAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa,IAAI;AAAA,QACjB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ,IAAI,gBAAgB,EAAE;AAAA,QAC9B,YAAY,YAAY,CAAC;AAAA,MAC3B,CAAC;AAAA,MACH,IAAI;AAAA,QACF,MAAM,QAAQ,cAAc,OAAO;AAAA,QACnC,SAAO,MAAM,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,aAAa,SAAS,KAAK,CAAC;AAAA,QAChF,MAAM,cAAc,MAAM,QAAQ,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;AAAA,QAC9D,SAAO,YAAY,IAAI,CAAC,WAAW,OAAO,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,WAAW,WAAW,CAAC;AAAA,QAC3F,MAAM,UAAU,YAAY,KAAK,CAAC,WAAW,OAAO,YAAY,SAAS;AAAA,QACzE,SAAO,YAAY,IAAI,OAAO,EAAE,QAAQ,YAAY,IAAI,OAAO;AAAA,QAC/D,SAAO,OAAO,EAAE,cAAc;AAAA,UAC5B,SAAS;AAAA,UACT,SAAS,EAAE,UAAU,GAAG,MAAM,QAAQ;AAAA,QACxC,CAAC;AAAA,QACD,SAAO,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,QACtC,IAAI,QAAQ;AAAA,UAAQ,UAAU,MAAM,QAAQ,OAAO,OAAO;AAAA,QAC1D,SAAO,MAAM,QAAQ,iBAAiB,QAAQ,EAAE,CAAC,EAAE,QAAQ,QAAQ,OAAO;AAAA,QAC1E,SAAO,MAAM,SAAS,CAAC,EAAE,cAAc,EAAE,SAAS,aAAa,SAAS,QAAQ,QAAQ,CAAC;AAAA,QAEzF,MAAM,aAAa,cAAc,uBAAuB;AAAA,UACtD,QAAQ,QAAQ,OAAO;AAAA,UACvB,YAAY;AAAA,UACZ,YAAY;AAAA,QACd,CAAC;AAAA,QACD,IAAI;AAAA,QACJ,MAAM,UAAU,MAAM,aAAa;AAAA,UACjC,aAAa;AAAA,UACb,aAAa,IAAI;AAAA,UACjB,SAAS;AAAA,UACT,MAAM;AAAA,UACN,QAAQ,IAAI,gBAAgB,EAAE;AAAA,UAC9B,YAAY,YAAY;AAAA,YACtB,YAAY,MAAM,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,UAAU;AAAA,YACxD,OAAO,CAAC;AAAA;AAAA,QAEZ,CAAC;AAAA,QACD,SAAO,OAAO,EAAE,cAAc,EAAE,SAAS,aAAa,SAAS,WAAW,QAAQ,CAAC;AAAA,QACnF,SAAO,MAAM,KAAK,SAAS,UAAU,CAAC,EAAE,aAAa,CAAC;AAAA,gBACtD;AAAA,QACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA,KAEnC;AAAA,IAED,OAAK,qFAAqF,MACxF,YAAY,OAAO,YAAY;AAAA,MAG7B,MAAM,aAAa,cAAc,+BAA+B;AAAA,QAC9D,QAAQ,CAAC,GAAG,QAAQ,OAAO,SAAS,IAAI,MAAM,aAAa,EAAE,UAAU,KAAK,CAAC,CAAC;AAAA,QAC9E,YAAY;AAAA,QACZ,YAAY;AAAA,MACd,CAAC;AAAA,MACD,MAAM,QAAQ,cAAc,UAAU;AAAA,MACtC,MAAM,MAAM,CAAC,KAAa,KAAK,SAAS,OAAO,OAAO,EAAE,IAAI,UAAU,GAAG,MAAM,OAAO,QAAG,CAAC;AAAA,MAC1F,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC,IAAI,0BAA0B,CAAC,GAAG,UAAU;AAAA,MAClF,WAAW,OAAM;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AAAA,QACD,MAAM,SAAO,MAAM,SAAS,CAAC,IAAI,KAAI,KAAK,CAAC,GAAG,UAAU,CAAC,EAAE,QAAQ,QAAQ,aAAa;AAAA,QACxF,SAAO,MAAM,QAAQ,iBAAiB,WAAW,EAAE,CAAC,EAAE,QAAQ,QAAQ,OAAO;AAAA,MAC/E;AAAA,MACA,WAAW,OAAM,CAAC,iCAAiC,IAAI,KAAK,0BAA0B,CAAC,GAAG;AAAA,QACxF,UAAQ,MAAM,MAAM,SAAS,CAAC,IAAI,GAAE,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,KAAK,WAAW;AAAA,MAChF;AAAA,MACA,MAAM,SAAO,MAAM,SAAS,CAAC,IAAI,0BAA0B,CAAC,GAAG,UAAU,CAAC,EAAE,QAAQ,QAClF,qBACF;AAAA,MACA,MAAM,MAAM,SAAS,CAAC,IAAI,MAAM,UAAU,CAAC,GAAG,UAAU;AAAA,MACxD,UAAQ,MAAM,MAAM,SAAS,CAAC,IAAI,WAAW,UAAU,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,KAC/E,WACF;AAAA,KACD,CAAC;AAAA,IAEJ,OAAK,oEAAoE,YAAY;AAAA,MAEnF,IAAI,UAAU,MAAM,QAAQ,cAAc;AAAA,MAC1C,MAAM,SAAS,IAAI;AAAA,MACnB,IAAI;AAAA,QACF,MAAM,OAAO,IAAI,SAAS;AAAA,UACxB,IAAI;AAAA,UACJ,UAAU,CAAC;AAAA,UACX,UAAU,CAAC,OAAO;AAAA,UAClB,aAAa;AAAA,UACb;AAAA,UACA,SAAS,IAAI;AAAA,UACb,QAAQ,IAAI;AAAA,UACZ,aAAa,IAAI;AAAA,QACnB,CAAC;AAAA,QACD,MAAM,OAAO,eAAe,IAAI;AAAA,QAChC,MAAM,SAAS,MAAM,KAAK,SAAS,OAAO,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;AAAA,QAC3E,SAAO,OAAO,OAAO,EAAE,KAAK,SAAS;AAAA,QACrC,IAAI,QAAQ;AAAA,UAAQ,UAAU,MAAM,QAAQ,OAAO,OAAO;AAAA,QAC1D,UAAQ,MAAM,QAAQ,iBAAiB,QAAQ,EAAE,IAAI,QAAQ,EAAE,QAAQ;AAAA,UACrE,MAAM;AAAA,UACN,IAAI,KAAK,UAAU;AAAA,QACrB,CAAC;AAAA,QACD,UAAQ,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,QACpE,SAAO,MAAM,KAAK,OAAO,KAAK,CAAC,EAAE,cAAc;AAAA,UAC7C,EAAE,MAAM,6BAA6B,SAAS,EAAE,WAAW,OAAO,SAAS,UAAU,EAAE;AAAA,QACzF,CAAC;AAAA,gBACD;AAAA,QACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA,KAEnC;AAAA,IACD,OAAK,qEAAqE,MACxE,YAAY,OAAO,YAAY;AAAA,MAE7B,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,QAAQ,CAAC;AAAA,MAClD,MAAM,SAAS,MAAM,QAAQ,WAAW,EAAE,QAAQ,CAAC;AAAA,MACnD,MAAM,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAAA,MACpC,MAAM,OAAO,aAAa,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,OAAO,CAAC,CAAC;AAAA,MAC3E,MAAM,UAAU,MAAM,MAAM,OAAO,EAAE,iBAAiB,KAAK,CAAC;AAAA,MAC5D,MAAM,OAAO,OAAO,EAAE,iBAAiB,KAAK,CAAC;AAAA,MAC7C,UAAQ,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,OAAO,CAAC;AAAA,MACpF,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,QACvC;AAAA,QACA,0BAA0B,MAAM,QAAQ,iBAAiB,QAAQ,EAAE,IAAI;AAAA,MACzE,CAAC;AAAA,MACD,MAAM,QAAQ,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;AAAA,MACvC,MAAM,MAAM,SAAS,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAAA,MACnE,MAAM,SAAO,QAAQ,OAAO,EAAE,iBAAiB,KAAK,CAAC,CAAC,EAAE,QAAQ,QAAQ,YAAY;AAAA,MACpF,MAAM,QAAQ,MAAM;AAAA,MACpB,MAAM,cAAc,MAAM,QAAQ,WAAW,EAAE,QAAQ,CAAC;AAAA,MACxD,MAAM,YAAY,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAAA,MAC7E,MAAM,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AAAA,MACjC,UAAQ,MAAM,YAAY,OAAO,EAAE,iBAAiB,KAAK,CAAC,GAAG,OAAO,EAAE,KAAK,WAAW;AAAA,MACtF,UAAQ,MAAM,QAAQ,iBAAiB,QAAQ,EAAE,IAAI,SAAS,EAAE,IAAI,KAClE,QAAQ,SAAS,SACnB;AAAA,KACD,CAAC;AAAA,IAGJ,OAAK,yDAAyD,MAC5D,YAAY,OAAO,YAAY;AAAA,MAC7B,MAAM,QAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAAA,MAC/D,UAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,oBAAoB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAC5E,WACF;AAAA,MACA,UAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,mBAAmB,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,WAAW;AAAA,MACtF,MAAM,SACJ,MAAM,SAAS,CAAC,OAAO,KAAK,SAAS,OAAO,GAAG,OAAO,oBAAoB,UAAU,CAAC,CAAC,CACxF,EAAE,QAAQ,QAAQ,qBAAqB;AAAA,MACvC,UAAQ,MAAM,QAAQ,iBAAiB,QAAQ,EAAE,IAAI,SAAS,EAAE,KAC9D,MAAM,SAAS,SACjB;AAAA,MACA,SAAO,MAAM,KAAK,OAAO,CAAC,EAAE,aAAa,CAAC;AAAA,MAC1C,MAAM,MAAM,SAAS;AAAA,QACnB,OAAO,oBAAoB,QAAQ;AAAA,QACnC,OAAO,oBAAoB,OAAO;AAAA,MACpC,CAAC;AAAA,MACD,UAAQ,MAAM,KAAK,OAAO,GAAG,IAAI,IAAI,EAAE,KAAK,QAAQ;AAAA,MACpD,MAAM,SACJ,MAAM,SAAS,CAAC,OAAO,oBAAoB,GAAG,GAAG,OAAO,oBAAoB,GAAG,CAAC,CAAC,CACnF,EAAE,QAAQ,QAAQ,qBAAqB;AAAA,MACvC,UAAQ,MAAM,KAAK,OAAO,GAAG,IAAI,IAAI,EAAE,KAAK,QAAQ;AAAA,KACrD,CAAC;AAAA,IAEJ,OAAK,oEAAoE,MACvE,YAAY,OAAO,YAAY;AAAA,MAC7B,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,QAAQ,CAAC;AAAA,MACzD,MAAM,aAAa,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAAA,MAC3C,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAAA,MACnF,SAAO,OAAO,EAAE,cAAc,EAAE,SAAS,WAAW,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC;AAAA,MAC9E,MAAM,SAAO,aAAa,OAAO,CAAC,EAAE,QAAQ,QAAQ,YAAY;AAAA,MAChE,MAAM,aAAa,MAAM;AAAA,MACzB,UAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,WAAW;AAAA,MACpE,UACG,MAAM,MAAM,SAAS,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC,GAAG,OAC3E,EAAE,KAAK,WAAW;AAAA,MAClB,MAAM,SAAO,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,QAAQ,qBAAqB;AAAA,MAC/E,MAAM,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AAAA,MACjC,SAAO,MAAM,KAAK,OAAO,CAAC,EAAE,aAAa,CAAC;AAAA,MAC1C,UAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,KACrF,WACF;AAAA,MACA,MAAM,MAAM,SAAS,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;AAAA,MACpE,SAAO,MAAM,KAAK,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,KACvC,CAAC;AAAA,IAEJ,OAAK,6EAA6E,MAChF,YAAY,OAAO,YAAY;AAAA,MAC7B,MAAM,MAAM,SAAS;AAAA,QACnB,OAAO,OAAO,EAAE,IAAI,MAAM,UAAU,GAAG,MAAM,OAAO,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;AAAA,MAC/E,CAAC;AAAA,MACD,UAEI,MAAM,MAAM,SAAS;AAAA,QACnB,OAAO,OAAO,EAAE,IAAI,MAAM,UAAU,MAAM,MAAM,OAAO,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC;AAAA,MAClF,CAAC,GACD,OACJ,EAAE,KAAK,WAAW;AAAA,MAClB,MAAM,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAAA,MAChC,UAEI,MAAM,MAAM,SAAS;AAAA,QACnB,OAAO,OAAO,EAAE,IAAI,MAAM,UAAU,KAAK,MAAM,OAAO,SAAS,KAAK,CAAC;AAAA,MACvE,CAAC,GACD,OACJ,EAAE,KAAK,WAAW;AAAA,KACnB,CAAC;AAAA,IAEJ,OAAK,0EAA0E,MAC7E,YAAY,OAAO,YAAY;AAAA,MAC7B,WAAW,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,mBAAmB;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AAAA,QACD,MAAM,SACJ,MAAM,SAAS,CAAC,OAAO,OAAO,EAAE,IAAI,MAAM,UAAU,MAAM,MAAM,CAAC,CAAC,CAAC,CACrE,EAAE,QAAQ,QAAQ,UAAU;AAAA,MAC9B;AAAA,MACA,MAAM,SAAO,MAAM,SAAS,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,QAAQ,UAAU;AAAA,MACtF,MAAM,MAAM,SAAS,CAAC,OAAO,sBAAsB,GAAG,OAAO,qBAAqB,CAAC,CAAC;AAAA,MACpF,UAAQ,MAAM,KAAK,OAAO,GAAG,IAAI,UAAU,SAAS,CAAC,EAAE,KAAK,qBAAqB;AAAA,KAClF,CAAC;AAAA,IAEJ,OAAK,qEAAqE,MACxE,YAAY,OAAO,YAAY;AAAA,MAC7B,MAAM,aAAa,cAAc,8BAA8B;AAAA,QAC7D,QAAQ,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,WAAW,WAAW,GAAG,IAAI,QAAQ,QAAQ,CAAC;AAAA,QAChF,YAAY;AAAA,QACZ,YAAY;AAAA,MACd,CAAC;AAAA,MACD,MAAM,QAAQ,cAAc,UAAU;AAAA,MACtC,MAAM,MAAM,CAAC,SAAkB,OAAO,UAAU,OAAO,OAAO,EAAE,IAAI,MAAM,SAAS,KAAK,CAAC;AAAA,MACzF,MAAM,MAAM,SAAS,CAAC,IAAI,0BAA0B,CAAC,GAAG,UAAU;AAAA,MAClE,WAAW,WAAW;AAAA,QACpB;AAAA,QACA,IAAI,KAAK,0BAA0B;AAAA,MACrC,GAAG;AAAA,QACD,UAAQ,MAAM,MAAM,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,KAAK,WAAW;AAAA,MACrF;AAAA,MACA,WAAW,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,KAAK,OAAO,GAAG;AAAA,MACrB,GAAG;AAAA,QACD,MAAM,SAAO,MAAM,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE,QAAQ,QAAQ,UAAU;AAAA,MACrF;AAAA,MACA,MAAM,MACJ,SACA,CAAC,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,2BAA2B,CAAC,CAAC,GACtE,UACF;AAAA,MACA,UAAQ,MAAM,MAAM,SAAS,CAAC,IAAI,0BAA0B,CAAC,GAAG,UAAU,GAAG,OAAO,EAAE,KACpF,WACF;AAAA,KACD,CAAC;AAAA,IAEJ,OAAK,4EAA4E,MAC/E,YAAY,OAAO,YAAY;AAAA,MAC7B,UAAQ,MAAM,QAAQ,WAAW,QAAQ,EAAE,IAAI,UAAU,EAAE,KAAK,UAAU;AAAA,MAC1E,UACG,MAAM,QAAQ,aAAa,GAAG,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE,GAAG,UACzE,EAAE,KAAK,UAAU;AAAA,MACjB,QAAQ,YAAY,MAAM,gBAAgB;AAAA,MAC1C,MAAM,SAAO,QAAQ,cAAc,WAAW,CAAC,EAAE,QAAQ,QAAQ,WAAW;AAAA,MAC5E,MAAM,QAAQ,cAAc,KAAK,aAAa,IAAI,SAAS,CAAC;AAAA,MAC5D,MAAM,SAAO,QAAQ,cAAc,KAAK,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE,QAAQ,QACxE,WACF;AAAA,MACA,MAAM,SACJ,QAAQ,cAAc,KAAK,SAAS,IAAI,WAAW,YAAY,UAAU,CAAC,CAC5E,EAAE,QAAQ,QAAQ,YAAY;AAAA,MAC9B,MAAM,SACJ,QAAQ,cAAc,KAAK,SAAS,IAAI,WAAW,YAAY,OAAO,CAAC,CACzE,EAAE,QAAQ,QAAQ,YAAY;AAAA,MAC9B,MAAM,SAAO,QAAQ,WAAW,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,QAAQ,YAAY;AAAA,KAC3E,CAAC;AAAA,IAEJ,MAAM,SAAS,QAAQ;AAAA,IACvB,IAAI;AAAA,MACF,OAAK,uCAAuC,YAAY;AAAA,QACtD,IAAI,UAAU,MAAM,QAAQ,cAAc;AAAA,QAC1C,IAAI;AAAA,UACF,MAAM,QAAQ,cAAc,OAAO;AAAA,UACnC,MAAM,MAAM,SAAS;AAAA,YACnB,OAAO,GAAG,WAAW,SAAS;AAAA,YAC9B,OAAO,OAAO,EAAE,IAAI,KAAK,GAAG,EAAE,UAAU,EAAE,CAAC;AAAA,UAC7C,CAAC;AAAA,UACD,UAAU,MAAM,OAAO,OAAO;AAAA,UAC9B,UAAQ,MAAM,QAAQ,WAAW,QAAQ,EAAE,IAAI,UAAU,EAAE,KAAK,UAAU;AAAA,UAC1E,UAAQ,MAAM,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,SAAS,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,KACjF,WACF;AAAA,UACA,SAAO,MAAM,KAAK,OAAO,CAAC,EAAE,aAAa,CAAC;AAAA,UAC1C,MAAM,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;AAAA,UACjC,SAAO,MAAM,KAAK,OAAO,CAAC,EAAE,aAAa,CAAC;AAAA,kBAC1C;AAAA,UACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA,OAEnC;AAAA,GACJ;AAAA;;;ADxWH,IAAM,WAAW,cAAc,4BAA4B;AAAA,EACzD,QAAQ,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,UAAU,QAAQ,GAAG,IAAI,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAAA,EAChG,YAAY;AACd,CAAC;AAED,IAAM,YAAY,cAAc,8BAA8B;AAAA,EAC5D,QAAQ,CAAC,IAAI,aAAa,QAAQ,GAAG,IAAI,cAAc,QAAQ,GAAG,IAAI,eAAe,QAAQ,CAAC;AAAA,EAC9F,YAAY,CAAC,aAAa,YAAY;AACxC,CAAC;AAED,IAAM,UAAU,cAAc,2BAA2B;AAAA,EACvD,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC;AAC9B,CAAC;AAEM,SAAS,gCAA8D,CAC5E,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,WAAS,OAAO,MAAM;AAAA,IACpB,2BAA2B,OAAO;AAAA,IAClC,OAAK,uDAAuD,YAAY;AAAA,MACtE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QACpC,MAAM,SAAQ,MAAM,QAAQ,WAAW;AAAA,UACrC,SAAS;AAAA,UACT,UAAU,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,QAAQ;AAAA,UAC9D,QAAQ,CAAC,EAAE,WAAW,iBAAiB,WAAW,WAAW,CAAC;AAAA,QAChE,CAAC;AAAA,QAED,gBAAgB,OAAO,GAAG;AAAA,UACxB,MAAM,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK,CAAC;AAAA,UAC/D,MAAM,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,UAAU,CAAC;AAAA;AAAA,QAGtE,MAAM,OAAM,aAAa,QAAQ,CAAC;AAAA,QAClC,MAAM,SAAS,MAAM,OAAM,OAAO,EAAE,eAAe,0BAA0B,CAAC;AAAA,QAC9E,MAAM,UAAU,cAAc,MAAM;AAAA,QAEpC,SAAO,OAAO,EAAE,cAAc;AAAA,UAC5B,WAAW,SAAS;AAAA,UACpB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,UAAU,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,QAAQ;AAAA,UAC9D,QAAQ,CAAC,EAAE,WAAW,iBAAiB,WAAW,WAAW,CAAC;AAAA,QAChE,CAAC;AAAA,QACD,SAAO,QAAQ,eAAe,EAAE,cAAc;AAAA,QAC9C,MAAM,SAAO,YAAY,QAAQ,SAAS,EAAE,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,QAAQ;AAAA,UACvF,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,UAC1C,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,UAAU;AAAA,QACjD,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QACpC,MAAM,QAAO,MAAM,QAAQ,WAAW,EAAE,SAAS,UAAU,MAAM,WAAW,CAAC;AAAA,QAC7E,MAAM,MAAK,UAAU;AAAA,UACnB,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,UAC1C,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,QAC5C,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,MAAK,OAAO;AAAA,QAEjC,MAAM,SAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC5D,MAAM,OAAM,aAAa;AAAA,UACvB,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK,CAAC;AAAA,UAEzD,OAAO,OAAO,EAAE,IAAI,QAAQ,CAAC;AAAA,UAC7B,OAAO,OAAO,EAAE,IAAI,eAAe,QAAQ,QAAQ,MAAM,QAAQ,CAAC;AAAA,QACpE,CAAC;AAAA,QACD,MAAM,UAAU,cAAc,MAAM,OAAM,OAAO,CAAC;AAAA,QAElD,SAAO,QAAQ,eAAe,EAAE,KAAK,OAAO,SAAS;AAAA,QACrD,SAAO,QAAQ,IAAI,EAAE,KAAK,OAAO;AAAA,QACjC,MAAM,SAAO,YAAY,QAAQ,SAAS,EAAE,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,QAAQ;AAAA,UACvF,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,UAC1C,EAAE,IAAI,eAAe,QAAQ,QAAQ,MAAM,QAAQ;AAAA,QACrD,CAAC;AAAA,QACD,MAAM,SACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,SAAS,IAAI,WAAW,OAAO,UAAU,CAAC,CAAC,CACvF,EAAE,SAAS,QAAQ;AAAA,UACjB,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,UAC1C,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,QAC5C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,SAAS;AAAA,QACrC,MAAM,SAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,UAAU,CAAC;AAAA,QAC7D,MAAM,OAAM,aAAa;AAAA,UACvB,OAAO,OAAO,EAAE,WAAW,OAAO,YAAY,KAAK,aAAa,QAAQ,CAAC;AAAA,UACzE,OAAO,OAAO,EAAE,WAAW,KAAK,YAAY,OAAO,aAAa,YAAY,CAAC;AAAA,QAC/E,CAAC;AAAA,QACD,MAAM,OAAM,aAAa;AAAA,UACvB,OAAO,OAAO,EAAE,WAAW,OAAO,YAAY,IAAI,CAAC;AAAA,UACnD,OAAO,OAAO,EAAE,WAAW,OAAO,YAAY,KAAK,aAAa,QAAQ,CAAC;AAAA,QAC3E,CAAC;AAAA,QACD,cAAc,MAAM,OAAM,OAAO,CAAC;AAAA,QAElC,MAAM,SAAO,YAAY,QAAQ,SAAS,EAAE,WAAW,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,QAAQ;AAAA,UACxF,EAAE,WAAW,OAAO,YAAY,KAAK,aAAa,QAAQ;AAAA,UAC1D,EAAE,WAAW,KAAK,YAAY,OAAO,aAAa,YAAY;AAAA,QAChE,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QAEpC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC5D,SAAO,MAAM,MAAM,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,aAAa,SAAS,KAAK,CAAC;AAAA,QAE5E,MAAM,cAAc,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAClE,MAAM,YAAY,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC;AAAA,QACjE,SAAO,MAAM,YAAY,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,aAAa,SAAS,KAAK,CAAC;AAAA,QAClF,SAAO,MAAM,QAAQ,aAAa,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,QAE1D,MAAM,QAAO,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC3D,MAAM,MAAK,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QACpF,MAAM,cAAc,cAAc,MAAM,MAAK,OAAO,CAAC;AAAA,QAErD,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAChE,MAAM,UAAU,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QACzF,SAAO,MAAM,UAAU,OAAO,CAAC,EAAE,cAAc;AAAA,UAC7C,SAAS;AAAA,UACT,SAAS,EAAE,WAAW,YAAY,UAAU;AAAA,QAC9C,CAAC;AAAA,QAED,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAChE,MAAM,UAAU,aAAa;AAAA,UAC3B,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK,CAAC;AAAA,UACzD,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,OAAO,CAAC;AAAA,UAC7C,OAAO,OAAO,EAAE,IAAI,UAAU,CAAC;AAAA,QACjC,CAAC;AAAA,QACD,MAAM,aAAa,MAAM,UAAU,OAAO;AAAA,QAE1C,SAAO,UAAU,EAAE,cAAc,EAAE,SAAS,YAAY,CAAC;AAAA,QACzD,SAAO,WAAW,SAAS,SAAS,EAAE,KAAK,YAAY,SAAS;AAAA,QAChE,SAAO,MAAM,QAAQ,aAAa,SAAS,EAAE,CAAC,EAAE,aAAa,CAAC;AAAA,OAC/D;AAAA,KACF;AAAA,IAED,OAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QACpC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC5D,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAE5D,MAAM,MAAM,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC;AAAA,QACrF,MAAM,MAAM,OAAO;AAAA,QACnB,MAAM,MAAM,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,OAAO,CAAC,CAAC,CAAC;AAAA,QAEzE,MAAM,SAAO,MAAM,OAAO,CAAC,EAAE,QAAQ,QAAQ,gCAAgC;AAAA,QAC7E,MAAM,SAAO,YAAY,QAAQ,SAAS,EAAE,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,QAAQ;AAAA,UACvF,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,QAC5C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,2EAA2E,YAAY;AAAA,MAC1F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QACpC,MAAM,QAAO,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC3D,MAAM,MAAK,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,SAAS,QAAQ,OAAO,CAAC,CAAC,CAAC;AAAA,QACxE,MAAM,UAAU,cAAc,MAAM,MAAK,OAAO,CAAC;AAAA,QAEjD,MAAM,SACJ,QAAQ,WAAW,EAAE,SAAS,UAAU,yBAAyB,gBAAgB,CAAC,CACpF,EAAE,QAAQ,QAAQ,+BAA+B;AAAA,QAEjD,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,UACvC,SAAS;AAAA,UACT,yBAAyB,QAAQ;AAAA,QACnC,CAAC;AAAA,QACD,MAAM,QAAQ,MAAM;AAAA,OACrB;AAAA,KACF;AAAA,IAED,OAAK,oDAAoD,YAAY;AAAA,MAGnE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QACpC,MAAM,OAAO,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC3D,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC5D,MAAM,KAAK,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,YAAY,QAAQ,OAAO,CAAC,CAAC,CAAC;AAAA,QAC3E,MAAM,MAAM,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,aAAa,QAAQ,OAAO,CAAC,CAAC,CAAC;AAAA,QAE7E,MAAM,UAAU,MAAM,QAAQ,WAAW,CAAC,KAAK,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,QAExE,SAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,WAAW,CAAC,EAAE,aAAa,CAAC;AAAA,QAChF,SAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,UAAU,CAAC,EAAE,aAAa,CAAC;AAAA,QAC/E,SAAO,MAAM,QAAQ,aAAa,SAAS,EAAE,CAAC,EAAE,aAAa,CAAC;AAAA,QAC9D,SAAO,MAAM,YAAY,QAAQ,SAAS,EAAE,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC;AAAA,OACvF;AAAA,KACF;AAAA,IAED,OAAK,kDAAkD,YAAY;AAAA,MACjE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,OAAO;AAAA,QACnC,MAAM,SAAO,QAAQ,WAAW,EAAE,SAAS,QAAQ,CAAC,CAAC,EAAE,QAAQ,QAC7D,0BACF;AAAA,QAEA,MAAM,QAAQ,cAAc,QAAQ;AAAA,QACpC,MAAM,SAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC5D,MAAM,SAAO,OAAM,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,QACzE,kCACF;AAAA,QACA,MAAM,SAAO,OAAM,aAAa,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,QAC5D,iCACF;AAAA,QACA,MAAM,SACJ,OAAM,aAAa,CAAC,EAAE,MAAM,UAAU,KAAK,EAAE,IAAI,SAAS,OAAO,IAAI,EAAE,CAAC,CAAC,CAC3E,EAAE,QAAQ,QAAQ,wBAAwB;AAAA,QAC1C,MAAM,OAAM,MAAM;AAAA,OACnB;AAAA,KACF;AAAA,IAED,OAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QAEpC,MAAM,oBAAoB,MAAM,QAAQ,WAAW,EAAE,SAAS,UAAU,MAAM,WAAW,CAAC;AAAA,QAC1F,MAAM,SACJ,kBAAkB,UAAU;AAAA,UAC1B,EAAE,IAAI,SAAS,QAAQ,OAAO;AAAA,UAC9B,EAAE,IAAI,SAAS,QAAQ,OAAO;AAAA,QAChC,CAAC,CACH,EAAE,QAAQ,QAAQ,uBAAuB;AAAA,QACzC,MAAM,kBAAkB,MAAM;AAAA,QAE9B,MAAM,QAAO,MAAM,QAAQ,WAAW,EAAE,SAAS,UAAU,MAAM,WAAW,CAAC;AAAA,QAC7E,MAAM,MAAK,UAAU,CAAC,EAAE,IAAI,SAAS,QAAQ,OAAO,CAAC,CAAC;AAAA,QACtD,MAAM,MAAK,OAAO;AAAA,QAElB,MAAM,oBAAoB,MAAM,QAAQ,WAAW,EAAE,SAAS,UAAU,MAAM,SAAS,CAAC;AAAA,QACxF,MAAM,kBAAkB,UAAU,CAAC,EAAE,IAAI,SAAS,QAAQ,OAAO,CAAC,CAAC;AAAA,QACnE,MAAM,SAAO,kBAAkB,OAAO,CAAC,EAAE,QAAQ,QAAQ,uBAAuB;AAAA,OACjF;AAAA,KACF;AAAA,IAED,OAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ;AAAA,QACpC,MAAM,MAAM,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,QACtD,MAAM,SAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC5D,MAAM,OAAM,aAAa,CAAC,OAAO,OAAO,GAAG,CAAC,CAAC;AAAA,QAC7C,IAAI,SAAS;AAAA,QACb,cAAc,MAAM,OAAM,OAAO,CAAC;AAAA,QAClC,MAAM,OAAM,MAAM;AAAA,QAElB,MAAM,SAAO,OAAM,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,QAAQ,gBAAgB;AAAA,QACrE,MAAM,SAAO,YAAY,QAAQ,SAAS,EAAE,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,QAAQ;AAAA,UACvF,EAAE,IAAI,SAAS,QAAQ,QAAQ,MAAM,KAAK;AAAA,QAC5C,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,SAAS,SAAS,CAAC;AAAA,QAC9D,MAAM,QAAQ,aAAa,CAAC,OAAO,OAAO,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC;AAAA,QAC3D,MAAM,QAAQ,MAAM;AAAA,QACpB,MAAM,QAAQ,MAAM;AAAA,QACpB,SAAO,MAAM,QAAQ,aAAa,SAAS,EAAE,CAAC,EAAE,aAAa,CAAC;AAAA,OAC/D;AAAA,KACF;AAAA,GACF;AAAA;AAGH,SAAS,aAAa,CAAC,QAAkC;AAAA,EACvD,SAAO,OAAO,OAAO,EAAE,KAAK,SAAS;AAAA,EACrC,IAAI,OAAO,YAAY,WAAW;AAAA,IAChC,MAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAAA,EACA,OAAO,OAAO;AAAA;AAGhB,eAAe,WAAW,CAAC,OAAwD;AAAA,EACjF,MAAM,SAAuB,CAAC;AAAA,EAC9B,iBAAiB,OAAO,OAAM;AAAA,IAC5B,OAAO,KAAK,GAAG;AAAA,EACjB;AAAA,EACA,OAAO;AAAA;;AE/ST,qBAAS,sBAAU,kBAAQ;AA0B3B,IAAM,oBAAoB,cAAc,+BAA+B;AAAA,EACrE,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,gBAAgB,QAAQ,CAAC;AAAA,EAChE,aAAa;AACf,CAAC;AAED,IAAM,6BAA6B,cAAc,+BAA+B;AAAA,EAC9E,QAAQ,CAAC,IAAI,gBAAgB,QAAQ,GAAG,IAAI,WAAW,QAAQ,CAAC;AAAA,EAChE,aAAa;AACf,CAAC;AAED,IAAM,yBAAyB,cAAc,qCAAqC;AAAA,EAChF,QAAQ,CAAC,IAAI,YAAY,QAAQ,GAAG,IAAI,WAAW,QAAQ,GAAG,IAAI,gBAAgB,QAAQ,CAAC;AAAA,EAC3F,YAAY,CAAC,YAAY,SAAS;AAAA,EAClC,aAAa;AACf,CAAC;AAED,IAAM,gBAAe,cAAc,0BAA0B;AAAA,EAC3D,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,gBAAgB,QAAQ,CAAC;AAClE,CAAC;AAED,IAAM,uBAAuB,cAAc,mCAAmC;AAAA,EAC5E,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,IAAM,sBAAsB,cAAc,4BAA4B;AAAA,EACpE,QAAQ,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,UAAU,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,IAAM,iBAAiB,cAAc,4BAA4B;AAAA,EAC/D,QAAQ,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,cAAc,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,IAAM,aAAsB;AAAA,EAC1B,QAAQ,QAAQ,IAAI,OAAO,EAAE;AAAA,EAC7B,QAAQ,UAAU,IAAI,OAAO,EAAE;AAAA,EAC/B,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AACf;AAUO,SAAS,2BAAyD,CACvE,OACA,SACM;AAAA,EACN,MAAM,kBAAkB,QAAQ,mBAAmB;AAAA,EACnD,MAAM,mBAAmB,QAAQ,oBAAoB;AAAA,EAErD,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,WAAS,OAAO,MAAM;AAAA,IACpB,WAAS,uBAAuB,MAAM;AAAA,MACpC,OAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,SAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,SAAS;AAAA,UAEhE,MAAM,UAAU,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAC7D,MAAM,WAAW,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAE9D,SAAO,OAAO,EAAE,QAAQ,iBAAiB;AAAA,UACzC,SAAO,QAAQ,EAAE,QAAQ,iBAAiB;AAAA,UAC1C,SAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,UAChF,SAAO,MAAM,QAAQ,WAAW,iBAAiB,CAAC,EAAE,SAAS;AAAA,UAC7D,SAAO,MAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC;AAAA,UAChE,SAAO,MAAM,QAAQ,aAAa,kBAAkB,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SACpE;AAAA,OACF;AAAA,MAED,OAAK,sEAAsE,YAAY;AAAA,QAGrF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,UAAU,MAAM,QAAQ,cAAc,sBAAsB;AAAA,UAClE,MAAM,WAAW,MAAM,QAAQ,cAAc,sBAAsB;AAAA,UAEnE,SAAO,OAAO,EAAE,QAAQ,sBAAsB;AAAA,UAC9C,SAAO,QAAQ,EAAE,QAAQ,sBAAsB;AAAA,UAC/C,SAAO,MAAM,QAAQ,WAAW,uBAAuB,EAAE,CAAC,EAAE,QAC1D,sBACF;AAAA,UACA,SAAO,MAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,CAAC,sBAAsB,CAAC;AAAA,UACrE,SAAO,MAAM,QAAQ,aAAa,uBAAuB,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SACzE;AAAA,OACF;AAAA,MAED,OAAK,sDAAsD,YAAY;AAAA,QACrE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAC7C,MAAM,QAAQ,mCAAmC,CAAC,0BAA0B,CAAC;AAAA,UAE7E,SAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,UAChF,MAAM,SAAO,QAAQ,cAAc,0BAA0B,CAAC,EAAE,SAAS,QACvE,iBACF;AAAA,UACA,SAAO,MAAM,QAAQ,aAAa,kBAAkB,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SACpE;AAAA,OACF;AAAA,MAED,OAAK,0CAA0C,YAAY;AAAA,QACzD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,iBAAiB,cAAc,iCAAiC;AAAA,YACpE,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,aAAa,MAAM,CAAC;AAAA,UAC7D,CAAC;AAAA,UACD,MAAM,oBAAoB,cAAc,iCAAiC;AAAA,YACvE,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,aAAa,MAAM,CAAC;AAAA,YAC3D,aAAa,CAAC,WAAW;AAAA,YACzB,aAAa;AAAA,UACf,CAAC;AAAA,UAED,MAAM,QAAQ,cAAc,cAAc;AAAA,UAC1C,MAAM,QAAQ,mCAAmC,CAAC,iBAAiB,CAAC;AAAA,UAEpE,SAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,cAAc;AAAA,UAC1E,MAAM,SAAO,QAAQ,cAAc,iBAAiB,CAAC,EAAE,SAAS,QAAQ,iBAAiB;AAAA,UACzF,SAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,SAC9E;AAAA,OACF;AAAA,MAED,OAAK,kFAAkF,YAAY;AAAA,QACjG,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,iBAAiB,cAAc,kBAAkB,IAAI;AAAA,YACzD,QAAQ,CAAC,IAAI,WAAW,OAAO,GAAG,IAAI,gBAAgB,QAAQ,CAAC;AAAA,YAC/D,aAAa;AAAA,UACf,CAAC;AAAA,UAED,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAE7C,MAAM,SACJ,QAAQ,mCAAmC,CAAC,cAAc,CAAC,CAC7D,EAAE,QAAQ,QAAQ,gCAAgC;AAAA,UAClD,MAAM,SAAO,QAAQ,cAAc,cAAc,CAAC,EAAE,QAAQ,eAC1D,gBACF;AAAA,UACA,SAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,SACjF;AAAA,OACF;AAAA,MAED,OAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,iBAAiB,cAAc,yCAAyC;AAAA,YAC5E,QAAQ,CAAC,IAAI,aAAa,QAAQ,CAAC;AAAA,UACrC,CAAC;AAAA,UACD,MAAM,mBAAmB,cAAc,yCAAyC;AAAA,YAC9E,QAAQ,CAAC,IAAI,YAAY,UAAU,EAAE,UAAU,KAAK,CAAC,GAAG,IAAI,aAAa,QAAQ,CAAC;AAAA,UACpF,CAAC;AAAA,UACD,MAAM,gBAAgB,cAAc,yCAAyC;AAAA,YAC3E,QAAQ,CAAC,IAAI,aAAa,QAAQ,GAAG,IAAI,YAAY,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAAA,UACpF,CAAC;AAAA,UAED,MAAM,QAAQ,cAAc,cAAc;AAAA,UAE1C,IAAI,oBAAoB,UAAU;AAAA,YAChC,MAAM,SACJ,QAAQ,mCAAmC,CAAC,gBAAgB,CAAC,CAC/D,EAAE,QAAQ,QAAQ,qBAAqB;AAAA,YACvC,MAAM,SAAO,QAAQ,cAAc,gBAAgB,CAAC,EAAE,QAAQ,QAC5D,qBACF;AAAA,YACA,SAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,cAAc;AAAA,YAC1E;AAAA,UACF;AAAA,UAEA,MAAM,QAAQ,mCAAmC,CAAC,gBAAgB,CAAC;AAAA,UACnE,SAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,cAAc;AAAA,UAC1E,SAAO,MAAM,QAAQ,aAAa,eAAe,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,UAEhE,MAAM,SAAO,QAAQ,cAAc,gBAAgB,CAAC,EAAE,SAAS,QAAQ,aAAa;AAAA,UACpF,SAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,aAAa;AAAA,UAEzE,OAAO,iBAAiB,MAAM,QAAQ,aAAa,eAAe,EAAE;AAAA,UACpE,SAAO,aAAa,EAAE,cAAc;AAAA,YAClC,WAAW,eAAe;AAAA,YAC1B,MAAM;AAAA,YACN,QAAQ,cAAc;AAAA,UACxB,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,OAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,mCAAmC,CAAC,iBAAiB,CAAC;AAAA,UAEpE,SAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,SAAS;AAAA,UAChE,SAAO,MAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SAChD;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,iBAAiB,MAAM;AAAA,MAC9B,OAAK,mEAAmE,YAAY;AAAA,QAClF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UACxC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,MAAM,UAAU;AAAA,YACpB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,SAAS,MAAM,MAAM,OAAO;AAAA,UAClC,SAAO,OAAO,OAAO,EAAE,KAAK,SAAS;AAAA,UACrC,MAAM,UAAU;AAAA,UAEhB,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAE7C,MAAM,QAAQ,MAAM,QAAQ,wBAAwB;AAAA,YAClD,cAAa;AAAA,YACb,kBAAkB;AAAA,YAClB;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA,UAEnE,SAAO,KAAK,IAAI,cAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YAC9C,WAAW,cAAa;AAAA,YACxB,cAAc;AAAA,UAChB,CAAC;AAAA,UACD,SAAO,KAAK,IAAI,cAAa,EAAE,GAAG,aAAa,EAAE,cAAc;AAAA,YAC7D,WAAW,cAAa;AAAA,YACxB,WAAW,QAAQ;AAAA,YACnB,MAAM;AAAA,YACN,UAAU;AAAA,UACZ,CAAC;AAAA,UAGD,SAAO,KAAK,IAAI,kBAAkB,EAAE,CAAC,EAAE,QAAQ;AAAA,YAC7C,WAAW,kBAAkB;AAAA,YAC7B,cAAc;AAAA,YACd,eAAe;AAAA,UACjB,CAAC;AAAA,UAGD,SAAO,KAAK,IAAI,0BAA0B,CAAC,EAAE,QAAQ;AAAA,YACnD,WAAW;AAAA,YACX,cAAc;AAAA,YACd,eAAe;AAAA,UACjB,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,SAAO,MAAM,QAAQ,wBAAwB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC7D;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,oBAAoB,MAAM;AAAA,MACjC,OAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UACxC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,WAAW;AAAA,YACf,EAAE,SAAS,SAAS,cAAc,YAAY;AAAA,YAC9C,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,WAAW;AAAA,YAC7C,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,YAC1C,EAAE,SAAS,SAAS,cAAc,UAAU;AAAA,UAC9C;AAAA,UACA,MAAM,MAAM,UAAU,QAAQ;AAAA,UAC9B,MAAM,UAAU,MAAM,MAAM,OAAO;AAAA,UACnC,MAAM,SAAS,EAAE,WAAW,cAAa,IAAI,WAAW,QAAQ,UAAU;AAAA,UAE1E,MAAM,SAAO,aAAY,QAAQ,SAAS,MAAM,CAAC,CAAC,EAAE,SAAS,QAAQ,QAAQ;AAAA,UAC7E,MAAM,SAAO,aAAY,QAAQ,SAAS,MAAM,CAAC,CAAC,EAAE,SAAS,QAAQ,QAAQ;AAAA,UAC7E,WAAW,UAAU,CAAC,GAAG,GAAG,SAAS,QAAQ,SAAS,SAAS,CAAC,GAAG;AAAA,YACjE,MAAM,SAAO,aAAY,QAAQ,SAAS,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,QAC1E,SAAS,MAAM,MAAM,CACvB;AAAA,UACF;AAAA,UACA,MAAM,SACJ,aAAY,QAAQ,SAAS,KAAK,QAAQ,SAAS,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC,CACxF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,GAAG,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,SAChE;AAAA,OACF;AAAA,MAED,OAAK,uCAAuC,YAAY;AAAA,QACtD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,SAAO,QAAQ,WAAW,EAAE,SAAS,cAAa,CAAC,CAAC,EAAE,QAAQ,QAClE,iBACF;AAAA,SACD;AAAA,OACF;AAAA,MAED,OAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,gBAAgB,MAAM,QAAQ,WAAW;AAAA,YAC7C,SAAS;AAAA,YACT,MAAM;AAAA,YACN,UAAU,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,QAAQ;AAAA,UAChE,CAAC;AAAA,UACD,MAAM,cAAc,UAAU;AAAA,YAC5B,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,iBAAiB,MAAM,cAAc,OAAO,EAAE,eAAe,kBAAkB,CAAC;AAAA,UACtF,SAAO,eAAe,OAAO,EAAE,KAAK,SAAS;AAAA,UAC7C,MAAM,WAAW;AAAA,UAEjB,SAAO,QAAQ,EAAE,cAAc;AAAA,YAC7B,WAAW,cAAa;AAAA,YACxB,MAAM;AAAA,YACN,QAAQ,cAAa;AAAA,YACrB,UAAU,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,QAAQ;AAAA,YAC9D,UAAU;AAAA,UACZ,CAAC;AAAA,UACD,SAAO,SAAS,eAAe,EAAE,cAAc;AAAA,UAC/C,SAAO,MAAM,QAAQ,iBAAiB,cAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,SAAS;AAAA,UACtB,CAAC;AAAA,UACD,SAAO,MAAM,QAAQ,WAAW,cAAa,IAAI,SAAS,SAAS,CAAC,EAAE,cAAc;AAAA,YAClF,WAAW,cAAa;AAAA,YACxB,WAAW,SAAS;AAAA,YACpB,MAAM;AAAA,YACN,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,CAAC;AAAA,UAEjB,MAAM,cAAc,MAAM,QAAQ,WAAW;AAAA,YAC3C,SAAS;AAAA,YACT,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,WAAW,cAAa,IAAI,WAAW,SAAS,UAAU,CAAC;AAAA,UACxE,CAAC;AAAA,UACD,MAAM,YAAY,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,YAAY,CAAC,CAAC;AAAA,UAC7E,MAAM,eAAe,MAAM,YAAY,OAAO;AAAA,YAC5C,yBAAyB,SAAS;AAAA,UACpC,CAAC;AAAA,UACD,SAAO,aAAa,OAAO,EAAE,KAAK,SAAS;AAAA,UAC3C,MAAM,WAAW;AAAA,UAEjB,SAAO,QAAQ,EAAE,cAAc;AAAA,YAC7B,WAAW,cAAa;AAAA,YACxB,iBAAiB,SAAS;AAAA,YAC1B,MAAM;AAAA,YACN,QAAQ,cAAa;AAAA,YACrB,QAAQ,CAAC,EAAE,WAAW,cAAa,IAAI,WAAW,SAAS,UAAU,CAAC;AAAA,YACtE,UAAU;AAAA,UACZ,CAAC;AAAA,UACD,SAAO,MAAM,QAAQ,iBAAiB,cAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,SAAS;AAAA,UACtB,CAAC;AAAA,UAED,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,YAC1C,EAAE,SAAS,SAAS,cAAc,YAAY;AAAA,UAChD,CAAC;AAAA,UACD,MAAM,SACJ,aACE,QAAQ,SAAS,EAAE,WAAW,cAAa,IAAI,WAAW,SAAS,UAAU,CAAC,CAChF,CACF,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,SACJ,aACE,QAAQ,SAAS;AAAA,YACf,WAAW,cAAa;AAAA,YACxB,SAAS,CAAC,SAAS;AAAA,YACnB,OAAO;AAAA,UACT,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,GAAG,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UAC/D,MAAM,SACJ,aACE,QAAQ,SAAS;AAAA,YACf,WAAW,cAAa;AAAA,YACxB,SAAS,CAAC,SAAS;AAAA,YACnB,OAAO;AAAA,YACP,QAAQ;AAAA,UACV,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UACzC,MAAM,SACJ,aACE,QAAQ,SAAS;AAAA,YACf,WAAW,cAAa;AAAA,YACxB,SAAS,CAAC,SAAS;AAAA,YACnB,QAAQ;AAAA,UACV,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,GAAG,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UAE/D,UACG,MAAM,QAAQ,aAAa,cAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,SAAS,WAAW,SAAS,SAAS,CAAC;AAAA,UAClD,UACG,MAAM,QAAQ,aAAa,cAAa,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CACrF,EAAE,QAAQ,CAAC,SAAS,SAAS,CAAC;AAAA,UAC9B,SAAO,MAAM,QAAQ,aAAa,iBAAiB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,UAChE,SAAO,MAAM,QAAQ,iBAAiB,iBAAiB,CAAC,EAAE,SAAS;AAAA,UACnE,SAAO,MAAM,QAAQ,WAAW,cAAa,IAAI,gBAAgB,CAAC,EAAE,SAAS;AAAA,SAC9E;AAAA,OACF;AAAA,MAED,OAAK,6CAA6C,YAAY;AAAA,QAC5D,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,UAAU,MAAM,MAAM,OAAO;AAAA,UAEnC,SAAO,OAAO,EAAE,cAAc;AAAA,YAC5B,WAAW,cAAa;AAAA,YACxB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,UACD,SAAO,MAAM,QAAQ,iBAAiB,cAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,QAAQ;AAAA,UACrB,CAAC;AAAA,UACD,SAAO,MAAM,QAAQ,aAAa,cAAa,EAAE,CAAC,EAAE,aAAa,CAAC;AAAA,UAElE,MAAM,gBAAgB,MAAM,QAAQ,WAAW;AAAA,YAC7C,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,kBAAkB,MAAM,cAAc,OAAO;AAAA,UACnD,SAAO,gBAAgB,OAAO,EAAE,KAAK,WAAW;AAAA,UAChD,SAAO,gBAAgB,SAAS,EAAE,KAAK,QAAQ,SAAS;AAAA,UACxD,SAAO,MAAM,QAAQ,aAAa,cAAa,EAAE,CAAC,EAAE,aAAa,CAAC;AAAA,UAElE,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,SACtB;AAAA,OACF;AAAA,MAED,OAAK,iFAAiF,MACpF,YAAY,OAAO,YAAY;AAAA,QAG7B,MAAM,QAAQ,cAAc,aAAY;AAAA,QACxC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAa,CAAC;AAAA,QAChE,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAa,CAAC;AAAA,QAChE,MAAM,UAAU,MAAM,MAAM,OAAO,EAAE,yBAAyB,KAAK,CAAC;AAAA,QACpE,MAAM,SAAO,MAAM,OAAO,EAAE,yBAAyB,KAAK,CAAC,CAAC,EAAE,QAAQ,QACpE,YACF;AAAA,QACA,MAAM,MAAM,MAAM;AAAA,QAClB,MAAM,cAAc,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAa,CAAC;AAAA,QACtE,MAAM,YAAY,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,QACvE,MAAM,OAAO,MAAM,YAAY,OAAO,EAAE,yBAAyB,QAAQ,UAAU,CAAC;AAAA,QACpF,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAa,CAAC;AAAA,QACpE,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,QACrE,MAAM,SACJ,UAAU,OAAO,EAAE,yBAAyB,QAAQ,UAAU,CAAC,CACjE,EAAE,QAAQ,QAAQ,YAAY;AAAA,QAC9B,MAAM,UAAU,MAAM;AAAA,QACtB,UAAQ,MAAM,QAAQ,iBAAiB,cAAa,EAAE,IAAI,SAAS,EAAE,KAAK,KAAK,SAAS;AAAA,OACzF,CAAC;AAAA,MAEJ,OAAK,sEAAsE,MACzE,YAAY,OAAO,YAAY;AAAA,QAG7B,MAAM,QAAQ,cAAc,aAAY;AAAA,QACxC,MAAM,QAAQ,cAAc,iBAAiB;AAAA,QAC7C,MAAM,cAAc,MAAM,QAAQ,WAAW,EAAE,SAAS,kBAAkB,CAAC;AAAA,QAC3E,MAAM,UAAU,MAAM,YAAY,OAAO;AAAA,QACzC,MAAM,QAAO,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC;AAAA,QACvD,MAAM,OAAO,EAAE,WAAW,kBAAkB,IAAI,WAAW,QAAQ,UAAU;AAAA,QAC7E,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,QAChF,MAAM,MAAM,UAAU,KAAI;AAAA,QAC1B,MAAM,UAAU,MAAM,MAAM,OAAO,EAAE,yBAAyB,KAAK,CAAC;AAAA,QACpE,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,QAChF,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,QAAQ,CAAC,CAAC;AAAA,QACnE,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,SAAS,kBAAkB,CAAC;AAAA,QAC5E,MAAM,aAAa,UAAU,CAAC,EAAE,SAAS,UAAU,cAAc,UAAU,CAAC,CAAC;AAAA,QAC7E,MAAM,UAAU,MAAM,aAAa,OAAO;AAAA,QAC1C,MAAM,OAAO,EAAE,WAAW,kBAAkB,IAAI,WAAW,QAAQ,UAAU;AAAA,QAC7E,MAAM,SAAS,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,QACjF,MAAM,OAAO,UAAU,KAAI;AAAA,QAC3B,MAAM,QAAQ,MAAM,OAAO,OAAO,EAAE,yBAAyB,QAAQ,UAAU,CAAC;AAAA,QAChF,SAAO,KAAK,EAAE,cAAc,EAAE,SAAS,WAAW,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,QAClE,MAAM,SACJ,MAAM,OAAO,EAAE,yBAAyB,QAAQ,UAAU,CAAC,CAC7D,EAAE,QAAQ,QAAQ,YAAY;AAAA,QAC9B,MAAM,MAAM,MAAM;AAAA,QAClB,MAAM,OAAO,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,QAC/E,MAAM,KAAK,UAAU,KAAI;AAAA,QACzB,MAAM,YAAY,MAAM,KAAK,OAAO,EAAE,yBAAyB,MAAM,UAAU,CAAC;AAAA,QAChF,SAAO,SAAS,EAAE,cAAc,EAAE,SAAS,aAAa,WAAW,MAAM,UAAU,CAAC;AAAA,QACpF,SAAO,MAAM,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAI;AAAA,OACzF,CAAC;AAAA,MAEJ,OAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,SAAS,CAAC;AAAA,UAChF,MAAM,UAAU,MAAM,MAAM,OAAO;AAAA,UAEnC,SAAO,OAAO,EAAE,cAAc;AAAA,YAC5B,WAAW,cAAa;AAAA,YACxB,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,UACD,SAAO,QAAQ,eAAe,EAAE,cAAc;AAAA,UAC9C,SAAO,MAAM,QAAQ,iBAAiB,cAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,QAAQ;AAAA,UACrB,CAAC;AAAA,UACD,SAAO,MAAM,QAAQ,aAAa,cAAa,EAAE,CAAC,EAAE,aAAa,CAAC;AAAA,UAClE,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,SACtB;AAAA,OACF;AAAA,MAED,OAAK,mDAAmD,YAAY;AAAA,QAClE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,aAAa,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UACvF,MAAM,WAAW,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACtE,MAAM,eAAe,MAAM,WAAW,OAAO;AAAA,UAE7C,MAAM,mBAAmB,MAAM,QAAQ,WAAW;AAAA,YAChD,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,iBAAiB,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,UAAU,CAAC,CAAC;AAAA,UAChF,MAAM,qBAAqB,MAAM,iBAAiB,OAAO;AAAA,UAEzD,SAAO,mBAAmB,SAAS,EAAE,IAAI,KAAK,aAAa,SAAS;AAAA,UACpE,SAAO,mBAAmB,eAAe,EAAE,cAAc;AAAA,UACzD,SAAO,mBAAmB,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC1C,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,SAAS,cAAc,UAAU,CAAC,CAAC;AAAA,UAClE,MAAM,SACJ,aACE,QAAQ,SAAS,EAAE,WAAW,cAAa,IAAI,WAAW,aAAa,UAAU,CAAC,CACpF,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,SAC/D;AAAA,OACF;AAAA,MAED,OAAK,uEAAuE,YAAY;AAAA,QACtF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU;AAAA,YACxB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAC3C,SAAO,YAAY,OAAO,EAAE,KAAK,SAAS;AAAA,UAG1C,MAAM,iBAAiB,MAAM,QAAQ,WAAW;AAAA,YAC9C,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,eAAe,UAAU;AAAA,YAC7B,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,YAC1C,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,UAC1C,CAAC;AAAA,UACD,MAAM,mBAAmB,MAAM,eAAe,OAAO;AAAA,UAErD,SAAO,iBAAiB,OAAO,EAAE,KAAK,WAAW;AAAA,UACjD,SAAO,iBAAiB,SAAS,EAAE,KAAK,YAAY,SAAS;AAAA,UAC7D,UACG,MAAM,QAAQ,aAAa,cAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,YAAY,SAAS,CAAC;AAAA,UACjC,SAAO,MAAM,QAAQ,iBAAiB,cAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,YAAY;AAAA,UACzB,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,CAAC;AAAA,UAEjB,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UACzF,MAAM,aAAa,UAAU;AAAA,YAC3B,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,SAAS;AAAA,UAC7C,CAAC;AAAA,UACD,MAAM,iBAAiB,MAAM,aAAa,OAAO;AAAA,UAEjD,SAAO,eAAe,OAAO,EAAE,KAAK,SAAS;AAAA,UAC7C,SAAO,eAAe,SAAS,EAAE,IAAI,KAAK,YAAY,SAAS;AAAA,UAC/D,UACG,MAAM,QAAQ,aAAa,cAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,eAAe,WAAW,YAAY,SAAS,CAAC;AAAA,SAC5D;AAAA,OACF;AAAA,MAED,OAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UACxC,MAAM,OAAO,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,UACrD,MAAM,OAAO,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAEvD,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,UAC5C,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAE3C,MAAM,IAAI,MAAM,CAAC;AAAA,UAIjB,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UACzF,MAAM,aAAa,UAAU,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,UAC/C,MAAM,iBAAiB,MAAM,aAAa,OAAO;AAAA,UAEjD,SAAO,eAAe,OAAO,EAAE,KAAK,SAAS;AAAA,UAC7C,SAAO,eAAe,SAAS,EAAE,IAAI,KAAK,YAAY,SAAS;AAAA,SAChE;AAAA,OACF;AAAA,MAED,OAAK,wEAAwE,YAAY;AAAA,QACvF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,oBAAoB;AAAA,UAEhD,MAAM,YAAY,MAAM,QAAQ,WAAW;AAAA,YACzC,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,SAAS,MAAM,KAAK,CAAC,CAAC;AAAA,UAC5D,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAE3C,MAAM,eAAe,MAAM,QAAQ,WAAW;AAAA,YAC5C,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,aAAa,UAAU,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UACnD,MAAM,iBAAiB,MAAM,aAAa,OAAO;AAAA,UAEjD,SAAO,eAAe,OAAO,EAAE,KAAK,WAAW;AAAA,UAC/C,SAAO,eAAe,SAAS,EAAE,KAAK,YAAY,SAAS;AAAA,SAC5D;AAAA,OACF;AAAA,MAED,OAAK,8DAA8D,YAAY;AAAA,QAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACrE,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAE3C,MAAM,cAAc,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,SAAS,CAAC;AAAA,UACtF,MAAM,gBAAgB,MAAM,YAAY,OAAO;AAAA,UAE/C,SAAO,cAAc,OAAO,EAAE,KAAK,WAAW;AAAA,UAC9C,SAAO,cAAc,SAAS,EAAE,KAAK,YAAY,SAAS;AAAA,UAC1D,SAAO,cAAc,QAAQ,EAAE,KAAK,CAAC;AAAA,UACrC,UACG,MAAM,QAAQ,aAAa,cAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,YAAY,SAAS,CAAC;AAAA,UACjC,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,SAC/D;AAAA,OACF;AAAA,MAED,OAAK,kCAAkC,YAAY;AAAA,QACjD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACrE,MAAM,iBAAiB,MAAM,UAAU,OAAO;AAAA,UAE9C,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,SAAS,CAAC;AAAA,UACvF,MAAM,aAAa,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,QAAQ,CAAC,CAAC;AAAA,UAE1E,MAAM,iBAAiB,MAAM,QAAQ,WAAW;AAAA,YAC9C,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,eAAe,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,YAAY,CAAC,CAAC;AAAA,UAChF,MAAM,eAAe,OAAO,EAAE,yBAAyB,eAAe,UAAU,CAAC;AAAA,UAEjF,MAAM,SACJ,aAAa,OAAO,EAAE,yBAAyB,eAAe,UAAU,CAAC,CAC3E,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,UAC5C,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,YAAY;AAAA,UAChD,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,OAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACjE,MAAM,MAAM,MAAM;AAAA,UAClB,MAAM,MAAM,MAAM;AAAA,UAElB,SAAO,MAAM,QAAQ,iBAAiB,cAAa,EAAE,CAAC,EAAE,SAAS;AAAA,UACjE,SAAO,MAAM,QAAQ,aAAa,cAAa,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,UAC9D,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,cAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,QAAQ,QAAQ,4BAA4B;AAAA,SAC/C;AAAA,OACF;AAAA,MAED,OAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UAExC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACjE,MAAM,MAAM,OAAO;AAAA,UACnB,MAAM,MAAM,MAAM;AAAA,UAElB,MAAM,SAAO,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,QAAQ,gBAAgB;AAAA,SACnE;AAAA,OACF;AAAA,MAED,OAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,aAAY;AAAA,UACxC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,eAAc,MAAM,WAAW,CAAC;AAAA,UAElF,MAAM,SAAO,MAAM,UAAU,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,QAC5D,yBACF;AAAA,UACA,MAAM,SACJ,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,OAAO,YAAY,KAAK,CAAU,CAAC,CACxF,EAAE,QAAQ,QAAQ,gBAAgB;AAAA,UAClC,MAAM,MAAM,MAAM;AAAA,SACnB;AAAA,OACF;AAAA,MAED,OAAK,kEAAkE,YAAY;AAAA,QACjF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ,cAAc,mBAAmB;AAAA,UAE/C,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,qBAAqB,MAAM,WAAW,CAAC;AAAA,UACzF,MAAM,MAAM,UAAU;AAAA,YACpB,EAAE,IAAI,YAAY,QAAQ,MAAM;AAAA,YAChC,EAAE,IAAI,YAAY,QAAQ,KAAK;AAAA,UACjC,CAAC;AAAA,UACD,MAAM,MAAM,OAAO;AAAA,UAEnB,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,oBAAoB,GAAG,CAAC,CAAC,CACrE,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,IAAI,YAAY,QAAQ,MAAM;AAAA,YAChC,EAAE,IAAI,YAAY,QAAQ,KAAK;AAAA,UACjC,CAAC;AAAA,UACD,MAAM,SACJ,aACE,QAAQ,SAAS;AAAA,YACf,WAAW,oBAAoB;AAAA,YAC/B,SAAS,CAAC,QAAQ;AAAA,YAClB,OAAO;AAAA,UACT,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,SACvC;AAAA,OACF;AAAA,MAED,OAAK,kCAAkC,YAAY;AAAA,QACjD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,cAAc;AAAA,UAE1C,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,gBAAgB,MAAM,WAAW,CAAC;AAAA,UACpF,MAAM,MAAM,UAAU;AAAA,YACpB,EAAE,IAAI,SAAS,YAAY,WAAW;AAAA,YACtC,EAAE,IAAI,SAAS,YAAY,KAAK;AAAA,UAClC,CAAC;AAAA,UACD,MAAM,MAAM,OAAO;AAAA,UAEnB,MAAM,SACJ,aAAY,QAAQ,SAAS,EAAE,WAAW,eAAe,GAAG,CAAC,CAAC,CAChE,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,IAAI,SAAS,YAAY,WAAW;AAAA,YACtC,EAAE,IAAI,SAAS,YAAY,KAAK;AAAA,UAClC,CAAC;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,YAAW,CAAC,OAAwD;AAAA,EACjF,MAAM,SAAuB,CAAC;AAAA,EAC9B,iBAAiB,OAAO,OAAM;AAAA,IAC5B,OAAO,KAAK,GAAG;AAAA,EACjB;AAAA,EACA,OAAO;AAAA;;ACl0BT,qBAAS,sBAAU,kBAAQ;;;ACa3B,IAAM,aAAa;AAAA,EACjB,WAAW;AAAA,IACT,SAAS,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,IACpC,OAAO;AAAA,MACL,OAAO,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,MAClC,OAAO,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,IACpC;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,eAAe,CAAC;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,aAAa,CAAC;AAAA,IACd,aAAa,CAAC;AAAA,EAChB;AAAA,EACA,YAAY,EAAE,cAAc,CAAC,EAAE;AAAA,EAC/B,QAAQ,CAAC;AACX;AAEO,SAAS,kBAAkB,CAAC,IAAuC;AAAA,EACxE,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,WAAW;AAAA,MACX;AAAA,MACA,gBAAgB,WAAW;AAAA,MAC3B,aAAa,QAAQ;AAAA,MACrB,aAAa,sBAAsB;AAAA,MACnC,QAAQ,EAAE,MAAM,WAAW,WAAW,GAAG;AAAA,MACzC,kBAAkB;AAAA,MAClB,QAAQ,EAAE,MAAM,QAAQ,MAAM,UAAU,gBAAgB,EAAE;AAAA,MAC1D,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,MACR,YAAY,CAAC;AAAA,MACb,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAAA;AAGK,IAAM,wBAAwB;AAE9B,SAAS,kBAAkB,CAAC,UAAkB,aAAa,GAAG;AAAA,EACnE,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,aAAa;AAAA,IACb,UAAU,CAAC;AAAA,IACX,SAAS,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACpC;AAAA;AAGF,eAAsB,eAAe,CAAC,SAAkC,IAA2B;AAAA,EACjG,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,IACtC,MAAM,SAAS,mBAAmB,EAAE;AAAA,IACpC,MAAM,wBAAwB,IAAI,MAAM;AAAA,IACxC,MAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,MAAM,MAAM;AAAA,IAC/D,MAAM,GAAG,SAAS,iBAAiB,SAAS;AAAA,MAC1C;AAAA,MACA,cAAc,EAAE,mBAAmB,CAAC,GAAG,QAAQ,mBAAmB,EAAE,EAAE;AAAA,IACxE,CAAC;AAAA,GACF;AAAA;AAQH,eAAsB,iBAAiB,CACrC,SACA,IACA,UAII,CAAC,GACkC;AAAA,EACvC,MAAM,SAAS,mBAAmB,EAAE;AAAA,EACpC,MAAM,MAAM,EAAE,cAAc,kBAAkB,WAAW,QAAQ,aAAa,GAAG;AAAA,EACjF,MAAM,MAAM;AAAA,IACV;AAAA,IACA,YAAY,EAAE,MAAM,GAAG;AAAA,IACvB,SAAS;AAAA,IACT,WAAW,OAAO,OAAO;AAAA,IACzB,WAAW,OAAO,OAAO;AAAA,IACzB,cAAc;AAAA,EAChB;AAAA,EACA,MAAM,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,MAAe,EAAE;AAAA,EACpE,MAAM,QAAQ;AAAA,IACZ,eAAe;AAAA,IACf,WAAW,OAAO,OAAO;AAAA,IACzB,YAAY,OAAO,OAAO;AAAA,IAC1B,eAAe,wBAAwB;AAAA,IACvC,QAAQ,OAAO,OAAO;AAAA,IACtB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc,GAAG,IAAI,gBAAgB,IAAI;AAAA,IACzC,SAAS;AAAA,MACP,cAAc,IAAI;AAAA,MAClB,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,iBAAiB,CAAC;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM,UAAU,cAAc,OAAO,OAAO,WAAW,IAAI,CAAC;AAAA,EAC5D,MAAM,WAAyC;AAAA,OAC1C;AAAA,IACH,IAAI;AAAA,IACJ,eAAe;AAAA,EACjB;AAAA,EACA,MAAM,OAA6C;AAAA,IACjD;AAAA,MACE,MAAM;AAAA,MACN,WAAW,QAAQ;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,MAAM,EAAE,MAAM,iBAAiB,OAAO,WAAW;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,WAAW;AAAA,MACtB,eAAe;AAAA,MACf,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,IACtC,MAAM,wBAAwB,IAAI,MAAM;AAAA,IACxC,MAAM,mBAAmB,GAAG,SAAS;AAAA,IACrC,MAAM,UAAU,MAAM,iBAAiB,MAAM,MAAM;AAAA,IACnD,MAAM,iBAAiB,UAAU,EAAE,SAAS,SAAS,KAAK,CAAC;AAAA,IAE3D,MAAM,eAAe,CAAC;AAAA,IACtB,iBAAiB,QAAQ,iBAAiB,WAAW;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC,GAAG;AAAA,MACF,aAAa,KAAK,GAAG,KAAK,OAAO;AAAA,IACnC;AAAA,IACA,MAAM,gBAAgB,aAAa,QAAQ,CAAC,WAC1C,OAAO,SAAS,UAAU,OAAO,KAAK,SAAS,kBAAkB,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,CAC1F;AAAA,IACA,MAAM,iBAAiB,WAAW;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,WACF;AAAA,QACH,WAAW,KAAK,WAAW,WAAW,cAAc;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,IAED,MAAM,eAAe,CAAC;AAAA,IACtB,iBAAiB,QAAQ,iBAAiB,WAAW;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC,GAAG;AAAA,MACF,aAAa,KAAK,GAAG,KAAK,OAAO;AAAA,IACnC;AAAA,IACA,MAAM,iBAAiB,WAAW;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,WACF;AAAA,QACH,QAAQ,aAAa,IAAI,CAAC,WAAW;AAAA,UACnC,IAAI,OAAO,SAAS;AAAA,YAAS,MAAM,IAAI,MAAM,6BAA6B;AAAA,UAC1E,OAAO;AAAA,YACL;AAAA,YACA,aAAa,OAAO,OAAO;AAAA,YAC3B,WAAW,OAAO,OAAO;AAAA,UAC3B;AAAA,SACD;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACD,IAAI,CAAC,QAAQ,cAAc;AAAA,MACzB,MAAM,iBAAiB,SAAS;AAAA,QAC9B;AAAA,QACA,cAAc,EAAE,mBAAmB,CAAC,GAAG,QAAQ,mBAAmB,IAAI,CAAC,EAAE;AAAA,MAC3E,CAAC;AAAA,IACH;AAAA,IACA,IAAI,QAAQ;AAAA,MAAoB,MAAM,IAAI,MAAM,mBAAmB;AAAA,GACpE;AAAA,EAED,OAAO,EAAE,QAAQ;AAAA;AAGnB,eAAsB,uBAAuB,CAC3C,SACA,QACe;AAAA,EACf,IACE,MAAM,QAAQ,WAAW,QAAQ;AAAA,IAC/B,WAAW,OAAO,OAAO;AAAA,IACzB,IAAI,OAAO,OAAO;AAAA,EACpB,CAAC,GACD;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,WAAW,OAAO;AAAA,IAC9B,IAAI,OAAO,OAAO;AAAA,IAClB,WAAW,OAAO,OAAO;AAAA,IACzB,UAAU,EAAE,MAAM,WAAW,WAAW,oBAAoB,OAAO,OAAO,KAAK;AAAA,IAC/E,QAAQ,EAAE,MAAM,QAAQ,WAAW,oBAAoB,OAAO,OAAO,KAAK;AAAA,IAC1E,eAAe,wBAAwB,OAAO,OAAO;AAAA,IACrD,kBAAkB,EAAE,MAAM,WAAW;AAAA,EACvC,CAAC;AAAA;;;ADzLI,SAAS,sCAGf,CAAC,OAAe,SAAgF;AAAA,EAC/F,MAAM,aAAa,QAAQ,cAAc,CAAC,2BAA2B,iBAAiB,UAAU;AAAA,EAEhG,WAAS,OAAO,MAAM;AAAA,IACpB,WAAW,YAAY,YAAY;AAAA,MACjC,OAAK,4CAA4C,kBAAkB,YAAY;AAAA,QAC7E,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,QAC5C,IAAI;AAAA,UACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,UAC7B,MAAM,SAAS,MAAM,QAAQ,aAAa,OAAO;AAAA,UACjD,MAAM,WAAU,IAAI,MAAM,qBAAqB,UAAU;AAAA,UACzD,MAAM,QAAQ,cAAc,SAAS,UAAU,QAAO;AAAA,UACtD,MAAM,SAAO,kBAAkB,SAAS,WAAW,UAAU,CAAC,EAAE,QAAQ,QACtE,SAAQ,OACV;AAAA,UACA,MAAM,QAAQ,eAAe,OAAO;AAAA,UACpC,SAAO,MAAM,QAAQ,aAAa,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,kBAC1D;AAAA,UACA,MAAM,QAAQ,eAAe,OAAO;AAAA,UACpC,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,OAElC;AAAA,IACH;AAAA,GACD;AAAA;;AEhEH,mBAAS,kBAAQ;;;ACiBjB,eAAsB,6BAA6B,CACjD,YACA,OAQiB;AAAA,EACjB,MAAM,eAAc,MAAM,eAAe,6BAA6B,MAAM;AAAA,EAC5E,MAAM,WAAW,MAAM,WAAW,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,aAAY,CAAC;AAAA,EACzF,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,MAAM,YAAiC;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,EACf;AAAA,EACA,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA,IACnB;AAAA,IACA,eAAe,oBAAoB,MAAM;AAAA,IACzC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA,EACD,OAAO;AAAA;AAIT,eAAsB,sBAAsB,CAC1C,SACA,OAC8B;AAAA,EAC9B,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E,MAAM,eAAc,MAAM,8BAA8B,QAAQ,YAAY;AAAA,IAC1E,WAAW,MAAM;AAAA,IACjB,cAAc,MAAM,SAAS;AAAA,IAC7B,OAAO,MAAM;AAAA,IACb,WAAW,MAAM,SAAS,eAAe;AAAA,IACzC,kBAAkB,MAAM,SAAS,eAAe;AAAA,EAClD,CAAC;AAAA,EACD,OAAO,QAAQ,eAAe,MAAM,KAAK,OAAO,0BAAY,CAAC;AAAA;AAI/D,eAAsB,sBAAsB,CAC1C,SACA,OAC6B;AAAA,EAC7B,MAAM,iBAAiB,QAAQ;AAAA,EAC/B,IAAI,CAAC;AAAA,IAAgB,MAAM,IAAI,MAAM,yDAAyD;AAAA,EAC9F,QAAQ,cAAc,cAAc;AAAA,EACpC,MAAM,uBAAuB,SAAS,KAAK,WAAW,UAAU,UAAU,CAAC;AAAA,EAC3E,OAAO,eAAe,eAAe,KAAK;AAAA;AAI5C,eAAsB,sBAAsB,CAC1C,SACA,OAC6B;AAAA,EAC7B,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E,MAAM,WAAW,MAAM,QAAQ,eAAe,QAAQ;AAAA,IACpD,WAAW,MAAM;AAAA,IACjB,IAAI,MAAM;AAAA,EACZ,CAAC;AAAA,EACD,IAAI,CAAC,UAAU;AAAA,IACb,QAAQ,cAAc,cAAc;AAAA,IACpC,MAAM,uBAAuB,SAAS,KAAK,WAAW,UAAU,UAAU,CAAC;AAAA,EAC7E;AAAA,EACA,OAAO,QAAQ,eAAe,eAAe,KAAK;AAAA;;;AD3DpD,IAAM,UAAS,iBAAiB;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,IACzC,KAAK,eAAe,UAAU,EAAE,MAAM,YAAY,CAAC;AAAA,EACrD;AAAA,EACA,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,aAAa,MAAM,CAAC,GAAG,KAAK,KAAK,SAAS,EAAE,aAAa,OAAO,CAAC,CAAC;AAClG,CAAC;AAED,IAAM,UAAU,cAAc,4BAA4B;AAAA,EACxD,QAAQ;AAAA,IACN,IAAI,MAAM,QAAQ;AAAA,IAClB,IAAI,QAAQ,QAAQ;AAAA,IACpB,IAAI,aAAa,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,EAC/C;AACF,CAAC;AACD,IAAM,WAAW,cAAc,6BAA6B;AAAA,EAC1D,QAAQ,CAAC,IAAI,aAAa,QAAQ,GAAG,IAAI,MAAM,WAAW,GAAG,IAAI,SAAS,SAAS,CAAC;AACtF,CAAC;AACD,IAAM,cAAc,cAAc,iCAAiC;AAAA,EACjE,QAAQ,CAAC,IAAI,aAAa,QAAQ,GAAG,IAAI,aAAa,QAAQ,CAAC;AACjE,CAAC;AACD,IAAM,iBAAiB,iBAAiB;AAAA,EACtC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,IACzC,KAAK,SAAS,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,EAC5C;AACF,CAAC;AACD,IAAM,kBAAkB,cAAc,qCAAqC;AAAA,EACzE,QAAQ;AAAA,IACN,IAAI,MAAM,QAAQ;AAAA,IAClB,IAAI,QAAQ,QAAQ;AAAA,IACpB,IAAI,SAAS,QAAQ;AAAA,IACrB,IAAI,cAAc,WAAW;AAAA,EAC/B;AACF,CAAC;AACD,IAAM,mBAAmB,iBAAiB,4BAA4B,OAAM,EACzE,YAAY,OAAO,EACnB,WAAW,EAAE,IAAI,MAAM,MAAM,OAAO,CAAC,EACrC,UAAU;AAAA,EACT,QAAQ;AAAA,IACN,MAAM,QAAO,EAAE;AAAA,IACf,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACF,CAAC;AACH,IAAM,wBAAwB,iBAC5B,iCACA,QAAO,EAAE,WACX,EACG,YAAY,QAAQ,EACpB,OAAO,EAAE,UAAU,aAAa,IAAI,MAAM,OAAO,QAAQ,CAAC;AAC7D,IAAM,wBAAwB,iBAAiB,iCAAiC,QAAO,EAAE,KAAK,EAC3F,YAAY,WAAW,EACvB,YAAY,WAAW,EACvB,YAAY,WAAW;AAC1B,IAAM,2BAA2B,iBAC/B,qCACA,cACF,EACG,YAAY,eAAe,EAC3B,WAAW,EAAE,IAAI,MAAM,MAAM,QAAQ,OAAO,QAAQ,CAAC,EACrD,iBAAiB,EAAE,UAAU,cAAc,iBAAiB,aAAa,CAAC;AAE7E,IAAM,YAAW,IAAI,iBAAiB,EAAE,SAAS,CAAC,SAAQ,cAAc,EAAE,CAAC;AAC3E,IAAM,cAAc,IAAI,mBAAmB;AAAA,EACzC,aAAa;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,EACA,cAAc,IAAI,IAA+B;AAAA,IAC/C,CAAC,QAAQ,IAAI,OAAO;AAAA,IACpB,CAAC,SAAS,IAAI,QAAQ;AAAA,IACtB,CAAC,YAAY,IAAI,WAAW;AAAA,IAC5B,CAAC,gBAAgB,IAAI,eAAe;AAAA,EACtC,CAAC;AACH,CAAC;AAEM,SAAS,mCAA6D,CAC3E,MACA,UACM;AAAA,EACN,OAAK,GAAG,uEAAuE,YAAY;AAAA,IACzF,MAAM,iBAAiB,MAAM,SAAS,cAAc;AAAA,IACpD,MAAM,UAAU,uBAAuB,cAAc;AAAA,IACrD,IAAI,yBAAyB;AAAA,IAC7B,MAAM,eAAe,2BAA2B;AAAA,MAC9C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ,UAAU,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe,EAAE;AAAA,QACnE,OAAO,MAAM,IAAI,KAAK,0BAA0B;AAAA,QAChD,mBAAmB,MAAM,8BAA8B,EAAE;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,IACD,IAAI;AAAA,MACF,MAAM,eAAe;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MACA,MAAM,iBAAiB,MAAM,MAAM,SAAS;AAAA,QAC1C,OAAO;AAAA,QACP,cAAc,iBAAiB;AAAA,QAC/B,UAAU;AAAA,QACV,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,oBAAoB,MAAM,uBAC9B,cACA,SACA,iBAAiB,IACjB,gBACF;AAAA,MACA,MAAM,QAAQ,MAAM,kBAAkB,YAAY,QAAQ;AAAA,QACxD,QAAQ,EAAE,cAAc,iBAAiB,GAAG;AAAA,QAC5C,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,SAAS,QAAQ,CAAC,YAAY,OAAO,OAAO,KAAK,GAAG,YAAY,OAAO,KAAK,CAAC,CAAC;AAAA,MAChF,CAAC;AAAA,MACD,SAAO,MAAM,MAAM,EAAE,cAAc,EAAE,gBAAgB,GAAG,cAAc,EAAE,CAAC;AAAA,MACzE,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,QACnC,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,WAAW;AAAA,MACb,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,OAAO,MAAM,MAAM,GAAG,cAAc,MAAM,SAAS,CAAC;AAAA,MAExF,MAAM,gBAAgB;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MACA,MAAM,kBAAkB,MAAM,MAAM,SAAS;AAAA,QAC3C,OAAO;AAAA,QACP,cAAc,iBAAiB;AAAA,QAC/B,UAAU;AAAA,QACV,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,qBAAqB,MAAM,uBAC/B,cACA,SACA,iBAAiB,IACjB,gBACF;AAAA,MACA,MAAM,SAAS,MAAM,mBAAmB,YAAY,QAAQ;AAAA,QAC1D,QAAQ,EAAE,cAAc,iBAAiB,GAAG;AAAA,QAC5C,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,SAAS,QAAQ,CAAC,YAAY,OAAO,aAAa,CAAC,CAAC;AAAA,MACtD,CAAC;AAAA,MACD,SAAO,OAAO,MAAM,EAAE,cAAc;AAAA,QAClC,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,QACnC,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,WAAW;AAAA,MACb,CAAC,CACH,EAAE,SAAS;AAAA,MAEX,MAAM,0BAA0B,QAAQ,YAAY;AAAA,QAClD,WAAW;AAAA,QACX,UAAU;AAAA,QACV,OAAO;AAAA,MACT,CAAC;AAAA,MACD,MAAM,4BAA4B,MAAM,sBAAsB,cAAc,SAAS;AAAA,QACnF,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,MACT,CAAC;AAAA,MACD,MAAM,SACJ,0BAA0B,MAAM,OAAO;AAAA,QACrC,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,UAAU,gBAAgB,OAAO,qBAAqB;AAAA,QAChF,YAAY;AAAA,UACV;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,YACjD,KAAK,EAAE,MAAM,mBAAmB;AAAA,YAChC,OAAO,CAAC;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAAA,QACF;AAAA,QACA,iBAAiB,CAAC;AAAA,QAClB,eAAe,CAAC;AAAA,QAChB,oBAAoB,CAAC;AAAA,MACvB,CAAC,CACH,EAAE,QAAQ,QAAQ,oBAAoB;AAAA,MAEtC,MAAM,mBAAmB,SAAS;AAAA,QAChC,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,QACrE,QAAQ,CAAC;AAAA,QACT,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,QAAQ,WAAW,MAAM;AAAA,QAC7B,IAAI;AAAA,QACJ,WAAW;AAAA,MACb,CAAC;AAAA,MACD,MAAM,qBAAqB,MAAM,sBAAsB,cAAc,SAAS;AAAA,QAC5E,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,MACT,CAAC;AAAA,MACD,MAAM,eAAe,MAAM,mBAAmB,MAAM,OAAO;AAAA,QACzD,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,UAAU,gBAAgB,OAAO,aAAa;AAAA,QACxE,YAAY;AAAA,UACV;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,YACjD,KAAK,EAAE,MAAM,eAAe;AAAA,YAC5B,OAAO,CAAC;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAAA,QACF;AAAA,QACA,iBAAiB,CAAC;AAAA,QAClB,eAAe,CAAC;AAAA,QAChB,oBAAoB,CAAC;AAAA,MACvB,CAAC;AAAA,MACD,SACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,QACzC,WAAW;AAAA,QACX,QAAQ,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,MACtD,CAAC,CACH,EAAE,cAAc,EAAE,IAAI,aAAa,SAAS,CAAC;AAAA,MAE7C,MAAM,mBAAmB;AAAA,QACvB,WAAW,SAAS;AAAA,QACpB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MACA,MAAM,8BAA8B,QAAQ,YAAY;AAAA,QACtD,WAAW;AAAA,QACX,cAAc,sBAAsB;AAAA,QACpC,OAAO;AAAA,QACP,WAAW,SAAS;AAAA,QACpB,kBAAkB;AAAA,MACpB,CAAC;AAAA,MACD,MAAM,+BAA+B,MAAM,sBAAsB,cAAc,SAAS;AAAA,QACtF,MAAM;AAAA,QACN,IAAI,sBAAsB;AAAA,QAC1B,OAAO;AAAA,MACT,CAAC;AAAA,MACD,MAAM,SACJ,6BAA6B,UAAU,OAAO;AAAA,QAC5C,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY,EAAE,cAAc,sBAAsB,GAAG;AAAA,UACrD,gBAAgB;AAAA,YACd,WAAW,SAAS;AAAA,YACpB,WAAW;AAAA,YACX,WAAW;AAAA,UACb;AAAA,UACA,WAAW;AAAA,YACT,iBAAiB;AAAA,YACjB,gBAAgB;AAAA,UAClB;AAAA,UACA,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,YACE,QAAQ;AAAA,cACN,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,cACpD,YAAY;AAAA,YACd;AAAA,YACA,OAAO;AAAA,YACP,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF,CAAC,CACH,EAAE,QAAQ,QAAQ,uBAAuB;AAAA,MAEzC,MAAM,qBAAqB,MAAM,MAAM,SAAS;AAAA,QAC9C,OAAO;AAAA,QACP,cAAc,sBAAsB;AAAA,QACpC,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,wBAAwB,MAAM,uBAClC,cACA,SACA,sBAAsB,IACtB,cACF;AAAA,MACA,MAAM,YAAY,MAAM,sBAAsB,UAAU,OAAO;AAAA,QAC7D,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY,EAAE,cAAc,sBAAsB,GAAG;AAAA,UACrD,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,YACE,QAAQ;AAAA,cACN,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,cACpD,YAAY;AAAA,YACd;AAAA,YACA,OAAO;AAAA,YACP,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,SAAO,SAAS,EAAE,cAAc,EAAE,eAAe,GAAG,sBAAsB,EAAE,CAAC;AAAA,MAC7E,SACE,MAAM,QAAQ,WAAW,UAAU;AAAA,QACjC,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,UAAU;AAAA,QACV,YAAY;AAAA,MACd,CAAC,CACH,EAAE,cAAc,EAAE,OAAO,MAAM,cAAc,UAAU,SAAS,CAAC;AAAA,cACjE;AAAA,MACA,MAAM,SAAS,UAAU,cAAc;AAAA;AAAA,GAE1C;AAAA,EAED,OAAK,GAAG,gDAAgD,YAAY;AAAA,IAClE,MAAM,iBAAiB,MAAM,SAAS,cAAc;AAAA,IACpD,MAAM,UAAU,uBAAuB,cAAc;AAAA,IACrD,IAAI,yBAAyB;AAAA,IAC7B,IAAI,MAAM,IAAI,KAAK,0BAA0B;AAAA,IAC7C,MAAM,eAAe,2BAA2B;AAAA,MAC9C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ,UAAU,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe,EAAE;AAAA,QACnE,OAAO,MAAM;AAAA,QACb,mBAAmB,MAAM,+BAA+B,EAAE;AAAA,MAC5D;AAAA,IACF,CAAC;AAAA,IACD,MAAM,sBAAsB,aAAa,UAAU,aAAa,CAAC;AAAA,IACjE,MAAM,MAAM,EAAE,cAAc,eAAe,IAAI,WAAW,MAAM;AAAA,IAChE,MAAM,UAAU,OACd,WACA,iBACA,OACA,UACG;AAAA,MACH,MAAM,iBAAiB;AAAA,QACrB,WAAW,gBAAgB;AAAA,QAC3B;AAAA,QACA,WAAW;AAAA,MACb;AAAA,MACA,MAAM,aAAY,MAAM,MAAM,SAAS;AAAA,QACrC,OAAO,YAAY;AAAA,QACnB,cAAc,yBAAyB;AAAA,QACvC,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,MACD,MAAM,+BAA+B,MAAM,uBACzC,cACA,SACA,yBAAyB,IACzB,YAAY,WACd;AAAA,MACA,MAAM,6BAA6B,YAAY,QAAQ;AAAA,QACrD,QAAQ,EAAE,cAAc,yBAAyB,GAAG;AAAA,QACpD;AAAA,QACA;AAAA,QACA,SAAS,QAAQ;AAAA,UACf;AAAA,YACE,MAAM,EAAE,MAAM,UAAU,IAAI;AAAA,YAC5B,YAAY,CAAC,EAAE,MAAM,UAAU,KAAK,YAAY,EAAE,aAAM,MAAM,GAAG,gBAAgB,CAAC;AAAA,UACpF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA;AAAA,IAEH,MAAM,OAAO,CAAC,WAAmB,YAA8B,UAC7D,oBAAoB,MAAM,OAAO;AAAA,MAC/B,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,WAAW,UAAU;AAAA,MACrC,YAAY;AAAA,QACV;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,KAAK,GAAG,aAAa,MAAM;AAAA,UAC3B,OAAO,CAAC;AAAA,UACR,OAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA,MACA,iBAAiB,CAAC;AAAA,MAClB,eAAe,CAAC;AAAA,MAChB,oBAAoB,CAAC;AAAA,IACvB,CAAC;AAAA,IAEH,IAAI;AAAA,MACF,MAAM,QAAQ,MAAM,4BAA4B,YAAY,aAAa;AAAA,MAEzE,MAAM,IAAI,KAAK,0BAA0B;AAAA,MACzC,MAAM,KAAK,iBAAiB,QAAQ,UAAU;AAAA,MAC9C,MAAM,IAAI,KAAK,0BAA0B;AAAA,MACzC,MAAM,KAAK,kBAAkB,SAAS,eAAe;AAAA,MAErD,MAAM,QAAQ,MAAM,4BAA4B,YAAY,gBAAgB;AAAA,MAC5E,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,QACnC,WAAW;AAAA,QACX,cAAc,eAAe;AAAA,QAC7B,WAAW;AAAA,MACb,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,OAAO,MAAM,YAAY,OAAO,gBAAgB,EAAE,CAAC;AAAA,cACvF;AAAA,MACA,MAAM,SAAS,UAAU,cAAc;AAAA;AAAA,GAE1C;AAAA,EAED,OAAK,GAAG,yDAAyD,YAAY;AAAA,IAC3E,MAAM,iBAAiB,MAAM,SAAS,cAAc;AAAA,IACpD,MAAM,UAAU,uBAAuB,cAAc;AAAA,IACrD,IAAI,yBAAyB;AAAA,IAC7B,MAAM,eAAe,2BAA2B;AAAA,MAC9C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ,UAAU,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe,EAAE;AAAA,QACnE,OAAO,MAAM,IAAI,KAAK,0BAA0B;AAAA,QAChD,mBAAmB,MAAM,4BAA4B,EAAE;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,IACD,MAAM,sBAAsB,aAAa,UAAU,aAAa,CAAC;AAAA,IACjE,MAAM,UAAU,CAAC,cAAsB;AAAA,MACrC,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,WAAW;AAAA,MACzD,QAAQ;AAAA,MACR,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,SAAS;AAAA,IACzD;AAAA,IACA,MAAM,UAAU,OAAO,WAAmB,aAAqB;AAAA,MAC7D,MAAM,iBAAiB;AAAA,QACrB,WAAW,QAAQ;AAAA,QACnB;AAAA,QACA,WAAW,YAAY,UAAU,MAAM,CAAC;AAAA,MAC1C;AAAA,MACA,MAAM,aAAY,MAAM,MAAM,SAAS;AAAA,QACrC,OAAO,SAAS;AAAA,QAChB,cAAc,iBAAiB;AAAA,QAC/B,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,MACD,MAAM,+BAA+B,MAAM,uBACzC,cACA,SACA,iBAAiB,IACjB,SAAS,WACX;AAAA,MACA,MAAM,6BAA6B,YAAY,QAAQ;AAAA,QACrD,QAAQ,EAAE,cAAc,iBAAiB,GAAG;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,SAAS,QAAQ;AAAA,UACf,YAAY,YAAY,YAAY,QAAQ;AAAA,UAC5C,YAAY,YAAY,UAAU;AAAA,UAClC,YAAY,cAAc,YAAY;AAAA,QACxC,CAAC;AAAA,MACH,CAAC;AAAA;AAAA,IAEH,MAAM,OAAO,CAAC,WAAmB,cAC/B,oBAAoB,MAAM,OAAO;AAAA,MAC/B,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,WAAW,UAAU;AAAA,MACrC,YAAY,CAAC,SAAS;AAAA,MACtB,iBAAiB,CAAC;AAAA,MAClB,eAAe,CAAC;AAAA,MAChB,oBAAoB,CAAC;AAAA,IACvB,CAAC;AAAA,IACH,MAAM,UAAU,aAEZ,MAAM,QAAQ,QAAQ,UAAU;AAAA,MAC9B,WAAW;AAAA,MACX,cAAc,QAAO;AAAA,MACrB,UAAU;AAAA,IACZ,CAAC,GACD,IAAI,CAAC,QAAQ,IAAI,QAAQ;AAAA,IAE7B,IAAI;AAAA,MACF,MAAM,QAAQ,MAAM,UAAU;AAAA,MAC9B,MAAM,KAAK,aAAa;AAAA,QACtB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,KAAK,QAAQ,UAAU;AAAA,MACzB,CAAC;AAAA,MAED,MAAM,QAAQ,MAAM,YAAY;AAAA,MAChC,SAAO,MAAM,QAAQ,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,MAE5C,MAAM,KAAK,eAAe;AAAA,QACxB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,KAAK,QAAQ,UAAU;AAAA,MACzB,CAAC;AAAA,MACD,SAAO,MAAM,QAAQ,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,MAE9C,MAAM,KAAK,eAAe;AAAA,QACxB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,KAAK,QAAQ,YAAY;AAAA,MAC3B,CAAC;AAAA,MACD,MAAM,QAAQ,MAAM,UAAU;AAAA,MAC9B,SAAO,MAAM,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,MAElC,MAAM,KAAK,qBAAqB;AAAA,QAC9B,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,KAAK,QAAQ,YAAY;AAAA,MAC3B,CAAC;AAAA,MACD,SAAO,MAAM,QAAQ,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,cAC5C;AAAA,MACA,MAAM,SAAS,UAAU,cAAc;AAAA;AAAA,GAE1C;AAAA,EAED,OAAK,GAAG,qEAAqE,YAAY;AAAA,IACvF,MAAM,iBAAiB,MAAM,SAAS,cAAc;AAAA,IACpD,MAAM,UAAU,uBAAuB,cAAc;AAAA,IACrD,IAAI,yBAAyB;AAAA,IAC7B,MAAM,eAAe,2BAA2B;AAAA,MAC9C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ,UAAU,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe,EAAE;AAAA,QACnE,OAAO,MAAM,IAAI,KAAK,0BAA0B;AAAA,QAChD,mBAAmB,MAAM,iCAAiC,EAAE;AAAA,MAC9D;AAAA,IACF,CAAC;AAAA,IACD,MAAM,sBAAsB,aAAa,UAAU,aAAa,CAAC;AAAA,IACjE,MAAM,SAAS,EAAE,cAAc,QAAO,IAAI,WAAW,SAAS;AAAA,IAC9D,MAAM,QAAO,CAAC,eAAuB,EAAE,cAAc,QAAO,IAAI,UAAU;AAAA,IAC1E,MAAM,UAAU,CAAC,cAAsB;AAAA,MACrC;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ,MAAK,QAAQ;AAAA,IACvB;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,oBAAoB,MAAM,OAAO;AAAA,QACrC,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,WAAW,WAAW,uBAAuB;AAAA,QAC7D,YAAY,CAAC,UAAU,UAAU,UAAU,QAAQ,EAAE,IAAI,CAAC,eAAe;AAAA,UACvE,IAAI,UAAU;AAAA,UACd,MAAM;AAAA,UACN,KAAK,MAAK,SAAS;AAAA,UACnB,YAAY,EAAE,MAAM,UAAU;AAAA,QAChC,EAAE;AAAA,QACF,iBAAiB,CAAC;AAAA,QAClB,eAAe,CAAC;AAAA,QAChB,oBAAoB,CAAC;AAAA,MACvB,CAAC;AAAA,MAED,MAAM,iBAAiB;AAAA,QACrB,WAAW,YAAY;AAAA,QACvB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MACA,MAAM,aAAY,MAAM,MAAM,SAAS;AAAA,QACrC,OAAO;AAAA,QACP,cAAc,sBAAsB;AAAA,QACpC,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,MACD,MAAM,iBAAiB,CAAC,QAAQ,QAAQ,GAAG,QAAQ,QAAQ,CAAC;AAAA,MAC5D,OACE,MAAM,uBACJ,cACA,SACA,sBAAsB,IACtB,eACF,GACA,YAAY,QAAQ;AAAA,QACpB,QAAQ,EAAE,cAAc,sBAAsB,GAAG;AAAA,QACjD;AAAA,QACA;AAAA,QACA,SAAS,QACP,eAAe,IAAI,CAAC,SAAS;AAAA,UAC3B,MAAM,EAAE,MAAM,QAAQ,IAAI;AAAA,UAC1B,YAAY,CAAC,EAAE,MAAM,QAAQ,IAAI,CAAC;AAAA,QACpC,EAAE,CACJ;AAAA,MACF,CAAC;AAAA,MAED,MAAM,gBAAgB,MAAM,QAAQ,QAAQ,UAAU;AAAA,QACpD,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,UAAU,OAAO;AAAA,QACjB,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,MAAM,cAAc,2BAClB,cAAc,IAAI,CAAC,QAAQ;AAAA,QACzB,IAAI,IAAI,iBAAiB,WAAW;AAAA,UAClC,MAAM,IAAI,MAAM,6DAA6D;AAAA,QAC/E;AAAA,QACA,OAAO;AAAA,UACL,KAAK,QAAQ,IAAI,QAAQ;AAAA,UACzB,WAAW,IAAI,UAAU,YAAY;AAAA,UACrC,WAAW,IAAI,UAAU,YAAY;AAAA,UACrC,cAAc,IAAI;AAAA,QACpB;AAAA,OACD,CACH;AAAA,MACA,MAAM,oBAAoB,OAAO,OAAe,UAAiB;AAAA,QAC/D,MAAM,mBAAmB,SAAS;AAAA,UAChC,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,UAAU;AAAA,UACV,SAAS,EAAE,MAAM,UAAU,cAAc,QAAO,IAAI,WAAW,OAAO,UAAU;AAAA,UAChF,QAAQ,CAAC;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,MAAM,EAAE,IAAI,OAAO,WAAW,gCAAgC,CAAC;AAAA,QACxF,MAAM,qBAAqB,MAAM,sBAAsB,cAAc,SAAS;AAAA,UAC5E,MAAM;AAAA,UACN,IAAI;AAAA,UACJ;AAAA,QACF,CAAC;AAAA,QACD,OAAO,mBAAmB,MAAM,OAAO;AAAA,UACrC,MAAM;AAAA,UACN,QAAQ,EAAE,MAAM,UAAU,UAAU,gBAAgB,MAAM;AAAA,UAC1D,YAAY;AAAA,YACV;AAAA,cACE,IAAI,UAAU;AAAA,cACd,MAAM;AAAA,cACN,KAAK;AAAA,cACL,KAAK,EAAE,YAAK;AAAA,cACZ,OAAO,CAAC;AAAA,cACR,OAAO,CAAC;AAAA,YACV;AAAA,UACF;AAAA,UACA,iBAAiB,CAAC;AAAA,UAClB,eAAe,CAAC;AAAA,UAChB,oBAAoB,CAAC,EAAE,QAAQ,QAAQ,SAAS,YAAY,CAAC;AAAA,QAC/D,CAAC;AAAA;AAAA,MAMH,MAAM,SAAO,kBAAkB,qBAAqB,gBAAgB,CAAC,EAAE,SAAS,cAC9E,EAAE,MAAM,QAAQ,SAAS,KAAK,CAChC;AAAA,MAEA,MAAM,oBAAoB,MAAM,OAAO;AAAA,QACrC,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,WAAW,WAAW,oBAAoB;AAAA,QAC1D,YAAY,CAAC,EAAE,IAAI,YAAY,MAAM,eAAe,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAAA,QAC5E,iBAAiB,CAAC;AAAA,QAClB,eAAe,CAAC;AAAA,QAChB,oBAAoB,CAAC;AAAA,MACvB,CAAC;AAAA,MAED,MAAM,SAAO,kBAAkB,2BAA2B,iBAAiB,CAAC,EAAE,QAAQ,QACpF,6BACF;AAAA,MACA,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,QACnC,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,WAAW,OAAO;AAAA,MACpB,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,EAAE,CAAC;AAAA,cAC1D;AAAA,MACA,MAAM,SAAS,UAAU,cAAc;AAAA;AAAA,GAE1C;AAAA;AAGH,SAAS,YAAY,GAAG;AAAA,EACtB,OAAO,mBAAmB;AAAA,IACxB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,WAAW;AAAA,IACX,eAAe;AAAA,EACjB,CAAC;AAAA;AAGH,eAAe,sBAAsB,CACnC,cACA,SACA,cACA,OACA;AAAA,EACA,OAAO,sBAAsB,cAAc,SAAS;AAAA,IAClD,MAAM;AAAA,IACN,IAAI;AAAA,IACJ;AAAA,EACF,CAAC;AAAA;AAGH,eAAe,qBAAqB,CAClC,cACA,SACA,WACA;AAAA,EACA,MAAM,MACJ,UAAU,SAAS,WACf,MAAM,QAAQ,WAAW,QAAQ;AAAA,IAC/B,WAAW;AAAA,IACX,IAAI,UAAU;AAAA,EAChB,CAAC,IACD,MAAM,QAAQ,eAAe,QAAQ;AAAA,IACnC,WAAW;AAAA,IACX,IAAI,UAAU;AAAA,EAChB,CAAC;AAAA,EACP,MAAM,eAAc,KAAK,eAAe,QAAQ,UAAU,kBAAkB,UAAU;AAAA,EACtF,MAAM,aAAY,MAAM,QAAQ,WAAW,QAAQ;AAAA,IACjD,WAAW;AAAA,IACX,IAAI;AAAA,EACN,CAAC;AAAA,EACD,IAAI,CAAC;AAAA,IAAW,MAAM,IAAI,MAAM,mBAAmB,2BAA0B;AAAA,EAC7E,OAAO,aAAa,UAAU,sCAAsC,EAAE,uBAAW,UAAU,CAAC,CAAC;AAAA;AAG/F,SAAS,sBAAsB,CAAC,SAAmC;AAAA,EACjE,IAAI,CAAC,QAAQ,YAAY;AAAA,IACvB,MAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AAAA,EACA,IAAI,CAAC,QAAQ,gBAAgB;AAAA,IAC3B,MAAM,IAAI,MACR,gFACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,IAAY,MAAc,UAA0C;AAAA,EACvF,MAAM,MAAM,EAAE,cAAc,QAAO,IAAI,WAAW,GAAG;AAAA,EACrD,OAAO;AAAA,IACL,MAAM,EAAE,MAAM,UAAU,IAAI;AAAA,IAC5B,YAAY;AAAA,MACV,EAAE,MAAM,UAAU,KAAK,YAAY,EAAE,KAAK,EAAE;AAAA,MAC5C,GAAI,WACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,SAAS;AAAA,UACzD;AAAA,QACF;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAAA;AAGF,gBAAgB,OAAO,CAAC,QAA0C;AAAA,EAChE,WAAW,SAAS;AAAA,IAAQ,MAAM;AAAA;AAGpC,eAAe,KAAK,CAClB,SACA,OAWA;AAAA,EACA,MAAM,WACJ,MAAM,aAAa,gBACf,YAAY,cAAc,MAAM,YAAY,IAC5C,YAAY,iBAAiB,MAAM,YAAY;AAAA,EACrD,MAAM,aAAa,SAAS;AAAA,EAC5B,MAAM,eAAe;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,gBAAgB,MAAM;AAAA,IACtB,kBAAkB,YAAY;AAAA,IAC9B,oBAAoB,SAAS;AAAA,IAC7B,eAAe,SAAS;AAAA,EAC1B;AAAA,EACA,MAAM,SAAS;AAAA,IACb,IAAI,MAAM;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EAEA,IAAI,WAAW,SAAS,iCAAiC;AAAA,IACvD,MAAM,SAAQ,MAAM,uBAAuB,SAAS;AAAA,SAC/C;AAAA,MACH,UAAU,KAAK,cAAc,gBAAgB,aAAa,UAAU,YAAY;AAAA,MAChF,QAAQ,EAAE,cAAc,WAAW,aAAa;AAAA,MAChD,gBAAgB,MAAM,kBAAkB;AAAA,IAC1C,CAAC;AAAA,IACD,OAAO,OAAM;AAAA,EACf;AAAA,EAEA,IAAI,WAAW,SAAS,4BAA4B;AAAA,IAClD,MAAM,SAAQ,MAAM,uBAAuB,SAAS;AAAA,SAC/C;AAAA,MACH,UAAU,KAAK,cAAc,gBAAgB,QAAQ,UAAU,cAAc;AAAA,MAC7E,QAAQ;AAAA,QACN,oBAAoB,WAAW;AAAA,QAC/B,oBAAoB,WAAW;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,IACD,OAAO,OAAM;AAAA,EACf;AAAA,EAEA,MAAM,SAAQ,MAAM,uBAAuB,SAAS;AAAA,OAC/C;AAAA,IACH,UAAU,KAAK,cAAc,gBAAgB,UAAU,UAAU,cAAc;AAAA,IAC/E,QAAQ,EAAE,cAAc,WAAW,aAAa;AAAA,EAClD,CAAC;AAAA,EACD,OAAO,OAAM;AAAA;;AE32Bf,qBAAS,sBAAU,kBAAQ;AA+B3B,IAAM,cAAY;AAElB,IAAM,UAAS,iBAAiB;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IAC3E,CAAC;AAAA,IACD,KAAK,QAAQ,UAAU;AAAA,MACrB,OAAO,EAAE,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IACvF,CAAC;AAAA,EACH;AAAA,EACA,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE;AAClC,CAAC;AAED,IAAM,OAAO,iBAAiB;AAAA,EAC5B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IAC3E,CAAC;AAAA,IACD,KAAK,QAAQ,UAAU;AAAA,MACrB,OAAO,EAAE,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IACvF,CAAC;AAAA,IACD,KAAK,eAAe,UAAU;AAAA,MAC5B,OAAO,EAAE,YAAY,MAAM,MAAM,KAAK;AAAA,IACxC,CAAC;AAAA,IACD,KAAK,SAAS,UAAU;AAAA,MACtB,UAAU;AAAA,MACV,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IAC3E,CAAC;AAAA,IACD,KAAK,YAAY,UAAU;AAAA,MACzB,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,UAAU,KAAK;AAAA,IAC9D,CAAC;AAAA,IACD,KAAK,YAAY,WAAW;AAAA,MAC1B,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,IACxE,CAAC;AAAA,IACD,KAAK,UAAU,WAAW,CAAC,UAAU,QAAQ,CAAC,GAAG;AAAA,MAC/C,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,IACxE,CAAC;AAAA,IACD,KACE,QACA,EAAE,MAAM,SAAS,OAAO,SAAS,GACjC,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,KAAK,EAAE,CAClD;AAAA,IACA,KACE,YACA,EAAE,MAAM,OAAO,WAAW,UAAU,aAAa,SAAS,GAC1D,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,KAAK,EAAE,CAClD;AAAA,IACA,KACE,aACA,EAAE,MAAM,SAAS,OAAO,SAAS,GACjC,EAAE,OAAO,EAAE,YAAY,MAAM,QAAQ,KAAK,EAAE,CAC9C;AAAA,EACF;AAAA,EACA,OAAO,CAAC,KAAK,aAAa,OAAM,CAAC;AAAA,EACjC,QAAQ;AAAA,IACN,aAAa,CAAC,QAAQ,aAAa;AAAA,IACnC,QAAQ,EAAE,UAAU,aAAa,QAAQ,CAAC,QAAQ,aAAa,EAAE;AAAA,EACnE;AACF,CAAC;AAED,IAAM,OAAO,iBAAiB;AAAA,EAC5B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC,CAAC;AAAA,EACpE,OAAO,CAAC,KAAK,aAAa,OAAM,CAAC;AACnC,CAAC;AAED,IAAM,QAAQ,iBAAiB;AAAA,EAC7B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,IAAM,cAAc,iBAAiB;AAAA,EACnC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY,CAAC;AACf,CAAC;AAED,IAAM,kBAAkB,iBAAiB;AAAA,EACvC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,MAAM,KAAK,EAAE,CAAC;AAAA,IAClE,KAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EACA,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE;AAClC,CAAC;AAED,IAAM,mBAAmB,iBAAiB;AAAA,EACxC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY,CAAC,KAAK,SAAS,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;AAAA,EACjF,QAAQ,EAAE,aAAa,CAAC,OAAO,EAAE;AACnC,CAAC;AAEM,IAAM,8BAA8B,IAAI,iBAAiB;AAAA,EAC9D,SAAS,CAAC,MAAM,SAAQ,MAAM,OAAO,aAAa,iBAAiB,gBAAgB;AACrF,CAAC;AAUM,SAAS,mCAA6D,CAC3E,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAClB,SAIkB;AAAA,IAClB,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK;AAAA,QACT,SAAS,QAAQ;AAAA,QACjB,SAAS,8BAA8B;AAAA,UACrC;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,cACD;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,+DAA+D,MAAM;AAAA,MACxE,MAAM,aAAa,qBAAqB;AAAA,QACtC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,MAAM,QAAQ,IAAI;AAAA,YAC/B,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ,CAAC,QAAQ,eAAe,MAAM;AAAA,cACtC,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,SAAO,WAAW,IAAI,EAAE,KAAK,OAAO;AAAA,MACpC,IAAI,WAAW,SAAS;AAAA,QAAS;AAAA,MACjC,SAAO,WAAW,KAAK,EAAE,KAAK,CAAC;AAAA,MAC/B,SAAO,WAAW,MAAM,IAAI,EAAE,KAAK,SAAS;AAAA,MAC5C,IAAI,WAAW,MAAM,SAAS;AAAA,QAAW;AAAA,MACzC,SAAO,WAAW,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,MAAM,CAAC;AAAA,MAC1D,SAAO,WAAW,MAAM,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,MAC/C,IAAI,WAAW,MAAM,MAAM,SAAS;AAAA,QAAQ;AAAA,MAC5C,SAAO,WAAW,MAAM,MAAM,MAAM,EAAE,QAAQ,CAAC,QAAQ,aAAa,CAAC;AAAA,MAErE,MAAM,YAAY,oBAChB,EAAE,MAAM,QAAQ,OAAO,SAAS,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE,GAChF,EAAE,UAAU,4BAA4B,CAC1C;AAAA,MACA,SAAO,UAAU,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,MACxC,IAAI,UAAU,MAAM,SAAS,QAAQ;AAAA,QACnC,SAAO,UAAU,MAAM,MAAM,EAAE,cAAc;AAAA,QAC7C,SAAO,UAAU,MAAM,kBAAkB,EAAE,QAAQ;AAAA,WAChD,KAAK,KAAK,CAAC,QAAQ,aAAa;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,KACD;AAAA,IAED,OAAK,yDAAyD,MAAM;AAAA,MAClE,MAAM,SAAS,mCACb;AAAA,QACE,MAAM;AAAA,QACN,WAAW,EAAE,IAAI,MAAM,YAAY,WAAW,OAAO,IAAI;AAAA,QACzD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ,CAAC,UAAU;AAAA,UACnB,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,QAChD;AAAA,MACF,GACA,EAAE,UAAU,4BAA4B,CAC1C;AAAA,MAEA,SAAO,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,EAAE,QACxC,SAAO,gBAAgB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,CACH;AAAA,KACD;AAAA,IAED,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,SAAS,SAAS,cAAc;AAAA,QAChD,MAAM,eAAe,QAAQ,kBAAkB;AAAA,QAE/C,SAAO,aAAa,YAAY,EAAE,KAAK,IAAI;AAAA,QAC3C,SAAO,aAAa,YAAY,EAAE,KAAK,IAAI;AAAA,QAC3C,SAAO,aAAa,aAAa,EAAE,KAAK,IAAI;AAAA,QAC5C,SAAO,aAAa,YAAY,EAAE,KAAK,IAAI;AAAA,QAC3C,WAAW,QAAQ;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,GAAY;AAAA,UACV,SAAO,aAAa,QAAQ,KAAK,EAAE,KAAK,IAAI;AAAA,QAC9C;AAAA,QACA,WAAW,MAAM;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,GAAY;AAAA,UACV,SAAO,aAAa,eAAe,GAAG,EAAE,KAAK,IAAI;AAAA,QACnD;AAAA,QACA,SAAO,aAAa,WAAW,QAAQ,EAAE,KAAK,IAAI;AAAA,QAClD,SAAO,aAAa,qBAAqB,QAAQ,EAAE,KAAK,IAAI;AAAA,QAC5D,SAAO,aAAa,qBAAqB,QAAQ,EAAE,KAAK,IAAI;AAAA,QAC5D,SAAO,aAAa,QAAQ,KAAK,EAAE,KAAK,IAAI;AAAA,QAC5C,SAAO,aAAa,QAAQ,SAAS,EAAE,KAAK,IAAI;AAAA,QAChD,SAAO,aAAa,QAAQ,QAAQ,EAAE,KAAK,IAAI;AAAA,OAChD;AAAA,KACF;AAAA,IAED,OAAK,mFAAmF,YAAY;AAAA,MAClG,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,MAAM,QAAQ,UAAU;AAAA,YACrC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,YAAY,WAAW,OAAO,CAAC;AAAA,gBACxE,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,WAAW;AAAA,oBACT,IAAI;AAAA,oBACJ,OAAO;AAAA,sBACL,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,sBAClD,EAAE,IAAI,OAAO,YAAY,QAAQ,OAAO,eAAe;AAAA,sBACvD,EAAE,IAAI,OAAO,YAAY,YAAY,OAAO,GAAG;AAAA,sBAC/C,EAAE,IAAI,OAAO,YAAY,YAAY,OAAO,GAAG;AAAA,sBAC/C,EAAE,IAAI,MAAM,YAAY,SAAS,QAAQ,CAAC,GAAG,EAAE;AAAA,sBAC/C,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,MAAM;AAAA,sBACnD;AAAA,wBACE,IAAI;AAAA,wBACJ,OAAO;AAAA,0BACL,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,QAAQ;AAAA,0BACrD,EAAE,IAAI,YAAY,YAAY,YAAY,OAAO,OAAO;AAAA,wBAC1D;AAAA,sBACF;AAAA,sBACA,EAAE,IAAI,OAAO,MAAM,EAAE,IAAI,MAAM,YAAY,MAAM,OAAO,UAAU,EAAE;AAAA,oBACtE;AAAA,kBACF;AAAA,kBACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,gBAChD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,aAAa,YAAY,CAAC;AAAA,QACvD,SAAO,OAAO,QAAQ,IAAI,UAAU,EAAE,QAAQ;AAAA,UAC5C,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,SAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,SAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,OAClC;AAAA,KACF;AAAA,IAED,OAAK,mDAAmD,YAAY;AAAA,MAClE,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,WAAW;AAAA,QACjB,MAAM,WAAW;AAAA,QACjB,MAAM,QAAQ,KAAK;AAAA,UACjB,SAAS;AAAA,YACP,WAAW,MAAM,IAAI,UAAU,EAAE,IAAI,SAAS,CAAC;AAAA,YAC/C,WAAW,MAAM,IAAI,UAAU,EAAE,IAAI,SAAS,CAAC;AAAA,UACjD;AAAA,QACF,CAAC;AAAA,QAED,MAAM,OAAO,MAAM,mBACjB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM;AAAA,cACJ,EAAE,cAAc,MAAM,IAAI,WAAW,SAAS;AAAA,cAC9C,EAAE,cAAc,MAAM,IAAI,WAAW,SAAS;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAGA,SAAO,KAAK,KAAK,IAAI,EAAE,KACrB,QAAQ,kBAAkB,EAAE,OAAO,SAAS,OAAO,aAAa,UAClE;AAAA,QACA,SAAO,IAAI,IAAI,CAAC,EAAE,QAAQ,CAAC,UAAU,QAAQ,CAAC;AAAA,OAC/C;AAAA,KACF;AAAA,IAED,OAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,OAAuD;AAAA,UAC3D,EAAE,cAAc,QAAO,IAAI,WAAW,gBAAgB;AAAA,UACtD,EAAE,cAAc,KAAK,IAAI,WAAW,aAAa;AAAA,UACjD,EAAE,cAAc,KAAK,IAAI,WAAW,UAAU;AAAA,UAC9C,EAAE,cAAc,KAAK,IAAI,WAAW,aAAa;AAAA,QACnD;AAAA,QACA,MAAM,QAAQ,MAAM,mBAClB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,IAAI;AAAA,YACjB,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAG,OAAO,EAAE,MAAM,QAAQ,KAAK,EAAE;AAAA,UACpE;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,IAAI;AAAA,YACjB,OAAO;AAAA,cACL,MAAM;AAAA,cACN,UAAU;AAAA,cACV,WAAW,MAAM;AAAA,cACjB,OAAO,EAAE,MAAM,QAAQ,KAAK;AAAA,YAC9B;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,QAAQ,MAAM,aAClB,EAAE,wBAAW,OAAO,EAAE,MAAM,QAAQ,KAAK,EAAE,GAC3C,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,MAAM,eACJ,QAAQ,kBAAkB,EAAE,OAAO,SAAS,OAAO,aAAa;AAAA,QAClE,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK,YAAY;AAAA,QACzC,SAAO,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,iBAAiB,YAAY,CAAC;AAAA,QAC1D,SAAO,MAAM,QAAQ,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,QAAQ;AAAA,UACzD,EAAE,IAAI,gBAAgB;AAAA,UACtB,EAAE,IAAI,aAAa;AAAA,QACrB,CAAC;AAAA,QACD,SAAO,MAAM,KAAK,EAAE,KAAK,CAAC;AAAA,QAC1B,SAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,QAC/B,SAAO,MAAM,aAAa,EAAE,WAAW;AAAA,QACvC,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,YAAY;AAAA,QAC1C,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,QAC1C,SAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QACjC,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK,YAAY;AAAA,QACzC,SAAO,MAAM,KAAK,EAAE,KAAK,CAAC;AAAA,OAC3B;AAAA,KACF;AAAA,IAED,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,IAAI,QAAQ,kBAAkB,EAAE,OAAO,SAAS;AAAA,UAAM;AAAA,QACtD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,MAAM;AAAA,cACN,MAAM,CAAC,EAAE,cAAc,KAAK,IAAI,WAAW,aAAa,CAAC;AAAA,YAC3D;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;AAAA,OACjD;AAAA,KACF;AAAA,IAED,OAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,MAAM,CAAC,EAAE,cAAc,QAAO,IAAI,WAAW,mBAAmB,CAAC;AAAA,QACnE;AAAA,QAEA,MAAM,QAAQ,MAAM,wBAClB;AAAA,UACE;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACZ,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,SAAS,MAAM,wBACnB;AAAA,UACE;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,WAAW,MAAM;AAAA,QACnB,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,MAAM,KAAK,EAAE,QAAQ;AAAA,UAC1B,SAAO,iBAAiB;AAAA,YACtB,cAAc,KAAK;AAAA,YACnB,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,cAAc,QAAO;AAAA,YACrB,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,CAAC;AAAA,QACD,SAAO,MAAM,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ;AAAA,UACxD;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,SAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,QAC/B,SAAO,MAAM,aAAa,EAAE,WAAW;AAAA,QACvC,SAAO,OAAO,KAAK,EAAE,QAAQ;AAAA,UAC3B,SAAO,iBAAiB;AAAA,YACtB,cAAc,KAAK;AAAA,YACnB,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,cAAc,QAAO;AAAA,YACrB,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,CAAC;AAAA,QACD,SAAO,OAAO,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,oBAAoB,UAAU,CAAC;AAAA,QAC3F,SAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,OAClC;AAAA,KACF;AAAA,IAED,OAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,wBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,cACL,MAAM;AAAA,cACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,cACjE,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,UACA,WAAW;AAAA,QACb,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,EAAE,QAAQ;AAAA,UAC3B,SAAO,iBAAiB,EAAE,UAAU,cAAc,UAAU,mBAAmB,CAAC;AAAA,QAClF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,gBACT,IAAI;AAAA,gBACJ,OAAO;AAAA,kBACL,EAAE,IAAI,MAAM,YAAY,SAAS,OAAO,KAAK;AAAA,kBAC7C,EAAE,IAAI,UAAU,YAAY,SAAS,OAAO,MAAM;AAAA,gBACpD;AAAA,cACF;AAAA,cACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,eAAe,MAAM,mBACzB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,gBACT,IAAI;AAAA,gBACJ,OAAO;AAAA,kBACL,EAAE,IAAI,OAAO,YAAY,SAAS,OAAO,IAAI;AAAA,kBAC7C,EAAE,IAAI,MAAM,YAAY,SAAS,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,gBACvD;AAAA,cACF;AAAA,cACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,eAAe,MAAM,mBACzB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW,EAAE,IAAI,OAAO,YAAY,SAAS,OAAO,KAAK;AAAA,cACzD,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,cAAc,MAAM,mBACxB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW,EAAE,IAAI,OAAO,MAAM,EAAE,IAAI,MAAM,YAAY,SAAS,OAAO,IAAI,EAAE;AAAA,cAC5E,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,sBAAsB,iBAAiB,CAAC;AAAA,QACvE,SAAO,IAAI,YAAY,CAAC,EAAE,QAAQ,CAAC,cAAc,iBAAiB,CAAC;AAAA,QACnE,SAAO,IAAI,YAAY,CAAC,EAAE,QAAQ;AAAA,UAChC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,SAAO,IAAI,WAAW,CAAC,EAAE,QAAQ,CAAC,cAAc,sBAAsB,iBAAiB,CAAC;AAAA,OACzF;AAAA,KACF;AAAA,IAED,OAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,YAAY,WAAW,OAAO,CAAC;AAAA,UACxE,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,UAAU,YAAY,YAAY,OAAO,KAAK;AAAA,YAC/D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,QACA,MAAM,QAAQ,MAAM,mBAClB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,IAAI;AAAA,YACjB,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAG,MAAM;AAAA,UAC5C;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,QAAQ,MAAM,mBAClB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,IAAI;AAAA,YACjB,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAG,WAAW,MAAM,eAAe,MAAM;AAAA,UAC5E;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACvC,SAAO,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,aAAa,YAAY,CAAC;AAAA,QACtD,SAAO,MAAM,QAAQ,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,QAAQ;AAAA,UACzD,EAAE,IAAI,YAAY;AAAA,UAClB,EAAE,IAAI,aAAa;AAAA,QACrB,CAAC;AAAA,QACD,SAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,QAC/B,SAAO,MAAM,aAAa,EAAE,WAAW;AAAA,QACvC,SAAO,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,OAC1C;AAAA,KACF;AAAA,IAED,OAAK,sDAAsD,YAAY;AAAA,MACrE,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,UAAU,MAAM,mBACpB;AAAA,UACE;AAAA,UACA,cAAc;AAAA,UACd,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACpF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,OAAO,MAAM,mBACjB;AAAA,UACE;AAAA,UACA,cAAc;AAAA,UACd,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACtF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,gBAAgB,MAAM,mBAC1B;AAAA,UACE;AAAA,UACA,cAAc;AAAA,UACd,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,YAAY,WAAW,OAAO,CAAC;AAAA,YACxE,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,UACpF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,QAAQ,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACzC,SAAO,IAAI,OAAO,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QACxD,SAAO,QAAQ,KAAK,EAAE,cAAc;AAAA,QACpC,SAAO,QAAQ,OAAO,EAAE,KAAK,IAAI;AAAA,QACjC,SAAO,IAAI,IAAI,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QACrD,SAAO,KAAK,KAAK,EAAE,cAAc;AAAA,QACjC,SAAO,KAAK,OAAO,EAAE,KAAK,IAAI;AAAA,QAC9B,SAAO,KAAK,aAAa,EAAE,WAAW;AAAA,QACtC,SAAO,IAAI,aAAa,CAAC,EAAE,QAAQ,CAAC,aAAa,YAAY,CAAC;AAAA,QAC9D,SAAO,cAAc,KAAK,EAAE,cAAc;AAAA,QAC1C,SAAO,cAAc,OAAO,EAAE,KAAK,IAAI;AAAA,OACxC;AAAA,KACF;AAAA,IAED,OAAK,kDAAkD,YAAY;AAAA,MACjE,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,aACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,YAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,aACpB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACpF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,SAAO,QAAQ,KAAK,EAAE,KAAK,CAAC;AAAA,OAC7B;AAAA,KACF;AAAA,IAED,OAAK,2CAA2C,YAAY;AAAA,MAC1D,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,cACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,YAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,cACpB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,MAAM,YAAY,QAAQ,OAAO,eAAe;AAAA,YACjE,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,cACpB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACpF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,OAAO,MAAM,EAAE,KAAK,IAAI;AAAA,QAC/B,SAAO,QAAQ,MAAM,EAAE,KAAK,KAAK;AAAA,QACjC,SAAO,QAAQ,MAAM,EAAE,KAAK,IAAI;AAAA,OACjC;AAAA,KACF;AAAA,IAED,OAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,UAC9B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,QAEA,MAAM,QAAQ,MAAM,aAClB,EAAE,wBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,SAAS,MAAM,cACnB,EAAE,wBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACvC,IAAI,MAAM,KAAK,SAAS;AAAA,UAAY;AAAA,QACpC,SAAO,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,QACzC,SAAO,MAAM,KAAK,EAAE,KAAK,CAAC;AAAA,QAC1B,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,IAAI,OAAO,KAAK,SAAS;AAAA,UAAY;AAAA,QACrC,SAAO,OAAO,KAAK,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,QAC1C,SAAO,OAAO,MAAM,EAAE,KAAK,IAAI;AAAA,OAChC;AAAA,KACF;AAAA,IAED,OAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,aACnB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAC9C,QAAQ;AAAA,YACN,EAAE,YAAY,UAAU,OAAO,GAAG;AAAA,YAClC,EAAE,YAAY,YAAY,OAAO,GAAG;AAAA,UACtC;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,aACpB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,UAClF,QAAQ;AAAA,YACN,EAAE,YAAY,UAAU,OAAO,GAAG;AAAA,YAClC,EAAE,YAAY,YAAY,OAAO,GAAG;AAAA,UACtC;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,OAAO,MAAM,EAAE,QAAQ;AAAA,UAC5B;AAAA,YACE,YAAY;AAAA,YACZ,SAAS;AAAA,cACP,EAAE,OAAO,UAAU,OAAO,EAAE;AAAA,cAC5B,EAAE,OAAO,UAAU,OAAO,EAAE;AAAA,YAC9B;AAAA,UACF;AAAA,UACA;AAAA,YACE,YAAY;AAAA,YACZ,SAAS;AAAA,cACP,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,cACzB,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,YAC1B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,SAAO,QAAQ,MAAM,EAAE,QAAQ,OAAO,MAAM;AAAA,OAC7C;AAAA,KACF;AAAA,IAED,OAAK,4CAA4C,YAAY;AAAA,MAC3D,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,cAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,UAClD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,gBAAgB,MAAM,mBAC1B;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,oBAAoB,KAAK;AAAA,YACzB,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,UAClD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,gBAAgB,MAAM,mBAC1B;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,oBAAoB,KAAK;AAAA,YACzB,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,UAClD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,YAAY,MAAM,mBACtB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,MAAM;AAAA,gBAC9D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,QAAQ;AAAA,gBAChE,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,SAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,SAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,CAAC,oBAAoB,eAAe,CAAC;AAAA,QACzE,SAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,aAAa,UAAU,CAAC;AAAA,QAC3E,SAAO,cAAc,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC/C,SAAO,UAAU,aAAa,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QACpE,SAAO,UAAU,aAAa,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,QACrD,SAAO,UAAU,SAAS,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QAChE,SAAO,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC;AAAA,OAC5C;AAAA,KACF;AAAA,IAED,OAAK,sEAAsE,YAAY;AAAA,MACrF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,EAAE,QAAQ,aAAa,WAAW,WAAW,CAAC;AAAA,YAC3D,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAKA,MAAM,aAAa,QAAQ,kBAAkB,EAAE,OAAO,SAAS,aAAa;AAAA,QAC5E,SAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,SAAO,YAAY,UAAU,cAAc,WAAW,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;AAAA,QACrF,SAAO,YAAY,UAAU,aAAa,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;AAAA,QAEjF,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,EAAE,QAAQ,aAAa,WAAW,WAAW,CAAC;AAAA,YAC3D,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAGA,SAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,SAAO,YAAY,UAAU,oBAAoB,WAAW,CAAC,EAAE,QAAQ;AAAA,UACrE;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,SAAO,YAAY,UAAU,iBAAiB,WAAW,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC;AAAA,OAClF;AAAA,KACF;AAAA,IAED,OAAK,iFAAiF,YAAY;AAAA,MAChG,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO,EAAE,MAAM,SAAS,cAAc,MAAM,IAAI,iBAAiB,KAAK;AAAA,UACxE;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,CAAC,cAAc,UAAU,CAAC;AAAA,OAC7D;AAAA,KACF;AAAA,IAED,OAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,QAAQ,WAAW,MAAM,CAAC;AAAA,YACnE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,OAC3C;AAAA,KACF;AAAA,IAED,OAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,QAAQ,KAAK;AAAA,UACjB,SAAS;AAAA,YACP;AAAA,cACE,KAAK,EAAE,cAAc,gBAAgB,IAAI,WAAW,eAAe;AAAA,cACnE,YAAY,EAAE,IAAI,gBAAgB,MAAM,YAAY,OAAO,SAAS;AAAA,YACtE;AAAA,YACA;AAAA,cACE,KAAK,EAAE,cAAc,iBAAiB,IAAI,WAAW,gBAAgB;AAAA,cACrE,YAAY,EAAE,IAAI,iBAAiB,MAAM,YAAY,OAAO,SAAS;AAAA,YACvE;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,gBAAgB;AAAA,cAC9B,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;AAAA,OAC9C;AAAA,KACF;AAAA,IAED,OAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,UAC9B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,QAEA,IAAI,QAAQ,kBAAkB,EAAE,WAAW,cAAc,MAAM;AAAA,UAC7D,MAAM,SAAS,MAAM,mBACnB,EAAE,wBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,UACA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,UACxC,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,UAC1C;AAAA,QACF;AAAA,QAEA,MAAM,oBACJ,mBACE,EAAE,wBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD,GACA,yBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,OAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,QAAQ,CAAC,GAAG,CAAC;AAAA,UACb,GAAG;AAAA,UACH,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,QAChD;AAAA,QAEA,IAAI,QAAQ,kBAAkB,EAAE,OAAO,WAAW,MAAM;AAAA,UACtD,MAAM,SAAS,MAAM,mBACnB,EAAE,wBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,UACA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,UACxC,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,UACvD;AAAA,QACF;AAAA,QAEA,MAAM,oBACJ,mBACE,EAAE,wBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD,GACA,0BACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,OAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,kBAAkB,qBAAqB,OAAO;AAAA,QAEpD,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,QAAQ,WAAW,MAAM,CAAC;AAAA,cACnE,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,SAAS,iBAAiB,iBAAiB,GAAG,CACzF;AAAA,QAEA,SAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,SAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,OACxD;AAAA,KACF;AAAA,IAED,OAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,kBAAkB,qBAAqB,OAAO;AAAA,QAEpD,MAAM,oBACJ,mBACE;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,SAAS,iBAAiB,iBAAiB,GAAG,CACzF,GACA,6BACF;AAAA,OACD;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAsB,2BAA2B,CAAC,SAAiD;AAAA,EACjG,MAAM,QAAQ,KAAK;AAAA,IACjB,SAAS;AAAA,MACP,WAAW,KAAK,IAAI,cAAc;AAAA,QAChC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC,OAAO,OAAO;AAAA,QACrB,UAAU,EAAE,MAAM,QAAQ;AAAA,QAC1B,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,aAAa;AAAA,QAC/B,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC,KAAK;AAAA,QACZ,UAAU,EAAE,MAAM,QAAQ;AAAA,QAC1B,WAAW,CAAC,KAAK,GAAG;AAAA,MACtB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,cAAc;AAAA,QAChC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC,QAAQ;AAAA,QACf,UAAU,EAAE,MAAM,QAAQ;AAAA,QAC1B,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,mBAAmB;AAAA,QACrC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,UAAU,CAAC;AAAA,QACX,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,sBAAsB;AAAA,QACxC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,UAAU,CAAC;AAAA,QACX,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,QAAO,IAAI,oBAAoB;AAAA,QACxC,IAAI;AAAA,QACJ,MAAM;AAAA,MACR,CAAC;AAAA,MACD,WAAW,QAAO,IAAI,iBAAiB,EAAE,IAAI,iBAAiB,MAAM,SAAS,CAAC;AAAA,MAC9E,WAAW,MAAM,IAAI,cAAc,EAAE,IAAI,aAAa,CAAC;AAAA,MACvD,WAAW,YAAY,IAAI,YAAY,EAAE,IAAI,WAAW,CAAC;AAAA,MACzD,WAAW,KAAK,IAAI,YAAY,EAAE,IAAI,WAAW,CAAC;AAAA,IACpD;AAAA,IACA,OAAO;AAAA,MACL,SAAS,KAAK,IAAI,cAAc,aAAa,QAAO,IAAI,kBAAkB;AAAA,MAC1E,SAAS,KAAK,IAAI,aAAa,aAAa,QAAO,IAAI,eAAe;AAAA,MACtE,SAAS,KAAK,IAAI,YAAY,aAAa,QAAO,IAAI,kBAAkB;AAAA,IAC1E;AAAA,EACF,CAAC;AAAA;AAGH,SAAS,UAAU,CACjB,cACA,WACA,YAC2B;AAAA,EAC3B,OAAO;AAAA,IACL,KAAK,EAAE,cAAc,UAAU;AAAA,IAC/B;AAAA,EACF;AAAA;AAGF,SAAS,QAAQ,CACf,cACA,UACA,QACA,cACA,UACyB;AAAA,EACzB,OAAO;AAAA,IACL,KAAK;AAAA,MACH,QAAQ,EAAE,cAAc,cAAc,WAAW,SAAS;AAAA,MAC1D;AAAA,MACA,QAAQ,EAAE,cAAc,cAAc,WAAW,SAAS;AAAA,IAC5D;AAAA,EACF;AAAA;AAGF,SAAS,GAAG,CAAC,QAAsC;AAAA,EACjD,OAAO,OAAO,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS;AAAA;AAIlD,SAAS,WAAW,CAAC,QAA4B,UAAkB,QAA0B;AAAA,EAC3F,MAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,QAAQ,IAAI,cAAc,QAAQ;AAAA,EACtE,IAAI,CAAC;AAAA,IAAQ,MAAM,IAAI,MAAM,eAAe,qBAAqB;AAAA,EACjE,MAAM,QAAQ,OAAO,QAAQ;AAAA,EAC7B,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,IAAG,MAAM,IAAI,MAAM,qCAAqC,SAAS;AAAA,EACzF,OAAO,MAAM,IAAI,CAAC,WAAW,OAAO,SAAS,EAAE,KAAK;AAAA;AAGtD,SAAS,SAAS,CAAC,QAAsC;AAAA,EACvD,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK;AAAA;AAG/B,SAAS,oBAAoB,CAAC,SAAuC;AAAA,EACnE,OAAO,IAAI,MAAM,SAAS;AAAA,IACxB,GAAG,CAAC,QAAQ,UAAU,UAAU;AAAA,MAC9B,IAAI,aAAa;AAAA,QAAqB,OAAO,OAAO,EAAE,cAAc,MAAM;AAAA,MAC1E,IAAI,aAAa;AAAA,QAAgB;AAAA,MAEjC,MAAM,QAAQ,QAAQ,IAAI,QAAQ,UAAU,QAAQ;AAAA,MACpD,OAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAAA;AAAA,EAE9D,CAAC;AAAA;AAGH,eAAe,mBAAmB,CAAC,SAA2B,MAA6B;AAAA,EACzF,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO,OAAO;AAAA,IACd,SAAO,KAAK,EAAE,eAAe,wBAAwB;AAAA,IACrD,IAAI,iBAAiB,0BAA0B;AAAA,MAC7C,SAAO,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,EAAE,UAAU,IAAI;AAAA,IAChE;AAAA,IACA;AAAA;AAAA,EAGF,MAAM,IAAI,MAAM,gDAAgD,OAAO;AAAA;;ACl4CzE,qBAAS,sBAAU,kBAAQ;AAmC3B,IAAM,cAAY;AAClB,IAAM,kBAAiB;AACvB,IAAM,UAAU,iBAAiB;AAAA,EAC/B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,MAAM,KAAK,EAAE,CAAC;AAAA,IAClE,KAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EACA,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE;AAClC,CAAC;AAED,IAAM,WAAW,iBAAiB;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,MAAM,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,IAClF,KAAK,SAAS,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,IACzF,KAAK,cAAc,QAAQ;AAAA,IAC3B,KAAK,YAAY,QAAQ;AAAA,EAC3B;AAAA,EACA,OAAO,CAAC,KAAK,WAAW,SAAS,EAAE,aAAa,MAAM,CAAC,CAAC;AAAA,EACxD,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE;AAClC,CAAC;AAED,IAAM,WAAW,iBAAiB;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC;AAAA,IACtD,KAAK,SAAS,UAAU;AAAA,MACtB,OAAO,EAAE,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM,UAAU,KAAK;AAAA,IAC1E,CAAC;AAAA,IACD,KAAK,QAAQ,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,UAAU,KAAK,EAAE,CAAC;AAAA,IACxF,KAAK,YAAY,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,IACzF,KACE,aACA,EAAE,MAAM,SAAS,OAAO,SAAS,GACjC,EAAE,OAAO,EAAE,YAAY,MAAM,QAAQ,KAAK,EAAE,CAC9C;AAAA,IACA,KAAK,UAAU,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,KAAK,EAAE,CAAC;AAAA,EACzF;AAAA,EACA,OAAO;AAAA,IACL,KAAK,SAAS,UAAU;AAAA,MACtB,YAAY,CAAC,KAAK,YAAY,QAAQ,GAAG,KAAK,SAAS,QAAQ,GAAG,KAAK,YAAY,QAAQ,CAAC;AAAA,IAC9F,CAAC;AAAA,IACD,KAAK,aAAa,QAAQ;AAAA,IAC1B,KAAK,KAAK,SAAS;AAAA,IACnB,KAAK,YAAY,OAAO;AAAA,IACxB,KAAK,YAAY,OAAO;AAAA,EAC1B;AAAA,EACA,QAAQ,EAAE,aAAa,CAAC,OAAO,EAAE;AACnC,CAAC;AAEM,IAAM,kCAAkC,IAAI,iBAAiB;AAAA,EAClE,SAAS,CAAC,UAAU,UAAU,OAAO;AACvC,CAAC;AAED,IAAM,SAAoC;AAAA,EACxC,mBAAmB;AAAA,EACnB,oBAAoB;AACtB;AASO,SAAS,+BAAyD,CACvE,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAClB,SAIkB;AAAA,IAClB,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,UAAU,8BAA8B;AAAA,QAC5C;AAAA,QACA,UAAU;AAAA,QACV,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,MACD,MAAM,MAAK,OAAO;AAAA,MAClB,MAAM,KAAK,EAAE,SAAS,QAAQ,CAAC;AAAA,cAC/B;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,+EAA+E,YAAY;AAAA,MAC9F,MAAM,YAAY,SAAS,SAAS,cAAc;AAAA,QAChD,MAAM,SAAS,aAAa,QAAQ,sBAAsB;AAAA,QAE1D,MAAM,WAAW,MAAM,OAAO,eAAe;AAAA,UAC3C;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,WAAW;AAAA,QACb,CAAC;AAAA,QACD,SAAO,UAAU,SAAS,EAAE,KAAK,YAAY;AAAA,QAC7C,SAAO,UAAU,UAAU,EAAE,QAAQ;AAAA,UACnC,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,UACV,WAAW,CAAC,GAAG,CAAC;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,UAAU,KAAK,EAAE,cAAc;AAAA,QACtC,SACE,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS;AAAA,QAEX,MAAM,OAAO,MAAM,OAAO,eAAe;AAAA,UACvC;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,WAAW;AAAA,QACb,CAAC;AAAA,QACD,SAAO,MAAM,UAAU,EAAE,QAAQ;AAAA,UAC/B,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC;AAAA,QACD,SACE,MAAM,OAAO,wBAAwB;AAAA,UACnC;AAAA,UACA,OAAO;AAAA,YACL,EAAE,cAAc,SAAS,IAAI,WAAW,iBAAiB,YAAY,QAAQ;AAAA,YAC7E,EAAE,cAAc,SAAS,IAAI,WAAW,iBAAiB,YAAY,QAAQ;AAAA,YAC7E,EAAE,cAAc,SAAS,IAAI,WAAW,iBAAiB,YAAY,SAAS;AAAA,YAC9E,EAAE,cAAc,SAAS,IAAI,WAAW,eAAe,YAAY,KAAK;AAAA,UAC1E;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,CAAC,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,QAEpC,MAAM,SAAS,MAAM,OAAO,KAAK;AAAA,UAC/B;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,SAAS,KAAK,CAAC;AAAA,QACxD,SAAO,OAAO,OAAO,EAAE,aAAa,CAAC;AAAA,QACrC,SAAO,OAAO,QAAQ,IAAI,SAAS,EAAE,KAAK,eAAe;AAAA,QACzD,SAAO,OAAO,QAAQ,IAAI,UAAU,EAAE,QAAQ;AAAA,UAC5C,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC;AAAA,QACD,SAAO,OAAO,QAAQ,IAAI,KAAK,EAAE,cAAc;AAAA,QAE/C,IAAI,CAAC;AAAA,UAAM,MAAM,IAAI,MAAM,0BAA0B;AAAA,QACrD,KAAK,WAAW,OAAO;AAAA,QACvB,UAEI,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,WAAW;AAAA,QACb,CAAC,IACA,UACL,EAAE,QAAQ,EAAE,IAAI,iBAAiB,MAAM,gBAAgB,YAAY,iBAAiB,CAAC;AAAA,QAErF,MAAM,QAAQ,KAAK;AAAA,UACjB,SAAS,CAAC,OAAO,SAAS,IAAI,aAAa,EAAE,IAAI,aAAa,MAAM,cAAc,CAAC,CAAC;AAAA,UACpF,OAAO,CAAC,QAAQ,SAAS,IAAI,cAAc,SAAS,SAAS,IAAI,WAAW,CAAC;AAAA,QAC/E,CAAC;AAAA,QACD,UAEI,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,WAAW;AAAA,QACb,CAAC,IACA,UACL,EAAE,QAAQ,EAAE,IAAI,aAAa,MAAM,cAAc,CAAC;AAAA,QAElD,MAAM,QAAQ,OAAO;AAAA,UACnB;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,QAAQ,SAAS,IAAI,cAAc,SAAS,SAAS,IAAI,WAAW,EAAE;AAAA,UAC7E;AAAA,QACF,CAAC;AAAA,QACD,SACE,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS;AAAA,OACZ;AAAA,KACF;AAAA,IAED,OAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,SAAS,cAAc;AAAA,QACvC,MAAM,QAAQ,aAAa,QAAQ,wBAAwB;AAAA,UACzD,MAAM;AAAA,UACN,OAAO,CAAC;AAAA,QACV,CAAC;AAAA,QACD,UAAQ,MAAM,MAAM,KAAK,EAAE,uBAAU,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC;AAAA,QACtD,SACE,MAAM,MAAM,eAAe;AAAA,UACzB;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,QACpD,CAAC,CACH,EAAE,cAAc,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,QAEzC,MAAM,SAAS,aAAa,QAAQ,sBAAsB;AAAA,QAC1D,MAAM,eAAe,OAAO,cAAc,KAAK,MAAM;AAAA,QACrD,MAAM,gBAAe,OAAO,cAAc,KAAK,MAAM;AAAA,QACrD,MAAM,iBAAgB,OAAO,eAAe,KAAK,MAAM;AAAA,QACvD,MAAM,gBAAe,OAAO,cAAc,KAAK,MAAM;AAAA,QACrD,IAAI,CAAC,gBAAgB,CAAC,iBAAgB,CAAC,kBAAiB,CAAC,eAAc;AAAA,UACrE,MAAM,IAAI,MAAM,oEAAoE;AAAA,QACtF;AAAA,QACA,MAAM,oBAAyD;AAAA,UAC7D,MACE,aAAa;AAAA,YACX,WAAW;AAAA,YACX,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UACpD,CAAC;AAAA,UACH,MACE,cAAa;AAAA,YACX,WAAW;AAAA,YACX,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UACpD,CAAC;AAAA,UACH,MACE,eAAc;AAAA,YACZ,WAAW;AAAA,YACX,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UACpD,CAAC;AAAA,UACH,MACE,cAAa;AAAA,YACX,WAAW;AAAA,YACX,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,YAClD,QAAQ,CAAC,EAAE,YAAY,YAAY,OAAO,EAAE,CAAC;AAAA,UAC/C,CAAC;AAAA,UACH,MACE,OAAO,eAAe;AAAA,YACpB,WAAW;AAAA,YACX,cAAc,SAAS;AAAA,YACvB,WAAW;AAAA,UACb,CAAC;AAAA,UACH,MACE,OAAO,wBAAwB;AAAA,YAC7B,WAAW;AAAA,YACX,OAAO,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,cAAc,YAAY,KAAK,CAAC;AAAA,UAClF,CAAC;AAAA,UACH,MACE,OAAO,UAAU;AAAA,YACf,WAAW;AAAA,YACX,cAAc,SAAS;AAAA,YACvB,UAAU;AAAA,UACZ,CAAC;AAAA,UACH,MACE,OAAO,oBAAoB;AAAA,YACzB,WAAW;AAAA,YACX,OAAO,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa,CAAC;AAAA,UAChE,CAAC;AAAA,UACH,MACE,OAAO,eAAe;AAAA,YACpB,WAAW;AAAA,YACX,OAAO,CAAC,EAAE,cAAc,SAAS,IAAI,UAAU,cAAc,QAAQ,QAAQ,CAAC;AAAA,UAChF,CAAC;AAAA,UACH,MACE,OAAO,WAAW;AAAA,YAChB,WAAW;AAAA,YACX,YAAY,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa,CAAC;AAAA,YACnE,WAAW;AAAA,YACX,OAAO;AAAA,UACT,CAAC;AAAA,UACH,MAAM,OAAO,KAAK,EAAE,WAAW,gBAAe,CAAC;AAAA,QACjD;AAAA,QAEA,WAAW,QAAQ,mBAAmB;AAAA,UACpC,MAAM,SAAO,KAAK,CAAC,EAAE,QAAQ,QAAQ,uBAAuB,cAAY;AAAA,QAC1E;AAAA,OACD;AAAA,KACF;AAAA,IAED,OAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,SAAS,SAAS,cAAc;AAAA,QAChD,MAAM,SAAS,aAAa,QAAQ,sBAAsB;AAAA,QAC1D,MAAM,QAAQ,OAAO;AAAA,UACnB;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,UAC5D;AAAA,QACF,CAAC;AAAA,QAED,WAAW,OAAO;AAAA,UAChB,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,UACrD,EAAE,cAAc,SAAS,IAAI,WAAW,gBAAgB;AAAA,UACxD,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,UACrD,EAAE,cAAc,QAAQ,IAAI,WAAW,YAAY;AAAA,QACrD,GAAG;AAAA,UACD,SAAO,MAAM,OAAO,eAAe,EAAE,2BAAc,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,QACtE;AAAA,QAEA,SAAO,MAAM,OAAO,KAAK,EAAE,uBAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,SAAS,OAAO,OAAO,EAAE,CAAC;AAAA,QAC1F,SACE,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,QACpD,CAAC,CACH,EAAE,cAAc,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,QACzC,SACE,MAAM,OAAO,UAAU;AAAA,UACrB;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,UAAU;AAAA,QACZ,CAAC,CACH,EAAE,QAAQ,CAAC,CAAC;AAAA,QACZ,SACE,MAAM,OAAO,WAAW;AAAA,UACtB;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa,CAAC;AAAA,UACnE,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,MAAM,CAAC;AAAA,OACxC;AAAA,KACF;AAAA,IAED,OAAK,wFAAwF,YAAY;AAAA,MACvG,MAAM,YAAY,SAAS,cAAc;AAAA,QACvC,MAAM,SAAS,aAAa,QAAQ,sBAAsB;AAAA,QAC1D,MAAM,UAAU,MAAM,OAAO,oBAAoB;AAAA,UAC/C;AAAA,UACA,OAAO;AAAA,YACL,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,YACrD,EAAE,cAAc,SAAS,IAAI,WAAW,gBAAgB;AAAA,YACxD,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,UACvD;AAAA,QACF,CAAC;AAAA,QACD,SAAO,CAAC,GAAG,QAAQ,KAAK,CAAC,CAAC,EAAE,QAAQ;AAAA,UAClC,eAAe,SAAS,IAAI,YAAY;AAAA,UACxC,eAAe,SAAS,IAAI,eAAe;AAAA,QAC7C,CAAC;AAAA,QACD,SAAO,QAAQ,IAAI,eAAe,SAAS,IAAI,YAAY,CAAC,GAAG,UAAU,EAAE,QAAQ;AAAA,UACjF,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,UACV,WAAW,CAAC,GAAG,CAAC;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,QAAQ,IAAI,eAAe,SAAS,IAAI,YAAY,CAAC,GAAG,KAAK,EAAE,cAAc;AAAA,QACpF,SAAO,QAAQ,IAAI,eAAe,SAAS,IAAI,eAAe,CAAC,GAAG,UAAU,EAAE,QAAQ;AAAA,UACpF,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,YAAY;AAAA,QACd,CAAC;AAAA,QACD,SAAO,QAAQ,IAAI,eAAe,SAAS,IAAI,eAAe,CAAC,GAAG,KAAK,EAAE,cAAc;AAAA,QAEvF,MAAM,WAAW,MAAM,OAAO,eAAe;AAAA,UAC3C;AAAA,UACA,WAAW;AAAA,UACX,OAAO,CAAC,EAAE,cAAc,SAAS,IAAI,UAAU,cAAc,QAAQ,QAAQ,CAAC;AAAA,QAChF,CAAC;AAAA,QACD,MAAM,eAAe,SAAS,IAAI,aAAa,SAAS,IAAI,cAAc,OAAO,CAAC;AAAA,QAClF,SAAO,YAAY,EAAE,aAAa,CAAC;AAAA,QACnC,SAAO,eAAe,IAAI,QAAQ,EAAE,KAAK,eAAe;AAAA,QACxD,SAAO,eAAe,IAAI,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,UAAU,CAAC;AAAA,QAE/E,MAAM,cAAc,MAAM,OAAO,UAAU;AAAA,UACzC;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,SAAO,WAAW,EAAE,aAAa,CAAC;AAAA,QAClC,SAAO,YAAY,IAAI,QAAQ,EAAE,KAAK,eAAe;AAAA,QACrD,SAAO,YAAY,IAAI,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,UAAU,CAAC;AAAA,QAE5E,MAAM,eAAe,MAAM,OAAO,WAAW;AAAA,UAC3C;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa,CAAC;AAAA,UACnE,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,aAAa,KAAK,EAAE,aAAa,CAAC;AAAA,QACzC,SAAO,aAAa,MAAM,IAAI,QAAQ,EAAE,KAAK,eAAe;AAAA,QAC5D,SAAO,aAAa,MAAM,IAAI,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,UAAU,CAAC;AAAA,QAEnF,MAAM,WAAW,MAAM,OAAO,eAAe;AAAA,UAC3C;AAAA,UACA,WAAW;AAAA,UACX,OAAO,CAAC,EAAE,cAAc,SAAS,IAAI,UAAU,iBAAiB,QAAQ,QAAQ,CAAC;AAAA,QACnF,CAAC;AAAA,QACD,MAAM,eAAe,SAAS,IAAI,aAAa,SAAS,IAAI,iBAAiB,OAAO,CAAC;AAAA,QACrF,SAAO,YAAY,EAAE,aAAa,CAAC;AAAA,QACnC,SAAO,eAAe,IAAI,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,UAAU,CAAC;AAAA,QAC/E,SAAO,SAAS,IAAI,aAAa,SAAS,IAAI,cAAc,OAAO,CAAC,CAAC,EAAE,KAAK,KAAK;AAAA,QAEjF,MAAM,WAAW,MAAM,OAAO,eAAe;AAAA,UAC3C;AAAA,UACA,WAAW;AAAA,UACX,OAAO,CAAC,EAAE,cAAc,SAAS,IAAI,UAAU,cAAc,QAAQ,UAAU,CAAC;AAAA,QAClF,CAAC;AAAA,QACD,SAAO,SAAS,IAAI,aAAa,SAAS,IAAI,cAAc,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC;AAAA,OACxF;AAAA,KACF;AAAA,IAED,OAAK,wFAAwF,YAAY;AAAA,MACvG,MAAM,YAAY,SAAS,cAAc;AAAA,QACvC,MAAM,SAAS,aAAa,QAAQ,sBAAsB;AAAA,QAC1D,MAAM,QAAQ,OAAO,UACnB,OAAO,eAAe,EAAE,wBAAW,OAAO,MAAM,CAAC;AAAA,QAEnD,MAAM,kBAAkB,MAAM,MAAM,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG,CAAC;AAAA,QAChF,SAAO,iBAAiB,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,QACnF,SAAO,iBAAiB,QAAQ,IAAI,UAAU,EAAE,QAAQ;AAAA,UACtD,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,UACV,WAAW,CAAC,GAAG,CAAC;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,iBAAiB,QAAQ,IAAI,KAAK,EAAE,cAAc;AAAA,QACzD,UAEI,MAAM,MAAM;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,YACJ,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,YACrD,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,YACrD,EAAE,cAAc,SAAS,IAAI,WAAW,gBAAgB;AAAA,UAC1D;AAAA,QACF,CAAC,IACA,QAAQ,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,IAAI,WAAW,CAChE,EAAE,QAAQ,CAAC,GAAG,SAAS,oBAAoB,GAAG,SAAS,eAAe,CAAC;AAAA,QACvE,UAEI,MAAM,MAAM;AAAA,UACV,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UAClD,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,cAAc;AAAA,QACpE,CAAC,IACA,OACL,EAAE,QAAQ,CAAC,CAAC;AAAA,QACZ,UAEI,MAAM,MAAM;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,QAAQ,WAAW,MAAM,CAAC;AAAA,YACnE,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UACpD;AAAA,QACF,CAAC,IACA,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CACvC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,QACxB,UAEI,MAAM,MAAM;AAAA,UACV,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UAClD,OAAO;AAAA,UACP,QAAQ,CAAC,OAAO;AAAA,QAClB,CAAC,IACA,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CACvC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,QACxB,UAEI,MAAM,MAAM;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ;AAAA,YACN,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,YAC3C,EAAE,MAAM,SAAS,cAAc,QAAQ,GAAG;AAAA,UAC5C;AAAA,QACF,CAAC,IACA,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CACvC,EAAE,QAAQ,SAAO,gBAAgB,CAAC,cAAc,WAAW,CAAC,CAAC;AAAA,QAE7D,MAAM,YAAY,MAAM,MAAM;AAAA,UAC5B,MAAM;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UACpD;AAAA,QACF,CAAC;AAAA,QACD,SAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,SAAS;AAAA,UACT,SAAS,CAAC,EAAE,WAAW,gBAAgB,CAAC;AAAA,QAC1C,CAAC;AAAA,QACD,SAAO,WAAW,aAAa,EAAE,WAAW;AAAA,QAC5C,MAAM,aAAa,MAAM,MAAM;AAAA,UAC7B,MAAM;AAAA,UACN,UAAU;AAAA,UACV,WAAW,WAAW;AAAA,UACtB,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UACpD;AAAA,QACF,CAAC;AAAA,QACD,SAAO,UAAU,EAAE,cAAc;AAAA,UAC/B,SAAS;AAAA,UACT,SAAS,CAAC,EAAE,WAAW,aAAa,CAAC;AAAA,QACvC,CAAC;AAAA,QACD,SAAO,YAAY,QAAQ,IAAI,UAAU,EAAE,QAAQ;AAAA,UACjD,IAAI;AAAA,UACJ,YAAY;AAAA,QACd,CAAC;AAAA,QACD,SAAO,YAAY,QAAQ,IAAI,KAAK,EAAE,cAAc;AAAA,QAEpD,SACE,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,QACpD,CAAC,CACH,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAAA,QACtB,SACE,MAAM,OAAO,gBAAgB;AAAA,UAC3B;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,YAClD,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,cAAc;AAAA,UACpE;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,EAAE,QAAQ,MAAM,CAAC;AAAA,QAC3B,SACE,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UAClD,QAAQ;AAAA,YACN,EAAE,YAAY,YAAY,OAAO,GAAG;AAAA,YACpC,EAAE,YAAY,UAAU,OAAO,GAAG;AAAA,UACpC;AAAA,QACF,CAAC,CACH,EAAE,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,EAAE,YAAY,YAAY,SAAS,CAAC,EAAE,OAAO,WAAW,OAAO,EAAE,CAAC,EAAE;AAAA,YACpE,EAAE,YAAY,UAAU,SAAS,CAAC,EAAE;AAAA,UACtC;AAAA,QACF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,SAAS,cAAc;AAAA,QACvC,MAAM,SAAS,aAAa,QAAQ,sBAAsB;AAAA,QAC1D,MAAM,YAAY,MAAM,OAAO,eAAe;AAAA,UAC5C;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UACpD;AAAA,QACF,CAAC;AAAA,QACD,SAAO,WAAW,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC;AAAA,QAC5E,SAAO,WAAW,QAAQ,IAAI,UAAU,EAAE,QAAQ;AAAA,UAChD,IAAI;AAAA,UACJ,MAAM;AAAA,QACR,CAAC;AAAA,QACD,SAAO,WAAW,QAAQ,IAAI,KAAK,EAAE,cAAc;AAAA,QACnD,SACE,MAAM,OAAO,eAAe;AAAA,UAC1B;AAAA,UACA,cAAc,QAAQ;AAAA,UACtB,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS;AAAA,QAEX,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,YACpD;AAAA,YACA,YAAY;AAAA,cACV;AAAA,gBACE,QAAQ;AAAA,gBACR,WAAW;AAAA,gBACX,QAAQ,CAAC,EAAE,QAAQ,WAAW,WAAW,WAAW,CAAC;AAAA,cACvD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,iCAAiC,SAAS,OAAO,CAC/D;AAAA,QACA,MAAM,QAAQ,SAAS,QAAQ,IAAI,OAAO;AAAA,QAC1C,SAAO,MAAM,QAAQ,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,QACtC,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,UAAG,MAAM,IAAI,MAAM,yBAAyB;AAAA,QACpE,SAAO,MAAM,IAAI,cAAc,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,UAAU,CAAC;AAAA,QAC1E,MAAM,kBAAkB,MAAM,IAAI,OAAO;AAAA,QACzC,SAAO,eAAe,EAAE,cAAc,EAAE,WAAW,YAAY,CAAC;AAAA,QAChE,IAAI,CAAC,mBAAmB,MAAM,QAAQ,eAAe,GAAG;AAAA,UACtD,MAAM,IAAI,MAAM,+BAA+B;AAAA,QACjD;AAAA,QACA,SAAO,gBAAgB,UAAU,EAAE,QAAQ;AAAA,UACzC,IAAI;AAAA,UACJ,MAAM;AAAA,QACR,CAAC;AAAA,QACD,SAAO,gBAAgB,KAAK,EAAE,cAAc;AAAA,OAC7C;AAAA,KACF;AAAA,IAED,OAAK,6EAA6E,YAAY;AAAA,MAC5F,MAAM,YAAY,SAAS,cAAc;AAAA,QACvC,MAAM,SAAS,aAAa,QAAQ,wBAAwB,iBAAiB,CAAC;AAAA,QAC9E,SACE,MAAM,OAAO,WAAW;AAAA,UACtB;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa,CAAC;AAAA,UACnE,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC,CACH,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,QAAQ,WAAW,CAAC,GAAG,SAAS,MAAM,CAAC;AAAA,QACnE,SACE,MAAM,OAAO,WAAW;AAAA,UACtB;AAAA,UACA,YAAY,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa,CAAC;AAAA,UACnE,WAAW;AAAA,UACX,uBAAuB,CAAC,SAAS,EAAE;AAAA,UACnC,OAAO;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,MAAM,CAAC;AAAA,OACxC;AAAA,KACF;AAAA,IAED,OAAK,8EAA8E,YAAY;AAAA,MAC7F,MAAM,YAAY,SAAS,cAAc;AAAA,QACvC,MAAM,iBAAiB,aAAa,QAAQ,wBAAwB,cAAc,GAAG;AAAA,aAChF;AAAA,UACH,mBAAmB;AAAA,QACrB,CAAC;AAAA,QACD,MAAM,SAAO,eAAe,KAAK,EAAE,uBAAU,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,UACrE,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,aAAa,aAAa,QAAQ,wBAAwB,cAAc,GAAG;AAAA,aAC5E;AAAA,UACH,oBAAoB;AAAA,QACtB,CAAC;AAAA,QACD,MAAM,SACJ,WAAW,oBAAoB;AAAA,UAC7B;AAAA,UACA,OAAO,CAAC,EAAE,cAAc,SAAS,IAAI,WAAW,gBAAgB,CAAC;AAAA,QACnE,CAAC,CACH,EAAE,QAAQ,cAAc;AAAA,UACtB,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,aAAa,aAAa,QAAQ,wBAAwB,cAAc,GAAG;AAAA,aAC5E;AAAA,UACH,mBAAmB;AAAA,QACrB,CAAC;AAAA,QACD,MAAM,SACJ,WAAW,eAAe;AAAA,UACxB;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,UAClD,QAAQ,MAAM,KAAK,EAAE,QAAQ,yBAAyB,EAAE,GAAG,CAAC,GAAG,WAAW;AAAA,YACxE,YAAY,SAAS;AAAA,YACrB,OAAO;AAAA,UACT,EAAE;AAAA,QACJ,CAAC,CACH,EAAE,QAAQ,QAAQ,iBAAiB,+BAA+B;AAAA,OACnE;AAAA,KACF;AAAA,GACF;AAAA;AAGH,SAAS,YAAY,CACnB,SACA,QAAiC,cAAc,GAC/C,kBAA6C,QAC1B;AAAA,EACnB,OAAO,QAAQ,wBAAwB;AAAA,IACrC;AAAA,IACA,OAAO,+BAA+B,KAAK;AAAA,IAC3C,QAAQ;AAAA,EACV,CAAC;AAAA;AAGH,SAAS,aAAa,GAA4B;AAAA,EAChD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,QACE,QAAQ,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,QAC7D,MAAM;AAAA,UACJ,SAAS;AAAA,YACP;AAAA,cACE,cAAc,SAAS;AAAA,cACvB,aAAa,CAAC,MAAM,SAAS,QAAQ,YAAY,WAAW;AAAA,YAC9D;AAAA,UACF;AAAA,UACA,OAAO;AAAA,YACL;AAAA,cACE,aAAa;AAAA,gBACX;AAAA,kBACE,oBAAoB,SAAS;AAAA,kBAC7B,QAAQ;AAAA,kBACR,qBAAqB,CAAC,SAAS,EAAE;AAAA,kBACjC,aAAa,CAAC,UAAU;AAAA,gBAC1B;AAAA,gBACA;AAAA,kBACE,oBAAoB,SAAS;AAAA,kBAC7B,QAAQ;AAAA,kBACR,qBAAqB,CAAC,SAAS,EAAE;AAAA,kBACjC,aAAa,CAAC,SAAS,UAAU;AAAA,gBACnC;AAAA,cACF;AAAA,cACA,QAAQ;AAAA,gBACN,SAAS,CAAC,EAAE,cAAc,SAAS,IAAI,aAAa,CAAC,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,gBAC7E,OAAO;AAAA,kBACL;AAAA,oBACE,aAAa;AAAA,sBACX;AAAA,wBACE,oBAAoB,SAAS;AAAA,wBAC7B,QAAQ;AAAA,wBACR,qBAAqB,CAAC,QAAQ,EAAE;AAAA,wBAChC,aAAa,CAAC;AAAA,sBAChB;AAAA,oBACF;AAAA,oBACA,QAAQ;AAAA,sBACN,SAAS,CAAC,EAAE,cAAc,QAAQ,IAAI,aAAa,CAAC,MAAM,MAAM,EAAE,CAAC;AAAA,sBACnE,OAAO,CAAC;AAAA,oBACV;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,YACA;AAAA,cACE,aAAa;AAAA,gBACX;AAAA,kBACE,oBAAoB,SAAS;AAAA,kBAC7B,QAAQ;AAAA,kBACR,qBAAqB,CAAC,SAAS,EAAE;AAAA,kBACjC,aAAa,CAAC;AAAA,gBAChB;AAAA,cACF;AAAA,cACA,QAAQ;AAAA,gBACN,SAAS,CAAC,EAAE,cAAc,SAAS,IAAI,aAAa,CAAC,MAAM,YAAY,EAAE,CAAC;AAAA,gBAC1E,OAAO,CAAC;AAAA,cACV;AAAA,YACF;AAAA,YACA;AAAA,cACE,aAAa;AAAA,gBACX;AAAA,kBACE,oBAAoB,SAAS;AAAA,kBAC7B,QAAQ;AAAA,kBACR,qBAAqB,CAAC,SAAS,EAAE;AAAA,kBACjC,aAAa,CAAC;AAAA,gBAChB;AAAA,cACF;AAAA,cACA,QAAQ;AAAA,gBACN,SAAS,CAAC,EAAE,cAAc,SAAS,IAAI,aAAa,CAAC,MAAM,OAAO,EAAE,CAAC;AAAA,gBACrE,OAAO,CAAC;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAGF,SAAS,gBAAgB,GAA4B;AAAA,EACnD,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,QACE,QAAQ,EAAE,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,QAC7D,MAAM;AAAA,UACJ,SAAS,CAAC,EAAE,cAAc,SAAS,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;AAAA,UAC5D,OAAO;AAAA,YACL;AAAA,cACE,aAAa;AAAA,gBACX;AAAA,kBACE,oBAAoB,SAAS;AAAA,kBAC7B,QAAQ;AAAA,kBACR,qBAAqB,CAAC,QAAQ,EAAE;AAAA,kBAChC,aAAa,CAAC;AAAA,gBAChB;AAAA,cACF;AAAA,cACA,QAAQ;AAAA,gBACN,SAAS,CAAC,EAAE,cAAc,QAAQ,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;AAAA,gBAC3D,OAAO,CAAC;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAGF,eAAe,KAAI,CAAC,SAAiD;AAAA,EACnE,MAAM,QAAQ,KAAK;AAAA,IACjB,SAAS;AAAA,MACP,OAAO,SAAS,IAAI,cAAc;AAAA,QAChC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW,CAAC,GAAG,CAAC;AAAA,QAChB,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,OAAO,SAAS,IAAI,cAAc;AAAA,QAChC,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW,CAAC,GAAG,CAAC;AAAA,QAChB,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,OAAO,SAAS,IAAI,iBAAiB;AAAA,QACnC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,OAAO,SAAS,IAAI,eAAe,EAAE,IAAI,eAAe,MAAM,cAAc,CAAC;AAAA,MAC7E,OAAO,SAAS,IAAI,cAAc;AAAA,QAChC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,YAAY;AAAA,MACd,CAAC;AAAA,MACD,OAAO,QAAQ,IAAI,aAAa;AAAA,QAC9B,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,OAAO,QAAQ,IAAI,kBAAkB;AAAA,QACnC,IAAI;AAAA,QACJ,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,MACL,QAAQ,SAAS,IAAI,cAAc,SAAS,SAAS,IAAI,iBAAiB;AAAA,QACxE,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,QAAQ,SAAS,IAAI,cAAc,SAAS,SAAS,IAAI,aAAa;AAAA,MACtE,QAAQ,SAAS,IAAI,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,MAC5E,QAAQ,SAAS,IAAI,cAAc,aAAa,SAAS,IAAI,YAAY;AAAA,MACzE,QAAQ,SAAS,IAAI,cAAc,WAAW,SAAS,IAAI,YAAY;AAAA,MACvE,QAAQ,SAAS,IAAI,iBAAiB,WAAW,QAAQ,IAAI,WAAW;AAAA,MACxE,QAAQ,SAAS,IAAI,cAAc,WAAW,QAAQ,IAAI,gBAAgB;AAAA,MAC1E,QAAQ,SAAS,IAAI,cAAc,YAAY,QAAQ,IAAI,gBAAgB;AAAA,MAC3E,QAAQ,SAAS,IAAI,cAAc,YAAY,QAAQ,IAAI,WAAW;AAAA,IACxE;AAAA,EACF,CAAC;AAAA;AAGH,SAAS,MAAM,CACb,cACA,WACA,YAC2B;AAAA,EAC3B,OAAO;AAAA,IACL,KAAK,EAAE,cAAc,UAAU;AAAA,IAC/B;AAAA,EACF;AAAA;AAGF,SAAS,OAAO,CACd,oBACA,iBACA,QACA,oBACA,iBACA,YACyB;AAAA,EACzB,OAAO;AAAA,IACL,KAAK;AAAA,MACH,QAAQ,EAAE,cAAc,oBAAoB,WAAW,gBAAgB;AAAA,MACvE;AAAA,MACA,QAAQ,EAAE,cAAc,oBAAoB,WAAW,gBAAgB;AAAA,IACzE;AAAA,OACI,eAAe,YAAY,CAAC,IAAI,EAAE,WAAW;AAAA,EACnD;AAAA;;ACz6BF,qBAAS,sBAAU,kBAAQ;AAsC3B,IAAM,sBAAsB,CAC1B,WACA,eAAe,wBACwE;AAAA,EACvF;AAAA,EACA,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX;AAAA,IACA,WAAW,WAAW,UAAU,SAAS,GAAG,GAAG;AAAA,EACjD;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe;AACjB;AAEA,IAAM,wBAAwB;AAAA,EAC5B,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAClB;AAaA,SAAS,qBAAqB,CAAC,SAAwC;AAAA,EACrE,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,WAAW;AAAA,IACX,IAAI;AAAA,EACN;AAAA;AASK,SAAS,+BAAgF,CAC9F,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7B,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,2EAA2E,YAAY;AAAA,MAC1F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBAAgB,SAAS,YAAY;AAAA,QAC3C,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACpD,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC;AAAA,QACD,SAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,aAAa;AAAA,UACb,QAAQ,EAAE,UAAU,aAAa;AAAA,QACnC,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,QAAQ,oBAAoB;AAAA,UACjD,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,MAAM;AAAA,QAEhB,MAAM,SAAO,gBAAgB,SAAS,YAAY,CAAC,EAAE,QAAQ,cAAc;AAAA,UACzE,MAAM;AAAA,QACR,CAAC;AAAA,QACD,MAAM,YAAY,gBAAgB,mBAAmB,cAAc,CAAC;AAAA,QAClE,UAAU,OAAsC,iBAAiB;AAAA,QACjE,UAAU,OAAmC,cAAc;AAAA,QAC7D,MAAM,SACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,MAAM,wBAAwB,IAAI,SAAS;AAAA,UAC3C,MAAM,GAAG,SAAS,iBAAiB,MAAM,SAAS;AAAA,SACnD,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,cAAc,CAAC;AAAA,QAE/C,MAAM,OAAO,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAAA,UAC/C,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,SAAO,IAAI,EAAE,cAAc,EAAE,OAAO,GAAG,SAAS,MAAM,CAAC;AAAA,QACvD,SAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,OACvE;AAAA,KACF;AAAA,IAED,OAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,mBAAmB,mBAAmB;AAAA,QACrD,MAAM,SACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,MAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,MAAM,MAAM;AAAA,UAC/D,MAAM,GAAG,SAAS,iBAAiB,SAAS;AAAA,YAC1C;AAAA,YACA,cAAc;AAAA,cACZ,mBAAmB,CAAC;AAAA,cACpB,QAAQ,mBAAmB,OAAO,OAAO,EAAE;AAAA,YAC7C;AAAA,UACF,CAAC;AAAA,SACF,CACH,EAAE,QAAQ,QAAQ;AAAA,QAClB,MAAM,SACJ,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UAC/B,WAAW,OAAO,OAAO;AAAA,UACzB,IAAI,OAAO,OAAO;AAAA,QACpB,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,OAAK,yEAAyE,YAAY;AAAA,MACxF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,mBAAmB,kBAAkB;AAAA,QACpD,MAAM,SAAO,QAAQ,SAAS,iBAAiB,MAAM,MAAM,CAAC,EAAE,QAAQ,QACpE,4BACF;AAAA,QAEA,MAAM,SACJ,kBAAkB,SAAS,sBAAsB,EAAE,cAAc,KAAK,CAAC,CACzE,EAAE,QAAQ,QAAQ,oCAAoC;AAAA,QACtD,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClC,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,CAAC,CAAC;AAAA,QAEZ,IAAI;AAAA,QACJ,MAAM,SACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,MAAM,eAAe,mBAAmB,gBAAgB;AAAA,UACxD,MAAM,wBAAwB,IAAI,YAAY;AAAA,UAC9C,gBAAgB,MAAM,GAAG,SAAS,iBAAiB,MAAM,YAAY;AAAA,SACtE,CACH,EAAE,QAAQ,QAAQ,oCAAoC;AAAA,QACtD,IAAI,CAAC;AAAA,UAAe,MAAM,IAAI,MAAM,uCAAuC;AAAA,QAC3E,MAAM,eAAe;AAAA,QACrB,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,UACtC,MAAM,SACJ,GAAG,SAAS,iBAAiB,SAAS;AAAA,YACpC,SAAS;AAAA,YACT,cAAc;AAAA,cACZ,mBAAmB,CAAC;AAAA,cACpB,QAAQ,mBAAmB,gBAAgB;AAAA,YAC7C;AAAA,UACF,CAAC,CACH,EAAE,QAAQ,QAAQ,UAAU;AAAA,SAC7B;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,mFAAmF,YAAY;AAAA,MAClG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,oBAAoB,IAAI;AAAA,QACzC,MAAM,UAAU,MAAM,uBAAuB,SAAS;AAAA,UACpD,IAAI;AAAA,UACJ,WAAW;AAAA,UACX;AAAA,UACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,aAAY,QAAQ;AAAA,QAC1B,MAAM,SAAS,EAAE,cAAc,SAAS,aAAa;AAAA,QACrD,MAAM,SACJ,QAAQ,SAAS,QAAQ,qBAAqB;AAAA,UAC5C,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,gBAAgB,SAAS;AAAA,UACzB,oBAAoB,SAAS;AAAA,UAC7B,eAAe,SAAS;AAAA,UACxB,kBAAkB,SAAS;AAAA,UAC3B,WAAW;AAAA,QACb,CAAC,CACH,EAAE,QAAQ,QAAQ,UAAU;AAAA,QAC5B,MAAM,QAAQ,SAAS,QAAQ,qBAAqB;AAAA,UAClD,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,gBAAgB,SAAS;AAAA,UACzB,oBAAoB,SAAS;AAAA,UAC7B,eAAe,SAAS;AAAA,UACxB,kBAAkB,SAAS;AAAA,UAC3B,WAAW;AAAA,QACb,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU,EAAE,WAAW,oBAAoB,OAAO,CAAC,CACpF,EAAE,SAAS;AAAA,QAEX,MAAM,MAAM;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,kBAAkB,WAAW,MAAM;AAAA,UAC1D;AAAA,UACA,WAAW;AAAA,YACT,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,kBAAkB,WAAW,MAAM;AAAA,YACxD,YAAY,EAAE,MAAM,MAAM;AAAA,UAC5B;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,QACA,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACvC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM,CAAC,GAAG;AAAA,QACZ,CAAC,CACH,EAAE,QAAQ,EAAE,UAAU,GAAG,WAAW,EAAE,CAAC;AAAA,QACvC,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACvC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM,CAAC,GAAG;AAAA,QACZ,CAAC,CACH,EAAE,QAAQ,EAAE,UAAU,GAAG,WAAW,EAAE,CAAC;AAAA,QACvC,MAAM,SACJ,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACjC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM;AAAA,YACJ;AAAA,iBACK;AAAA,cACH,WAAW,KAAK,IAAI,WAAW,YAAY,EAAE,MAAM,YAAY,EAAE;AAAA,YACnE;AAAA,UACF;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,QAAQ;AAAA,QAElB,MAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACrD,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,SAAS;AAAA,QACX,CAAC;AAAA,QACD,SAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,SAAS,WAAW,GAAG,gBAAgB,EAAE,CAAC;AAAA,QAEhF,MAAM,YAAY,MAAM,QAAQ,eAAe,eAAe;AAAA,UAC5D,IAAI,QAAQ,IAAI;AAAA,UAChB,WAAW,QAAQ,IAAI;AAAA,UACvB;AAAA,UACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACjC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM,CAAC;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAAA,QAClD,MAAM,SACJ,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACjC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,SAAS;AAAA,QACX,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAAA,QAClD,MAAM,SACJ,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UAC/B,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,aAAa;AAAA,QACf,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAAA,QAClD,MAAM,YAAY,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACvD,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA,WAAW,UAAU;AAAA,UACrB,aAAa;AAAA,QACf,CAAC;AAAA,QACD,SAAO,SAAS,EAAE,cAAc,EAAE,QAAQ,aAAa,gBAAgB,KAAK,CAAC;AAAA,QAC7E,SACE,MAAM,QAAQ,SAAS,QAAQ,kBAAkB,EAAE,WAAW,mBAAmB,CAAC,CACpF,EAAE,QAAQ,EAAE,OAAO,GAAG,kBAAkB,2BAA2B,CAAC;AAAA,QAEpE,SACE,MAAM,QAAQ,SAAS,QAAQ,gBAAgB;AAAA,UAC7C,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,EAAE,aAAa,GAAG,yBAAyB,EAAE,CAAC;AAAA,QACxD,SACE,MAAM,QAAQ,SAAS,QAAQ,gBAAgB;AAAA,UAC7C,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,EAAE,aAAa,GAAG,yBAAyB,EAAE,CAAC;AAAA,QACxD,SACE,MAAM,QAAQ,SAAS,QAAQ,kBAAkB,EAAE,WAAW,mBAAmB,CAAC,CACpF,EAAE,QAAQ,EAAE,OAAO,GAAG,kBAAkB,KAAK,CAAC;AAAA,OAC/C;AAAA,KACF;AAAA,IAED,OAAK,oFAAoF,YAAY;AAAA,MACnG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,0BAA0B,SAAS,WAAW,iBAAiB,IAAI;AAAA,QACvF,MAAM,uBACJ,SACA,OACA,MACA,qBACA,0BACF;AAAA,QACA,MAAM,YAAY,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACzD,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,QACD,SAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,mBAAmB,MAAM;AAAA,UACzB,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,UACzC,WAAW;AAAA,UACX,QAAQ,EAAE,MAAM,cAAc,iBAAiB,MAAM,UAAU,gBAAgB;AAAA,QACjF,CAAC,CACH,EAAE,cAAc,EAAE,IAAI,oBAAoB,CAAC;AAAA,QAC3C,MAAM,SACJ,uBACE,SACA,OACA,WACA,+BACA,0BACF,CACF,EAAE,QAAQ,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAAA,QAEnD,MAAM,OAAO,MAAM,0BAA0B,SAAS,YAAY,kBAAkB,IAAI;AAAA,QACxF,MAAM,QAAQ,MAAM,0BAA0B,SAAS,aAAa,mBAAmB,IAAI;AAAA,QAC3F,MAAM,uBACJ,SACA,MACA,WACA,sBACA,0BACF;AAAA,QACA,MAAM,SACJ,uBACE,SACA,OACA,WACA,uBACA,0BACF,CACF,EAAE,QAAQ,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAAA,QACpD,MAAM,gBAAgB,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UAC7D,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,QACD,SAAO,aAAa,EAAE,cAAc,EAAE,mBAAmB,KAAK,kBAAkB,CAAC;AAAA,QAEjF,MAAM,QAAQ,MAAM,0BAClB,SACA,wBACA,8BACA,IACF;AAAA,QACA,MAAM,YAAY,MAAM,QAAQ,eAAe,eAAe;AAAA,UAC5D,IAAI,MAAM,UAAU;AAAA,UACpB,WAAW;AAAA,UACX,UAAU,MAAM;AAAA,UAChB,QAAQ,EAAE,cAAc,iBAAiB;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,SACJ,uBACE,SACA,OACA,eACA,2BACA,0BACF,CACF,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAC5C,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,UACd,WAAW,UAAU;AAAA,UACrB,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,SAAS,QAAQ,gBAAgB;AAAA,UAC7D,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,QAAQ,uBAAuB,EAAE,uBAAuB,CAAC;AAAA,QAChE,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACvC,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,QAChB,CAAC,CACH,EAAE,cAAc,EAAE,mBAAmB,KAAK,kBAAkB,CAAC;AAAA,QAC7D,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,UACd,mBAAmB,MAAM;AAAA,UACzB,WAAW,MAAM;AAAA,UACjB,aAAa;AAAA,QACf,CAAC,CACH,EAAE,cAAc,EAAE,QAAQ,YAAY,CAAC;AAAA,OACxC;AAAA,KACF;AAAA,IAED,OAAK,oFAAoF,YAAY;AAAA,MACnG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SACJ,kBAAkB,SAAS,eAAe,EAAE,oBAAoB,KAAK,CAAC,CACxE,EAAE,QAAQ,QAAQ,mBAAmB;AAAA,QACrC,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClC,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,CAAC,CAAC;AAAA,QAEZ,MAAM,kBAAkB,SAAS,WAAW;AAAA,QAC5C,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,GAAG,cAAc,YAAY,CAAC;AAAA,QAEhF,MAAM,SACJ,kBAAkB,SAAS,oBAAoB,EAAE,WAAW,YAAY,CAAC,CAC3E,EAAE,QAAQ,QAAQ,cAAc;AAAA,QAChC,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,GAAG,cAAc,YAAY,CAAC;AAAA,OACjF;AAAA,KACF;AAAA,IAED,OAAK,qFAAqF,YAAY;AAAA,MACpG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,MAAM,kBAAkB,SAAS,UAAU;AAAA,QAC3D,MAAM,UAAU,MAAM,kBAAkB,SAAS,UAAU;AAAA,QAC3D,MAAM,SACJ,QAAQ,SAAS,OAAO,MAAM;AAAA,UAC5B,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,QAAQ,eAAe;AAAA,QACjC,MAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAChD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,QAC5B,SAAO,MAAM,EAAE,EAAE,cAAc,EAAE,UAAU,GAAG,SAAS,YAAY,CAAC;AAAA,QACpE,SAAO,MAAM,GAAG,SAAS,EAAE,EAAE,KAAK,CAAC,QAAQ,SAAS,QAAQ,OAAO,EAAE,KAAK,EAAE,EAAE;AAAA,QAC9E,MAAM,aAAa,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UACrD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,UAAU,EAAE,aAAa,CAAC;AAAA,QACjC,SAAO,WAAW,GAAG,SAAS,EAAE,EAAE,IAAI,KAAK,MAAM,GAAG,SAAS,EAAE;AAAA,QAE/D,MAAM,YAAY,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UACpD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,UAAU,GAAG,SAAS,EAAE,EAAE,KAAK,MAAM,GAAG,SAAS,EAAE;AAAA,QAC1D,MAAM,SACJ,QAAQ,SAAS,OAAO,cAAc;AAAA,UACpC,WAAW;AAAA,UACX,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE;AAAA,UAC1B,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC,CACH,EAAE,QAAQ,QAAQ,sBAAsB;AAAA,QACxC,MAAM,QAAQ,SAAS,OAAO,WAAW;AAAA,UACvC,WAAW;AAAA,UACX,KAAK,CAAC,UAAU,GAAG,SAAS,EAAE;AAAA,UAC9B,SAAS;AAAA,UACT,aAAa;AAAA,UACb,SAAS,sBAAsB,oBAAoB;AAAA,QACrD,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,QAAQ,EAAE,EAAE,cAAc;AAAA,UAC/B,UAAU;AAAA,UACV,aAAa,sBAAsB,oBAAoB;AAAA,QACzD,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO,WAAW;AAAA,UACvC,WAAW;AAAA,UACX,KAAK,CAAC,QAAQ,GAAG,SAAS,EAAE;AAAA,UAC5B,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,QACD,MAAM,uBAAuB,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAC/D,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,qBAAqB,EAAE,EAAE,cAAc;AAAA,UAC5C,UAAU;AAAA,UACV,aAAa,sBAAsB,oBAAoB;AAAA,QACzD,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,OAAO,UAAU,EAAE,WAAW,mBAAmB,CAAC,CAC3E,EAAE,cAAc,EAAE,cAAc,GAAG,eAAe,GAAG,aAAa,EAAE,CAAC;AAAA,QACrE,MAAM,QAAQ,SAAS,OAAO,cAAc;AAAA,UAC1C,WAAW;AAAA,UACX,KAAK,CAAC,qBAAqB,GAAG,SAAS,EAAE;AAAA,UACzC,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,OAAO,eAAe;AAAA,UAC3C,WAAW;AAAA,UACX,iBAAiB;AAAA,UACjB,OAAO;AAAA,QACT,CAAC,CACH,EAAE,KAAK,CAAC;AAAA,OACT;AAAA,KACF;AAAA,IAED,OAAK,yEAAyE,YAAY;AAAA,MACxF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,kBAAkB,SAAS,gBAAgB;AAAA,QACjD,MAAM,kBAAkB,SAAS,gBAAgB;AAAA,QACjD,MAAM,UAAU,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,OAAO,EAAE,aAAa,CAAC;AAAA,QAC9B,OAAO,aAAa,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UACtD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,YAAY,QAAQ,KAAK,CAAC,QAAQ,IAAI,SAAS,OAAO,UAAW,SAAS,EAAE;AAAA,QAElF,IAAI;AAAA,QACJ,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,UACtC,IAAI;AAAA,YACF,MAAM,GAAG,SAAS,OAAO,cAAc;AAAA,cACrC,WAAW;AAAA,cACX,KAAK,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;AAAA,cACzC,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AAAA,YACD,OAAO,OAAO;AAAA,YACd,WAAW;AAAA;AAAA,SAEd;AAAA,QACD,SAAO,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAAA,QAEvD,MAAM,QAAQ,SAAS,OAAO,cAAc;AAAA,UAC1C,WAAW;AAAA,UACX,KAAK,CAAC,UAAU,SAAS,EAAE;AAAA,UAC3B,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAA8C;AAAA,UAClD,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,gBAAgB;AAAA,YACd,WAAW;AAAA,YACX,WAAW;AAAA,YACX,WAAW;AAAA,UACb;AAAA,UACA,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,MAAM,MAAM,MAAM,uBAAuB,SAAS;AAAA,UAChD,IAAI;AAAA,UACJ,WAAW;AAAA,UACX;AAAA,UACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,UACzC,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,UAAU,OAAO,eAAwB;AAAA,UAC7C,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,YACtC,IAAI,CAAC,GAAG,gBAAgB;AAAA,cACtB,MAAM,IAAI,MAAM,wDAAwD;AAAA,YAC1E;AAAA,YACA,MAAM,SAAS,gBAAgB,UAAU,IAAI,IAAI,IAAI,IAAI,IAAI,WAAW;AAAA,YACxE,MAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,MAAM,MAAM;AAAA,YAC/D,MAAM,GAAG,SAAS,iBAAiB,SAAS;AAAA,cAC1C;AAAA,cACA,cAAc;AAAA,gBACZ,mBAAmB,CAAC;AAAA,gBACpB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,UAAU,OAAO,OAAO;AAAA,kBACxB,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,aAAa,OAAO,OAAO;AAAA,kBAC3B,eAAe;AAAA,kBACf,eAAe;AAAA,kBACf,iBAAiB;AAAA,kBACjB,sBAAsB;AAAA,gBACxB;AAAA,cACF;AAAA,YACF,CAAC;AAAA,YACD,MAAM,GAAG,eAAe,2BAA2B;AAAA,cACjD,IAAI,IAAI,IAAI;AAAA,cACZ,WAAW,IAAI,IAAI;AAAA,cACnB;AAAA,cACA,gBAAgB,IAAI,UAAU;AAAA,cAC9B,cAAc;AAAA,cACd,eAAe;AAAA,cACf,kBAAkB;AAAA,cAClB,gBAAgB;AAAA,YAClB,CAAC;AAAA,YACD,IAAI;AAAA,cAAY,MAAM,IAAI,MAAM,oBAAoB;AAAA,WACrD;AAAA;AAAA,QAGH,MAAM,SAAO,QAAQ,IAAI,CAAC,EAAE,QAAQ,QAAQ,oBAAoB;AAAA,QAChE,SACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,UACzC,WAAW;AAAA,UACX,QAAQ,EAAE,MAAM,aAAa,iBAAiB,IAAI,IAAI,IAAI,cAAc,EAAE;AAAA,QAC5E,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,eAAe,QAAQ,EAAE,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,GAAG,CAAC,CACvF,EAAE,cAAc;AAAA,UACd,qBAAqB,EAAE,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,MAAM;AAAA,QACtF,CAAC;AAAA,QAED,MAAM,QAAQ,KAAK;AAAA,QACnB,SACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,UACzC,WAAW;AAAA,UACX,QAAQ,EAAE,MAAM,aAAa,iBAAiB,IAAI,IAAI,IAAI,cAAc,EAAE;AAAA,QAC5E,CAAC,CACH,EAAE,cAAc,EAAE,IAAI,mBAAmB,CAAC;AAAA,QAC1C,SACE,MAAM,QAAQ,eAAe,QAAQ,EAAE,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,GAAG,CAAC,CACvF,EAAE,cAAc;AAAA,UACd,qBAAqB,EAAE,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,KAAK;AAAA,QACrF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,yBAAyB,CACtC,SACA,OACA,mBACA,WACyB;AAAA,EACzB,MAAM,WAAW,oBAAoB,SAAS;AAAA,EAC9C,MAAM,MAAM,MAAM,uBAAuB,SAAS;AAAA,IAChD,IAAI;AAAA,IACJ,WAAW;AAAA,IACX;AAAA,IACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,EAC3C,CAAC;AAAA,EACD,MAAM,aAAY,IAAI;AAAA,EACtB,MAAM,SAAS,EAAE,cAAc,SAAS,aAAa;AAAA,EACrD,MAAM,QAAQ,SAAS,QAAQ,qBAAqB;AAAA,IAClD,WAAW,IAAI,IAAI;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,gBAAgB,SAAS;AAAA,IACzB,oBAAoB,SAAS;AAAA,IAC7B,eAAe,SAAS;AAAA,IACxB,kBAAkB,SAAS;AAAA,IAC3B,WAAW,SAAS,eAAe;AAAA,EACrC,CAAC;AAAA,EACD,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,IACvC,WAAW,IAAI,IAAI;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,SAAS,IAAI,KAAK,KAAK,MAAM,SAAS,eAAe,SAAS,IAAI,IAAK,EAAE,YAAY;AAAA,EACvF,CAAC;AAAA,EACD,OAAO,EAAE,UAAU,uBAAW,mBAAmB,QAAQ,aAAa,IAAI,IAAI,YAAY;AAAA;AAG5F,eAAe,sBAAsB,CACnC,SACA,WACA,gBACA,UACA,aACe;AAAA,EACf,MAAM,WAAW;AAAA,IACf,QAAQ,UAAU;AAAA,IAClB,yBAAyB,gBAAgB,qBAAqB;AAAA,IAC9D,cAAc,gBAAgB,gBAAgB;AAAA,EAChD;AAAA,EACA,MAAM,SAAoC;AAAA,IACxC,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,gBAAgB,cAAc;AAAA,MAC9B,aAAa,QAAQ;AAAA,MACrB,aAAa,UAAU;AAAA,MACvB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,cAAc,UAAU,OAAO;AAAA,QAC/B,iBAAiB,UAAU,UAAU;AAAA,QACrC,WAAW,UAAU,SAAS,eAAe;AAAA,QAC7C,kBAAkB,UAAU,SAAS,eAAe;AAAA,MACtD;AAAA,MACA,kBAAkB,UAAU,SAAS;AAAA,MACrC,oBAAoB,UAAU,SAAS;AAAA,MACvC,eAAe,UAAU,SAAS;AAAA,MAClC,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,UAAU;AAAA,QAClB,gBAAgB,UAAU,SAAS;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACtF;AAAA,EACA,MAAM,eAAgD;AAAA,IACpD,mBAAmB;AAAA,MACjB;AAAA,QACE,QAAQ,UAAU;AAAA,QAClB,mBAAmB,UAAU;AAAA,QAC7B,WAAW,UAAU;AAAA,QACrB,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,gBAAgB,UAAU,SAAS;AAAA,QACnC,oBAAoB,UAAU,SAAS;AAAA,QACvC,eAAe,UAAU,SAAS;AAAA,QAClC,kBAAkB,UAAU,SAAS;AAAA,QACrC;AAAA,QACA,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,IACtC,IAAI,CAAC,GAAG,gBAAgB;AAAA,MACtB,MAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAAA,IACA,MAAM,GAAG,eAAe,uBAAuB;AAAA,MAC7C,IAAI,UAAU,UAAU;AAAA,MACxB,WAAW,OAAO,OAAO;AAAA,MACzB,UAAU,UAAU;AAAA,MACpB,gBAAgB,UAAU,UAAU;AAAA,IACtC,CAAC;AAAA,IACD,MAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,MAAM,MAAM;AAAA,IAC/D,WAAW,cAAc,CAAC,UAAU,MAAM,GAAY;AAAA,MACpD,iBAAiB,SAAS,GAAG,SAAS,iBAAiB,6BAA6B;AAAA,QAClF;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,4BAA4B,UAAU;AAAA,QACtC;AAAA,QACA,UAAU;AAAA,MACZ,CAAC,GAAG,CAEJ;AAAA,IACF;AAAA,IACA,MAAM,GAAG,SAAS,iBAAiB,SAAS,EAAE,SAAS,aAAa,CAAC;AAAA,GACtE;AAAA;AAGH,SAAS,eAAe,CACtB,UACA,iBACA,cAC2B;AAAA,EAC3B,IAAI,SAAS,aAAa;AAAA,IAAa,MAAM,IAAI,MAAM,6BAA6B;AAAA,EACpF,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,cAAc,SAAS;AAAA,UACvB;AAAA,UACA,WAAW,SAAS,eAAe;AAAA,UACnC,kBAAkB,SAAS,eAAe;AAAA,UAC1C,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MACA,kBAAkB,SAAS;AAAA,MAC3B,oBAAoB,SAAS;AAAA,MAC7B,eAAe,SAAS;AAAA,MACxB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY,EAAE,cAAc,SAAS,aAAa;AAAA,UAClD,gBAAgB,SAAS;AAAA,UACzB,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,YAAY;AAAA,QACZ,iBAAiB;AAAA,MACnB;AAAA,MACA,aAAa;AAAA,IACf;AAAA,IACA,UAAU,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC9E;AAAA;;ACh9BF,eAAsB,2BAA2B,CAC/C,YACA,OAMiB;AAAA,EACjB,MAAM,eAAc,MAAM,eAAe,2BAA2B,MAAM;AAAA,EAC1E,MAAM,WAAW,MAAM,WAAW,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,aAAY,CAAC;AAAA,EACzF,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,MAAM,YAAiC;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,EACf;AAAA,EACA,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,MAAM,QAAQ;AAAA,IAC9D,eAAe,oBAAoB,MAAM;AAAA,IACzC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA,EACD,OAAO;AAAA;AAIT,eAAsB,oBAAoB,CACxC,SACA,OAC4B;AAAA,EAC5B,IAAI,CAAC,QAAQ;AAAA,IACX,MAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE,MAAM,eAAc,MAAM,4BAA4B,QAAQ,YAAY;AAAA,IACxE,WAAW,MAAM;AAAA,IACjB,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,EACf,CAAC;AAAA,EACD,OAAO,QAAQ,aAAa,MAAM,KAAK,OAAO,0BAAY,CAAC;AAAA;AAI7D,eAAsB,oBAAoB,CACxC,SACA,OAG4B;AAAA,EAC5B,QAAQ,cAAc,cAAc;AAAA,EACpC,MAAM,qBAAqB,SAAS,KAAK,WAAW,UAAU,UAAU,CAAC;AAAA,EACzE,OAAO,QAAQ,aAAc,MAAM;AAAA,IACjC,IAAI,MAAM;AAAA,IACV,WAAW,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAAA;;AC9DH,qBAAS,sBAAU,kBAAQ;AAgC3B,IAAM,cAAY;AAClB,IAAM,eAAe,EAAE,cAAc,SAAS;AAE9C,IAAM,WAAU;AAAA,EACd,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,IAAI;AAAA,EACJ,SAAS,EAAE,cAAc,oBAAoB,OAAO,aAAa;AACnE;AAEA,IAAM,uBAAsB;AAAA,EAC1B,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe;AACjB;AAEA,IAAM,oBAAoB;AAAA,EACxB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe;AACjB;AAGO,SAAS,oCAA2E,CACzF,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAClB,SACkB;AAAA,IAClB,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7B,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,iBAAiB,YAAY;AAAA,QAC3C,MAAM,SACJ,QAAQ,eAAe,MAAM;AAAA,aACxB;AAAA,UACH,aAAa;AAAA,QACf,CAAC,CACH,EAAE,QAAQ,QAAQ;AAAA,QAElB,MAAM,yBAAyB;AAAA,QAC/B,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ,WAAW,MAAM;AAAA,UACjB,UAAU,EAAE,MAAM,aAAa,MAAM,cAAc,OAAO,MAAM,GAAG;AAAA,UACnE,QAAQ,EAAE,MAAM,SAAS,SAAS,eAAe;AAAA,UACjD,eAAe,MAAM;AAAA,UACrB,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,WAAW,EAAE,MAAM,cAAc,IAAI,MAAM,SAAS,cAAc,OAAO,MAAM,GAAG;AAAA,UACpF;AAAA,QACF,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,eAAe,MAAM;AAAA,aACxB;AAAA,UACH,aAAa;AAAA,QACf,CAAC,CACH,EAAE,QAAQ,QAAQ,mCAAmC;AAAA,QAErD,MAAM,YAAY,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACzD,MAAM,SACJ,QAAQ,eAAe,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,MAAM,GAAG,CAAC,CAC7E,EAAE,SAAS,cAAc;AAAA,UACvB,IAAI,MAAM;AAAA,UACV,aAAa,UAAU;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,iBAAiB,mBAAmB;AAAA,QAClD,MAAM,YAAY,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACzD,MAAM,SACJ,QAAQ,eAAe,YAAY;AAAA,UACjC,IAAI,MAAM;AAAA,UACV,WAAW,MAAM;AAAA,UACjB,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,WAAW;AAAA,YACX,IAAI;AAAA,YACJ,SAAS,EAAE,cAAc,MAAM,SAAS,cAAc,OAAO,MAAM,GAAG;AAAA,UACxE;AAAA,QACF,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ;AAAA,UACR,OAAO,EAAE,MAAM,wBAAwB,SAAS,oBAAoB;AAAA,QACtE,CAAC;AAAA,QAED,MAAM,SAAO,QAAQ,eAAe,MAAM,SAAS,CAAC,EAAE,SAAS,cAAc;AAAA,UAC3E,aAAa,UAAU;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,QAAQ,iBAAiB,iBAAiB;AAAA,QAChD,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACvC,MAAM,QAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,SAAS,MAAM,QAAQ,eAAe,KAAK;AAAA,QAEjD,SAAO,MAAM,GAAG,EAAE,cAAc,EAAE,IAAI,MAAM,IAAI,SAAS,GAAG,QAAQ,UAAU,CAAC;AAAA,QAC/E,SAAO,OAAO,GAAG,EAAE,cAAc,EAAE,IAAI,MAAM,IAAI,SAAS,GAAG,QAAQ,UAAU,CAAC;AAAA,QAChF,SAAO,OAAO,UAAU,cAAc,EAAE,IAAI,KAAK,MAAM,UAAU,cAAc;AAAA,QAC/E,SAAO,OAAO,GAAG,EAAE,IAAI,eAAe,gBAAgB;AAAA,QACtD,SAAO,MAAM,QAAQ,QAAQ,EAAE,wBAAW,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,cAAc;AAAA,UACvE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,QACtD,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,QAAQ,iBAAiB,YAAY;AAAA,QAC3C,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACvC,MAAM,QAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,UAAU,MAAM,QAAQ,eAAe,KAAK;AAAA,QAElD,MAAM,SAAO,QAAQ,uBAAuB,eAAe,KAAK,CAAC,CAAC,EAAE,QAAQ,QAC1E,0BACF;AAAA,QACA,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,KAAK;AAAA,UACvB,UAAU,EAAE,gBAAgB,EAAE;AAAA,QAChC,CAAC,CACH,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAC5C,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,KAAK;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAC,CACH,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAE5C,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,OAAO;AAAA,UACzB,UAAU,EAAE,gBAAgB,EAAE;AAAA,QAChC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC;AAAA,OAC7D;AAAA,KACF;AAAA,IAED,OAAK,+CAA+C,YAAY;AAAA,MAC9D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,QAAQ,iBAAiB,cAAc;AAAA,QAC7C,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACvC,MAAM,SAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,kBAAkB,KAAK,sBAAqB,eAAe,sBAAsB;AAAA,QAEvF,MAAM,SACJ,QAAQ,eAAe,KAAK,OAAO,UAAU,gBAAgB,CAAC,CAChE,EAAE,QAAQ,QAAQ,yBAAyB;AAAA,QAC3C,MAAM,SACJ,QAAQ,eAAe,KAAK,OAAO,QAAQ,EAAE,cAAc,cAAc,EAAE,CAAC,CAC9E,EAAE,QAAQ,QAAQ,kCAAkC;AAAA,QACpD,MAAM,SACJ,QAAQ,uBAAuB;AAAA,aAC1B,eAAe,MAAK;AAAA,UACvB,UAAU;AAAA,QACZ,CAAC,CACH,EAAE,QAAQ,QAAQ,yBAAyB;AAAA,OAC5C;AAAA,KACF;AAAA,IAED,OAAK,8DAA8D,YAAY;AAAA,MAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,mBAAmB,SAAS,iBAAiB,cAAc,CAAC;AAAA,QAClE,MAAM,SAAQ,MAAM,QAAQ,eAAe,iBAAiB,cAAc,CAAC;AAAA,QAC3E,MAAM,aAAY,eAAe,MAAK;AAAA,QACtC,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV;AAAA,UACH,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,QACtD,CAAC,CACH,EAAE,QAAQ,QAAQ,kDAAkD;AAAA,QACpE,MAAM,QAAQ,OAAO;AAAA,aAChB;AAAA,UACH,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,QACtD,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,OAAO,KAAK,YAAW,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAClE,EAAE,QAAQ,QAAQ,mBAAmB;AAAA,OACtC;AAAA,KACF;AAAA,IAED,OAAK,oDAAoD,YAAY;AAAA,MACnE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,mBAAmB,SAAS,iBAAiB,wBAAwB,CAAC;AAAA,QAC5E,MAAM,SACJ,mBAAmB,SAAS;AAAA,aACvB,iBAAiB,2BAA2B;AAAA,UAC/C,UAAU;AAAA,eACL;AAAA,YACH,gBAAgB;AAAA,iBACX,qBAAoB;AAAA,cACvB,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,QAAQ,sDAAsD;AAAA,OACzE;AAAA,KACF;AAAA,IAED,OAAK,2DAA2D,YAAY;AAAA,MAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,QAAQ;AAAA,UACZ,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACvC,MAAM,SAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,aAAY,eAAe,MAAK;AAAA,QACtC,SAAO,OAAM,GAAG,EAAE,cAAc;AAAA,UAC9B,qBAAqB;AAAA,YACnB,gBAAgB;AAAA,YAChB,kBAAkB;AAAA,YAClB,eAAe;AAAA,YACf,gBAAgB;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,OAAO,KAAK,YAAW,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAClE,EAAE,QAAQ,QAAQ,sCAAsC;AAAA,QAExD,MAAM,QAAQ,2BAA2B;AAAA,aACpC;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,2BAA2B;AAAA,aAC9B;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAC5C,MAAM,SACJ,QAAQ,2BAA2B;AAAA,aAC9B;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,QAAQ,yBAAyB;AAAA,QAE3C,MAAM,YAAY,MAAM,QAAQ,2BAA2B;AAAA,aACtD;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,UACpD,qBAAqB,EAAE,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,KAAK;AAAA,QACrF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,QAAQ;AAAA,UACZ,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACvC,MAAM,SAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,aAAY,eAAe,MAAK;AAAA,QACtC,MAAM,cAAc,IAAI,KAAK,0BAA0B;AAAA,QACvD,MAAM,gBAAgB;AAAA,UACpB,cAAc;AAAA,UACd,UAAU;AAAA,UACV,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QAEA,MAAM,UAAU,MAAM,QAAQ,oBAAoB,KAAK,YAAW,cAAc,CAAC;AAAA,QACjF,SAAO,QAAQ,aAAa,EAAE,QAAQ,aAAa;AAAA,QACnD,UACG,MAAM,QAAQ,QAAQ,EAAE,wBAAW,IAAI,+BAA+B,CAAC,IAAI,aAC9E,EAAE,QAAQ,aAAa;AAAA,QAIvB,MAAM,SACJ,QAAQ,oBAAoB;AAAA,aACvB;AAAA,UACH,eAAe,KAAK,eAAe,cAAc,EAAE;AAAA,QACrD,CAAC,CACH,EAAE,QAAQ,QAAQ,wBAAwB;AAAA,QAI1C,MAAM,SACJ,QAAQ,oBAAoB;AAAA,aACvB;AAAA,UACH,eAAe,KAAK,eAAe,cAAc,WAAW;AAAA,QAC9D,CAAC,CACH,EAAE,QAAQ,QAAQ,2BAA2B;AAAA,QAI7C,WAAW,WAAW;AAAA,UACpB,EAAE,UAAU,GAAG;AAAA,UACf,EAAE,cAAc,GAAG;AAAA,UACnB,EAAE,aAAa,IAAI,KAAK,OAAO,GAAG,EAAE;AAAA,QACtC,GAAG;AAAA,UACD,MAAM,SACJ,QAAQ,oBAAoB;AAAA,eACvB;AAAA,YACH,eAAe,KAAK,kBAAkB,QAAQ;AAAA,UAChD,CAAC,CACH,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,QAKA,MAAM,aAAa,MAAM,QAAQ,oBAAoB;AAAA,aAChD;AAAA,UACH,eAAe,KAAK,eAAe,aAAa,IAAI,KAAK,0BAA0B,EAAE;AAAA,QACvF,CAAC;AAAA,QACD,SAAO,WAAW,eAAe,WAAW,EAAE,QAAQ,IAAI,KAAK,0BAA0B,CAAC;AAAA,QAE1F,MAAM,WAAW,MAAM,QAAQ,2BAA2B;AAAA,aACrD;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,SAAS,aAAa,EAAE,cAAc;AAAA,OAC9C;AAAA,KACF;AAAA,IAED,OAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,QAAQ;AAAA,UACZ,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,mBAAmB,SAAS,KAAK;AAAA,QACvC,MAAM,SAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAEhD,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,MAAK;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAkD,CACpD,EAAE,QAAQ,QAAQ,wCAAwC;AAAA,QAC1D,MAAM,SAAO,QAAQ,QAAQ,EAAE,wBAAW,IAAI,OAAM,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACpF,QAAQ;AAAA,UACR,qBAAqB,EAAE,gBAAgB,MAAM;AAAA,QAC/C,CAAC;AAAA,QAED,MAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,aACjC,eAAe,MAAK;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,QAAQ,EAAE,cAAc;AAAA,UAC7B,QAAQ;AAAA,UACR,UAAU,EAAE,gBAAgB,EAAE;AAAA,UAC9B,qBAAqB,EAAE,gBAAgB,KAAK;AAAA,QAC9C,CAAC;AAAA,QACD,MAAM,SAAO,QAAQ,uBAAuB,eAAe,MAAK,CAAC,CAAC,EAAE,QAAQ,QAC1E,kBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,mBAAmB,SAAS,iBAAiB,YAAY,CAAC;AAAA,QAChE,MAAM,SAAQ,MAAM,QAAQ,eAAe,iBAAiB,YAAY,CAAC;AAAA,QACzE,MAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,aACjC,eAAe,MAAK;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY,IAAI,KAAK,SAAQ,EAAE;AAAA,UAC/B,OAAO;AAAA,QACT,CAAC;AAAA,QAED,SAAO,QAAQ,EAAE,cAAc;AAAA,UAC7B,QAAQ;AAAA,UACR,YAAY,IAAI,KAAK,SAAQ,EAAE;AAAA,UAC/B,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,SAAS,KAAK,EAAE,IAAI,KAAK,QAAO;AAAA,QACvC,MAAM,SAAO,QAAQ,QAAQ,EAAE,wBAAW,IAAI,aAAa,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACpF,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,mBAAmB,SAAS,iBAAiB,qBAAqB,CAAC;AAAA,QACzE,MAAM,UAAU,MAAM,QAAQ,eAAe,iBAAiB,qBAAqB,CAAC;AAAA,QACpF,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,OAAO;AAAA,UACzB,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,KAAK,UAAS,MAAM,oBAAoB;AAAA,QACjD,CAAC,CACH,EAAE,QAAQ,QAAQ,8CAA8C;AAAA,OACjE;AAAA,KACF;AAAA,IAED,OAAK,2CAA2C,YAAY;AAAA,MAC1D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,QAAQ;AAAA,QACxB,MAAM,WAAW,KAAK,iBAAiB,WAAW,GAAG,WAAW,YAAY;AAAA,QAC5E,MAAM,WAAW,KAAK,iBAAiB,WAAW,GAAG,WAAW,YAAY;AAAA,QAC5E,MAAM,mBAAmB,SAAS,QAAQ;AAAA,QAC1C,MAAM,mBAAmB,SAAS,QAAQ;AAAA,QAC1C,MAAM,QAAQ,eAAe,QAAQ;AAAA,QACrC,MAAM,QAAQ,eAAe,QAAQ;AAAA,QAErC,SAAO,MAAM,QAAQ,QAAQ,EAAE,WAAW,aAAa,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,SAAS;AAAA,QACxF,SAAO,MAAM,QAAQ,QAAQ,EAAE,WAAW,aAAa,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,SAAS;AAAA,QACxF,SAAO,MAAM,QAAQ,QAAQ,EAAE,WAAW,aAAa,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS;AAAA,OACrF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,kBAAyD,CACtE,SACA,OACkC;AAAA,EAClC,MAAM,eAAc,aAAa,MAAM,aAAa,MAAM;AAAA,EAC1D,MAAM,QAAQ,WAAW,OAAO;AAAA,IAC9B,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,cAAc,OAAO,MAAM,GAAG;AAAA,IACnE,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,WAAW,MAAM,SAAS,eAAe;AAAA,MACzC,WAAW,MAAM,SAAS,eAAe;AAAA,IAC3C;AAAA,IACA,eAAe,MAAM;AAAA,IACrB,kBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,WAAW,EAAE,MAAM,cAAc,IAAI,MAAM,SAAS,cAAc,OAAO,MAAM,GAAG;AAAA,IACpF;AAAA,EACF,CAAC;AAAA,EACD,MAAM,YAAY;AAAA,OACb;AAAA,IACH;AAAA,IACA,UAAU,IAAI,KAAK,0BAA0B;AAAA,EAC/C;AAAA,EACA,MAAM,QAAQ,eAAe,MAAM,SAAS;AAAA,EAC5C,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,IAAY;AAAA,EACpC,OAAO,EAAE,IAAI,wBAAW,UAAU,sBAAqB,QAAQ,aAAa;AAAA;AAG9E,SAAS,cAAc,CAAC,QAA2B;AAAA,EACjD,OAAO;AAAA,IACL,IAAI,OAAM,IAAI;AAAA,IACd,WAAW,OAAM,IAAI;AAAA,IACrB,UAAU,OAAM,IAAI;AAAA,IACpB,gBAAgB,OAAM,UAAU;AAAA,EAClC;AAAA;;AC5iBF,qBAAS,sBAAU,kBAAQ;AAI3B,IAAM,mBAAmB;AAAA,EACvB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,SAAS,EAAE,YAAY,MAAM;AAC/B;AA+BO,SAAS,qBAAqB,CAAC,OAAe,SAA0C;AAAA,EAC7F,MAAM,eAAe,QAAQ,gBAAgB;AAAA,EAC7C,MAAM,0BAA0B,QAAQ,2BAA2B,eAAe;AAAA,EAClF,MAAM,oBAAoB,QAAQ,qBAAqB,eAAe;AAAA,EAEtE,MAAM,aAAa,OAAO,SAA2D;AAAA,IACnF,MAAM,SAAS,MAAM,QAAQ,aAAa;AAAA,IAC1C,IAAI;AAAA,MACF,MAAM,KAAK,MAAM;AAAA,cACjB;AAAA,MACA,MAAM,QAAQ,WAAW,MAAM;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,WAAS,WAAW,MAAM;AAAA,MACxB,OAAK,0EAA0E,YAAY;AAAA,QACzF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,KAAK,IAAI;AAAA,UAExB,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,EAAE,OAAO,SAAS;AAAA,cAC7B;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UAED,SAAO,KAAK,EAAE,EAAE,QAAQ,iBAAiB;AAAA,UACzC,SAAO,KAAK,SAAS,EAAE,KAAK,WAAW;AAAA,UACvC,SAAO,KAAK,OAAO,EAAE,KAAK,CAAC;AAAA,UAC3B,SAAO,KAAK,IAAI,EAAE,KAAK,oBAAoB;AAAA,UAC3C,SAAO,KAAK,QAAQ,KAAK,EAAE,KAAK,QAAQ;AAAA,UACxC,SAAO,KAAK,MAAM,IAAK,SAAS,CAAC,EAAE,uBAAuB,MAAM;AAAA,UAChE,SAAO,KAAK,WAAW,EAAE,KAAK,KAAK,SAAS;AAAA,SAC7C;AAAA,OACF;AAAA,MAED,OAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QAAQ;AAAA,YACZ,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,EAAE,OAAO,SAAS;AAAA,UAC7B;AAAA,UACA,QAAQ,SAAS,WAAW,MAAM,QAAQ,IAAI;AAAA,YAC5C,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,YACjE,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UAED,SAAO,OAAO,EAAE,EAAE,KAAK,MAAM,EAAE;AAAA,UAC/B,SAAO,QAAQ,EAAE,EAAE,KAAK,MAAM,EAAE;AAAA,UAChC,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,YAAY,OAAO,EAAE,CAAC,CAClF,EAAE,SAAS,aAAa,CAAC;AAAA,SAC1B;AAAA,OACF;AAAA,MAED,OAAK,iEAAiE,YAAY;AAAA,QAChF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,KAAK;AAAA,UACX,MAAM,QAAQ;AAAA,YACZ;AAAA,YACA,MAAM;AAAA,YACN,SAAS,EAAE,OAAO,SAAS;AAAA,UAC7B;AAAA,UAEA,QAAQ,SAAS,cAAc,MAAM,QAAQ,IAAI;AAAA,YAC/C,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,YACjE,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC5C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,OAAO,EAAE,EAAE,KAAK,EAAE;AAAA,UACzB,SAAO,WAAW,EAAE,EAAE,KAAK,EAAE;AAAA,UAC7B,SAAO,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE;AAAA,UAC/B,IAAI,OAAO,SAAS,YAAY;AAAA,YAC9B,MAAM,SACJ,OAAO,SAAS,WAAW;AAAA,cACzB,WAAW;AAAA,cACX,OAAO;AAAA,cACP,SAAS,QAAS;AAAA,cAClB,SAAS,eAAe;AAAA,YAC1B,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,UAC1C;AAAA,UACA,MAAM,OAAO,SAAS,SAAS;AAAA,YAC7B,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,QAAS;AAAA,UACpB,CAAC;AAAA,UACD,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,WAAW,CAAC,CACxE,EAAE,SAAS,aAAa,CAAC;AAAA,SAC1B;AAAA,OACF;AAAA,MAED,OAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,MAAM,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,EAAE,CAAC;AAAA,UAEjF,SAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC1B;AAAA,OACF;AAAA,MAED,OAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SACJ,OAAO,SAAS,QAAQ;AAAA,YACtB,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,UACrE,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,SAAS,MAAM;AAAA,MACtB,OAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC7B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,0BAA0B,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UACtE,CAAC;AAAA,UAED,OAAO,WAAW,MAAM,OAAO,UAAU,MAAM;AAAA,YAC7C,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,SAAO,SAAS,IAAI,OAAO,EAAE,KAAK,CAAC;AAAA,UACnC,SAAO,SAAS,IAAI,QAAQ,KAAK,EAAE,KAAK,KAAK;AAAA,UAC7C,SAAO,SAAS,OAAO,EAAE,WAAW;AAAA,UACpC,SAAO,KAAK,MAAM,QAAS,cAAc,CAAC,EAAE,gBAC1C,KAAK,MAAM,QAAS,SAAS,CAC/B;AAAA,SACD;AAAA,OACF;AAAA,MAED,OAAK,mDAAmD,YAAY;AAAA,QAClE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,SAAS,MAAM;AAAA,YACvC,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,UACvB,SAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC5B;AAAA,OACF;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UAED,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,OAAO,SAAS,EAAE,CAAC,CAC/E,EAAE,QAAQ,eAAe,UAAU;AAAA,UACnC,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,OAAO,SAAS,GAAG,CAAC,CAChF,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,MAED,OAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,IAAI,KAAK,KAAK,IAAI,IAAI,eAAe,EAAE,EAAE,YAAY;AAAA,UACzE,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,GAAG,YAAY,CAAC;AAAA,UAC/E,CAAC;AAAA,UAED,MAAM,SAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YACzC,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,eAAe,EAAE;AAAA,UACjC,MAAM,QAAQ,MAAM,OAAO,SAAS,MAAM;AAAA,YACxC,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,SAAO,MAAM,EAAE,aAAa,CAAC;AAAA,UAC7B,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,UAC5B,SAAO,MAAM,IAAI,IAAI,WAAW,EAAE,KAAK,WAAW;AAAA,SACnD;AAAA,OACF;AAAA,MAED,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UAED,MAAM,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,UAC/B,SAAO,SAAS,IAAI,IAAI,QAAQ,KAAK,EAAE,KAAK,KAAK;AAAA,UACjD,SAAO,SAAS,IAAI,IAAI,SAAS,EAAE,KAAK,WAAW;AAAA,SACpD;AAAA,OACF;AAAA,MAED,OAAK,uCAAuC,YAAY;AAAA,QACtD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC7B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,0BAA0B,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UACtE,CAAC;AAAA,UACD,MAAM,OAAO,YAAY,QAAQ;AAAA,YAC/B,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,EAAE,OAAO,mBAAmB;AAAA,cACvC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACD,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC7B,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,EAAE,OAAO,iBAAiB;AAAA,cACrC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACD,MAAM,OAAO,QAAQ,QAAQ;AAAA,YAC3B,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS;AAAA,kBACP,OAAO;AAAA,gBACT;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACD,MAAM,OAAO,OAAO,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,EAAE,OAAO,cAAc;AAAA,cAClC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACD,MAAM,OAAO,cAAc,QAAQ;AAAA,YACjC,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,EAAE,OAAO,cAAc;AAAA,cAClC;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UAED,MAAM,YAAY,MAAM,OAAO,UAAU,MAAM;AAAA,YAC7C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,iBAAiB,MAAM,OAAO,YAAY,MAAM;AAAA,YACpD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,eAAe,MAAM,OAAO,UAAU,MAAM;AAAA,YAChD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,aAAa,MAAM,OAAO,QAAQ,MAAM;AAAA,YAC5C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,YAAY,MAAM,OAAO,OAAO,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,YAAY,MAAM,OAAO,cAAc,MAAM;AAAA,YACjD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,SAAS,EAAE,aAAa,CAAC;AAAA,UAChC,SAAO,UAAU,IAAI,IAAI,QAAQ,KAAK,EAAE,KAAK,KAAK;AAAA,UAClD,SAAO,cAAc,EAAE,aAAa,CAAC;AAAA,UACrC,SAAO,eAAe,IAAI,IAAI,QAAQ,KAAK,EAAE,KAAK,kBAAkB;AAAA,UACpE,SAAO,YAAY,EAAE,aAAa,CAAC;AAAA,UACnC,SAAO,aAAa,IAAI,IAAI,QAAQ,KAAK,EAAE,KAAK,gBAAgB;AAAA,UAChE,SAAO,UAAU,EAAE,aAAa,CAAC;AAAA,UACjC,SAAO,WAAW,IAAI,IAAI,QAAQ,KAAK,EAAE,KAAK,OAAO;AAAA,UACrD,SAAO,SAAS,EAAE,aAAa,CAAC;AAAA,UAChC,SAAO,UAAU,IAAI,GAAG,EAAE,cAAc;AAAA,YACtC,MAAM;AAAA,YACN,SAAS,EAAE,OAAO,cAAc;AAAA,UAClC,CAAC;AAAA,UACD,SAAO,SAAS,EAAE,aAAa,CAAC;AAAA,UAChC,SAAO,UAAU,IAAI,IAAI,QAAQ,KAAK,EAAE,KAAK,aAAa;AAAA,UAC1D,SAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,SAChC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,YAAY,MAAM;AAAA,MACzB,OAAK,6CAA6C,YAAY;AAAA,QAC5D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,MAAM,OAAO,SAAS,SAAS;AAAA,YAC7B,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,UAClB,CAAC;AAAA,UAED,MAAM,QAAQ,MAAM,OAAO,SAAS,MAAM;AAAA,YACxC,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,SAC7B;AAAA,OACF;AAAA,MAED,OAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1B,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,SACJ,OAAO,SAAS,SAAS;AAAA,YACvB,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS;AAAA,UACX,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,SAAS,MAAM;AAAA,MACtB,OAAK,uDAAuD,YAAY;AAAA,QACtE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,OAAO,cAAc,MAAM,OAAO,SAAS,MAAM;AAAA,YAC/C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,MAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,iBAAiB,EAAE,YAAY;AAAA,UACrE,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1B,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,WAAY;AAAA,YACrB,aAAa;AAAA,UACf,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,oBAAoB,EAAE;AAAA,UACtC,OAAO,eAAe,MAAM,OAAO,SAAS,MAAM;AAAA,YAChD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,aAAa,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE;AAAA,UACxC,SAAO,aAAa,IAAI,OAAO,EAAE,KAAK,CAAC;AAAA,SACxC;AAAA,OACF;AAAA,MAED,OAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,SACJ,OAAO,SAAS,MAAM;AAAA,YACpB,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,YAChB,aAAa;AAAA,UACf,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,QAAQ,MAAM;AAAA,MACrB,OAAK,sCAAsC,YAAY;AAAA,QACrD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,0BAA0B,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UACtE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,UAAU,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,MAAM,OAAO,UAAU,KAAK;AAAA,YAC1B,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,YAChB,SAAS;AAAA,UACX,CAAC;AAAA,UAED,MAAM,QAAQ,MAAM,OAAO,UAAU,MAAM;AAAA,YACzC,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,SAC7B;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,cAAc,MAAM;AAAA,MAC3B,OAAK,kDAAkD,YAAY;AAAA,QACjE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,OAAO,SAAS,aAAa;AAAA,YACjD,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,YAChB,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,SAAO,SAAS,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE;AAAA,UACpC,SAAO,SAAS,OAAO,EAAE,KAAK,QAAO,OAAO;AAAA,UAC5C,SAAO,KAAK,MAAM,QAAS,cAAc,CAAC,EAAE,gBAC1C,KAAK,MAAM,OAAO,cAAc,CAClC;AAAA,SACD;AAAA,OACF;AAAA,MAED,OAAK,kCAAkC,YAAY;AAAA,QACjD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,MAAM,OAAO,SAAS,aAAa;AAAA,YAChD,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,MAAM,EAAE,SAAS;AAAA,SACzB;AAAA,OACF;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1B,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,OAAO,SAAS,aAAa;AAAA,YACjD,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,OAAO,EAAE,SAAS;AAAA,SAC1B;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,cAAc,MAAM;AAAA,MAC3B,OAAK,0DAA0D,YAAY;AAAA,QACzE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,OAAO,SAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,uBAAuB;AAAA,UACvC,OAAO,UAAU,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,OAAO,IAAI,OAAO,EAAE,KAAK,CAAC;AAAA,UACjC,SAAO,QAAQ,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE;AAAA,UACnC,SAAO,OAAQ,IAAI,OAAO,EAAE,uBAAuB,CAAC;AAAA,SACrD;AAAA,OACF;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,OAAO,MAAM,EAAE,CAAC;AAAA,UAClE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,uBAAuB;AAAA,UAEvC,MAAM,SACJ,OAAO,SAAS,SAAS;AAAA,YACvB,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,UAClB,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,UAAU,MAAM;AAAA,MAGvB,OAAK,wCAAwC,YAAY;AAAA,QACvD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAO,OAAO,OAAO,CAAC,EAAE,SAAS,cAAc;AAAA,SACtD;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,SAAS,MAAM;AAAA,MAGtB,OAAK,sDAAsD,YAAY;AAAA,QACrE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,SAAO,CAAC,WAAW,QAAQ,CAAC,EAAE,UAAU,OAAO,KAAK;AAAA,SACrD;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;;AChpBH,4CAAgC,sBAAU,kBAAQ;AAClD;AA6BA,IAAM,uBAAuB;AAMtB,SAAS,yBAAyB,CACvC,OACA,SACM;AAAA,EACN,MAAM,iBAAiB,QAAQ,kBAAkB;AAAA,EACjD,MAAM,eAAe,QAAQ,gBAAgB,CAAC;AAAA,EAE9C,WAAS,OAAO,MAAM;AAAA,IACpB,IAAI;AAAA,IAEJ,WAAW,YAAY;AAAA,MACrB,UAAU,MAAM,QAAQ,cAAc;AAAA,KACvC;AAAA,IAED,UAAU,YAAY;AAAA,MACpB,MAAM,QAAQ,WAAW,OAAO;AAAA,KACjC;AAAA,IAED,WAAS,aAAa,MAAM;AAAA,MAC1B,OAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,SAAO,QAAQ,MAAM,EAAE,KAAK,SAAS;AAAA,UACrC,SAAO,QAAQ,GAAG,MAAM,EAAE,gBAAgB,CAAC;AAAA,UAC3C,SAAO,QAAQ,iBAAiB,MAAM,EAAE,gBAAgB,CAAC;AAAA,kBACzD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,+DAA+D,YAAY;AAAA,QAC9E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,QAAQ,CAAC,OAAO,CAAC;AAAA,UACzD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,OAAO;AAAA,UACzC,SAAO,OAAO,MAAM,EAAE,KAAK,EAAE;AAAA,UAC7B,SAAO,OAAO,UAAU,EAAE,uBAAuB,CAAC;AAAA,UAClD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,IAAI;AAAA,kBACrC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,uDAAuD,YAAY;AAAA,QACtE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,gCAAgC,CAAC,CAAC;AAAA,UAC1E,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,kBAClC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,kDAAkD,YAAY;AAAA,QACjE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW;AAAA,YACjD;AAAA,YACA;AAAA,UACF,CAAC;AAAA,UACD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,MAAM,EAAE,UAAU,UAAU;AAAA,UAC1C,SAAO,OAAO,MAAM,EAAE,UAAU,UAAU;AAAA,UAC1C,SAAO,OAAO,MAAM,EAAE,IAAI,UAAU,UAAU;AAAA,UAC9C,SAAO,OAAO,MAAM,EAAE,IAAI,UAAU,UAAU;AAAA,kBAC9C;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,QAAQ,KAAK;AAAA,UACnB,SAAO,QAAQ,MAAM,EAAE,KAAK,SAAS;AAAA,UACrC,MAAM,SAAO,QAAQ,WAAW,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,eACzD,sBACF;AAAA,kBACA;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,yBAAyB,YAAY;AAAA,QACxC,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM,SAAO,QAAQ,WAAW,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,eACtD,sBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,WAAS,qBAAqB,MAAM;AAAA,MAClC,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,KAAK;AAAA,UAC7C,MAAM,WAAW,MAAM,SAAS,QAAQ,gBAAgB;AAAA,UACxD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;AAAA,kBAC1C;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,WAAW,MAAM,SAAS,MAAM;AAAA,UACtC,MAAM,SAAS,MAAM,QAAQ,WAAW,OAAO,CAAC,GAAG,EAAE,KAAK,OAAO,CAAC;AAAA,UAClE,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;AAAA,kBAC1C;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,KACF;AAAA,IAED,WAAS,eAAe,MAAM;AAAA,MAC5B,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,KAAK,EAAE,aAAa,QAAQ,EAAE,CAAC;AAAA,QACtE,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,CAAC;AAAA,UACnE,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,OAAO;AAAA,kBACzC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,oDAAoD,YAAY;AAAA,QACnE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACnC,KAAK,EAAE,aAAa,SAAS,aAAa,OAAO;AAAA,QACnD,CAAC;AAAA,QACD,IAAI;AAAA,UACF,MAAM,IAAI,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,GAAG;AAAA,YAC9D,KAAK,EAAE,aAAa,UAAU,aAAa,QAAQ;AAAA,UACrD,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,GAAG;AAAA,YAC9D,KAAK,EAAE,aAAa,UAAU,aAAa,QAAQ;AAAA,UACrD,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,GAAG;AAAA,YAC9D,KAAK,EAAE,aAAa,UAAU,aAAa,QAAQ;AAAA,UACrD,CAAC;AAAA,UACD,SAAO,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;AAAA,UACrC,SAAO,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,MAAM;AAAA,UACnC,SAAO,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,OAAO;AAAA,kBACpC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,YAAY;AAAA,QAClB,MAAM,WAAW,QAAQ,IAAI;AAAA,QAC7B,QAAQ,IAAI,aAAa;AAAA,QACzB,IAAI;AAAA,UACF,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACrC,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,YAAY,CAAC,SAAS,CAAC;AAAA,YAC/D,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,YAClC,SAAO,OAAO,MAAM,EAAE,IAAI,UAAU,iBAAiB;AAAA,oBACrD;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,kBAExB;AAAA,UACA,IAAI,aAAa,WAAW;AAAA,YAC1B,OAAO,QAAQ,IAAI;AAAA,UACrB,EAAO;AAAA,YACL,QAAQ,IAAI,aAAa;AAAA;AAAA;AAAA,OAG9B;AAAA,KACF;AAAA,IAED,WAAS,qBAAqB,MAAM;AAAA,MAClC,OAAK,qEAAqE,YAAY;AAAA,QACpF,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,QAAQ,KAAK,IAAI;AAAA,UACvB,MAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,CAAC,OAAO,oBAAoB,CAAC,GAAG;AAAA,YAC/E,SAAS;AAAA,UACX,CAAC;AAAA,UACD,MAAM,UAAU,KAAK,IAAI,IAAI;AAAA,UAC7B,SAAO,OAAO,QAAQ,EAAE,KAAK,IAAI;AAAA,UACjC,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,UAClC,SAAO,OAAO,EAAE,aAAa,uBAAuB,IAAI;AAAA,kBACxD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,KAAK,IAAI;AAAA,UACf,WAAW,MAAM,GAAG,MAAM,GAAG,cAAc;AAAA,UAC3C,MAAM,QAAQ,KAAK,IAAI;AAAA,UACvB,MAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,CAAC,OAAO,oBAAoB,CAAC,GAAG;AAAA,YAC/E,QAAQ,GAAG;AAAA,UACb,CAAC;AAAA,UACD,MAAM,UAAU,KAAK,IAAI,IAAI;AAAA,UAC7B,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,UAClC,SAAO,OAAO,EAAE,aAAa,uBAAuB,IAAI;AAAA,kBACxD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,oDAAoD,YAAY;AAAA,QACnE,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,SAAS,uBAAuB,KAAK,CAAC;AAAA,QAC7E,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,CAAC,OAAO,oBAAoB,CAAC,GAAG;AAAA,YAC/E,SAAS;AAAA,UACX,CAAC;AAAA,UACD,SAAO,OAAO,QAAQ,EAAE,KAAK,IAAI;AAAA,kBACjC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,KACF;AAAA,IAED,WAAS,wBAAwB,MAAM;AAAA,MACrC,OAAK,+DAA+D,YAAY;AAAA,QAC9E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,OAAO,GAAG,QAAQ;AAAA,UACxB,MAAM,SAAS,GAAG,QAAQ;AAAA,UAC1B,MAAM,QAAQ,WAAW;AAAA,YACvB,EAAE,MAAM,MAAM,UAAU,gBAAgB;AAAA,YACxC,EAAE,MAAM,QAAQ,UAAU,kBAAkB;AAAA,UAC9C,CAAC;AAAA,UAED,MAAM,aAAa,MAAM,QAAQ,WAAW,OAAO,CAAC,IAAI,CAAC;AAAA,UACzD,SAAO,WAAW,QAAQ,EAAE,KAAK,CAAC;AAAA,UAClC,SAAO,WAAW,MAAM,EAAE,UAAU,eAAe;AAAA,UAGnD,MAAM,eAAe,MAAM,QAAQ,WAAW,OAAO,CAAC,MAAM,CAAC;AAAA,UAC7D,SAAO,aAAa,QAAQ,EAAE,KAAK,CAAC;AAAA,UACpC,SAAO,aAAa,MAAM,EAAE,UAAU,iBAAiB;AAAA,kBACvD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,OAAO,GAAG,QAAQ;AAAA,UACxB,MAAM,QAAQ,IAAI,WAAW,CAAC,GAAM,GAAM,KAAM,KAAM,IAAM,GAAI,CAAC;AAAA,UACjE,MAAM,QAAQ,WAAW,CAAC,EAAE,MAAM,UAAU,MAAM,CAAC,CAAC;AAAA,UAEpD,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,CAAC,MAAM,IAAI,CAAC;AAAA,UACxD,SAAO,KAAK,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC5B,SAAO,KAAK,OAAO,KAAK,EAAE,MAAM,KAAK,EAAE,EAAE,EAAE,KAAK,OAAO,MAAM,MAAM,CAAC;AAAA,UAGpE,MAAM,MAAM,MAAM,QAAQ,WAAW,MAAM,CAAC,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,UACtE,SAAO,IAAI,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC3B,SAAO,IAAI,OAAO,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,mBAAmB;AAAA,kBACvE;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,OAAO,GAAG,QAAQ;AAAA,UACxB,MAAM,QAAQ,WAAW,CAAC,EAAE,MAAM,UAAU;AAAA;AAAA,GAAyB,MAAM,IAAM,CAAC,CAAC;AAAA,UAGnF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW,CAAC,MAAM,WAAW,kBAAkB,CAAC;AAAA,UACxF,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,MAAM,EAAE,UAAU,KAAK;AAAA,kBACrC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,iCAAiC,YAAY;AAAA,QAChD,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI;AAAA,UACF,MAAM,SACJ,QAAQ,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,0BAA0B,UAAU,IAAI,CAAC,CAAC,CACnF,EAAE,QAAQ,QAAQ,sBAAsB;AAAA,kBACxC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,KACF;AAAA,IAED,IAAI,aAAa,iBAAiB;AAAA,MAChC,WAAS,qBAAqB,MAAM;AAAA,QAClC,OAAK,iDAAiD,YAAY;AAAA,UAChE,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,UAClE,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,QAAQ;AAAA,cAC9C;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,oBAClC;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,QAED,OAAK,+CAA+C,YAAY;AAAA,UAC9D,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,EAAE,CAAC;AAAA,UACjE,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,QAAQ;AAAA,cAC9C;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,oBAClC;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,OACF;AAAA,IACH;AAAA,IAQA,IAAI,aAAa,qBAAqB;AAAA,MACpC,WAAS,wBAAwB,MAAM;AAAA,QACrC,OAAK,0CAA0C,YAAY;AAAA,UACzD,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACrC,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW;AAAA,cACjD;AAAA,cACA,kBAAkB,QAAQ,qCAAqC,QAAQ;AAAA,YACzE,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,YAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,SAAS;AAAA,oBAC3C;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,QAED,OAAK,wCAAwC,YAAY;AAAA,UACvD,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACrC,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW;AAAA,cACjD;AAAA,cACA;AAAA,YACF,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,oBAClC;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,OACF;AAAA,IACH;AAAA,GACD;AAAA;;AClZH,qBAAS,sBAAU,kBAAQ;AAW3B,IAAM,cAAY;AAClB,IAAM,aAAY,IAAI,KAAK,0BAA0B;AACrD,IAAM,aAAY,IAAI,KAAK,0BAA0B;AAG9C,SAAS,iCAAqE,CACnF,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,QAA6D;AAAA,IACtF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,IAAI,OAAO;AAAA,cACjB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,WAAW;AAAA,QACzB,MAAM,UAAU,MAAM,QAAQ,OAAO,KAAK;AAAA,QAExC,MAAM,OAAiC,YAAY;AAAA,QACnD,MAAM,SAA4B,KAAK;AAAA,QACzC,MAAM,UAAU,eAAe,IAAI;AAAA,QACnC,gBAAgB,MAAM;AAAA,UAClB,QAAQ,OAAiC,YAAY;AAAA,SACxD;AAAA,QACD,QAAQ,UAAU,eAAe,IAAI;AAAA,QACrC,MAAM,YAAY,QAAQ,kBAAkB,OAAO,OAAO;AAAA,QAC1D,IAAI,CAAC,aAAa,UAAU,SAAS,eAAe;AAAA,UAClD,MAAM,IAAI,MAAM,gEAAgE;AAAA,QAClF;AAAA,QACA,gBAAgB,MAAM;AAAA,UAClB,UAAU,UAAU,MAAM,GAAI,OAAiC,YAC/D;AAAA,SACH;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,QAAQ,EAAE,wBAAW,IAAI,QAAQ,CAAC;AAAA,QAC/D,SAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,IAAI;AAAA,UACJ,QAAQ,EAAE,cAAc,UAAU,WAAW,WAAW;AAAA,UACxD,UAAU,EAAE,MAAM,QAAQ,IAAI,QAAQ;AAAA,UACtC,mBAAmB,EAAE,SAAS,EAAE;AAAA,UAChC,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,SAAO,QAAQ,eAAe,EAAE,QAAQ,gBAAgB;AAAA,QACxD,SAAO,QAAQ,SAAS,EAAE,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,OAC9C;AAAA,KACF;AAAA,IAED,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,WAAW,CAAC;AAAA,QACjC,MAAM,SACJ,QAAQ,OAAO,WAAW,EAAE,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC,CAC1D,EAAE,QAAQ,cAAc,EAAE,MAAM,YAAY,CAAC;AAAA,QAC7C,MAAM,SAAO,QAAQ,OAAO,WAAW,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,UAC9E,MAAM;AAAA,QACR,CAAC;AAAA,QAED,MAAM,SACJ,QAAQ,OAAO,WAAW,EAAE,WAAW,gBAAgB,CAAC,CAAC,CAC3D,EAAE,SAAS,cAAc,EAAE,IAAI,SAAS,WAAW,gBAAgB,CAAC;AAAA,OACrE;AAAA,KACF;AAAA,IAED,OAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,WAAW,EAAE,IAAI,SAAS,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAAA,QAC3E,MAAM,QAAQ,OAAO,WAAW,EAAE,IAAI,SAAS,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAAA,QAC3E,MAAM,QAAQ,OACZ,WAAW;AAAA,UACT,IAAI;AAAA,UACJ,WAAW,IAAI,OAAO,EAAE;AAAA,UACxB,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAC,CACH;AAAA,QAEA,MAAM,SACJ,QAAQ,KAAK,EAAE,wBAAW,KAAK,YAAW,OAAO,GAAG,QAAQ,EAAE,CAAC,CACjE,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ,CAAC,EAAE,IAAI,YAAY,GAAG,EAAE,IAAI,QAAQ,CAAC;AAAA,UAC7C,OAAO;AAAA,UACP,SAAS;AAAA,QACX,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,KAAK,EAAE,wBAAW,KAAK,YAAW,OAAO,GAAG,QAAQ,EAAE,CAAC,CACjE,EAAE,SAAS,cAAc;AAAA,UACvB,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC;AAAA,UACxB,OAAO;AAAA,UACP,SAAS;AAAA,QACX,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,WAAW,EAAE,IAAI,UAAU,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAAA,QAC5E,MAAM,QAAQ,OACZ,WAAW;AAAA,UACT,IAAI;AAAA,UACJ,WAAW,IAAI,OAAO,EAAE;AAAA,UACxB,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,QACnB,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,OACZ,WAAW,EAAE,IAAI,oBAAoB,WAAW,IAAI,OAAO,EAAE,GAAG,cAAc,QAAQ,CAAC,CACzF;AAAA,QACA,MAAM,QAAQ,OACZ,WAAW;AAAA,UACT,IAAI;AAAA,UACJ,WAAW,IAAI,OAAO,EAAE;AAAA,UACxB,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,OAAO,WAAW,EAAE,IAAI,WAAW,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAAA,QAC7E,MAAM,QAAQ,OAAO;AAAA,UACnB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,UAC9C,WAAW,EAAE,MAAM,QAAQ,IAAI,cAAc;AAAA,QAC/C,CAAC;AAAA,QACD,MAAM,QAAQ,OAAO,WAAW,EAAE,WAAW,gBAAgB,CAAC,CAAC;AAAA,QAE/D,MAAM,SAAS;AAAA,UACb;AAAA,UACA,cAAc;AAAA,UACd,QAAQ,EAAE,cAAc,UAAU,WAAW,WAAW;AAAA,UACxD,KAAK,IAAI,KAAK,0BAA0B;AAAA,QAC1C;AAAA,QACA,MAAM,SAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,SAAS,cAAc;AAAA,UACxD,QAAQ,CAAC,EAAE,IAAI,SAAS,CAAC;AAAA,UACzB,OAAO;AAAA,UACP,SAAS;AAAA,QACX,CAAC;AAAA,QACD,MAAM,YAAY,MAAM,QAAQ,KAAK;AAAA,aAChC;AAAA,UACH,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,UAAU,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,WAAW,WAAW,QAAQ,CAAC;AAAA,OAC3F;AAAA,KACF;AAAA,IAED,OAAK,+CAA+C,YAAY;AAAA,MAC9D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,WAAW,CAAC;AAAA,QACjC,MAAM,SAAO,QAAQ,KAAK,EAAE,wBAAW,KAAK,WAAU,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UAC/E,QAAQ,CAAC;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,KAAK,EAAE,wBAAW,KAAK,YAAW,gBAAgB,KAAK,CAAC,CAClE,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,OACjE;AAAA,KACF;AAAA,IAED,OAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,WAAW,CAAC;AAAA,QACjC,MAAM,OAAO;AAAA,UACX;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,UAC9C,WAAW,EAAE,MAAM,QAAiB,IAAI,WAAW;AAAA,QACrD;AAAA,QACA,MAAM,QAAQ;AAAA,UACZ;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,UAC9C,WAAW,EAAE,MAAM,UAAmB,IAAI,SAAS;AAAA,QACrD;AAAA,QAEA,OAAO,OAAO,UAAU,MAAM,QAAQ,IAAI,CAAC,QAAQ,OAAO,IAAI,GAAG,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,QACvF,SAAO,KAAK,EAAE,QAAQ,MAAM;AAAA,QAC5B,SACE,MAAM,QAAQ,OAAO,KAAK,OAAO,WAAW,IAAI,KAAK,0BAA0B,EAAE,CAAC,CACpF,EAAE,QAAQ,KAAK;AAAA,QACf,MAAM,SAAO,QAAQ,OAAO,KAAK,MAAM,IAAI,UAAU,CAAC,CAAC,EAAE,SAAS,SAAS;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,OAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,mBAAmB,WAAW,EAAE;AAAA,QACtC,MAAM,mBAAmB,iBAAiB,OAAO,OAAO;AAAA,QACxD,IAAI,CAAC,oBAAoB,iBAAiB,SAAS,eAAe;AAAA,UAChE,MAAM,IAAI,MAAM,gEAAgE;AAAA,QAClF;AAAA,QACE,iBAAiB,UAAU,MAAM,GAAI,OAAiC,YAAY;AAAA,QAEpF,MAAM,UAAmC;AAAA,UACvC,WAAW,EAAE,WAAW,GAAG,CAAC;AAAA,UAC5B,WAAW,EAAE,WAAW,aAAa,CAAC;AAAA,UACtC,WAAW,EAAE,iBAAiB,6BAA6B,CAAC;AAAA,UAC5D,WAAW,EAAE,iBAAiB,qBAAqB,CAAC;AAAA,UACpD,WAAW,EAAE,iBAAiB,gBAAgB,CAAC;AAAA,UAC/C,WAAW,EAAE,iBAAiB,UAAU,CAAC;AAAA,UACzC,WAAW,EAAE,iBAAiB,mBAAmB,CAAC;AAAA,UAClD,WAAW,EAAE,iBAAiB,qBAAqB,CAAC;AAAA,UACpD,WAAW,EAAE,iBAAiB,qBAAqB,CAAC;AAAA,UACpD,WAAW,EAAE,iBAAiB,qBAAqB,CAAC;AAAA,UACpD,WAAW,EAAE,WAAW,IAAI,KAAK,UAAS,EAAE,CAAC;AAAA,UAC7C,WAAW,EAAE,WAAW,IAAI,KAAK,SAAS,EAAE,CAAC;AAAA,UAC7C,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,IAAI,SAAS,EAAW,CAAC;AAAA,UAClE,WAAW,EAAE,mBAAmB,iBAAiB,CAAC;AAAA,QACpD;AAAA,QACA,WAAW,SAAS,SAAS;AAAA,UAC3B,MAAM,SAAO,QAAQ,OAAO,KAAK,CAAC,EAAE,QAAQ,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA,MAAM,SAAO,QAAQ,OAAO,IAAa,CAAC,EAAE,QAAQ,cAAc;AAAA,UAChE,MAAM;AAAA,QACR,CAAC;AAAA,QACD,MAAM,SAAO,QAAQ,QAAQ,IAAa,CAAC,EAAE,QAAQ,cAAc;AAAA,UACjE,MAAM;AAAA,QACR,CAAC;AAAA,QAED,MAAM,SAAO,QAAQ,KAAK,EAAE,wBAAW,KAAK,YAAW,OAAO,IAAI,CAAC,CAAC,EAAE,QAAQ,cAC5E,EAAE,MAAM,gBAAgB,CAC1B;AAAA,QACA,MAAM,SAAO,QAAQ,KAAK,EAAE,wBAAW,KAAK,IAAI,KAAK,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,UACxF,MAAM;AAAA,QACR,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,WAAW,CAAC;AAAA,QACjC,MAAM,SACJ,QAAQ,OAAO;AAAA,UACb;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,UAC9C,WAAW,EAAE,MAAM,QAAQ,IAAI,QAAQ;AAAA,QACzC,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAAA,QACjD,MAAM,YAAY,MAAM,QAAQ,QAAQ,EAAE,wBAAW,IAAI,QAAQ,CAAC;AAAA,QAClE,SAAO,SAAS,EAAE,IAAI,SAAS;AAAA,QAC/B,SAAO,SAAS,EAAE,IAAI,eAAe,WAAW;AAAA,QAChD,SAAO,SAAS,EAAE,IAAI,eAAe,WAAW;AAAA,OACjD;AAAA,KACF;AAAA,GACF;AAAA;AAGH,SAAS,UAAU,CACjB,YAAoF,CAAC,GAC9D;AAAA,EACvB,MAAM,kBAAkB,UAAU,mBAAmB;AAAA,EACrD,MAAM,SAAS,UAAU,UAAU,EAAE,cAAc,UAAU,WAAW,gBAAgB;AAAA,EACxF,MAAM,OAA8B;AAAA,IAClC,IAAI;AAAA,IACJ;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,UAAU,EAAE,MAAM,QAAQ,IAAI,QAAQ;AAAA,IACtC,mBAAmB,kBAAkB,OAAO,cAAc,OAAO,SAAS;AAAA,IAC1E,WAAW,IAAI,OAAO,EAAE;AAAA,IACxB,iBAAiB;AAAA,IACjB,WAAW,IAAI,KAAK,UAAS;AAAA,IAC7B,WAAW,IAAI,KAAK,UAAS;AAAA,EAC/B;AAAA,EACA,QAAQ,iBAAiB,qBAAqB,oBAAoB;AAAA,EAClE,OAAO,KAAK,SAAS,gBAAgB;AAAA;AAGvC,SAAS,iBAAiB,CACxB,cACA,WAC4C;AAAA,EAC5C,OAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,MACN,QAAQ;AAAA,QACN;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,YACT,MAAM;AAAA,YACN,OAAO;AAAA,cACL;AAAA,gBACE,QAAQ,EAAE,cAAc,UAAU;AAAA,gBAClC,MAAM;AAAA,kBACJ,SAAS,CAAC,EAAE,cAAc,aAAa,CAAC,MAAM,OAAO,EAAE,CAAC;AAAA,kBACxD,OAAO,CAAC;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAGK,SAAS,oCAAoC,CAClD,YAA4C,CAAC,GACtB;AAAA,EACvB,OAAO,WAAW,SAAS;AAAA;AAG7B,SAAS,eAAe,CAAC,QAA0B;AAAA,EACjD,IAAI;AAAA,IACF,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,SAAO,KAAK,EAAE,eAAe,SAAS;AAAA;AAAA;;AClU1C,qBAAS,sBAAU,kBAAQ;AAc3B,IAAM,cAAY;AAClB,IAAM,aAAY,IAAI,KAAK,0BAA0B;AACrD,IAAM,aAAY,IAAI,KAAK,0BAA0B;AACrD,IAAM,oBAAoB,IAAI,KAAK,0BAA0B;AAGtD,SAAS,mCAAyE,CACvF,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,QAA6D;AAAA,IACtF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,IAAI,OAAO;AAAA,cACjB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,cAAa;AAAA,QAC3B,MAAM,UAAU,MAAM,QAAQ,OAAO,KAAK;AAAA,QAC1C,MAAM,UAAU,eAAe,IAAI;AAAA,QACnC,MAAM,UAAU,eAAe,IAAI;AAAA,QACnC,MAAM,kBAAkB,eAAe,IAAI;AAAA,QAC3C,QAAQ,UAAU,eAAe,IAAI;AAAA,QAErC,MAAM,SAAO,QAAQ,QAAQ,EAAE,wBAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,QAAQ,cAAa,CAAC;AAAA,OAC1F;AAAA,KACF;AAAA,IAED,OAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,EAAE,WAAW,gBAAgB,CAAC,CAAC;AAAA,QAEjE,MAAM,SACJ,QAAQ,OAAO,cAAa,EAAE,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC,CAC5D,EAAE,QAAQ,cAAc,EAAE,MAAM,YAAY,CAAC;AAAA,QAC7C,MAAM,SAAO,QAAQ,OAAO,cAAa,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,UAChF,MAAM;AAAA,QACR,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,QAAQ,EAAE,WAAW,iBAAiB,IAAI,QAAQ,CAAC,CAC7D,EAAE,SAAS,cAAc,EAAE,WAAW,gBAAgB,CAAC;AAAA,OACxD;AAAA,KACF;AAAA,IAED,OAAK,sDAAsD,YAAY;AAAA,MACrE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAO,QAAQ,OAAO,cAAa,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,UACvF,MAAM;AAAA,QACR,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,QACnC,MAAM,QAAQ,aAAa,EAAE,WAAW,IAAI,KAAK,0BAA0B,EAAE,CAAC;AAAA,QAC9E,MAAM,SAAO,QAAQ,aAAa,KAAK,CAAC,EAAE,SAAS,cAAc;AAAA,UAC/D,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAC;AAAA,QACD,MAAM,SAAO,QAAQ,aAAa,KAAK,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,SAAS,SAAS;AAAA,QAClF,MAAM,SAAO,QAAQ,aAAa,KAAK,OAAO,SAAS,YAAY,CAAC,CAAC,EAAE,SAAS,SAAS;AAAA,QACzF,MAAM,SACJ,QAAQ,aAAa,KAAK,OAAO,WAAW,IAAI,OAAO,EAAE,EAAE,CAAC,CAC9D,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,SACJ,QAAQ,aAAa,KAAK,OAAO,KAAK,IAAI,KAAK,0BAA0B,EAAE,CAAC,CAC9E,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,OAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,QAEnC,MAAM,SACJ,QAAQ,aAAa,aAAa,EAAE,WAAW,IAAI,KAAK,0BAA0B,EAAE,CAAC,CAAC,CACxF,EAAE,SAAS,cAAc,EAAE,sBAAU,CAAC;AAAA,QACtC,MAAM,SACJ,QAAQ,aAAa,aAAa,EAAE,WAAW,IAAI,KAAK,0BAA0B,EAAE,CAAC,CAAC,CACxF,EAAE,SAAS,cAAc,EAAE,WAAW,kBAAkB,CAAC;AAAA,QACzD,MAAM,SACJ,QAAQ,aACN,aAAa;AAAA,UACX,KAAK,IAAI,KAAK,iBAAiB;AAAA,UAC/B,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAC,CACH,CACF,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,OAAK,iDAAiD,YAAY;AAAA,MAChE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,QACnC,MAAM,SACJ,QAAQ,aACN,aAAa;AAAA,UACX,KAAK,IAAI,KAAK,UAAS;AAAA,UACvB,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAC,CACH,CACF,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,OAAK,uCAAuC,YAAY;AAAA,MACtD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,QACnC,MAAM,QAAQ,IAAI;AAAA,UAChB,QAAQ,aAAa,aAAa,EAAE,WAAW,IAAI,KAAK,0BAA0B,EAAE,CAAC,CAAC;AAAA,UACtF,QAAQ,aAAa,aAAa,EAAE,WAAW,IAAI,KAAK,0BAA0B,EAAE,CAAC,CAAC;AAAA,QACxF,CAAC;AAAA,QACD,MAAM,SAAO,QAAQ,QAAQ,EAAE,wBAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UAC/E,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,QACnC,MAAM,OAAO;AAAA,UACX;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD;AAAA,QACA,MAAM,QAAQ;AAAA,UACZ;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD;AAAA,QACA,OAAO,OAAO,UAAU,MAAM,QAAQ,IAAI,CAAC,QAAQ,OAAO,IAAI,GAAG,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,QACvF,SAAO,KAAK,EAAE,QAAQ,MAAM;AAAA,QAC5B,MAAM,SAAO,QAAQ,OAAO,KAAK,CAAC,EAAE,SAAS,QAAQ,KAAK;AAAA,QAC1D,MAAM,SAAO,QAAQ,aAAa,aAAa,CAAC,CAAC,EAAE,SAAS,SAAS;AAAA,QACrE,MAAM,SAAO,QAAQ,OAAO,KAAK,MAAM,IAAI,UAAU,CAAC,CAAC,EAAE,SAAS,SAAS;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,OAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAqC;AAAA,UACzC,cAAa,EAAE,IAAI,GAAG,CAAC;AAAA,UACvB,cAAa,EAAE,WAAW,GAAG,CAAC;AAAA,UAC9B,cAAa,EAAE,SAAS,GAAG,CAAC;AAAA,UAC5B,cAAa,EAAE,WAAW,aAAa,CAAC;AAAA,UACxC,cAAa,EAAE,WAAW,IAAI,KAAK,SAAS,EAAE,CAAC;AAAA,UAC/C,cAAa,EAAE,WAAW,IAAI,KAAK,UAAS,EAAE,CAAC;AAAA,UAC/C,cAAa,EAAE,mBAAmB,IAAI,KAAK,UAAS,EAAE,CAAC;AAAA,UACvD,cAAa,EAAE,mBAAmB,IAAI,KAAK,0BAA0B,EAAE,CAAC;AAAA,QAC1E;AAAA,QACA,WAAW,SAAS,SAAS;AAAA,UAC3B,MAAM,SAAO,QAAQ,OAAO,KAAK,CAAC,EAAE,QAAQ,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAAA,QACrF;AAAA,QACA,MAAM,SAAO,QAAQ,OAAO,IAAa,CAAC,EAAE,QAAQ,cAAc;AAAA,UAChE,MAAM;AAAA,QACR,CAAC;AAAA,QACD,MAAM,SAAO,QAAQ,QAAQ,IAAa,CAAC,EAAE,QAAQ,cAAc;AAAA,UACjE,MAAM;AAAA,QACR,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,aAAa,aAAa,EAAE,WAAW,IAAI,KAAK,0BAA0B,EAAE,CAAC,CAAC,CACxF,EAAE,QAAQ,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAAA,OAClD;AAAA,KACF;AAAA,IAED,OAAK,mEAAmE,YAAY;AAAA,MAClF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,OAAO,cAAa,CAAC;AAAA,QACnC,MAAM,SACJ,QAAQ,OAAO;AAAA,UACb;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAI,KAAK,0BAA0B;AAAA,QAChD,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAAA,QACjD,SAAO,MAAM,QAAQ,QAAQ,EAAE,wBAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,IAAI,eAAe,WAAW;AAAA,OACzF;AAAA,KACF;AAAA,GACF;AAAA;AAGI,SAAS,sCAAsC,CACpD,YAA8C,CAAC,GACtB;AAAA,EACzB,OAAO,cAAa,SAAS;AAAA;AAG/B,SAAS,aAAY,CAAC,YAA8C,CAAC,GAA4B;AAAA,EAC/F,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,WAAW,IAAI,OAAO,EAAE;AAAA,IACxB,WAAW,IAAI,KAAK,UAAS;AAAA,IAC7B,WAAW,IAAI,KAAK,UAAS;AAAA,IAC7B,mBAAmB,IAAI,KAAK,iBAAiB;AAAA,OAC1C;AAAA,EACL;AAAA;AAGF,SAAS,YAAY,CACnB,YAAoD,CAAC,GACtB;AAAA,EAC/B,OAAO;AAAA,IACL;AAAA,IACA,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,WAAW,IAAI,OAAO,EAAE;AAAA,IACxB,KAAK,IAAI,KAAK,0BAA0B;AAAA,IACxC,WAAW,IAAI,KAAK,0BAA0B;AAAA,OAC3C;AAAA,EACL;AAAA;;ACpOF,eAAsB,uBAAuB,CAC3C,YACA,OAMiB;AAAA,EACjB,MAAM,eAAc,MAAM,eAAe,uBAAuB,MAAM;AAAA,EACtE,MAAM,WAAW,MAAM,WAAW,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,aAAY,CAAC;AAAA,EACzF,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,MAAM,YAAiC;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,EACf;AAAA,EACA,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,SAAS,SAAS,cAAc,MAAM,QAAQ;AAAA,IAC9D,eAAe,oBAAoB,MAAM;AAAA,IACzC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA,EACD,OAAO;AAAA;AAIT,eAAsB,gBAAgB,CACpC,SACA,OACwB;AAAA,EACxB,IAAI,CAAC,QAAQ;AAAA,IAAU,MAAM,IAAI,MAAM,mDAAmD;AAAA,EAC1F,MAAM,eAAc,MAAM,wBAAwB,QAAQ,YAAY;AAAA,IACpE,WAAW,MAAM;AAAA,IACjB,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,EACf,CAAC;AAAA,EACD,OAAO,QAAQ,SAAS,MAAM,KAAK,OAAO,0BAAY,CAAC;AAAA;AAIzD,eAAsB,gBAAgB,CACpC,SACA,OACwB;AAAA,EACxB,QAAQ,cAAc,cAAc;AAAA,EACpC,MAAM,iBAAiB,SAAS,KAAK,WAAW,UAAU,UAAU,CAAC;AAAA,EACrE,OAAO,QAAQ,SAAU,MAAM;AAAA,IAC7B,IAAI,MAAM;AAAA,IACV,WAAW,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAAA;;ACtDH,eAAsB,0BAA0B,CAC9C,YACA,OAMiB;AAAA,EACjB,MAAM,eAAc,MAAM,eAAe,0BAA0B,MAAM;AAAA,EACzE,MAAM,WAAW,MAAM,WAAW,QAAQ,EAAE,WAAW,MAAM,WAAW,IAAI,aAAY,CAAC;AAAA,EACzF,IAAI;AAAA,IAAU,OAAO;AAAA,EAErB,MAAM,YAAiC;AAAA,IACrC,MAAM;AAAA,IACN,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,EACf;AAAA,EACA,MAAM,WAAW,OAAO;AAAA,IACtB,IAAI;AAAA,IACJ,WAAW,MAAM;AAAA,IACjB,UAAU,EAAE,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,UAAU,MAAM;AAAA,IAC5E,QAAQ,EAAE,MAAM,WAAW,YAAY,MAAM,MAAM;AAAA,IACnD,eAAe,oBAAoB,MAAM;AAAA,IACzC,kBAAkB,EAAE,MAAM,oBAAoB,UAAU;AAAA,EAC1D,CAAC;AAAA,EACD,OAAO;AAAA;AAIT,eAAsB,mBAAmB,CACvC,SACA,OAC2B;AAAA,EAC3B,IAAI,CAAC,QAAQ;AAAA,IAAa,MAAM,IAAI,MAAM,sDAAsD;AAAA,EAChG,MAAM,eAAc,MAAM,2BAA2B,QAAQ,YAAY;AAAA,IACvE,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,EACf,CAAC;AAAA,EACD,OAAO,QAAQ,YAAY,MAAM,KAAK,OAAO,0BAAY,CAAC;AAAA;;AC7C5D,qBAAS,sBAAU,kBAAQ;AAiB3B,IAAM,cAAY;AAClB,IAAM,QAAQ;AACd,IAAM,aAAa,IAAI,OAAO,EAAE;AAChC,IAAM,aAAa,IAAI,KAAK,0BAA0B;AACtD,IAAM,mBAAmB;AAAA,EACvB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,IAAI,WAAW,YAAY;AAAA,EAC3B,SAAS,EAAE,aAAa,UAAU,WAAW,UAAU,OAAO,iBAAiB;AACjF;AACA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,IAAI,WAAW,YAAY;AAC7B;AAGO,SAAS,iCAEf,CAAC,OAAe,SAAgE;AAAA,EAC/E,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,MAAM,MAAM,oBAAoB,SAAS,UAAS,cAAc,YAAY,CAAC;AAAA,QACnF,SAAO,GAAG,EAAE,cAAc;AAAA,UACxB,IAAI;AAAA,UACJ;AAAA,UACA,aAAa;AAAA,UACb,aAAa;AAAA,UACb,WAAW;AAAA,UACX,QAAQ;AAAA,UACR;AAAA,UACA,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,YAAY,cAAc;AAAA,UAChC;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,SAAS,QAAQ,GAAG;AAAA,OACvB;AAAA,KACF;AAAA,IAED,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,UAAS,mBAAmB;AAAA,QAC5C,MAAM,SACJ,QAAQ,YAAY,MAAM,KAAK,SAAS,aAAa,UAAU,CAAC,CAClE,EAAE,QAAQ,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAAA,QAErD,MAAM,QAAQ,WAAW,OAAO,yBAAyB,iBAAiB,CAAC;AAAA,QAC3E,MAAM,SACJ,QAAQ,YAAY,MAAM,KAAK,SAAS,aAAa,kBAAkB,CAAC,CAC1E,EAAE,QAAQ,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAAA,OACtD;AAAA,KACF;AAAA,IAED,OAAK,8CAA8C,YAAY;AAAA,MAC7D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,oBAAoB,SAAS,UAAS,kBAAkB,iBAAiB,CAAC;AAAA,QAChF,MAAM,SACJ,oBAAoB,SAAS,UAAS,mBAAmB,iBAAiB,CAAC,CAC7E,EAAE,QAAQ,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAAA,OAClD;AAAA,KACF;AAAA,IAED,OAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,MAAM,oBACpB,SACA,UAAS,kBAAkB,gBAAgB,CAC7C;AAAA,QACA,MAAM,QAAQ,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,IAAI,QAAQ;AAAA,UACZ,QAAQ;AAAA,UACR;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,YAAY,MAAM,QAAQ,YAAY,QAAQ,EAAE,wBAAW,IAAI,QAAQ,GAAG,CAAC;AAAA,QACjF,SAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,IAAI,QAAQ;AAAA,UACZ,aAAa,QAAQ;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,SAAO,UAAU,UAAU,EAAE,cAAc;AAAA,QAC3C,SAAO,UAAU,cAAc,EAAE,cAAc;AAAA,QAC/C,SAAO,UAAU,KAAK,EAAE,cAAc;AAAA,QAEtC,MAAM,QAAQ,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,IAAI,QAAQ;AAAA,UACZ,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,YAAY,QAAQ,EAAE,wBAAW,IAAI,QAAQ,GAAG,CAAC,CAC3D,EAAE,QAAQ,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAAA,OACvD;AAAA,KACF;AAAA,IAED,OAAK,+CAA+C,YAAY;AAAA,MAC9D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,MAAM,MAAM,oBAAoB,SAAS,UAAS,mBAAmB,CAAC;AAAA,QAC5E,MAAM,QAAQ,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,IAAI,IAAI;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,SAAO,QAAQ,YAAY,QAAQ,EAAE,wBAAW,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,QAAQ,cAAc;AAAA,UACzF,MAAM;AAAA,QACR,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,MAAM,MAAM,oBAAoB,SAAS,UAAS,cAAc,YAAY,CAAC;AAAA,QACnF,MAAM,mBAAmB;AAAA,aACpB;AAAA,UACH,SAAS,KAAK,iBAAiB,SAAS,OAAO,IAAI,GAAG;AAAA,QACxD;AAAA,QACA,MAAM,iBAAiB;AAAA,UACrB,MAAM;AAAA,UACN,SAAS,OAAO,iBAAiB,OAAO;AAAA,UACxC,WAAW;AAAA,UACX,IAAI,iBAAiB;AAAA,UACrB,SAAS;AAAA,YACP,aAAa,OAAO,iBAAiB,QAAQ,WAAW;AAAA,YACxD,WAAW,OAAO,iBAAiB,QAAQ,SAAS;AAAA,YACpD,OAAO,OAAO,iBAAiB,QAAQ,KAAK;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,MAAM,WAAW,MAAM,QAAQ,YAAY,OAAO;AAAA,UAChD;AAAA,UACA,IAAI,IAAI;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QAED,eAAe,QAAQ,QAAQ;AAAA,QAC/B,SAAO,SAAS,KAAK,EAAE,QAAQ,gBAAgB;AAAA,QAC/C,MAAM,SAAO,QAAQ,YAAY,QAAQ,EAAE,wBAAW,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,cAC5E;AAAA,UACE,OAAO;AAAA,QACT,CACF;AAAA,QACA,MAAM,SACJ,QAAQ,YAAY,KAAK;AAAA,UACvB;AAAA,UACA,UAAU,CAAC,QAAQ;AAAA,UACnB,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,iBAAiB,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,OACvF;AAAA,KACF;AAAA,IAED,OAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,MAAM,MAAM,oBAAoB,SAAS,UAAS,iBAAiB,CAAC;AAAA,QAC1E,MAAM,SACJ,QAAQ,YAAY,OAAO;AAAA,UACzB;AAAA,UACA,IAAI,IAAI;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,OAAO,KAAK,kBAAkB,MAAM,oBAAoB;AAAA,QAC1D,CAAC,CACH,EAAE,QAAQ,QAAQ,8CAA8C;AAAA,QAChE,MAAM,YAAY,MAAM,QAAQ,YAAY,QAAQ,EAAE,wBAAW,IAAI,IAAI,GAAG,CAAC;AAAA,QAC7E,SAAO,WAAW,MAAM,EAAE,KAAK,SAAS;AAAA,QACxC,SAAO,WAAW,KAAK,EAAE,cAAc;AAAA,OACxC;AAAA,KACF;AAAA,GACF;AAAA;AAGH,SAAS,SAAQ,CAAC,IAAY,gBAAyB;AAAA,EACrD,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,OACf,mBAAmB,YAAY,CAAC,IAAI,EAAE,eAAe;AAAA,IACzD,WAAW,IAAI,KAAK,0BAA0B;AAAA,EAChD;AAAA;AAGF,SAAS,wBAAwB,CAAC,IAAkC;AAAA,EAClE,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,EAAE,MAAM,WAAW,WAAW,GAAG;AAAA,IAC3C,QAAQ,EAAE,MAAM,QAAQ,WAAW,GAAG;AAAA,IACtC,eAAe,eAAe;AAAA,IAC9B,kBAAkB,EAAE,MAAM,WAAW;AAAA,EACvC;AAAA;",
|
|
42
|
+
"debugId": "485577425ADF420C64756E2164756E21",
|
|
37
43
|
"names": []
|
|
38
44
|
}
|