zklicensing 0.1.0-beta.2 → 0.1.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +417 -201
- package/build/agent.d.ts +371 -0
- package/build/agent.d.ts.map +1 -0
- package/build/agent.js +553 -0
- package/build/agent.js.map +1 -0
- package/build/agentActions.d.ts +841 -0
- package/build/agentActions.d.ts.map +1 -0
- package/build/agentActions.js +581 -0
- package/build/agentActions.js.map +1 -0
- package/build/agentRecord.d.ts +83 -0
- package/build/agentRecord.d.ts.map +1 -0
- package/build/agentRecord.js +69 -0
- package/build/agentRecord.js.map +1 -0
- package/build/agentVendor.d.ts +220 -0
- package/build/agentVendor.d.ts.map +1 -0
- package/build/agentVendor.js +306 -0
- package/build/agentVendor.js.map +1 -0
- package/build/appsLookup.d.ts +14 -0
- package/build/appsLookup.d.ts.map +1 -0
- package/build/appsLookup.js +12 -0
- package/build/appsLookup.js.map +1 -0
- package/build/archiveBootstrap.d.ts +31 -5
- package/build/archiveBootstrap.d.ts.map +1 -0
- package/build/archiveBootstrap.js +140 -47
- package/build/archiveBootstrap.js.map +1 -0
- package/build/atomicJson.d.ts +5 -0
- package/build/atomicJson.d.ts.map +1 -0
- package/build/atomicJson.js +55 -0
- package/build/atomicJson.js.map +1 -0
- package/build/bindClient.d.ts +85 -0
- package/build/bindClient.d.ts.map +1 -0
- package/build/bindClient.js +187 -0
- package/build/bindClient.js.map +1 -0
- package/build/buyClient.d.ts +27 -4
- package/build/buyClient.d.ts.map +1 -0
- package/build/buyClient.js +72 -26
- package/build/buyClient.js.map +1 -0
- package/build/chainHead.d.ts +61 -0
- package/build/chainHead.d.ts.map +1 -0
- package/build/chainHead.js +88 -0
- package/build/chainHead.js.map +1 -0
- package/build/compactMerkleMap.d.ts +72 -0
- package/build/compactMerkleMap.d.ts.map +1 -0
- package/build/compactMerkleMap.js +224 -0
- package/build/compactMerkleMap.js.map +1 -0
- package/build/contractInterface.d.ts +191 -51
- package/build/contractInterface.d.ts.map +1 -0
- package/build/contractInterface.js +234 -43
- package/build/contractInterface.js.map +1 -0
- package/build/contractTypes.d.ts +9 -0
- package/build/contractTypes.d.ts.map +1 -0
- package/build/contractTypes.js +28 -0
- package/build/contractTypes.js.map +1 -0
- package/build/countryStats.d.ts +12 -3
- package/build/countryStats.d.ts.map +1 -0
- package/build/countryStats.js +87 -23
- package/build/countryStats.js.map +1 -0
- package/build/deployClient.d.ts +138 -24
- package/build/deployClient.d.ts.map +1 -0
- package/build/deployClient.js +91 -31
- package/build/deployClient.js.map +1 -0
- package/build/deviceIdentity.d.ts +68 -0
- package/build/deviceIdentity.d.ts.map +1 -0
- package/build/deviceIdentity.js +209 -0
- package/build/deviceIdentity.js.map +1 -0
- package/build/freezeClient.d.ts +26 -6
- package/build/freezeClient.d.ts.map +1 -0
- package/build/freezeClient.js +30 -6
- package/build/freezeClient.js.map +1 -0
- package/build/generationClient.d.ts +6 -3
- package/build/generationClient.d.ts.map +1 -0
- package/build/generationClient.js +25 -38
- package/build/generationClient.js.map +1 -0
- package/build/holderSecret.d.ts +70 -0
- package/build/holderSecret.d.ts.map +1 -0
- package/build/holderSecret.js +76 -0
- package/build/holderSecret.js.map +1 -0
- package/build/index.d.ts +38 -38
- package/build/index.d.ts.map +1 -0
- package/build/index.js +97 -121
- package/build/index.js.map +1 -0
- package/build/keysClient.d.ts +142 -0
- package/build/keysClient.d.ts.map +1 -0
- package/build/keysClient.js +109 -0
- package/build/keysClient.js.map +1 -0
- package/build/licenseLeaf.d.ts +76 -0
- package/build/licenseLeaf.d.ts.map +1 -0
- package/build/licenseLeaf.js +189 -0
- package/build/licenseLeaf.js.map +1 -0
- package/build/licenseRecord.d.ts +68 -5
- package/build/licenseRecord.d.ts.map +1 -0
- package/build/licenseRecord.js +26 -1
- package/build/licenseRecord.js.map +1 -0
- package/build/licenseStore.d.ts +81 -4
- package/build/licenseStore.d.ts.map +1 -0
- package/build/licenseStore.js +400 -30
- package/build/licenseStore.js.map +1 -0
- package/build/licenseTrustless.d.ts +43 -0
- package/build/licenseTrustless.d.ts.map +1 -0
- package/build/licenseTrustless.js +180 -0
- package/build/licenseTrustless.js.map +1 -0
- package/build/manifestVerify.d.ts +29 -1
- package/build/manifestVerify.d.ts.map +1 -0
- package/build/manifestVerify.js +46 -4
- package/build/manifestVerify.js.map +1 -0
- package/build/minaPriceHistory.d.ts +9 -0
- package/build/minaPriceHistory.d.ts.map +1 -0
- package/build/minaPriceHistory.js +152 -0
- package/build/minaPriceHistory.js.map +1 -0
- package/build/onChainRoot.d.ts +60 -0
- package/build/onChainRoot.d.ts.map +1 -0
- package/build/onChainRoot.js +74 -0
- package/build/onChainRoot.js.map +1 -0
- package/build/ownershipLicenseHash.d.ts +25 -0
- package/build/ownershipLicenseHash.d.ts.map +1 -0
- package/build/ownershipLicenseHash.js +29 -0
- package/build/ownershipLicenseHash.js.map +1 -0
- package/build/ownershipSignature.d.ts +153 -0
- package/build/ownershipSignature.d.ts.map +1 -0
- package/build/ownershipSignature.js +297 -0
- package/build/ownershipSignature.js.map +1 -0
- package/build/permitCheckFlow.d.ts +155 -0
- package/build/permitCheckFlow.d.ts.map +1 -0
- package/build/permitCheckFlow.js +196 -0
- package/build/permitCheckFlow.js.map +1 -0
- package/build/permitDescribe.d.ts +124 -0
- package/build/permitDescribe.d.ts.map +1 -0
- package/build/permitDescribe.js +324 -0
- package/build/permitDescribe.js.map +1 -0
- package/build/permitInterface.d.ts +85 -0
- package/build/permitInterface.d.ts.map +1 -0
- package/build/permitInterface.js +121 -0
- package/build/permitInterface.js.map +1 -0
- package/build/permitMessages.d.ts +313 -0
- package/build/permitMessages.d.ts.map +1 -0
- package/build/permitMessages.js +462 -0
- package/build/permitMessages.js.map +1 -0
- package/build/permitProof.d.ts +108 -0
- package/build/permitProof.d.ts.map +1 -0
- package/build/permitProof.js +202 -0
- package/build/permitProof.js.map +1 -0
- package/build/permitRegistryRebuild.d.ts +166 -0
- package/build/permitRegistryRebuild.d.ts.map +1 -0
- package/build/permitRegistryRebuild.js +347 -0
- package/build/permitRegistryRebuild.js.map +1 -0
- package/build/permitTree.d.ts +88 -0
- package/build/permitTree.d.ts.map +1 -0
- package/build/permitTree.js +230 -0
- package/build/permitTree.js.map +1 -0
- package/build/permitsClient.d.ts +680 -0
- package/build/permitsClient.d.ts.map +1 -0
- package/build/permitsClient.js +597 -0
- package/build/permitsClient.js.map +1 -0
- package/build/proveErrors.d.ts +50 -0
- package/build/proveErrors.d.ts.map +1 -0
- package/build/proveErrors.js +76 -0
- package/build/proveErrors.js.map +1 -0
- package/build/receipt.d.ts +95 -0
- package/build/receipt.d.ts.map +1 -0
- package/build/receipt.js +84 -0
- package/build/receipt.js.map +1 -0
- package/build/refundClient.d.ts +7 -12
- package/build/refundClient.d.ts.map +1 -0
- package/build/refundClient.js +52 -21
- package/build/refundClient.js.map +1 -0
- package/build/registryTrustVerify.d.ts +78 -0
- package/build/registryTrustVerify.d.ts.map +1 -0
- package/build/registryTrustVerify.js +129 -0
- package/build/registryTrustVerify.js.map +1 -0
- package/build/releaseClient.d.ts +26 -0
- package/build/releaseClient.d.ts.map +1 -0
- package/build/releaseClient.js +65 -0
- package/build/releaseClient.js.map +1 -0
- package/build/renewClient.d.ts +28 -2
- package/build/renewClient.d.ts.map +1 -0
- package/build/renewClient.js +31 -27
- package/build/renewClient.js.map +1 -0
- package/build/seatName.d.ts +8 -0
- package/build/seatName.d.ts.map +1 -0
- package/build/seatName.js +136 -0
- package/build/seatName.js.map +1 -0
- package/build/slotConstants.d.ts +15 -0
- package/build/slotConstants.d.ts.map +1 -0
- package/build/slotConstants.js +17 -0
- package/build/slotConstants.js.map +1 -0
- package/build/statsClient.d.ts +61 -7
- package/build/statsClient.d.ts.map +1 -0
- package/build/statsClient.js +44 -5
- package/build/statsClient.js.map +1 -0
- package/build/successorChain.d.ts +35 -0
- package/build/successorChain.d.ts.map +1 -0
- package/build/successorChain.js +69 -0
- package/build/successorChain.js.map +1 -0
- package/build/taxId.d.ts +44 -0
- package/build/taxId.d.ts.map +1 -0
- package/build/taxId.js +212 -0
- package/build/taxId.js.map +1 -0
- package/build/trustAnchorVerify.d.ts +49 -0
- package/build/trustAnchorVerify.d.ts.map +1 -0
- package/build/trustAnchorVerify.js +432 -0
- package/build/trustAnchorVerify.js.map +1 -0
- package/build/trustAnchorVerifyCli.d.ts +45 -0
- package/build/trustAnchorVerifyCli.d.ts.map +1 -0
- package/build/trustAnchorVerifyCli.js +235 -0
- package/build/trustAnchorVerifyCli.js.map +1 -0
- package/build/txBroadcastClient.d.ts +26 -0
- package/build/txBroadcastClient.d.ts.map +1 -0
- package/build/txBroadcastClient.js +20 -0
- package/build/txBroadcastClient.js.map +1 -0
- package/build/unbindClient.d.ts +77 -0
- package/build/unbindClient.d.ts.map +1 -0
- package/build/unbindClient.js +169 -0
- package/build/unbindClient.js.map +1 -0
- package/build/units.d.ts +28 -0
- package/build/units.d.ts.map +1 -0
- package/build/units.js +65 -0
- package/build/units.js.map +1 -0
- package/build/vatRates.d.ts +54 -0
- package/build/vatRates.d.ts.map +1 -0
- package/build/vatRates.js +82 -0
- package/build/vatRates.js.map +1 -0
- package/build/vatRatesData.d.ts +5 -0
- package/build/vatRatesData.d.ts.map +1 -0
- package/build/vatRatesData.js +42 -0
- package/build/vatRatesData.js.map +1 -0
- package/build/vendorAccountClient.d.ts +66 -0
- package/build/vendorAccountClient.d.ts.map +1 -0
- package/build/vendorAccountClient.js +47 -0
- package/build/vendorAccountClient.js.map +1 -0
- package/build/verifyCore.d.ts +4 -1
- package/build/verifyCore.d.ts.map +1 -0
- package/build/verifyCore.js +21 -10
- package/build/verifyCore.js.map +1 -0
- package/build/verifyOffline.d.ts +85 -0
- package/build/verifyOffline.d.ts.map +1 -0
- package/build/verifyOffline.js +139 -0
- package/build/verifyOffline.js.map +1 -0
- package/build/verifyService.d.ts.map +1 -0
- package/build/verifyService.js +571 -501
- package/build/verifyService.js.map +1 -0
- package/build/verifyWithAncestors.d.ts +19 -0
- package/build/verifyWithAncestors.d.ts.map +1 -0
- package/build/verifyWithAncestors.js +127 -0
- package/build/verifyWithAncestors.js.map +1 -0
- package/build/zipToState.d.ts +2 -0
- package/build/zipToState.d.ts.map +1 -0
- package/build/zipToState.js +94 -0
- package/build/zipToState.js.map +1 -0
- package/package.json +141 -16
- package/src/agent.ts +682 -0
- package/src/agentActions.ts +637 -0
- package/src/agentRecord.ts +121 -0
- package/src/agentVendor.ts +356 -0
- package/src/appsLookup.ts +48 -0
- package/src/archiveBootstrap.ts +386 -0
- package/src/atomicJson.ts +53 -0
- package/src/bindClient.ts +297 -0
- package/src/buyClient.ts +344 -0
- package/src/chainHead.ts +106 -0
- package/src/compactMerkleMap.ts +222 -0
- package/src/contractInterface.ts +465 -0
- package/src/contractTypes.ts +31 -0
- package/src/countryStats.ts +200 -0
- package/src/deployClient.ts +517 -0
- package/src/deviceIdentity.ts +249 -0
- package/src/freezeClient.ts +162 -0
- package/src/generationClient.ts +145 -0
- package/src/holderSecret.ts +91 -0
- package/src/index.ts +362 -0
- package/src/keysClient.ts +135 -0
- package/src/licenseLeaf.ts +221 -0
- package/src/licenseRecord.ts +190 -0
- package/src/licenseStore.ts +767 -0
- package/src/licenseTrustless.ts +207 -0
- package/src/manifestVerify.ts +164 -0
- package/src/minaPriceHistory.ts +166 -0
- package/src/onChainRoot.ts +90 -0
- package/src/ownershipLicenseHash.ts +31 -0
- package/src/ownershipSignature.ts +421 -0
- package/src/permitCheckFlow.ts +227 -0
- package/src/permitDescribe.ts +362 -0
- package/src/permitInterface.ts +146 -0
- package/src/permitMessages.ts +572 -0
- package/src/permitProof.ts +230 -0
- package/src/permitRegistryRebuild.ts +423 -0
- package/src/permitTree.ts +232 -0
- package/src/permitsClient.ts +746 -0
- package/src/proveErrors.ts +98 -0
- package/src/receipt.ts +156 -0
- package/src/refundClient.ts +177 -0
- package/src/registryTrustVerify.ts +192 -0
- package/src/releaseClient.ts +101 -0
- package/src/renewClient.ts +234 -0
- package/src/seatName.ts +165 -0
- package/src/slotConstants.ts +18 -0
- package/src/statsClient.ts +249 -0
- package/src/successorChain.ts +87 -0
- package/src/taxId.ts +227 -0
- package/src/trustAnchorVerify.ts +550 -0
- package/src/trustAnchorVerifyCli.ts +234 -0
- package/src/txBroadcastClient.ts +48 -0
- package/src/unbindClient.ts +233 -0
- package/src/units.ts +74 -0
- package/src/vatRates.ts +100 -0
- package/src/vatRatesData.ts +43 -0
- package/src/vendorAccountClient.ts +120 -0
- package/src/verifyCore.ts +100 -0
- package/src/verifyOffline.ts +212 -0
- package/src/verifyService.ts +982 -0
- package/src/verifyWithAncestors.ts +163 -0
- package/src/zipToState.ts +94 -0
- package/build/licenseProof.d.ts +0 -26
- package/build/licenseProof.js +0 -41
- package/build/migrateClient.d.ts +0 -43
- package/build/migrateClient.js +0 -47
- package/build/ownership.d.ts +0 -34
- package/build/ownership.js +0 -147
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 zkLicensing project developers
|
|
2
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
/**
|
|
4
|
+
* permitTree.ts — `zklicensing/permits/tree`
|
|
5
|
+
*
|
|
6
|
+
* A compact copy of a registry's permits tree, for holders to build their
|
|
7
|
+
* Merkle witness without the keeper learning which permit is theirs, and
|
|
8
|
+
* without rebuilding the 256-level tree (one 256-hash path per permit,
|
|
9
|
+
* about 0.1 s each).
|
|
10
|
+
*
|
|
11
|
+
* The tree is sparse: permits sit at random-looking positions, so below the
|
|
12
|
+
* top few levels nearly every permit is alone in its subtree and everything
|
|
13
|
+
* beside it is empty — known constants. The only non-constant siblings any
|
|
14
|
+
* witness needs are the two children of each node where two permits' paths
|
|
15
|
+
* split: with the permits sorted by position, one such node per adjacent
|
|
16
|
+
* pair, N − 1 in all. The compact tree is every permit's record plus those
|
|
17
|
+
* 2(N − 1) node values. Everyone downloads the same thing; a wrong copy only
|
|
18
|
+
* makes the holder's proof fail against the chain's root, never pass.
|
|
19
|
+
*
|
|
20
|
+
* Updates: `applyTreeDiff` takes the records that changed since a root the
|
|
21
|
+
* holder has and recomputes only the nodes above them.
|
|
22
|
+
*/
|
|
23
|
+
import { Field, MerkleMap, Poseidon } from 'o1js';
|
|
24
|
+
import { permitLeafHash } from './permitMessages.js';
|
|
25
|
+
import { recordToLeaf } from './permitRegistryRebuild.js';
|
|
26
|
+
import { CompactMerkleMap, encodeFields, decodeFields } from './compactMerkleMap.js';
|
|
27
|
+
const HEIGHT = 256;
|
|
28
|
+
// ── field and position helpers ───────────────────────────────────────────────
|
|
29
|
+
let zeroCache = null;
|
|
30
|
+
/** zeros[l]: the value of an empty subtree whose top is at level l. */
|
|
31
|
+
function zeros() {
|
|
32
|
+
if (!zeroCache) {
|
|
33
|
+
const z = [0n];
|
|
34
|
+
for (let i = 1; i < HEIGHT; i++)
|
|
35
|
+
z.push(Poseidon.hash([Field(z[i - 1]), Field(z[i - 1])]).toBigInt());
|
|
36
|
+
zeroCache = z;
|
|
37
|
+
}
|
|
38
|
+
return zeroCache;
|
|
39
|
+
}
|
|
40
|
+
const H = (a, b) => Poseidon.hash([Field(a), Field(b)]).toBigInt();
|
|
41
|
+
const keyMap = new MerkleMap();
|
|
42
|
+
/** A subject's leaf position (as MerkleMap places it). */
|
|
43
|
+
export function subjectIndex(subject) {
|
|
44
|
+
return keyMap._keyToIndex(Field(subject));
|
|
45
|
+
}
|
|
46
|
+
function bitLength(x) { let n = 0; while (x > 0n) {
|
|
47
|
+
x >>= 1n;
|
|
48
|
+
n++;
|
|
49
|
+
} return n; }
|
|
50
|
+
/** The split-children positions, [level, index] pairs, in canonical order, for sorted leaf positions. */
|
|
51
|
+
function splitChildren(sorted) {
|
|
52
|
+
const out = [];
|
|
53
|
+
for (let i = 0; i + 1 < sorted.length; i++) {
|
|
54
|
+
const a = sorted[i], b = sorted[i + 1];
|
|
55
|
+
const l = bitLength(a ^ b) - 1; // the children's level; their parent at l + 1 is where the paths split
|
|
56
|
+
out.push([l, a >> BigInt(l)], [l, b >> BigInt(l)]);
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function sortPermits(permits) {
|
|
61
|
+
const withIdx = permits.map(p => ({ p, i: subjectIndex(p.subject) }));
|
|
62
|
+
withIdx.sort((x, y) => (x.i < y.i ? -1 : x.i > y.i ? 1 : 0));
|
|
63
|
+
return { permits: withIdx.map(x => x.p), idx: withIdx.map(x => x.i) };
|
|
64
|
+
}
|
|
65
|
+
const nodeKey = (l, j) => `${l}:${j}`;
|
|
66
|
+
// ── keeper side ──────────────────────────────────────────────────────────────
|
|
67
|
+
/**
|
|
68
|
+
* The compact tree from a full permits tree (the keeper's MerkleMap). Reads
|
|
69
|
+
* node values; no hashing.
|
|
70
|
+
*/
|
|
71
|
+
export function compactTreeFrom(args) {
|
|
72
|
+
const { permits, idx } = sortPermits([...args.permits]);
|
|
73
|
+
let values;
|
|
74
|
+
if (args.tree instanceof CompactMerkleMap) {
|
|
75
|
+
values = args.tree.splitValues();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const full = args.tree.tree;
|
|
79
|
+
values = splitChildren(idx).map(([l, j]) => full.getNode(l, j).toBigInt());
|
|
80
|
+
}
|
|
81
|
+
if (values.length !== Math.max(0, permits.length - 1) * 2)
|
|
82
|
+
throw new Error('compact tree: the tree and the permits list disagree');
|
|
83
|
+
return { registry: args.registry, root: args.tree.getRoot().toString(), slot: args.slot, permits, nodes: encodeFields(values) };
|
|
84
|
+
}
|
|
85
|
+
const indexed = new WeakMap();
|
|
86
|
+
function index(ct) {
|
|
87
|
+
let x = indexed.get(ct);
|
|
88
|
+
if (x)
|
|
89
|
+
return x;
|
|
90
|
+
const idx = ct.permits.map(p => subjectIndex(p.subject));
|
|
91
|
+
for (let i = 1; i < idx.length; i++)
|
|
92
|
+
if (idx[i] <= idx[i - 1])
|
|
93
|
+
throw new Error('compact tree: permits are not sorted by position');
|
|
94
|
+
const positions = splitChildren(idx);
|
|
95
|
+
const vals = ct.nodes ? decodeFields(ct.nodes) : [];
|
|
96
|
+
if (vals.length !== positions.length)
|
|
97
|
+
throw new Error(`compact tree: expected ${positions.length} node values, got ${vals.length}`);
|
|
98
|
+
const values = new Map();
|
|
99
|
+
positions.forEach(([l, j], i) => values.set(nodeKey(l, j), vals[i]));
|
|
100
|
+
x = { ct, idx, values };
|
|
101
|
+
indexed.set(ct, x);
|
|
102
|
+
return x;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The Merkle witness for `subject` from the compact tree, checked by folding
|
|
106
|
+
* it to the tree's root (one path of hashes).
|
|
107
|
+
*/
|
|
108
|
+
export function witnessFromCompactTree(ct, subject) {
|
|
109
|
+
const { values } = index(ct);
|
|
110
|
+
const permit = ct.permits.find(p => p.subject === subject);
|
|
111
|
+
if (!permit)
|
|
112
|
+
throw new Error('The registry has no such permit.');
|
|
113
|
+
const z = zeros();
|
|
114
|
+
const s = subjectIndex(subject);
|
|
115
|
+
const isLefts = [];
|
|
116
|
+
const siblings = [];
|
|
117
|
+
let h = permitLeafHash(recordToLeaf(permit)).toBigInt();
|
|
118
|
+
for (let l = 0; l < HEIGHT - 1; l++) {
|
|
119
|
+
const at = s >> BigInt(l);
|
|
120
|
+
const left = (at & 1n) === 0n;
|
|
121
|
+
const sib = values.get(nodeKey(l, at ^ 1n)) ?? z[l];
|
|
122
|
+
isLefts.push(left);
|
|
123
|
+
siblings.push(sib.toString());
|
|
124
|
+
h = left ? H(h, sib) : H(sib, h);
|
|
125
|
+
}
|
|
126
|
+
if (h.toString() !== ct.root)
|
|
127
|
+
throw new Error('The registry copy does not fold to its root; download it again.');
|
|
128
|
+
return { root: ct.root, witness: { isLefts, siblings }, permit };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Applies the records that changed since `old.root`, recomputing only the
|
|
132
|
+
* nodes above them, and checks the result against `diff.root`.
|
|
133
|
+
*/
|
|
134
|
+
export function applyTreeDiff(old, diff) {
|
|
135
|
+
if (diff.since !== old.root)
|
|
136
|
+
throw new Error('This update is for another version of the registry.');
|
|
137
|
+
if (diff.registry !== old.registry)
|
|
138
|
+
throw new Error('This update is for another registry.');
|
|
139
|
+
const prev = index(old);
|
|
140
|
+
const bySubject = new Map(old.permits.map(p => [p.subject, p]));
|
|
141
|
+
for (const p of diff.changed)
|
|
142
|
+
bySubject.set(p.subject, p);
|
|
143
|
+
const { permits, idx } = sortPermits([...bySubject.values()]);
|
|
144
|
+
const changedIdx = diff.changed.map(p => subjectIndex(p.subject)).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
145
|
+
const leafHash = new Map(permits.map((p, i) => [idx[i], permitLeafHash(recordToLeaf(p)).toBigInt()]));
|
|
146
|
+
const z = zeros();
|
|
147
|
+
// First position >= x in a sorted array.
|
|
148
|
+
const lower = (arr, x) => { let lo = 0, hi = arr.length; while (lo < hi) {
|
|
149
|
+
const m = (lo + hi) >> 1;
|
|
150
|
+
if (arr[m] < x)
|
|
151
|
+
lo = m + 1;
|
|
152
|
+
else
|
|
153
|
+
hi = m;
|
|
154
|
+
} return lo; };
|
|
155
|
+
const inRange = (arr, lo, hi) => { const a = lower(arr, lo); return { a, b: lower(arr, hi + 1n) }; };
|
|
156
|
+
const memo = new Map();
|
|
157
|
+
const node = (l, j) => {
|
|
158
|
+
const k = nodeKey(l, j);
|
|
159
|
+
const m = memo.get(k);
|
|
160
|
+
if (m !== undefined)
|
|
161
|
+
return m;
|
|
162
|
+
const lo = j << BigInt(l), hi = ((j + 1n) << BigInt(l)) - 1n;
|
|
163
|
+
const leaves = inRange(idx, lo, hi);
|
|
164
|
+
let v;
|
|
165
|
+
if (leaves.b === leaves.a)
|
|
166
|
+
v = z[l];
|
|
167
|
+
else {
|
|
168
|
+
const touched = inRange(changedIdx, lo, hi);
|
|
169
|
+
const kept = touched.a === touched.b ? prev.values.get(k) : undefined;
|
|
170
|
+
if (kept !== undefined)
|
|
171
|
+
v = kept;
|
|
172
|
+
else if (l === 0)
|
|
173
|
+
v = leafHash.get(j);
|
|
174
|
+
else if (leaves.b - leaves.a === 1) {
|
|
175
|
+
// One permit below: hash its path up to here, beside empty subtrees.
|
|
176
|
+
const pos = idx[leaves.a];
|
|
177
|
+
let h = leafHash.get(pos);
|
|
178
|
+
for (let t = 0; t < l; t++)
|
|
179
|
+
h = ((pos >> BigInt(t)) & 1n) === 0n ? H(h, z[t]) : H(z[t], h);
|
|
180
|
+
v = h;
|
|
181
|
+
}
|
|
182
|
+
else
|
|
183
|
+
v = H(node(l - 1, 2n * j), node(l - 1, 2n * j + 1n));
|
|
184
|
+
}
|
|
185
|
+
memo.set(k, v);
|
|
186
|
+
return v;
|
|
187
|
+
};
|
|
188
|
+
const values = splitChildren(idx).map(([l, j]) => node(l, j));
|
|
189
|
+
const root = node(HEIGHT - 1, 0n);
|
|
190
|
+
if (root.toString() !== diff.root)
|
|
191
|
+
throw new Error('The updated registry copy does not match the new root; download it again.');
|
|
192
|
+
return { registry: old.registry, root: diff.root, slot: diff.slot, permits, nodes: encodeFields(values) };
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* The registry's current compact tree: the cached copy brought up to date
|
|
196
|
+
* with a diff when the keeper has one, else a full download.
|
|
197
|
+
*/
|
|
198
|
+
export async function syncRegistryTree(args) {
|
|
199
|
+
const cached = args.cache ? await args.cache.get(args.registry).catch(() => null) : null;
|
|
200
|
+
if (cached) {
|
|
201
|
+
try {
|
|
202
|
+
const res = await args.fetchTree(cached.root);
|
|
203
|
+
let next = null;
|
|
204
|
+
if (res.unchanged) {
|
|
205
|
+
next = { ...cached, slot: res.slot };
|
|
206
|
+
args.onProgress?.('cached');
|
|
207
|
+
}
|
|
208
|
+
else if (Array.isArray(res.changed)) {
|
|
209
|
+
next = applyTreeDiff(cached, res);
|
|
210
|
+
args.onProgress?.('diff');
|
|
211
|
+
}
|
|
212
|
+
else if (Array.isArray(res.permits)) {
|
|
213
|
+
next = res;
|
|
214
|
+
args.onProgress?.('full');
|
|
215
|
+
}
|
|
216
|
+
if (next) {
|
|
217
|
+
await args.cache.set(args.registry, next).catch(() => { });
|
|
218
|
+
return next;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch { /* fall through to a full download */ }
|
|
222
|
+
}
|
|
223
|
+
const full = await args.fetchTree();
|
|
224
|
+
if (!Array.isArray(full.permits))
|
|
225
|
+
throw new Error('The keeper did not send the registry.');
|
|
226
|
+
args.onProgress?.('full');
|
|
227
|
+
await args.cache?.set(args.registry, full).catch(() => { });
|
|
228
|
+
return full;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=permitTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permitTree.js","sourceRoot":"","sources":["../src/permitTree.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,oCAAoC;AAEpC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAqB,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErF,MAAM,MAAM,GAAG,GAAG,CAAC;AAcnB,gFAAgF;AAEhF,IAAI,SAAS,GAAoB,IAAI,CAAC;AACtC,uEAAuE;AACvE,SAAS,KAAK;IACZ,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;YAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtG,SAAS,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AACD,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEnF,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;AAC/B,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAQ,MAAc,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAW,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,IAAY,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAAC,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC,EAAE,CAAC;AAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhG,yGAAyG;AACzG,SAAS,aAAa,CAAC,MAAgB;IACrC,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,uEAAuE;QACvG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,OAAuB;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAEtD,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAA6G;IAC3I,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,IAAI,MAAgB,CAAC;IACrB,IAAI,IAAI,CAAC,IAAI,YAAY,gBAAgB,EAAE,CAAC;QAC1C,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAI,IAAI,CAAC,IAAY,CAAC,IAAwD,CAAC;QACzF,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACnI,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;AAClI,CAAC;AAKD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAwB,CAAC;AAEpD,SAAS,KAAK,CAAC,EAAe;IAC5B,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAChB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACnI,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,CAAC,MAAM,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACpI,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACnB,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,EAAe,EAAE,OAAe;IACrE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;IAClB,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACjH,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,IAAc;IAC5D,IAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACpG,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAU,CAAC,CAAC,CAAC;IACzE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;QAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAiB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACtH,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;IAElB,yCAAyC;IACzC,MAAM,KAAK,GAAG,CAAC,GAAa,EAAE,CAAS,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;;YAAM,EAAE,GAAG,CAAC,CAAC;IAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/K,MAAM,OAAO,GAAG,CAAC,GAAa,EAAE,EAAU,EAAE,EAAU,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/H,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;QAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAS,CAAC;QACd,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;YAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC/B,CAAC;YACJ,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtE,IAAI,IAAI,KAAK,SAAS;gBAAE,CAAC,GAAG,IAAI,CAAC;iBAC5B,IAAI,CAAC,KAAK,CAAC;gBAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;iBAClC,IAAI,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnC,qEAAqE;gBACrE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3F,CAAC,GAAG,CAAC,CAAC;YACR,CAAC;;gBAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAChI,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;AAC5G,CAAC;AAQD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAKtC;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,GAAQ,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,IAAI,GAAuB,IAAI,CAAC;YACpC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAAC,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;iBACpF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,GAAe,CAAC,CAAC;gBAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;iBAC7G,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,GAAG,GAAkB,CAAC;gBAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;YAC9F,IAAI,IAAI,EAAE,CAAC;gBAAC,MAAM,IAAI,CAAC,KAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC,CAAC,qCAAqC,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAiB,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3F,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC"}
|