@emilia-protocol/gate 0.10.0 → 0.13.0
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/CHANGELOG.md +91 -0
- package/README.md +272 -0
- package/action-control-manifest.js +3 -268
- package/action-escrow-custodian.js +4 -0
- package/action-escrow-evidence.js +4 -0
- package/action-escrow-package.js +4 -0
- package/action-escrow-postgres.js +4 -0
- package/action-escrow-state.js +4 -0
- package/action-escrow-verifiers.js +4 -0
- package/action-escrow.js +4 -0
- package/action-packs.js +3 -140
- package/adapters/_kit.js +3 -104
- package/adapters/aws.js +3 -108
- package/adapters/cloudflare.js +3 -54
- package/adapters/gcp.js +3 -70
- package/adapters/github.js +3 -109
- package/adapters/jira.js +3 -55
- package/adapters/k8s.js +3 -70
- package/adapters/linear.js +3 -55
- package/adapters/salesforce.js +3 -55
- package/adapters/stripe.js +3 -81
- package/adapters/supabase.js +3 -121
- package/adapters/terraform.js +3 -59
- package/adapters/vercel.js +3 -84
- package/aec-execution.js +3 -312
- package/breakglass.js +3 -582
- package/capability-receipt.js +4 -0
- package/cf1-conformance.js +3 -106
- package/challenge-store.js +3 -69
- package/control-plane.js +3 -340
- package/coverage.js +3 -721
- package/demo.mjs +1 -1
- package/deployment-attestation.js +3 -247
- package/dist/action-control-manifest.d.ts +82 -0
- package/dist/action-control-manifest.d.ts.map +1 -0
- package/dist/action-control-manifest.js +422 -0
- package/dist/action-control-manifest.js.map +1 -0
- package/dist/action-escrow-custodian.d.ts +74 -0
- package/dist/action-escrow-custodian.d.ts.map +1 -0
- package/dist/action-escrow-custodian.js +363 -0
- package/dist/action-escrow-custodian.js.map +1 -0
- package/dist/action-escrow-evidence.d.ts +130 -0
- package/dist/action-escrow-evidence.d.ts.map +1 -0
- package/dist/action-escrow-evidence.js +1012 -0
- package/dist/action-escrow-evidence.js.map +1 -0
- package/dist/action-escrow-package.d.ts +10 -0
- package/dist/action-escrow-package.d.ts.map +1 -0
- package/dist/action-escrow-package.js +1583 -0
- package/dist/action-escrow-package.js.map +1 -0
- package/dist/action-escrow-postgres.d.ts +62 -0
- package/dist/action-escrow-postgres.d.ts.map +1 -0
- package/dist/action-escrow-postgres.js +339 -0
- package/dist/action-escrow-postgres.js.map +1 -0
- package/dist/action-escrow-state.d.ts +141 -0
- package/dist/action-escrow-state.d.ts.map +1 -0
- package/dist/action-escrow-state.js +413 -0
- package/dist/action-escrow-state.js.map +1 -0
- package/dist/action-escrow-verifiers.d.ts +65 -0
- package/dist/action-escrow-verifiers.d.ts.map +1 -0
- package/dist/action-escrow-verifiers.js +421 -0
- package/dist/action-escrow-verifiers.js.map +1 -0
- package/dist/action-escrow.d.ts +112 -0
- package/dist/action-escrow.d.ts.map +1 -0
- package/dist/action-escrow.js +2661 -0
- package/dist/action-escrow.js.map +1 -0
- package/dist/action-packs.d.ts +54 -0
- package/dist/action-packs.d.ts.map +1 -0
- package/dist/action-packs.js +143 -0
- package/dist/action-packs.js.map +1 -0
- package/dist/adapters/_kit.d.ts +50 -0
- package/dist/adapters/_kit.d.ts.map +1 -0
- package/dist/adapters/_kit.js +98 -0
- package/dist/adapters/_kit.js.map +1 -0
- package/dist/adapters/aws.d.ts +158 -0
- package/dist/adapters/aws.d.ts.map +1 -0
- package/dist/adapters/aws.js +136 -0
- package/dist/adapters/aws.js.map +1 -0
- package/dist/adapters/cloudflare.d.ts +116 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +75 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/gcp.d.ts +139 -0
- package/dist/adapters/gcp.d.ts.map +1 -0
- package/dist/adapters/gcp.js +69 -0
- package/dist/adapters/gcp.js.map +1 -0
- package/dist/adapters/github.d.ts +123 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +105 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/jira.d.ts +109 -0
- package/dist/adapters/jira.d.ts.map +1 -0
- package/dist/adapters/jira.js +54 -0
- package/dist/adapters/jira.js.map +1 -0
- package/dist/adapters/k8s.d.ts +139 -0
- package/dist/adapters/k8s.d.ts.map +1 -0
- package/dist/adapters/k8s.js +69 -0
- package/dist/adapters/k8s.js.map +1 -0
- package/dist/adapters/linear.d.ts +109 -0
- package/dist/adapters/linear.d.ts.map +1 -0
- package/dist/adapters/linear.js +54 -0
- package/dist/adapters/linear.js.map +1 -0
- package/dist/adapters/salesforce.d.ts +109 -0
- package/dist/adapters/salesforce.d.ts.map +1 -0
- package/dist/adapters/salesforce.js +54 -0
- package/dist/adapters/salesforce.js.map +1 -0
- package/dist/adapters/stripe.d.ts +116 -0
- package/dist/adapters/stripe.d.ts.map +1 -0
- package/dist/adapters/stripe.js +77 -0
- package/dist/adapters/stripe.js.map +1 -0
- package/dist/adapters/supabase.d.ts +127 -0
- package/dist/adapters/supabase.d.ts.map +1 -0
- package/dist/adapters/supabase.js +112 -0
- package/dist/adapters/supabase.js.map +1 -0
- package/dist/adapters/terraform.d.ts +109 -0
- package/dist/adapters/terraform.d.ts.map +1 -0
- package/dist/adapters/terraform.js +58 -0
- package/dist/adapters/terraform.js.map +1 -0
- package/dist/adapters/vercel.d.ts +114 -0
- package/dist/adapters/vercel.d.ts.map +1 -0
- package/dist/adapters/vercel.js +81 -0
- package/dist/adapters/vercel.js.map +1 -0
- package/dist/aec-execution.d.ts +107 -0
- package/dist/aec-execution.d.ts.map +1 -0
- package/dist/aec-execution.js +334 -0
- package/dist/aec-execution.js.map +1 -0
- package/dist/breakglass.d.ts +205 -0
- package/dist/breakglass.d.ts.map +1 -0
- package/dist/breakglass.js +627 -0
- package/dist/breakglass.js.map +1 -0
- package/dist/capability-receipt.d.ts +601 -0
- package/dist/capability-receipt.d.ts.map +1 -0
- package/dist/capability-receipt.js +1177 -0
- package/dist/capability-receipt.js.map +1 -0
- package/dist/cf1-conformance.d.ts +83 -0
- package/dist/cf1-conformance.d.ts.map +1 -0
- package/dist/cf1-conformance.js +94 -0
- package/dist/cf1-conformance.js.map +1 -0
- package/dist/challenge-store.d.ts +20 -0
- package/dist/challenge-store.d.ts.map +1 -0
- package/dist/challenge-store.js +62 -0
- package/dist/challenge-store.js.map +1 -0
- package/dist/control-plane.d.ts +136 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +349 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/coverage.d.ts +156 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +768 -0
- package/dist/coverage.js.map +1 -0
- package/dist/deployment-attestation.d.ts +93 -0
- package/dist/deployment-attestation.d.ts.map +1 -0
- package/dist/deployment-attestation.js +262 -0
- package/dist/deployment-attestation.js.map +1 -0
- package/dist/eg1-conformance.d.ts +286 -0
- package/dist/eg1-conformance.d.ts.map +1 -0
- package/dist/eg1-conformance.js +379 -0
- package/dist/eg1-conformance.js.map +1 -0
- package/dist/enterprise.d.ts +88 -0
- package/dist/enterprise.d.ts.map +1 -0
- package/dist/enterprise.js +194 -0
- package/dist/enterprise.js.map +1 -0
- package/dist/evidence-postgres.d.ts +123 -0
- package/dist/evidence-postgres.d.ts.map +1 -0
- package/dist/evidence-postgres.js +343 -0
- package/dist/evidence-postgres.js.map +1 -0
- package/dist/evidence.d.ts +113 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +369 -0
- package/dist/evidence.js.map +1 -0
- package/dist/execution-binding.d.ts +49 -0
- package/dist/execution-binding.d.ts.map +1 -0
- package/dist/execution-binding.js +243 -0
- package/dist/execution-binding.js.map +1 -0
- package/dist/formal-runtime-map.d.ts +42 -0
- package/dist/formal-runtime-map.d.ts.map +1 -0
- package/dist/formal-runtime-map.js +23 -0
- package/dist/formal-runtime-map.js.map +1 -0
- package/dist/index.d.ts +1002 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1736 -0
- package/dist/index.js.map +1 -0
- package/dist/key-registry.d.ts +60 -0
- package/dist/key-registry.d.ts.map +1 -0
- package/dist/key-registry.js +144 -0
- package/dist/key-registry.js.map +1 -0
- package/dist/mcp.d.ts +53 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +112 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metering.d.ts +80 -0
- package/dist/metering.d.ts.map +1 -0
- package/dist/metering.js +227 -0
- package/dist/metering.js.map +1 -0
- package/dist/metrics.d.ts +68 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +242 -0
- package/dist/metrics.js.map +1 -0
- package/dist/network-witness.d.ts +167 -0
- package/dist/network-witness.d.ts.map +1 -0
- package/dist/network-witness.js +520 -0
- package/dist/network-witness.js.map +1 -0
- package/dist/protocol-state.d.ts +141 -0
- package/dist/protocol-state.d.ts.map +1 -0
- package/dist/protocol-state.js +106 -0
- package/dist/protocol-state.js.map +1 -0
- package/dist/receipt-program.d.ts +59 -0
- package/dist/receipt-program.d.ts.map +1 -0
- package/dist/receipt-program.js +1053 -0
- package/dist/receipt-program.js.map +1 -0
- package/dist/reliance-kernel.d.ts +66 -0
- package/dist/reliance-kernel.d.ts.map +1 -0
- package/dist/reliance-kernel.js +103 -0
- package/dist/reliance-kernel.js.map +1 -0
- package/dist/reliance-packet.d.ts +67 -0
- package/dist/reliance-packet.d.ts.map +1 -0
- package/dist/reliance-packet.js +176 -0
- package/dist/reliance-packet.js.map +1 -0
- package/dist/remedy-program-postgres.d.ts +37 -0
- package/dist/remedy-program-postgres.d.ts.map +1 -0
- package/dist/remedy-program-postgres.js +291 -0
- package/dist/remedy-program-postgres.js.map +1 -0
- package/dist/remedy-program-receipt.d.ts +97 -0
- package/dist/remedy-program-receipt.d.ts.map +1 -0
- package/dist/remedy-program-receipt.js +817 -0
- package/dist/remedy-program-receipt.js.map +1 -0
- package/dist/remedy-program.d.ts +76 -0
- package/dist/remedy-program.d.ts.map +1 -0
- package/dist/remedy-program.js +1346 -0
- package/dist/remedy-program.js.map +1 -0
- package/dist/reports/art14.d.ts +101 -0
- package/dist/reports/art14.d.ts.map +1 -0
- package/dist/reports/art14.js +340 -0
- package/dist/reports/art14.js.map +1 -0
- package/dist/reports/assurance-package.d.ts +197 -0
- package/dist/reports/assurance-package.d.ts.map +1 -0
- package/dist/reports/assurance-package.js +313 -0
- package/dist/reports/assurance-package.js.map +1 -0
- package/dist/reports/auditor-workpaper.d.ts +194 -0
- package/dist/reports/auditor-workpaper.d.ts.map +1 -0
- package/dist/reports/auditor-workpaper.js +545 -0
- package/dist/reports/auditor-workpaper.js.map +1 -0
- package/dist/reports/external-verification.d.ts +76 -0
- package/dist/reports/external-verification.d.ts.map +1 -0
- package/dist/reports/external-verification.js +209 -0
- package/dist/reports/external-verification.js.map +1 -0
- package/dist/reports/reperform.d.ts +122 -0
- package/dist/reports/reperform.d.ts.map +1 -0
- package/dist/reports/reperform.js +432 -0
- package/dist/reports/reperform.js.map +1 -0
- package/dist/reports/underwriter.d.ts +127 -0
- package/dist/reports/underwriter.d.ts.map +1 -0
- package/dist/reports/underwriter.js +348 -0
- package/dist/reports/underwriter.js.map +1 -0
- package/dist/retention.d.ts +88 -0
- package/dist/retention.d.ts.map +1 -0
- package/dist/retention.js +90 -0
- package/dist/retention.js.map +1 -0
- package/dist/roster.d.ts +113 -0
- package/dist/roster.d.ts.map +1 -0
- package/dist/roster.js +261 -0
- package/dist/roster.js.map +1 -0
- package/dist/runtime-monitor.d.ts +132 -0
- package/dist/runtime-monitor.d.ts.map +1 -0
- package/dist/runtime-monitor.js +197 -0
- package/dist/runtime-monitor.js.map +1 -0
- package/dist/settlement.d.ts +68 -0
- package/dist/settlement.d.ts.map +1 -0
- package/dist/settlement.js +306 -0
- package/dist/settlement.js.map +1 -0
- package/dist/siem.d.ts +261 -0
- package/dist/siem.d.ts.map +1 -0
- package/dist/siem.js +247 -0
- package/dist/siem.js.map +1 -0
- package/dist/store-postgres.d.ts +107 -0
- package/dist/store-postgres.d.ts.map +1 -0
- package/dist/store-postgres.js +152 -0
- package/dist/store-postgres.js.map +1 -0
- package/dist/store.d.ts +95 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +202 -0
- package/dist/store.js.map +1 -0
- package/dist/strict-json.d.ts +14 -0
- package/dist/strict-json.d.ts.map +1 -0
- package/dist/strict-json.js +132 -0
- package/dist/strict-json.js.map +1 -0
- package/dist/trust-program-adapters.d.ts +122 -0
- package/dist/trust-program-adapters.d.ts.map +1 -0
- package/dist/trust-program-adapters.js +802 -0
- package/dist/trust-program-adapters.js.map +1 -0
- package/dist/trust-program-postgres.d.ts +41 -0
- package/dist/trust-program-postgres.d.ts.map +1 -0
- package/dist/trust-program-postgres.js +346 -0
- package/dist/trust-program-postgres.js.map +1 -0
- package/dist/trust-program-revocation.d.ts +206 -0
- package/dist/trust-program-revocation.d.ts.map +1 -0
- package/dist/trust-program-revocation.js +600 -0
- package/dist/trust-program-revocation.js.map +1 -0
- package/dist/trust-program.d.ts +197 -0
- package/dist/trust-program.d.ts.map +1 -0
- package/dist/trust-program.js +1351 -0
- package/dist/trust-program.js.map +1 -0
- package/dist/witness-postgres.d.ts +43 -0
- package/dist/witness-postgres.d.ts.map +1 -0
- package/dist/witness-postgres.js +92 -0
- package/dist/witness-postgres.js.map +1 -0
- package/dist/zk-range-proof.d.ts +78 -0
- package/dist/zk-range-proof.d.ts.map +1 -0
- package/dist/zk-range-proof.js +228 -0
- package/dist/zk-range-proof.js.map +1 -0
- package/eg1-conformance.js +3 -404
- package/enterprise.js +3 -180
- package/ep-assure.mjs +1 -0
- package/evidence-postgres.js +3 -356
- package/evidence.js +4 -360
- package/execution-binding.js +3 -212
- package/formal-runtime-map.js +4 -0
- package/index.js +4 -1249
- package/key-registry.js +3 -134
- package/mcp.js +3 -109
- package/metering.js +3 -226
- package/metrics.js +3 -231
- package/network-witness.js +3 -499
- package/package.json +47 -4
- package/receipt-program.js +4 -0
- package/reliance-kernel.js +3 -112
- package/reliance-packet.js +3 -175
- package/remedy-program-postgres.js +4 -0
- package/remedy-program-receipt.js +4 -0
- package/remedy-program.js +4 -0
- package/reports/art14.js +0 -0
- package/reports/assurance-package.js +2 -312
- package/reports/auditor-workpaper.js +3 -537
- package/reports/external-verification.js +3 -222
- package/reports/reperform.js +3 -424
- package/reports/underwriter.js +3 -339
- package/retention.js +3 -84
- package/roster.js +3 -264
- package/runtime-monitor.js +4 -0
- package/settlement.js +3 -299
- package/siem.js +3 -235
- package/src/action-control-manifest.ts +424 -0
- package/src/action-escrow-custodian.ts +427 -0
- package/src/action-escrow-evidence.ts +1178 -0
- package/src/action-escrow-package.ts +1821 -0
- package/src/action-escrow-postgres.ts +366 -0
- package/src/action-escrow-state.ts +498 -0
- package/src/action-escrow-verifiers.ts +484 -0
- package/src/action-escrow.ts +3039 -0
- package/src/action-packs.ts +170 -0
- package/src/adapters/_kit.ts +117 -0
- package/src/adapters/aws.ts +142 -0
- package/src/adapters/cloudflare.ts +78 -0
- package/src/adapters/gcp.ts +71 -0
- package/src/adapters/github.ts +110 -0
- package/src/adapters/jira.ts +56 -0
- package/src/adapters/k8s.ts +71 -0
- package/src/adapters/linear.ts +56 -0
- package/src/adapters/salesforce.ts +56 -0
- package/src/adapters/stripe.ts +82 -0
- package/src/adapters/supabase.ts +122 -0
- package/src/adapters/terraform.ts +60 -0
- package/src/adapters/vercel.ts +85 -0
- package/src/aec-execution.ts +354 -0
- package/src/breakglass.ts +647 -0
- package/src/capability-receipt.ts +1258 -0
- package/src/cf1-conformance.ts +120 -0
- package/src/challenge-store.ts +70 -0
- package/src/control-plane.ts +374 -0
- package/src/coverage.ts +832 -0
- package/src/deployment-attestation.ts +259 -0
- package/src/eg1-conformance.ts +471 -0
- package/src/enterprise.ts +195 -0
- package/src/evidence-postgres.ts +374 -0
- package/src/evidence.ts +367 -0
- package/src/execution-binding.ts +236 -0
- package/src/formal-runtime-map.ts +24 -0
- package/src/index.ts +2122 -0
- package/src/key-registry.ts +150 -0
- package/src/mcp.ts +120 -0
- package/src/metering.ts +237 -0
- package/src/metrics.ts +232 -0
- package/src/network-witness.ts +585 -0
- package/src/protocol-state.ts +143 -0
- package/src/protocol-state.typecheck.ts +94 -0
- package/src/receipt-program.ts +1105 -0
- package/src/reliance-kernel.ts +119 -0
- package/src/reliance-packet.ts +206 -0
- package/src/remedy-program-postgres.ts +367 -0
- package/src/remedy-program-receipt.ts +891 -0
- package/src/remedy-program.ts +1388 -0
- package/src/reports/art14.ts +361 -0
- package/src/reports/assurance-package.ts +330 -0
- package/src/reports/auditor-workpaper.ts +558 -0
- package/src/reports/external-verification.ts +232 -0
- package/src/reports/reperform.ts +441 -0
- package/src/reports/underwriter.ts +356 -0
- package/src/retention.ts +100 -0
- package/src/roster.ts +273 -0
- package/src/runtime-monitor.ts +217 -0
- package/src/settlement.ts +313 -0
- package/src/siem.ts +247 -0
- package/src/store-postgres.ts +167 -0
- package/src/store.ts +214 -0
- package/src/strict-json.ts +115 -0
- package/src/trust-program-adapters.ts +847 -0
- package/src/trust-program-postgres.ts +429 -0
- package/src/trust-program-revocation.ts +751 -0
- package/src/trust-program.ts +1460 -0
- package/src/witness-postgres.ts +106 -0
- package/src/zk-range-proof.ts +250 -0
- package/store-postgres.js +3 -161
- package/store.js +4 -198
- package/strict-json.js +3 -85
- package/trust-program-adapters.js +4 -0
- package/trust-program-postgres.js +4 -0
- package/trust-program-revocation.js +4 -0
- package/trust-program.js +4 -0
- package/witness-postgres.js +3 -96
- package/zk-range-proof.js +4 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Durable, tenant-aware PostgreSQL CAS store for the Remedy Program kernel.
|
|
5
|
+
*
|
|
6
|
+
* Tables are never addressed directly. Each operation calls one service-role
|
|
7
|
+
* RPC on one pinned pg client inside an explicit transaction. Logical refusals
|
|
8
|
+
* have stable reasons; malformed rows, connection failures, and uncertain
|
|
9
|
+
* commit outcomes throw so callers cannot mistake ambiguity for success.
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
import { canonicalize } from '../execution-binding.js';
|
|
13
|
+
export const REMEDY_PROGRAM_PG_STORE_VERSION = 'EP-GATE-REMEDY-PROGRAM-PG-STORE-v1';
|
|
14
|
+
export const REMEDY_PROGRAM_MAX_STATE_BYTES = 4 * 1024 * 1024;
|
|
15
|
+
export const REMEDY_PROGRAM_MAX_FORWARD_SKEW_MINUTES = 5;
|
|
16
|
+
const INSTANCE_ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/;
|
|
17
|
+
const DIGEST = /^sha256:[0-9a-f]{64}$/;
|
|
18
|
+
const STRICT_INSTANT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/;
|
|
19
|
+
const ENVELOPE_KEYS = new Set([
|
|
20
|
+
'ok', 'reason', 'tenant_id', 'instance_id', 'revision',
|
|
21
|
+
'state_json', 'state_digest', 'recorded_at',
|
|
22
|
+
]);
|
|
23
|
+
export const REMEDY_PROGRAM_POSTGRES_SQL = Object.freeze({
|
|
24
|
+
create: `SELECT ok, reason, tenant_id, instance_id, revision, state_json, state_digest, recorded_at
|
|
25
|
+
FROM remedy_program_private.remedy_program_create(
|
|
26
|
+
$1::text, $2::text, $3::text, $4::text, $5::text
|
|
27
|
+
)`,
|
|
28
|
+
get: `SELECT ok, reason, tenant_id, instance_id, revision, state_json, state_digest, recorded_at
|
|
29
|
+
FROM remedy_program_private.remedy_program_get($1::text, $2::text)`,
|
|
30
|
+
compareAndSwap: `SELECT ok, reason, tenant_id, instance_id, revision, state_json, state_digest, recorded_at
|
|
31
|
+
FROM remedy_program_private.remedy_program_compare_and_swap(
|
|
32
|
+
$1::text, $2::text, $3::bigint, $4::bigint, $5::text, $6::text, $7::text
|
|
33
|
+
)`,
|
|
34
|
+
});
|
|
35
|
+
function isRecord(value) {
|
|
36
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
37
|
+
return false;
|
|
38
|
+
const prototype = Object.getPrototypeOf(value);
|
|
39
|
+
return prototype === Object.prototype || prototype === null;
|
|
40
|
+
}
|
|
41
|
+
function exactKeys(value, expected) {
|
|
42
|
+
const keys = Reflect.ownKeys(value);
|
|
43
|
+
return keys.length === expected.size
|
|
44
|
+
&& keys.every((key) => typeof key === 'string' && expected.has(key));
|
|
45
|
+
}
|
|
46
|
+
function fail(reason) {
|
|
47
|
+
return { ok: false, reason };
|
|
48
|
+
}
|
|
49
|
+
function assertTenantId(value) {
|
|
50
|
+
if (typeof value !== 'string'
|
|
51
|
+
|| Buffer.byteLength(value, 'utf8') < 1
|
|
52
|
+
|| Buffer.byteLength(value, 'utf8') > 512
|
|
53
|
+
|| /[\u0000-\u001f\u007f]/.test(value)) {
|
|
54
|
+
throw new TypeError('remedy-program tenantId is invalid');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function assertInstanceId(value) {
|
|
58
|
+
if (typeof value !== 'string' || !INSTANCE_ID.test(value)) {
|
|
59
|
+
throw new TypeError('remedy-program instanceId is invalid');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function assertRevision(value, label) {
|
|
63
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
64
|
+
throw new TypeError(`remedy-program ${label} revision is invalid`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function stateDigest(stateJson) {
|
|
68
|
+
return `sha256:${createHash('sha256').update(stateJson, 'utf8').digest('hex')}`;
|
|
69
|
+
}
|
|
70
|
+
function stateEventAt(state) {
|
|
71
|
+
const value = state.updated_at;
|
|
72
|
+
if (typeof value !== 'string'
|
|
73
|
+
|| !STRICT_INSTANT.test(value)
|
|
74
|
+
|| !Number.isFinite(Date.parse(value))) {
|
|
75
|
+
throw new TypeError('remedy-program state updated_at is invalid');
|
|
76
|
+
}
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
function encodeState(state, tenantId, instanceId, revision) {
|
|
80
|
+
if (!isRecord(state)
|
|
81
|
+
|| state.tenant_id !== tenantId
|
|
82
|
+
|| state.instance_id !== instanceId
|
|
83
|
+
|| state.revision !== revision) {
|
|
84
|
+
throw new TypeError('remedy-program state binding does not match the store operation');
|
|
85
|
+
}
|
|
86
|
+
let stateJson;
|
|
87
|
+
try {
|
|
88
|
+
stateJson = canonicalize(state);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
throw new TypeError('remedy-program state must be canonical JSON');
|
|
92
|
+
}
|
|
93
|
+
if (Buffer.byteLength(stateJson, 'utf8') > REMEDY_PROGRAM_MAX_STATE_BYTES) {
|
|
94
|
+
throw new TypeError('remedy-program state exceeds the durable store limit');
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
stateJson,
|
|
98
|
+
stateDigest: stateDigest(stateJson),
|
|
99
|
+
eventAt: stateEventAt(state),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function safeRevision(value) {
|
|
103
|
+
const revision = typeof value === 'string' && /^(?:0|[1-9]\d*)$/.test(value)
|
|
104
|
+
? Number(value)
|
|
105
|
+
: value;
|
|
106
|
+
if (!Number.isSafeInteger(revision) || revision < 0) {
|
|
107
|
+
throw new Error('remedy-program Postgres returned an invalid revision');
|
|
108
|
+
}
|
|
109
|
+
return revision;
|
|
110
|
+
}
|
|
111
|
+
function assertRecordedAt(value) {
|
|
112
|
+
if (typeof value !== 'string'
|
|
113
|
+
|| !STRICT_INSTANT.test(value)
|
|
114
|
+
|| !Number.isFinite(Date.parse(value))) {
|
|
115
|
+
throw new Error('remedy-program Postgres returned an invalid recorded_at');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function decodeState(row, expectedTenantId, expectedInstanceId, expectedRevision) {
|
|
119
|
+
if (row.tenant_id !== expectedTenantId
|
|
120
|
+
|| row.instance_id !== expectedInstanceId
|
|
121
|
+
|| typeof row.state_json !== 'string'
|
|
122
|
+
|| typeof row.state_digest !== 'string'
|
|
123
|
+
|| !DIGEST.test(row.state_digest)
|
|
124
|
+
|| Buffer.byteLength(row.state_json, 'utf8') > REMEDY_PROGRAM_MAX_STATE_BYTES
|
|
125
|
+
|| row.state_digest !== stateDigest(row.state_json)) {
|
|
126
|
+
throw new Error('remedy-program Postgres returned an invalid state envelope');
|
|
127
|
+
}
|
|
128
|
+
assertRecordedAt(row.recorded_at);
|
|
129
|
+
const revision = safeRevision(row.revision);
|
|
130
|
+
if (expectedRevision !== undefined && revision !== expectedRevision) {
|
|
131
|
+
throw new Error('remedy-program Postgres returned an unexpected revision');
|
|
132
|
+
}
|
|
133
|
+
let state;
|
|
134
|
+
try {
|
|
135
|
+
state = JSON.parse(row.state_json);
|
|
136
|
+
if (!isRecord(state)
|
|
137
|
+
|| canonicalize(state) !== row.state_json
|
|
138
|
+
|| state.tenant_id !== expectedTenantId
|
|
139
|
+
|| state.instance_id !== expectedInstanceId
|
|
140
|
+
|| state.revision !== revision) {
|
|
141
|
+
throw new Error('state binding mismatch');
|
|
142
|
+
}
|
|
143
|
+
stateEventAt(state);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
throw new Error('remedy-program Postgres returned non-canonical state');
|
|
147
|
+
}
|
|
148
|
+
return state;
|
|
149
|
+
}
|
|
150
|
+
function definitiveRow(result, operation, tenantId, instanceId, allowedReasons, expectedRevision) {
|
|
151
|
+
if (!result || result.rowCount !== 1 || !Array.isArray(result.rows) || result.rows.length !== 1) {
|
|
152
|
+
throw new Error(`remedy-program ${operation} outcome is ambiguous`);
|
|
153
|
+
}
|
|
154
|
+
const row = result.rows[0];
|
|
155
|
+
if (!isRecord(row) || !exactKeys(row, ENVELOPE_KEYS) || typeof row.ok !== 'boolean') {
|
|
156
|
+
throw new Error(`remedy-program ${operation} outcome is malformed`);
|
|
157
|
+
}
|
|
158
|
+
if (row.tenant_id !== tenantId || row.instance_id !== instanceId) {
|
|
159
|
+
throw new Error(`remedy-program ${operation} Postgres returned a mismatched identity`);
|
|
160
|
+
}
|
|
161
|
+
if (!row.ok) {
|
|
162
|
+
if (typeof row.reason !== 'string'
|
|
163
|
+
|| !allowedReasons.has(row.reason)
|
|
164
|
+
|| row.revision !== null
|
|
165
|
+
|| row.state_json !== null
|
|
166
|
+
|| row.state_digest !== null
|
|
167
|
+
|| row.recorded_at !== null) {
|
|
168
|
+
throw new Error(`remedy-program ${operation} refusal is unrecognized`);
|
|
169
|
+
}
|
|
170
|
+
return fail(row.reason);
|
|
171
|
+
}
|
|
172
|
+
if (row.reason !== null) {
|
|
173
|
+
throw new Error(`remedy-program ${operation} success carried a refusal reason`);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
ok: true,
|
|
177
|
+
state: decodeState(row, tenantId, instanceId, expectedRevision),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function lookupInput(value) {
|
|
181
|
+
if (!isRecord(value)
|
|
182
|
+
|| Reflect.ownKeys(value).length !== 2
|
|
183
|
+
|| !Object.hasOwn(value, 'tenantId')
|
|
184
|
+
|| !Object.hasOwn(value, 'instanceId')) {
|
|
185
|
+
throw new TypeError('remedy-program lookup input is invalid');
|
|
186
|
+
}
|
|
187
|
+
assertTenantId(value.tenantId);
|
|
188
|
+
assertInstanceId(value.instanceId);
|
|
189
|
+
return { tenantId: value.tenantId, instanceId: value.instanceId };
|
|
190
|
+
}
|
|
191
|
+
/** Build the exact durable store consumed by createRemedyProgramKernel(). */
|
|
192
|
+
export function createRemedyProgramPostgresStore({ pool } = {}) {
|
|
193
|
+
if (!pool || typeof pool.connect !== 'function') {
|
|
194
|
+
throw new TypeError('createRemedyProgramPostgresStore requires a transaction-capable pg pool');
|
|
195
|
+
}
|
|
196
|
+
async function transaction(readOnly, work) {
|
|
197
|
+
const client = await pool.connect();
|
|
198
|
+
if (!client || typeof client.query !== 'function' || typeof client.release !== 'function') {
|
|
199
|
+
throw new TypeError('remedy-program pg pool returned an invalid client');
|
|
200
|
+
}
|
|
201
|
+
let began = false;
|
|
202
|
+
try {
|
|
203
|
+
await client.query(readOnly
|
|
204
|
+
? 'BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY'
|
|
205
|
+
: 'BEGIN ISOLATION LEVEL READ COMMITTED READ WRITE');
|
|
206
|
+
began = true;
|
|
207
|
+
const value = await work(client);
|
|
208
|
+
await client.query('COMMIT');
|
|
209
|
+
began = false;
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
if (began) {
|
|
214
|
+
try {
|
|
215
|
+
await client.query('ROLLBACK');
|
|
216
|
+
}
|
|
217
|
+
catch (rollbackError) {
|
|
218
|
+
throw new AggregateError([error, rollbackError], 'remedy-program transaction and rollback both failed');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
client.release();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return Object.freeze({
|
|
228
|
+
durable: true,
|
|
229
|
+
async create(state) {
|
|
230
|
+
const tenantId = state?.tenant_id;
|
|
231
|
+
const instanceId = state?.instance_id;
|
|
232
|
+
assertTenantId(tenantId);
|
|
233
|
+
assertInstanceId(instanceId);
|
|
234
|
+
const encoded = encodeState(state, tenantId, instanceId, 0);
|
|
235
|
+
return transaction(false, async (client) => definitiveRow(await client.query(REMEDY_PROGRAM_POSTGRES_SQL.create, [
|
|
236
|
+
tenantId,
|
|
237
|
+
instanceId,
|
|
238
|
+
encoded.stateJson,
|
|
239
|
+
encoded.stateDigest,
|
|
240
|
+
encoded.eventAt,
|
|
241
|
+
]), 'create', tenantId, instanceId, new Set([
|
|
242
|
+
'instance_exists', 'clock_forward_skew',
|
|
243
|
+
'evidence_replayed', 'remedy_operation_replayed',
|
|
244
|
+
]), 0));
|
|
245
|
+
},
|
|
246
|
+
async get(input) {
|
|
247
|
+
const { tenantId, instanceId } = lookupInput(input);
|
|
248
|
+
return transaction(true, async (client) => definitiveRow(await client.query(REMEDY_PROGRAM_POSTGRES_SQL.get, [tenantId, instanceId]), 'get', tenantId, instanceId, new Set(['instance_not_found'])));
|
|
249
|
+
},
|
|
250
|
+
async compareAndSwap(input) {
|
|
251
|
+
if (!isRecord(input)
|
|
252
|
+
|| Reflect.ownKeys(input).length !== 4
|
|
253
|
+
|| !Object.hasOwn(input, 'tenantId')
|
|
254
|
+
|| !Object.hasOwn(input, 'instanceId')
|
|
255
|
+
|| !Object.hasOwn(input, 'expectedRevision')
|
|
256
|
+
|| !Object.hasOwn(input, 'state')) {
|
|
257
|
+
throw new TypeError('remedy-program compareAndSwap input is invalid');
|
|
258
|
+
}
|
|
259
|
+
const { tenantId, instanceId, expectedRevision, state } = input;
|
|
260
|
+
assertTenantId(tenantId);
|
|
261
|
+
assertInstanceId(instanceId);
|
|
262
|
+
assertRevision(expectedRevision, 'expected');
|
|
263
|
+
const nextRevision = expectedRevision + 1;
|
|
264
|
+
if (!Number.isSafeInteger(nextRevision)) {
|
|
265
|
+
throw new TypeError('remedy-program next revision is invalid');
|
|
266
|
+
}
|
|
267
|
+
const encoded = encodeState(state, tenantId, instanceId, nextRevision);
|
|
268
|
+
return transaction(false, async (client) => definitiveRow(await client.query(REMEDY_PROGRAM_POSTGRES_SQL.compareAndSwap, [
|
|
269
|
+
tenantId,
|
|
270
|
+
instanceId,
|
|
271
|
+
expectedRevision,
|
|
272
|
+
nextRevision,
|
|
273
|
+
encoded.stateJson,
|
|
274
|
+
encoded.stateDigest,
|
|
275
|
+
encoded.eventAt,
|
|
276
|
+
]), 'compareAndSwap', tenantId, instanceId, new Set([
|
|
277
|
+
'instance_not_found', 'revision_conflict',
|
|
278
|
+
'clock_regression', 'clock_forward_skew',
|
|
279
|
+
'evidence_replayed', 'remedy_operation_replayed',
|
|
280
|
+
]), nextRevision));
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
export default {
|
|
285
|
+
REMEDY_PROGRAM_PG_STORE_VERSION,
|
|
286
|
+
REMEDY_PROGRAM_MAX_STATE_BYTES,
|
|
287
|
+
REMEDY_PROGRAM_MAX_FORWARD_SKEW_MINUTES,
|
|
288
|
+
REMEDY_PROGRAM_POSTGRES_SQL,
|
|
289
|
+
createRemedyProgramPostgresStore,
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=remedy-program-postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remedy-program-postgres.js","sourceRoot":"","sources":["../src/remedy-program-postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export declare const ACTION_REMEDY_RECEIPT_VERSION = "EP-ACTION-REMEDY-RECEIPT-v1";
|
|
2
|
+
export declare const REMEDY_PROGRAM_RECEIPT_VERSION = "EP-ACTION-REMEDY-RECEIPT-v1";
|
|
3
|
+
export declare const ACTION_REMEDY_RECEIPT_DOMAIN = "EP-ACTION-REMEDY-RECEIPT-v1\0";
|
|
4
|
+
type DataRecord = Record<string, any>;
|
|
5
|
+
export interface RemedyReceiptExpectedBindings extends Record<string, unknown> {
|
|
6
|
+
original_operation_id: string;
|
|
7
|
+
original_action_digest: string;
|
|
8
|
+
original_terminal_evidence_digest: string;
|
|
9
|
+
case_instance_id: string;
|
|
10
|
+
case_revision: number;
|
|
11
|
+
case_status: string;
|
|
12
|
+
remedy_operation_id: string;
|
|
13
|
+
remedy_action_digest: string;
|
|
14
|
+
remedy_caid: string;
|
|
15
|
+
destination_binding_digest: string;
|
|
16
|
+
units: number;
|
|
17
|
+
unit: string;
|
|
18
|
+
owner_mode: string;
|
|
19
|
+
owner_digest: string;
|
|
20
|
+
}
|
|
21
|
+
/** Derive every relying-party binding that must be independently expected. */
|
|
22
|
+
export declare function expectedRemedyProgramReceiptBindings(state: unknown, remedyOperationId: string): Readonly<RemedyReceiptExpectedBindings>;
|
|
23
|
+
/** Return the exact domain-separated canonical bytes signed by Ed25519. */
|
|
24
|
+
export declare function remedyProgramReceiptSigningBytes(receipt: unknown): Buffer;
|
|
25
|
+
/**
|
|
26
|
+
* Issue one receipt. Local private keys require an explicit ephemeral/test
|
|
27
|
+
* opt-in; production issuance requires an external signer declaring KMS/HSM
|
|
28
|
+
* custody. Every returned signature is verified against the configured public
|
|
29
|
+
* key before the receipt leaves this function.
|
|
30
|
+
*/
|
|
31
|
+
export declare function issueRemedyProgramReceipt(input?: {
|
|
32
|
+
state?: unknown;
|
|
33
|
+
remedyOperationId?: string;
|
|
34
|
+
}, options?: {
|
|
35
|
+
context?: unknown;
|
|
36
|
+
privateKey?: unknown;
|
|
37
|
+
signer?: unknown;
|
|
38
|
+
allowEphemeralState?: boolean;
|
|
39
|
+
}): Promise<Readonly<{
|
|
40
|
+
signature: {
|
|
41
|
+
algorithm: string;
|
|
42
|
+
value: string;
|
|
43
|
+
};
|
|
44
|
+
content_digest: string;
|
|
45
|
+
version: string;
|
|
46
|
+
issuer: DataRecord;
|
|
47
|
+
payload: DataRecord;
|
|
48
|
+
}>>;
|
|
49
|
+
export declare const signRemedyProgramReceipt: typeof issueRemedyProgramReceipt;
|
|
50
|
+
export declare const createRemedyProgramReceipt: typeof issueRemedyProgramReceipt;
|
|
51
|
+
/**
|
|
52
|
+
* Verify a receipt without network access. Trust keys, all issuer fields, the
|
|
53
|
+
* exact current state snapshot, and every material original/remedy binding are
|
|
54
|
+
* relying-party inputs; none are accepted from the receipt itself.
|
|
55
|
+
*/
|
|
56
|
+
export declare function verifyRemedyProgramReceipt(receipt: unknown, { trustedKeys, expectedIssuer, state, expected, }?: {
|
|
57
|
+
trustedKeys?: unknown;
|
|
58
|
+
expectedIssuer?: unknown;
|
|
59
|
+
state?: unknown;
|
|
60
|
+
expected?: unknown;
|
|
61
|
+
}): Readonly<{
|
|
62
|
+
valid: false;
|
|
63
|
+
reason: string;
|
|
64
|
+
checks: Readonly<{
|
|
65
|
+
[x: string]: boolean;
|
|
66
|
+
}>;
|
|
67
|
+
content_digest: null;
|
|
68
|
+
payload: null;
|
|
69
|
+
}> | Readonly<{
|
|
70
|
+
valid: boolean;
|
|
71
|
+
reason: string;
|
|
72
|
+
checks: {
|
|
73
|
+
structure: boolean;
|
|
74
|
+
payload: boolean;
|
|
75
|
+
content_digest: boolean;
|
|
76
|
+
issuer_pin: boolean;
|
|
77
|
+
key: boolean;
|
|
78
|
+
signature: boolean;
|
|
79
|
+
state_snapshot: boolean;
|
|
80
|
+
expected_bindings: boolean;
|
|
81
|
+
};
|
|
82
|
+
content_digest: string;
|
|
83
|
+
payload: DataRecord;
|
|
84
|
+
}>;
|
|
85
|
+
declare const _default: {
|
|
86
|
+
ACTION_REMEDY_RECEIPT_VERSION: string;
|
|
87
|
+
REMEDY_PROGRAM_RECEIPT_VERSION: string;
|
|
88
|
+
ACTION_REMEDY_RECEIPT_DOMAIN: string;
|
|
89
|
+
expectedRemedyProgramReceiptBindings: typeof expectedRemedyProgramReceiptBindings;
|
|
90
|
+
remedyProgramReceiptSigningBytes: typeof remedyProgramReceiptSigningBytes;
|
|
91
|
+
issueRemedyProgramReceipt: typeof issueRemedyProgramReceipt;
|
|
92
|
+
signRemedyProgramReceipt: typeof issueRemedyProgramReceipt;
|
|
93
|
+
createRemedyProgramReceipt: typeof issueRemedyProgramReceipt;
|
|
94
|
+
verifyRemedyProgramReceipt: typeof verifyRemedyProgramReceipt;
|
|
95
|
+
};
|
|
96
|
+
export default _default;
|
|
97
|
+
//# sourceMappingURL=remedy-program-receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remedy-program-receipt.d.ts","sourceRoot":"","sources":["../src/remedy-program-receipt.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAC3E,eAAO,MAAM,8BAA8B,gCAAgC,CAAC;AAC5E,eAAO,MAAM,4BAA4B,kCAAuC,CAAC;AAoFjF,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEtC,MAAM,WAAW,6BAA8B,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5E,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iCAAiC,EAAE,MAAM,CAAC;IAC1C,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B,EAAE,MAAM,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAkXD,8EAA8E;AAC9E,wBAAgB,oCAAoC,CAClD,KAAK,EAAE,OAAO,EACd,iBAAiB,EAAE,MAAM,GACxB,QAAQ,CAAC,6BAA6B,CAAC,CAGzC;AAiDD,2EAA2E;AAC3E,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAMzE;AAsID;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,GAAE;IACL,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACvB,EACN,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC1B;;;;;;;;;IAkDP;AAED,eAAO,MAAM,wBAAwB,kCAA4B,CAAC;AAClE,eAAO,MAAM,0BAA0B,kCAA4B,CAAC;AAYpE;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,EAAE,EAC3D,WAAW,EACX,cAAc,EACd,KAAK,EACL,QAAQ,GACT,GAAE;IACD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACf;;;;;;;;;;;;;;;;;;;;;;;GAmGL;;;;;;;;;;;;AAED,wBAUE"}
|