@zincapp/znvault-cli 4.20.0 → 4.21.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/dist/commands/superadmin/index.d.ts.map +1 -1
- package/dist/commands/superadmin/index.js +2 -0
- package/dist/commands/superadmin/index.js.map +1 -1
- package/dist/commands/superadmin/rootkey.d.ts +13 -0
- package/dist/commands/superadmin/rootkey.d.ts.map +1 -0
- package/dist/commands/superadmin/rootkey.js +223 -0
- package/dist/commands/superadmin/rootkey.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AA8BtC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAyCzF"}
|
|
@@ -18,6 +18,7 @@ import { registerHostCommands } from '../host/index.js';
|
|
|
18
18
|
import { registerKmsCommands } from '../kms/index.js';
|
|
19
19
|
import { registerKmipSuperadminCommands } from '../kmip/index.js';
|
|
20
20
|
import { registerDynsecFenceCommands } from './dynsec-fence.js';
|
|
21
|
+
import { registerRootkeyCommands } from './rootkey.js';
|
|
21
22
|
import { registerPolicyCommands } from '../policy/index.js';
|
|
22
23
|
import { registerQuarantineCommands } from '../quarantine.js';
|
|
23
24
|
import { registerRoleCommands } from '../role.js';
|
|
@@ -53,6 +54,7 @@ export function registerSuperadminCommands(parent, _opts) {
|
|
|
53
54
|
registerKmsCommands(superadmin, { context: 'superadmin' });
|
|
54
55
|
registerKmipSuperadminCommands(superadmin);
|
|
55
56
|
registerDynsecFenceCommands(superadmin);
|
|
57
|
+
registerRootkeyCommands(superadmin);
|
|
56
58
|
registerPolicyCommands(superadmin, { context: 'superadmin' });
|
|
57
59
|
registerQuarantineCommands(superadmin, { context: 'superadmin' });
|
|
58
60
|
registerRoleCommands(superadmin, { context: 'superadmin' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/superadmin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
export declare function rootkeyStatus(options: {
|
|
3
|
+
json?: boolean;
|
|
4
|
+
}): Promise<void>;
|
|
5
|
+
export declare function rootkeyVerify(options: {
|
|
6
|
+
json?: boolean;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
export declare function rootkeyWrap(options: {
|
|
9
|
+
provider: string;
|
|
10
|
+
json?: boolean;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export declare function registerRootkeyCommands(parent: Command): void;
|
|
13
|
+
//# sourceMappingURL=rootkey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rootkey.d.ts","sourceRoot":"","sources":["../../../src/commands/superadmin/rootkey.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2FzC,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgG9E;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD9E;AASD,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ChB;AAID,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAuB7D"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// Path: src/commands/superadmin/rootkey.ts
|
|
2
|
+
/**
|
|
3
|
+
* `znvault superadmin rootkey` — root-of-trust provider chain for the
|
|
4
|
+
* vault's bootstrap key (BSK).
|
|
5
|
+
*
|
|
6
|
+
* Routes (superadmin only, deployment-wide, no tenant scoping):
|
|
7
|
+
* GET /v1/superadmin/rootkey/status
|
|
8
|
+
* POST /v1/superadmin/rootkey/verify
|
|
9
|
+
* POST /v1/superadmin/rootkey/wrap { provider }
|
|
10
|
+
*
|
|
11
|
+
* Contract: no command prints key material — the server never returns
|
|
12
|
+
* any; the publishable KCV fingerprint is the only key identity shown.
|
|
13
|
+
* No command can remove an envelope or the cleartext key file
|
|
14
|
+
* (retirement is a separate, deliberate server-side procedure that has
|
|
15
|
+
* no API in this release). `verify` exits 1 when any configured provider
|
|
16
|
+
* fails or mismatches, so it can gate migrations and drive monitoring.
|
|
17
|
+
*/
|
|
18
|
+
import Table from 'cli-table3';
|
|
19
|
+
import { client } from '../../lib/client.js';
|
|
20
|
+
import * as output from '../../lib/output.js';
|
|
21
|
+
// ─── Helpers ───────────────────────────────────────────────────────────────
|
|
22
|
+
function formatDate(iso) {
|
|
23
|
+
if (!iso)
|
|
24
|
+
return '-';
|
|
25
|
+
try {
|
|
26
|
+
return new Date(iso).toLocaleString();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return iso;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// ─── Handlers ──────────────────────────────────────────────────────────────
|
|
33
|
+
export async function rootkeyStatus(options) {
|
|
34
|
+
const spinner = output.spinner('Fetching root key provider status...').start();
|
|
35
|
+
try {
|
|
36
|
+
const response = await client.get('/v1/superadmin/rootkey/status');
|
|
37
|
+
spinner.stop();
|
|
38
|
+
if (options.json) {
|
|
39
|
+
output.json(response);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const resolution = response.resolution;
|
|
43
|
+
// Effective degraded = boot resolution OR the latest periodic probe;
|
|
44
|
+
// status must never report last-boot nostalgia as current health.
|
|
45
|
+
const effectiveDegraded = resolution !== null &&
|
|
46
|
+
(resolution.degraded || resolution.lastProbe?.degraded === true);
|
|
47
|
+
output.section('Root Key Provider Status');
|
|
48
|
+
output.keyValue({
|
|
49
|
+
'Degraded': resolution ? (effectiveDegraded ? 'YES — investigate' : 'no') : 'unknown (no resolution)',
|
|
50
|
+
'Served by (last boot)': resolution?.servedBy ?? '-',
|
|
51
|
+
'Active KCV': resolution?.kcv ?? '-',
|
|
52
|
+
'Resolved at': formatDate(resolution?.resolvedAt),
|
|
53
|
+
'Total latency': resolution ? `${String(resolution.totalLatencyMs)}ms` : '-',
|
|
54
|
+
'Last probe': resolution?.lastProbe
|
|
55
|
+
? `${formatDate(resolution.lastProbe.at)} — ${resolution.lastProbe.degraded ? 'DEGRADED' : 'healthy'}`
|
|
56
|
+
: 'never (probe has not run yet)',
|
|
57
|
+
'Cleartext file on this node': response.localFile.present ? 'present' : 'absent',
|
|
58
|
+
});
|
|
59
|
+
if (effectiveDegraded) {
|
|
60
|
+
output.warn('The chain is DEGRADED: a configured provider failed or had no material ' +
|
|
61
|
+
'at the last resolution or probe. The node is up, but redundancy is reduced.');
|
|
62
|
+
}
|
|
63
|
+
if (resolution) {
|
|
64
|
+
const table = new Table({
|
|
65
|
+
head: ['Priority', 'Provider', 'Outcome', 'Latency'],
|
|
66
|
+
style: { head: ['cyan'] },
|
|
67
|
+
});
|
|
68
|
+
for (const attempt of resolution.attempts) {
|
|
69
|
+
const priority = resolution.configured.find((c) => c.id === attempt.providerId)?.priority ?? '-';
|
|
70
|
+
table.push([
|
|
71
|
+
String(priority),
|
|
72
|
+
attempt.providerId,
|
|
73
|
+
attempt.outcome + (attempt.error ? ` (${attempt.error})` : ''),
|
|
74
|
+
attempt.latencyMs === undefined ? '-' : `${String(attempt.latencyMs)}ms`,
|
|
75
|
+
]);
|
|
76
|
+
}
|
|
77
|
+
console.log(table.toString());
|
|
78
|
+
}
|
|
79
|
+
if (resolution?.lastProbe) {
|
|
80
|
+
const probeTable = new Table({
|
|
81
|
+
head: ['Probe: Provider', 'Outcome', 'KCV', 'Latency'],
|
|
82
|
+
style: { head: ['cyan'] },
|
|
83
|
+
});
|
|
84
|
+
for (const result of resolution.lastProbe.results) {
|
|
85
|
+
probeTable.push([
|
|
86
|
+
result.providerId,
|
|
87
|
+
result.outcome + (result.error ? ` (${result.error})` : ''),
|
|
88
|
+
result.kcv ?? '-',
|
|
89
|
+
`${String(result.latencyMs)}ms`,
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
console.log(probeTable.toString());
|
|
93
|
+
}
|
|
94
|
+
if (response.envelopes.length > 0) {
|
|
95
|
+
const table = new Table({
|
|
96
|
+
head: ['Envelope', 'Key ID', 'KCV', 'Updated'],
|
|
97
|
+
style: { head: ['cyan'] },
|
|
98
|
+
});
|
|
99
|
+
for (const envelope of response.envelopes) {
|
|
100
|
+
table.push([
|
|
101
|
+
envelope.provider_id,
|
|
102
|
+
envelope.key_id ?? '-',
|
|
103
|
+
envelope.kcv,
|
|
104
|
+
formatDate(envelope.updated_at),
|
|
105
|
+
]);
|
|
106
|
+
}
|
|
107
|
+
console.log(table.toString());
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
output.info('No provider envelopes exist yet (create one with: rootkey wrap --provider <id>).');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
spinner.fail('Failed to fetch root key status');
|
|
115
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export async function rootkeyVerify(options) {
|
|
120
|
+
const spinner = output.spinner('Verifying every configured root key provider...').start();
|
|
121
|
+
try {
|
|
122
|
+
const response = await client.post('/v1/superadmin/rootkey/verify', {});
|
|
123
|
+
spinner.stop();
|
|
124
|
+
if (options.json) {
|
|
125
|
+
output.json(response);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const table = new Table({
|
|
129
|
+
head: ['Provider', 'Outcome', 'KCV', 'Latency'],
|
|
130
|
+
style: { head: ['cyan'] },
|
|
131
|
+
});
|
|
132
|
+
for (const result of response.results) {
|
|
133
|
+
table.push([
|
|
134
|
+
result.providerId,
|
|
135
|
+
result.outcome + (result.error ? ` (${result.error})` : ''),
|
|
136
|
+
result.kcv ?? '-',
|
|
137
|
+
`${String(result.latencyMs)}ms`,
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
console.log(table.toString());
|
|
141
|
+
}
|
|
142
|
+
if (response.allMatch) {
|
|
143
|
+
if (!options.json) {
|
|
144
|
+
output.success(`All configured providers agree with the active key (KCV ${response.activeKcv}).`);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// STRICT gate: anything other than 'match' fails — including a
|
|
149
|
+
// provider with no material. A green result on an unprovisioned
|
|
150
|
+
// provider would let an operator reorder priorities onto nothing.
|
|
151
|
+
const failing = response.results
|
|
152
|
+
.filter((r) => r.outcome !== 'match')
|
|
153
|
+
.map((r) => r.providerId);
|
|
154
|
+
output.error(`Root key verification FAILED for: ${failing.join(', ')}. ` +
|
|
155
|
+
'Do not change provider priorities or retire anything until every ' +
|
|
156
|
+
'configured provider verifies.');
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
spinner.fail('Root key verification failed');
|
|
161
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Mirror of the server's schema constraint. Enforced BEFORE any output or
|
|
167
|
+
* request: an operator who accidentally pastes a secret as --provider must
|
|
168
|
+
* see nothing echo it — not the spinner, not an error, not CI logs.
|
|
169
|
+
*/
|
|
170
|
+
const PROVIDER_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
|
|
171
|
+
export async function rootkeyWrap(options) {
|
|
172
|
+
if (!PROVIDER_ID_PATTERN.test(options.provider)) {
|
|
173
|
+
output.error('Invalid provider id: expected 1-32 lowercase letters, digits or hyphens ' +
|
|
174
|
+
"(e.g. 'aws-kms'). The value you passed is not echoed on purpose.");
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const spinner = output.spinner(`Wrapping the bootstrap key into '${options.provider}'...`).start();
|
|
178
|
+
try {
|
|
179
|
+
const receipt = await client.post('/v1/superadmin/rootkey/wrap', { provider: options.provider });
|
|
180
|
+
spinner.stop();
|
|
181
|
+
if (options.json) {
|
|
182
|
+
output.json(receipt);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
output.section('Root Key Envelope Written');
|
|
186
|
+
output.keyValue({
|
|
187
|
+
'Provider': receipt.providerId,
|
|
188
|
+
'Key ID': receipt.keyId ?? '-',
|
|
189
|
+
'KCV': receipt.kcv,
|
|
190
|
+
'Created': formatDate(receipt.createdAt),
|
|
191
|
+
});
|
|
192
|
+
output.success(`Envelope for '${receipt.providerId}' persisted (replicates to every node via the database).`);
|
|
193
|
+
output.info("Next: run 'znvault superadmin rootkey verify' to prove every provider opens the same key.");
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
spinner.fail('Failed to wrap the bootstrap key');
|
|
197
|
+
output.error(err instanceof Error ? err.message : String(err));
|
|
198
|
+
process.exit(1);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// ─── Registration ──────────────────────────────────────────────────────────
|
|
202
|
+
export function registerRootkeyCommands(parent) {
|
|
203
|
+
const rootkey = parent
|
|
204
|
+
.command('rootkey')
|
|
205
|
+
.description('Root-of-trust provider chain for the bootstrap key (superadmin only)');
|
|
206
|
+
rootkey
|
|
207
|
+
.command('status')
|
|
208
|
+
.description('Show configured providers, last-boot resolution, degraded flag and KCV')
|
|
209
|
+
.option('--json', 'Output as JSON')
|
|
210
|
+
.action(rootkeyStatus);
|
|
211
|
+
rootkey
|
|
212
|
+
.command('verify')
|
|
213
|
+
.description('Probe every configured provider and compare KCVs; exits 1 on any failure')
|
|
214
|
+
.option('--json', 'Output as JSON')
|
|
215
|
+
.action(rootkeyVerify);
|
|
216
|
+
rootkey
|
|
217
|
+
.command('wrap')
|
|
218
|
+
.description("Wrap the current bootstrap key into a provider's envelope (never retires anything)")
|
|
219
|
+
.requiredOption('--provider <id>', "Configured envelope provider id (e.g. 'aws-kms')")
|
|
220
|
+
.option('--json', 'Output the receipt as JSON')
|
|
221
|
+
.action(rootkeyWrap);
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=rootkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rootkey.js","sourceRoot":"","sources":["../../../src/commands/superadmin/rootkey.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAE3C;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,MAAM,MAAM,qBAAqB,CAAC;AA4E9C,8EAA8E;AAE9E,SAAS,UAAU,CAAC,GAA8B;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA2B;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE/E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAC/B,+BAA+B,CAChC,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;QACvC,qEAAqE;QACrE,kEAAkE;QAClE,MAAM,iBAAiB,GACrB,UAAU,KAAK,IAAI;YACnB,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC3C,MAAM,CAAC,QAAQ,CAAC;YACd,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB;YACrG,uBAAuB,EAAE,UAAU,EAAE,QAAQ,IAAI,GAAG;YACpD,YAAY,EAAE,UAAU,EAAE,GAAG,IAAI,GAAG;YACpC,aAAa,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC;YACjD,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;YAC5E,YAAY,EAAE,UAAU,EAAE,SAAS;gBACjC,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE;gBACtG,CAAC,CAAC,+BAA+B;YACnC,6BAA6B,EAAE,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;SACjF,CAAC,CAAC;QAEH,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CACT,yEAAyE;gBACvE,6EAA6E,CAChF,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC;gBACpD,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;aAC1B,CAAC,CAAC;YACH,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GACZ,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,IAAI,GAAG,CAAC;gBAClF,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,CAAC,QAAQ,CAAC;oBAChB,OAAO,CAAC,UAAU;oBAClB,OAAO,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI;iBACzE,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC;gBAC3B,IAAI,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC;gBACtD,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;aAC1B,CAAC,CAAC;YACH,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAClD,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,CAAC,UAAU;oBACjB,MAAM,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,MAAM,CAAC,GAAG,IAAI,GAAG;oBACjB,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;iBAChC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC;gBAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;aAC1B,CAAC,CAAC;YACH,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC;oBACT,QAAQ,CAAC,WAAW;oBACpB,QAAQ,CAAC,MAAM,IAAI,GAAG;oBACtB,QAAQ,CAAC,GAAG;oBACZ,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;iBAChC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA2B;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1F,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAChC,+BAA+B,EAC/B,EAAE,CACH,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;gBACtB,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC;gBAC/C,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE;aAC1B,CAAC,CAAC;YACH,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,CAAC,UAAU;oBACjB,MAAM,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3D,MAAM,CAAC,GAAG,IAAI,GAAG;oBACjB,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;iBAChC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,CAAC,OAAO,CACZ,2DAA2D,QAAQ,CAAC,SAAS,IAAI,CAClF,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,gEAAgE;QAChE,kEAAkE;QAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CACV,qCAAqC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACzD,mEAAmE;YACnE,+BAA+B,CAClC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAGjC;IACC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,KAAK,CACV,0EAA0E;YACxE,kEAAkE,CACrE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAC5B,oCAAoC,OAAO,CAAC,QAAQ,MAAM,CAC3D,CAAC,KAAK,EAAE,CAAC;IAEV,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAC/B,6BAA6B,EAC7B,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAC/B,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC;YACd,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;YAC9B,KAAK,EAAE,OAAO,CAAC,GAAG;YAClB,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC;SACzC,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CACZ,iBAAiB,OAAO,CAAC,UAAU,0DAA0D,CAC9F,CAAC;QACF,MAAM,CAAC,IAAI,CACT,2FAA2F,CAC5F,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E,MAAM,UAAU,uBAAuB,CAAC,MAAe;IACrD,MAAM,OAAO,GAAG,MAAM;SACnB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sEAAsE,CAAC,CAAC;IAEvF,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wEAAwE,CAAC;SACrF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0EAA0E,CAAC;SACvF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oFAAoF,CAAC;SACjG,cAAc,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SACrF,MAAM,CAAC,QAAQ,EAAE,4BAA4B,CAAC;SAC9C,MAAM,CAAC,WAAW,CAAC,CAAC;AACzB,CAAC"}
|