@lionden/plugin-deploy 0.1.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/LICENSE +201 -0
- package/README.md +23 -0
- package/dist/deploy-task.d.ts +83 -0
- package/dist/deploy-task.d.ts.map +1 -0
- package/dist/deploy-task.js +599 -0
- package/dist/deploy-task.js.map +1 -0
- package/dist/deployment-manager.d.ts +80 -0
- package/dist/deployment-manager.d.ts.map +1 -0
- package/dist/deployment-manager.js +521 -0
- package/dist/deployment-manager.js.map +1 -0
- package/dist/deployment-state.d.ts +40 -0
- package/dist/deployment-state.d.ts.map +1 -0
- package/dist/deployment-state.js +204 -0
- package/dist/deployment-state.js.map +1 -0
- package/dist/deployment-types.d.ts +112 -0
- package/dist/deployment-types.d.ts.map +1 -0
- package/dist/deployment-types.js +9 -0
- package/dist/deployment-types.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +10 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/leo-sources.d.ts +11 -0
- package/dist/leo-sources.d.ts.map +1 -0
- package/dist/leo-sources.js +31 -0
- package/dist/leo-sources.js.map +1 -0
- package/dist/leo-version.d.ts +2 -0
- package/dist/leo-version.d.ts.map +1 -0
- package/dist/leo-version.js +10 -0
- package/dist/leo-version.js.map +1 -0
- package/dist/on-chain-check.d.ts +34 -0
- package/dist/on-chain-check.d.ts.map +1 -0
- package/dist/on-chain-check.js +84 -0
- package/dist/on-chain-check.js.map +1 -0
- package/dist/preflight.d.ts +94 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +288 -0
- package/dist/preflight.js.map +1 -0
- package/dist/prove.d.ts +11 -0
- package/dist/prove.d.ts.map +1 -0
- package/dist/prove.js +19 -0
- package/dist/prove.js.map +1 -0
- package/dist/recipe-task.d.ts +18 -0
- package/dist/recipe-task.d.ts.map +1 -0
- package/dist/recipe-task.js +201 -0
- package/dist/recipe-task.js.map +1 -0
- package/dist/recipe-types.d.ts +95 -0
- package/dist/recipe-types.d.ts.map +1 -0
- package/dist/recipe-types.js +10 -0
- package/dist/recipe-types.js.map +1 -0
- package/dist/upgrade-task.d.ts +30 -0
- package/dist/upgrade-task.d.ts.map +1 -0
- package/dist/upgrade-task.js +315 -0
- package/dist/upgrade-task.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeploymentManager — facade for deployment state, preflight, export, and recovery.
|
|
3
|
+
*
|
|
4
|
+
* Session policy:
|
|
5
|
+
* - Devnode: memory-first. Every async read validates against getProgramSource().
|
|
6
|
+
* - HTTP: disk state trusted after .network.json metadata validation.
|
|
7
|
+
*/
|
|
8
|
+
import type { LionDenResolvedConfig } from "@lionden/config";
|
|
9
|
+
import type { ArtifactStore } from "@lionden/core";
|
|
10
|
+
import type { ProgramABI } from "@lionden/leo-compiler";
|
|
11
|
+
import type { NetworkConnection, NetworkManager } from "@lionden/network";
|
|
12
|
+
import type { DeploymentHistoryEntry, DeploymentRecord, ExportBundle, PendingDeployment, RecoveredDeploymentRecord } from "./deployment-types.js";
|
|
13
|
+
import type { DeployPreflightResult } from "./preflight.js";
|
|
14
|
+
export interface PreflightOptions {
|
|
15
|
+
/** Default: config.defaultNetwork */
|
|
16
|
+
network?: string;
|
|
17
|
+
/** Default: config.deploy.skipDeployed */
|
|
18
|
+
skipDeployed?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface RecordOptions {
|
|
21
|
+
abi?: ProgramABI;
|
|
22
|
+
historyEntry?: Partial<DeploymentHistoryEntry>;
|
|
23
|
+
}
|
|
24
|
+
export interface DeploymentManager {
|
|
25
|
+
getDeployment(programId: string, network?: string): Promise<DeploymentRecord | null>;
|
|
26
|
+
getAllDeployments(network?: string): Promise<DeploymentRecord[]>;
|
|
27
|
+
isDeployed(programId: string, network?: string): Promise<boolean>;
|
|
28
|
+
getHistory(programId: string, network?: string): Promise<DeploymentHistoryEntry[]>;
|
|
29
|
+
getCached(programId: string, network?: string): DeploymentRecord | null;
|
|
30
|
+
isCachedDeployed(programId: string, network?: string): boolean;
|
|
31
|
+
record(record: DeploymentRecord, action: "deploy" | "upgrade", options?: RecordOptions): Promise<void>;
|
|
32
|
+
setPending(pending: PendingDeployment): Promise<void>;
|
|
33
|
+
getPending(network: string, programId: string): Promise<PendingDeployment | null>;
|
|
34
|
+
clearPending(network: string, programId: string): Promise<void>;
|
|
35
|
+
recoverPendingDeployments(network: string, connection: NetworkConnection): Promise<RecoveredDeploymentRecord[]>;
|
|
36
|
+
preflight(programIds: string[], options?: PreflightOptions): Promise<DeployPreflightResult>;
|
|
37
|
+
export(network?: string): Promise<ExportBundle>;
|
|
38
|
+
isEphemeral(network: string): boolean;
|
|
39
|
+
getCachedAbi(programId: string, network?: string): ProgramABI | null;
|
|
40
|
+
invalidateSession(network: string): void;
|
|
41
|
+
}
|
|
42
|
+
export declare class DeploymentManagerImpl implements DeploymentManager {
|
|
43
|
+
private readonly config;
|
|
44
|
+
private readonly networkAccessor;
|
|
45
|
+
private readonly artifacts;
|
|
46
|
+
/** In-memory cache: network → programId → record */
|
|
47
|
+
private readonly cache;
|
|
48
|
+
/** In-memory ABI cache: network → programId → ABI (populated by record() for all networks) */
|
|
49
|
+
private readonly abiCache;
|
|
50
|
+
/** Memoized metadata validation results: network → "valid" | "invalid" | null */
|
|
51
|
+
private readonly metadataValidated;
|
|
52
|
+
constructor(config: LionDenResolvedConfig, networkAccessor: () => NetworkManager | null, artifacts: ArtifactStore);
|
|
53
|
+
private get deploymentsDir();
|
|
54
|
+
private resolveNetwork;
|
|
55
|
+
private networkCache;
|
|
56
|
+
private networkAbiCache;
|
|
57
|
+
isEphemeral(network: string): boolean;
|
|
58
|
+
getCachedAbi(programId: string, network?: string): ProgramABI | null;
|
|
59
|
+
private requireProgramEdition;
|
|
60
|
+
/**
|
|
61
|
+
* Validate .network.json for an HTTP network before trusting disk state.
|
|
62
|
+
* Throws on mismatch. Returns true when valid, false when metadata absent + no records.
|
|
63
|
+
*/
|
|
64
|
+
private validateHttpMetadata;
|
|
65
|
+
getDeployment(programId: string, network?: string): Promise<DeploymentRecord | null>;
|
|
66
|
+
getAllDeployments(network?: string): Promise<DeploymentRecord[]>;
|
|
67
|
+
isDeployed(programId: string, network?: string): Promise<boolean>;
|
|
68
|
+
getHistory(programId: string, network?: string): Promise<DeploymentHistoryEntry[]>;
|
|
69
|
+
getCached(programId: string, network?: string): DeploymentRecord | null;
|
|
70
|
+
isCachedDeployed(programId: string, network?: string): boolean;
|
|
71
|
+
record(record: DeploymentRecord, action: "deploy" | "upgrade", options?: RecordOptions): Promise<void>;
|
|
72
|
+
setPending(pending: PendingDeployment): Promise<void>;
|
|
73
|
+
getPending(network: string, programId: string): Promise<PendingDeployment | null>;
|
|
74
|
+
clearPending(network: string, programId: string): Promise<void>;
|
|
75
|
+
recoverPendingDeployments(network: string, connection: NetworkConnection): Promise<RecoveredDeploymentRecord[]>;
|
|
76
|
+
preflight(programIds: string[], options?: PreflightOptions): Promise<DeployPreflightResult>;
|
|
77
|
+
export(network?: string): Promise<ExportBundle>;
|
|
78
|
+
invalidateSession(network: string): void;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=deployment-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-manager.d.ts","sourceRoot":"","sources":["../src/deployment-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DeploymentManager — facade for deployment state, preflight, export, and recovery.
|
|
3
|
+
*
|
|
4
|
+
* Session policy:
|
|
5
|
+
* - Devnode: memory-first. Every async read validates against getProgramSource().
|
|
6
|
+
* - HTTP: disk state trusted after .network.json metadata validation.
|
|
7
|
+
*/
|
|
8
|
+
import { discoverUnits, parseAbi, resolveDependencies } from "@lionden/leo-compiler";
|
|
9
|
+
import { appendHistory, deletePendingMarker, listPendingMarkers, readAbiSnapshot, readAllDeploymentRecords, readDeploymentRecord, readHistory, readNetworkMetadata, readPendingMarker, writeAbiSnapshot, writeDeploymentRecord, writeExportBundle, writeNetworkMetadata, writePendingMarker, } from "./deployment-state.js";
|
|
10
|
+
import { checkProgramOnChain, createDegradedRecord } from "./on-chain-check.js";
|
|
11
|
+
import { runDeployPreflight } from "./preflight.js";
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// DeploymentManagerImpl
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
export class DeploymentManagerImpl {
|
|
16
|
+
config;
|
|
17
|
+
networkAccessor;
|
|
18
|
+
artifacts;
|
|
19
|
+
/** In-memory cache: network → programId → record */
|
|
20
|
+
cache = new Map();
|
|
21
|
+
/** In-memory ABI cache: network → programId → ABI (populated by record() for all networks) */
|
|
22
|
+
abiCache = new Map();
|
|
23
|
+
/** Memoized metadata validation results: network → "valid" | "invalid" | null */
|
|
24
|
+
metadataValidated = new Map();
|
|
25
|
+
constructor(config, networkAccessor, artifacts) {
|
|
26
|
+
this.config = config;
|
|
27
|
+
this.networkAccessor = networkAccessor;
|
|
28
|
+
this.artifacts = artifacts;
|
|
29
|
+
}
|
|
30
|
+
get deploymentsDir() {
|
|
31
|
+
return this.config.paths.deployments;
|
|
32
|
+
}
|
|
33
|
+
resolveNetwork(network) {
|
|
34
|
+
return network ?? this.config.defaultNetwork;
|
|
35
|
+
}
|
|
36
|
+
networkCache(network) {
|
|
37
|
+
let nc = this.cache.get(network);
|
|
38
|
+
if (!nc) {
|
|
39
|
+
nc = new Map();
|
|
40
|
+
this.cache.set(network, nc);
|
|
41
|
+
}
|
|
42
|
+
return nc;
|
|
43
|
+
}
|
|
44
|
+
networkAbiCache(network) {
|
|
45
|
+
let ac = this.abiCache.get(network);
|
|
46
|
+
if (!ac) {
|
|
47
|
+
ac = new Map();
|
|
48
|
+
this.abiCache.set(network, ac);
|
|
49
|
+
}
|
|
50
|
+
return ac;
|
|
51
|
+
}
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Ephemeral
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
isEphemeral(network) {
|
|
56
|
+
const nc = this.config.networks[network];
|
|
57
|
+
return nc?.ephemeral ?? nc?.type === "devnode";
|
|
58
|
+
}
|
|
59
|
+
getCachedAbi(programId, network) {
|
|
60
|
+
const net = this.resolveNetwork(network);
|
|
61
|
+
return this.abiCache.get(net)?.get(programId) ?? null;
|
|
62
|
+
}
|
|
63
|
+
requireProgramEdition(programId, edition, actionDescription) {
|
|
64
|
+
if (typeof edition === "number" && Number.isInteger(edition) && edition >= 0) {
|
|
65
|
+
return edition;
|
|
66
|
+
}
|
|
67
|
+
throw new Error(`Unable to ${actionDescription} for "${programId}": on-chain program edition could not be observed.`);
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// HTTP metadata validation
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
/**
|
|
73
|
+
* Validate .network.json for an HTTP network before trusting disk state.
|
|
74
|
+
* Throws on mismatch. Returns true when valid, false when metadata absent + no records.
|
|
75
|
+
*/
|
|
76
|
+
async validateHttpMetadata(network) {
|
|
77
|
+
// Already validated this session
|
|
78
|
+
if (this.metadataValidated.get(network) === true)
|
|
79
|
+
return;
|
|
80
|
+
const networkConfig = this.config.networks[network];
|
|
81
|
+
if (!networkConfig || networkConfig.type !== "http")
|
|
82
|
+
return;
|
|
83
|
+
const meta = readNetworkMetadata(this.deploymentsDir, network);
|
|
84
|
+
if (meta !== null) {
|
|
85
|
+
// Metadata exists — validate it matches config
|
|
86
|
+
const configEndpoint = networkConfig.endpoint;
|
|
87
|
+
const configNetworkId = networkConfig.network;
|
|
88
|
+
if (meta.type !== "http" ||
|
|
89
|
+
meta.networkId !== configNetworkId ||
|
|
90
|
+
meta.endpoint !== configEndpoint) {
|
|
91
|
+
throw new Error(`Network metadata mismatch for "${network}": ` +
|
|
92
|
+
`config says type=${networkConfig.type}, networkId=${configNetworkId}, endpoint=${configEndpoint} ` +
|
|
93
|
+
`but deployments/.network.json says type=${meta.type}, networkId=${meta.networkId}, endpoint=${meta.endpoint}. ` +
|
|
94
|
+
`This may mean the network was reconfigured. ` +
|
|
95
|
+
`Delete deployments/${network}/ to reset.`);
|
|
96
|
+
}
|
|
97
|
+
this.metadataValidated.set(network, true);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Metadata absent — check if any record files exist
|
|
101
|
+
const records = readAllDeploymentRecords(this.deploymentsDir, network);
|
|
102
|
+
if (records.length > 0) {
|
|
103
|
+
throw new Error(`Deployment records exist for "${network}" but .network.json is missing. ` +
|
|
104
|
+
`This state is unverifiable. ` +
|
|
105
|
+
`Delete deployments/${network}/ and re-deploy, or create .network.json manually.`);
|
|
106
|
+
}
|
|
107
|
+
// Empty state — metadata will be written on first record()
|
|
108
|
+
this.metadataValidated.set(network, true);
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Async reads
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
async getDeployment(programId, network) {
|
|
114
|
+
const net = this.resolveNetwork(network);
|
|
115
|
+
const networkConfig = this.config.networks[net];
|
|
116
|
+
const nc = this.networkCache(net);
|
|
117
|
+
if (networkConfig?.type === "devnode") {
|
|
118
|
+
// Devnode: always validate on-chain
|
|
119
|
+
const manager = this.networkAccessor();
|
|
120
|
+
const connection = manager?.getConnection();
|
|
121
|
+
if (!connection) {
|
|
122
|
+
// No connection yet — return cache only
|
|
123
|
+
return nc.get(programId) ?? null;
|
|
124
|
+
}
|
|
125
|
+
const onChain = await checkProgramOnChain(connection, programId);
|
|
126
|
+
if (!onChain.exists) {
|
|
127
|
+
nc.delete(programId);
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
// On-chain — return existing record (cache preferred, disk as fallback).
|
|
131
|
+
// Disk fallback only for non-ephemeral devnode (ephemeral: false opt-in).
|
|
132
|
+
// When ephemeral (default), disk state is never read — it may be stale from
|
|
133
|
+
// a previous session or process.
|
|
134
|
+
const existing = nc.get(programId) ??
|
|
135
|
+
(this.isEphemeral(net) ? null : readDeploymentRecord(this.deploymentsDir, net, programId));
|
|
136
|
+
if (existing) {
|
|
137
|
+
nc.set(programId, existing);
|
|
138
|
+
return existing;
|
|
139
|
+
}
|
|
140
|
+
const observedEdition = this.requireProgramEdition(programId, onChain.edition, "create degraded deployment record");
|
|
141
|
+
const degraded = createDegradedRecord(programId, net, connection.endpoint, onChain.source, observedEdition);
|
|
142
|
+
nc.set(programId, degraded);
|
|
143
|
+
return degraded;
|
|
144
|
+
}
|
|
145
|
+
// HTTP network
|
|
146
|
+
if (this.isEphemeral(net)) {
|
|
147
|
+
// Ephemeral HTTP: cache-only, skip metadata validation and disk reads
|
|
148
|
+
return nc.get(programId) ?? null;
|
|
149
|
+
}
|
|
150
|
+
await this.validateHttpMetadata(net);
|
|
151
|
+
const existing = nc.get(programId) ?? readDeploymentRecord(this.deploymentsDir, net, programId);
|
|
152
|
+
if (existing) {
|
|
153
|
+
const manager = this.networkAccessor();
|
|
154
|
+
if (!manager) {
|
|
155
|
+
throw new Error(`Unable to validate deployment record for "${programId}" on "${net}": network manager is not available.`);
|
|
156
|
+
}
|
|
157
|
+
const connection = await manager.connect(net);
|
|
158
|
+
const onChain = await checkProgramOnChain(connection, programId);
|
|
159
|
+
if (!onChain.exists) {
|
|
160
|
+
nc.delete(programId);
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
nc.set(programId, existing);
|
|
164
|
+
return existing;
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
async getAllDeployments(network) {
|
|
169
|
+
const net = this.resolveNetwork(network);
|
|
170
|
+
const networkConfig = this.config.networks[net];
|
|
171
|
+
const nc = this.networkCache(net);
|
|
172
|
+
if (networkConfig?.type === "devnode") {
|
|
173
|
+
const manager = this.networkAccessor();
|
|
174
|
+
const connection = manager?.getConnection();
|
|
175
|
+
if (!connection) {
|
|
176
|
+
return [...nc.values()];
|
|
177
|
+
}
|
|
178
|
+
const candidateIds = new Set(nc.keys());
|
|
179
|
+
if (!this.isEphemeral(net)) {
|
|
180
|
+
for (const record of readAllDeploymentRecords(this.deploymentsDir, net)) {
|
|
181
|
+
if (!candidateIds.has(record.programId)) {
|
|
182
|
+
candidateIds.add(record.programId);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const records = [];
|
|
187
|
+
for (const programId of candidateIds) {
|
|
188
|
+
const record = await this.getDeployment(programId, net);
|
|
189
|
+
if (record) {
|
|
190
|
+
records.push(record);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return records;
|
|
194
|
+
}
|
|
195
|
+
if (this.isEphemeral(net)) {
|
|
196
|
+
// Ephemeral HTTP: cache-only
|
|
197
|
+
return [...nc.values()];
|
|
198
|
+
}
|
|
199
|
+
// Non-ephemeral: validate metadata (HTTP) then read from disk
|
|
200
|
+
if (networkConfig?.type === "http") {
|
|
201
|
+
await this.validateHttpMetadata(net);
|
|
202
|
+
}
|
|
203
|
+
const candidateIds = new Set(nc.keys());
|
|
204
|
+
for (const record of readAllDeploymentRecords(this.deploymentsDir, net)) {
|
|
205
|
+
candidateIds.add(record.programId);
|
|
206
|
+
}
|
|
207
|
+
const records = [];
|
|
208
|
+
for (const programId of candidateIds) {
|
|
209
|
+
const record = await this.getDeployment(programId, net);
|
|
210
|
+
if (record) {
|
|
211
|
+
records.push(record);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return records;
|
|
215
|
+
}
|
|
216
|
+
async isDeployed(programId, network) {
|
|
217
|
+
return (await this.getDeployment(programId, network)) !== null;
|
|
218
|
+
}
|
|
219
|
+
async getHistory(programId, network) {
|
|
220
|
+
const net = this.resolveNetwork(network);
|
|
221
|
+
if (this.isEphemeral(net))
|
|
222
|
+
return [];
|
|
223
|
+
return readHistory(this.deploymentsDir, net, programId);
|
|
224
|
+
}
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
// Sync reads (cache-only)
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
getCached(programId, network) {
|
|
229
|
+
return this.networkCache(this.resolveNetwork(network)).get(programId) ?? null;
|
|
230
|
+
}
|
|
231
|
+
isCachedDeployed(programId, network) {
|
|
232
|
+
return this.getCached(programId, network) !== null;
|
|
233
|
+
}
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// State mutations
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
async record(record, action, options) {
|
|
238
|
+
const net = record.network;
|
|
239
|
+
const programId = record.programId;
|
|
240
|
+
const edition = record.edition;
|
|
241
|
+
if (!(typeof edition === "number" && Number.isInteger(edition) && edition >= 0)) {
|
|
242
|
+
throw new Error(`Cannot record deployment for "${programId}": on-chain program edition is required.`);
|
|
243
|
+
}
|
|
244
|
+
// Enforce ABI for complete records — export consumers rely on it
|
|
245
|
+
if (record.status === "complete" && !options?.abi) {
|
|
246
|
+
throw new Error(`ABI is required when recording a complete deployment for "${programId}". ` +
|
|
247
|
+
`Pass options.abi to manager.record() when status is "complete".`);
|
|
248
|
+
}
|
|
249
|
+
const ephemeral = this.isEphemeral(net);
|
|
250
|
+
if (!ephemeral) {
|
|
251
|
+
// Write network metadata on first record() for HTTP networks
|
|
252
|
+
const networkConfig = this.config.networks[net];
|
|
253
|
+
if (networkConfig?.type === "http") {
|
|
254
|
+
const existing = readNetworkMetadata(this.deploymentsDir, net);
|
|
255
|
+
if (!existing) {
|
|
256
|
+
const meta = {
|
|
257
|
+
type: "http",
|
|
258
|
+
networkId: networkConfig.network,
|
|
259
|
+
endpoint: networkConfig.endpoint,
|
|
260
|
+
};
|
|
261
|
+
writeNetworkMetadata(this.deploymentsDir, net, meta);
|
|
262
|
+
this.metadataValidated.set(net, true);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Write ABI snapshot if provided
|
|
266
|
+
if (options?.abi) {
|
|
267
|
+
writeAbiSnapshot(this.deploymentsDir, net, programId, options.abi);
|
|
268
|
+
}
|
|
269
|
+
// Write deployment record
|
|
270
|
+
writeDeploymentRecord(this.deploymentsDir, net, record);
|
|
271
|
+
// Append history
|
|
272
|
+
const historyEntry = {
|
|
273
|
+
record,
|
|
274
|
+
action,
|
|
275
|
+
...(options?.historyEntry ?? {}),
|
|
276
|
+
};
|
|
277
|
+
appendHistory(this.deploymentsDir, net, programId, historyEntry);
|
|
278
|
+
}
|
|
279
|
+
// Always: populate in-memory ABI cache when ABI provided.
|
|
280
|
+
// Normalize through parseAbi() so getCachedAbi() always returns a fully-normalized
|
|
281
|
+
// ProgramABI with `transitions` (not the compiler's `functions` format). The artifact
|
|
282
|
+
// store's lazy disk fallback returns raw JSON.parse() output (compiler format), so
|
|
283
|
+
// options.abi may arrive un-normalized when it came through lre.artifacts.getAbi().
|
|
284
|
+
if (options?.abi) {
|
|
285
|
+
const raw = options.abi;
|
|
286
|
+
const normalized = parseAbi(JSON.stringify(raw));
|
|
287
|
+
this.networkAbiCache(net).set(programId, normalized);
|
|
288
|
+
}
|
|
289
|
+
// Always: update in-memory record cache
|
|
290
|
+
this.networkCache(net).set(programId, record);
|
|
291
|
+
if (!ephemeral) {
|
|
292
|
+
// Clear pending marker (atomically committed)
|
|
293
|
+
deletePendingMarker(this.deploymentsDir, net, programId);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
async setPending(pending) {
|
|
297
|
+
if (!this.isEphemeral(pending.network)) {
|
|
298
|
+
writePendingMarker(this.deploymentsDir, pending.network, pending);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async getPending(network, programId) {
|
|
302
|
+
if (this.isEphemeral(network))
|
|
303
|
+
return null;
|
|
304
|
+
await this.validateHttpMetadata(network);
|
|
305
|
+
return readPendingMarker(this.deploymentsDir, network, programId);
|
|
306
|
+
}
|
|
307
|
+
async clearPending(network, programId) {
|
|
308
|
+
if (!this.isEphemeral(network)) {
|
|
309
|
+
deletePendingMarker(this.deploymentsDir, network, programId);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// ---------------------------------------------------------------------------
|
|
313
|
+
// Recovery
|
|
314
|
+
// ---------------------------------------------------------------------------
|
|
315
|
+
async recoverPendingDeployments(network, connection) {
|
|
316
|
+
if (this.isEphemeral(network))
|
|
317
|
+
return []; // No markers to recover in ephemeral mode
|
|
318
|
+
await this.validateHttpMetadata(network);
|
|
319
|
+
const markerIds = listPendingMarkers(this.deploymentsDir, network);
|
|
320
|
+
const recovered = [];
|
|
321
|
+
for (const programId of markerIds) {
|
|
322
|
+
const marker = readPendingMarker(this.deploymentsDir, network, programId);
|
|
323
|
+
if (!marker)
|
|
324
|
+
continue;
|
|
325
|
+
const onChain = await checkProgramOnChain(connection, programId);
|
|
326
|
+
if (!onChain.exists) {
|
|
327
|
+
// Not on-chain — delete marker, nothing to recover
|
|
328
|
+
deletePendingMarker(this.deploymentsDir, network, programId);
|
|
329
|
+
console.info(`[DeploymentManager] Pending deployment for "${programId}" not found on-chain. ` +
|
|
330
|
+
`The transaction may not have been broadcast. Clearing pending marker.`);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
let recoveredEdition;
|
|
334
|
+
if (marker.action === "deploy") {
|
|
335
|
+
recoveredEdition =
|
|
336
|
+
typeof onChain.edition === "number" &&
|
|
337
|
+
Number.isInteger(onChain.edition) &&
|
|
338
|
+
onChain.edition >= 0
|
|
339
|
+
? onChain.edition
|
|
340
|
+
: 0;
|
|
341
|
+
}
|
|
342
|
+
else {
|
|
343
|
+
recoveredEdition = this.requireProgramEdition(programId, onChain.edition, "recover pending deployment");
|
|
344
|
+
if (typeof marker.previousEdition !== "number" ||
|
|
345
|
+
!Number.isInteger(marker.previousEdition) ||
|
|
346
|
+
marker.previousEdition < 0) {
|
|
347
|
+
deletePendingMarker(this.deploymentsDir, network, programId);
|
|
348
|
+
console.info(`[DeploymentManager] Pending upgrade for "${programId}" did not advance on-chain. ` +
|
|
349
|
+
`Clearing pending marker.`);
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (recoveredEdition <= marker.previousEdition) {
|
|
353
|
+
if (typeof marker.blockHeight === "number") {
|
|
354
|
+
console.info(`[DeploymentManager] Confirmed upgrade for "${programId}" has not propagated to edition reads yet. ` +
|
|
355
|
+
`Keeping pending marker.`);
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
deletePendingMarker(this.deploymentsDir, network, programId);
|
|
359
|
+
console.info(`[DeploymentManager] Pending upgrade for "${programId}" did not advance on-chain. ` +
|
|
360
|
+
`Clearing pending marker.`);
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
const existingRecord = this.networkCache(network).get(programId) ??
|
|
365
|
+
(this.isEphemeral(network)
|
|
366
|
+
? null
|
|
367
|
+
: readDeploymentRecord(this.deploymentsDir, network, programId));
|
|
368
|
+
// On-chain — build RecoveredDeploymentRecord
|
|
369
|
+
const recoveredRecord = {
|
|
370
|
+
status: "recovered",
|
|
371
|
+
programId,
|
|
372
|
+
sourceProgramId: marker.sourceProgramId,
|
|
373
|
+
network,
|
|
374
|
+
endpoint: connection.endpoint,
|
|
375
|
+
updatedAt: new Date().toISOString(),
|
|
376
|
+
edition: recoveredEdition,
|
|
377
|
+
historyCount: existingRecord ? existingRecord.historyCount + 1 : 0,
|
|
378
|
+
txId: marker.txId ?? null,
|
|
379
|
+
blockHeight: marker.blockHeight ?? null,
|
|
380
|
+
deployerAddress: marker.deployerAddress,
|
|
381
|
+
deployedAt: marker.startedAt,
|
|
382
|
+
feePaid: null,
|
|
383
|
+
};
|
|
384
|
+
await this.record(recoveredRecord, marker.action, {
|
|
385
|
+
historyEntry: { action: marker.action },
|
|
386
|
+
});
|
|
387
|
+
recovered.push(recoveredRecord);
|
|
388
|
+
console.info(`[DeploymentManager] Recovered ${marker.action} for "${programId}".`);
|
|
389
|
+
}
|
|
390
|
+
return recovered;
|
|
391
|
+
}
|
|
392
|
+
// ---------------------------------------------------------------------------
|
|
393
|
+
// Preflight (programmatic API)
|
|
394
|
+
// ---------------------------------------------------------------------------
|
|
395
|
+
async preflight(programIds, options) {
|
|
396
|
+
const network = options?.network ?? this.config.defaultNetwork;
|
|
397
|
+
const skipDeployed = options?.skipDeployed ?? this.config.deploy.skipDeployed;
|
|
398
|
+
const networkConfig = this.config.networks[network];
|
|
399
|
+
if (!networkConfig) {
|
|
400
|
+
throw new Error(`Network "${network}" not found in config. ` +
|
|
401
|
+
`Available: ${Object.keys(this.config.networks).join(", ") || "none"}`);
|
|
402
|
+
}
|
|
403
|
+
const manager = this.networkAccessor();
|
|
404
|
+
if (!manager) {
|
|
405
|
+
throw new Error("Network manager not available. Ensure @lionden/plugin-network is loaded.");
|
|
406
|
+
}
|
|
407
|
+
const connection = await manager.connect(network);
|
|
408
|
+
// Normalize program IDs
|
|
409
|
+
const normalizedIds = programIds.map((id) => (id.endsWith(".aleo") ? id : `${id}.aleo`));
|
|
410
|
+
// Build the dependency graph. discoverUnits() reads .leo source files without
|
|
411
|
+
// compilation.
|
|
412
|
+
const programsDir = this.config.paths.programs;
|
|
413
|
+
const discovered = discoverUnits(programsDir);
|
|
414
|
+
let graph;
|
|
415
|
+
try {
|
|
416
|
+
graph = resolveDependencies(discovered);
|
|
417
|
+
}
|
|
418
|
+
catch (err) {
|
|
419
|
+
// Propagate dependency resolution failures (e.g. cycles, malformed imports)
|
|
420
|
+
// as a fatal preflight error rather than silently using an empty graph.
|
|
421
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
422
|
+
return {
|
|
423
|
+
passed: false,
|
|
424
|
+
warnings: [],
|
|
425
|
+
errors: [
|
|
426
|
+
{
|
|
427
|
+
code: "DEPENDENCY_RESOLUTION_FAILED",
|
|
428
|
+
message: `Failed to resolve program dependencies: ${message}`,
|
|
429
|
+
recoverable: false,
|
|
430
|
+
},
|
|
431
|
+
],
|
|
432
|
+
programs: normalizedIds.map((programId) => ({
|
|
433
|
+
programId,
|
|
434
|
+
action: "deploy",
|
|
435
|
+
})),
|
|
436
|
+
totalFeeEstimate: undefined,
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
// Build program entries: aleoSource from artifacts.
|
|
440
|
+
// getDeployment() (async, validates disk/on-chain) gives accurate existing state.
|
|
441
|
+
const programs = [];
|
|
442
|
+
for (const programId of normalizedIds) {
|
|
443
|
+
const aleoSource = this.artifacts.getAleoSource(programId);
|
|
444
|
+
const existingRecord = await this.getDeployment(programId, network);
|
|
445
|
+
programs.push({
|
|
446
|
+
programId,
|
|
447
|
+
aleoSource: typeof aleoSource === "string" ? aleoSource : undefined,
|
|
448
|
+
existingRecord,
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
const deployTargets = new Set(normalizedIds);
|
|
452
|
+
const localSources = new Map();
|
|
453
|
+
for (const p of programs) {
|
|
454
|
+
if (p.aleoSource !== undefined) {
|
|
455
|
+
localSources.set(p.programId, p.aleoSource);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
return runDeployPreflight({
|
|
459
|
+
programs,
|
|
460
|
+
connection,
|
|
461
|
+
networkConfig,
|
|
462
|
+
config: this.config,
|
|
463
|
+
skipDeployed,
|
|
464
|
+
deployTargets,
|
|
465
|
+
localSources,
|
|
466
|
+
graph,
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
// ---------------------------------------------------------------------------
|
|
470
|
+
// Export
|
|
471
|
+
// ---------------------------------------------------------------------------
|
|
472
|
+
async export(network) {
|
|
473
|
+
const net = this.resolveNetwork(network);
|
|
474
|
+
const networkConfig = this.config.networks[net];
|
|
475
|
+
const ephemeral = this.isEphemeral(net);
|
|
476
|
+
const records = await this.getAllDeployments(net);
|
|
477
|
+
const programs = {};
|
|
478
|
+
for (const record of records) {
|
|
479
|
+
// Ephemeral: skip disk ABI snapshot, use memory cache → artifacts
|
|
480
|
+
// Non-ephemeral: disk snapshot → memory cache → artifacts
|
|
481
|
+
const snapshotAbi = ephemeral
|
|
482
|
+
? null
|
|
483
|
+
: readAbiSnapshot(this.deploymentsDir, net, record.programId);
|
|
484
|
+
const cachedAbi = this.getCachedAbi(record.programId, net);
|
|
485
|
+
const artifactAbi = this.artifacts.getAbi(record.programId);
|
|
486
|
+
const abi = snapshotAbi ?? cachedAbi ?? artifactAbi ?? null;
|
|
487
|
+
programs[record.programId] = {
|
|
488
|
+
programId: record.programId,
|
|
489
|
+
abi,
|
|
490
|
+
txId: record.status === "complete" ? record.txId : null,
|
|
491
|
+
status: record.status,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
const endpoint = networkConfig?.type === "http"
|
|
495
|
+
? networkConfig.endpoint
|
|
496
|
+
: networkConfig?.type === "devnode"
|
|
497
|
+
? `http://${networkConfig.socketAddr ?? "127.0.0.1:3030"}`
|
|
498
|
+
: "unknown";
|
|
499
|
+
const bundle = {
|
|
500
|
+
network: net,
|
|
501
|
+
networkInfo: {
|
|
502
|
+
type: networkConfig?.type ?? "devnode",
|
|
503
|
+
networkId: networkConfig?.network ?? "testnet",
|
|
504
|
+
endpoint,
|
|
505
|
+
},
|
|
506
|
+
exportedAt: new Date().toISOString(),
|
|
507
|
+
programs,
|
|
508
|
+
};
|
|
509
|
+
writeExportBundle(this.deploymentsDir, net, bundle);
|
|
510
|
+
return bundle;
|
|
511
|
+
}
|
|
512
|
+
// ---------------------------------------------------------------------------
|
|
513
|
+
// Session
|
|
514
|
+
// ---------------------------------------------------------------------------
|
|
515
|
+
invalidateSession(network) {
|
|
516
|
+
this.cache.delete(network);
|
|
517
|
+
this.abiCache.delete(network);
|
|
518
|
+
this.metadataValidated.delete(network);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=deployment-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-manager.js","sourceRoot":"","sources":["../src/deployment-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAU/B,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA2DpD,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,OAAO,qBAAqB;IACf,MAAM,CAAwB;IAC9B,eAAe,CAA8B;IAC7C,SAAS,CAAgB;IAE1C,oDAAoD;IACnC,KAAK,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE1E,8FAA8F;IAC7E,QAAQ,GAAG,IAAI,GAAG,EAAmC,CAAC;IAEvE,iFAAiF;IAChE,iBAAiB,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEhE,YACE,MAA6B,EAC7B,eAA4C,EAC5C,SAAwB;QAExB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,IAAY,cAAc;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;IACvC,CAAC;IAEO,cAAc,CAAC,OAAgB;QACrC,OAAO,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IAC/C,CAAC;IAEO,YAAY,CAAC,OAAe;QAClC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,8EAA8E;IAC9E,YAAY;IACZ,8EAA8E;IAE9E,WAAW,CAAC,OAAe;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,EAAE,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,KAAK,SAAS,CAAC;IACjD,CAAC;IAED,YAAY,CAAC,SAAiB,EAAE,OAAgB;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IACxD,CAAC;IAEO,qBAAqB,CAC3B,SAAiB,EACjB,OAAsB,EACtB,iBAAyB;QAEzB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YAC7E,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,aAAa,iBAAiB,SAAS,SAAS,oDAAoD,CACrG,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,2BAA2B;IAC3B,8EAA8E;IAE9E;;;OAGG;IACK,KAAK,CAAC,oBAAoB,CAAC,OAAe;QAChD,iCAAiC;QACjC,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI;YAAE,OAAO;QAEzD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QAE5D,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAE/D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,+CAA+C;YAC/C,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC;YAC9C,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC;YAE9C,IACE,IAAI,CAAC,IAAI,KAAK,MAAM;gBACpB,IAAI,CAAC,SAAS,KAAK,eAAe;gBAClC,IAAI,CAAC,QAAQ,KAAK,cAAc,EAChC,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,kCAAkC,OAAO,KAAK;oBAC5C,oBAAoB,aAAa,CAAC,IAAI,eAAe,eAAe,cAAc,cAAc,GAAG;oBACnG,2CAA2C,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,QAAQ,IAAI;oBAChH,8CAA8C;oBAC9C,sBAAsB,OAAO,aAAa,CAC7C,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,oDAAoD;QACpD,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,kCAAkC;gBACxE,8BAA8B;gBAC9B,sBAAsB,OAAO,oDAAoD,CACpF,CAAC;QACJ,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,8EAA8E;IAC9E,cAAc;IACd,8EAA8E;IAE9E,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,OAAgB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,aAAa,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,oCAAoC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,OAAO,EAAE,aAAa,EAAE,CAAC;YAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,wCAAwC;gBACxC,OAAO,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;YACnC,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAEjE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,yEAAyE;YACzE,0EAA0E;YAC1E,4EAA4E;YAC5E,iCAAiC;YACjC,MAAM,QAAQ,GACZ,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;gBACjB,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;YAC7F,IAAI,QAAQ,EAAE,CAAC;gBACb,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC5B,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAChD,SAAS,EACT,OAAO,CAAC,OAAO,EACf,mCAAmC,CACpC,CAAC;YACF,MAAM,QAAQ,GAAG,oBAAoB,CACnC,SAAS,EACT,GAAG,EACH,UAAU,CAAC,QAAQ,EACnB,OAAO,CAAC,MAAM,EACd,eAAe,CAChB,CAAC;YACF,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,eAAe;QACf,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,sEAAsE;YACtE,OAAO,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAChG,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,6CAA6C,SAAS,SAAS,GAAG,sCAAsC,CACzG,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAgB;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,aAAa,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,OAAO,EAAE,aAAa,EAAE,CAAC;YAE5C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;YAC1B,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,KAAK,MAAM,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC;oBACxE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;wBACxC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACrC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAuB,EAAE,CAAC;YACvC,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACxD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,6BAA6B;YAC7B,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,8DAA8D;QAC9D,IAAI,aAAa,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,KAAK,MAAM,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,EAAE,CAAC;YACxE,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACxD,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,OAAgB;QAClD,OAAO,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAiB,EAAE,OAAgB;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,OAAO,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,8EAA8E;IAC9E,0BAA0B;IAC1B,8EAA8E;IAE9E,SAAS,CAAC,SAAiB,EAAE,OAAgB;QAC3C,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAChF,CAAC;IAED,gBAAgB,CAAC,SAAiB,EAAE,OAAgB;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACrD,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E,KAAK,CAAC,MAAM,CACV,MAAwB,EACxB,MAA4B,EAC5B,OAAuB;QAEvB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAEnC,MAAM,OAAO,GAAI,MAAoD,CAAC,OAAO,CAAC;QAC9E,IAAI,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,0CAA0C,CACrF,CAAC;QACJ,CAAC;QAED,iEAAiE;QACjE,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CACb,6DAA6D,SAAS,KAAK;gBACzE,iEAAiE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,6DAA6D;YAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChD,IAAI,aAAa,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;gBAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,GAAoB;wBAC5B,IAAI,EAAE,MAAM;wBACZ,SAAS,EAAE,aAAa,CAAC,OAAO;wBAChC,QAAQ,EAAE,aAAa,CAAC,QAAQ;qBACjC,CAAC;oBACF,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBACrD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;gBACjB,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YACrE,CAAC;YAED,0BAA0B;YAC1B,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAExD,iBAAiB;YACjB,MAAM,YAAY,GAA2B;gBAC3C,MAAM;gBACN,MAAM;gBACN,GAAG,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;aACjC,CAAC;YACF,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QACnE,CAAC;QAED,0DAA0D;QAC1D,mFAAmF;QACnF,sFAAsF;QACtF,mFAAmF;QACnF,oFAAoF;QACpF,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAiB,CAAC;YACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACvD,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAE9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,8CAA8C;YAC9C,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,SAAiB;QACjD,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,SAAiB;QACnD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,WAAW;IACX,8EAA8E;IAE9E,KAAK,CAAC,yBAAyB,CAC7B,OAAe,EACf,UAA6B;QAE7B,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,CAAC,CAAC,0CAA0C;QACpF,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,SAAS,GAAgC,EAAE,CAAC;QAElD,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAC1E,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAEjE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,mDAAmD;gBACnD,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC7D,OAAO,CAAC,IAAI,CACV,+CAA+C,SAAS,wBAAwB;oBAC9E,uEAAuE,CAC1E,CAAC;gBACF,SAAS;YACX,CAAC;YAED,IAAI,gBAAwB,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,gBAAgB;oBACd,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;wBACnC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC;wBACjC,OAAO,CAAC,OAAO,IAAI,CAAC;wBAClB,CAAC,CAAC,OAAO,CAAC,OAAO;wBACjB,CAAC,CAAC,CAAC,CAAC;YACV,CAAC;iBAAM,CAAC;gBACN,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAC3C,SAAS,EACT,OAAO,CAAC,OAAO,EACf,4BAA4B,CAC7B,CAAC;gBACF,IACE,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ;oBAC1C,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC;oBACzC,MAAM,CAAC,eAAe,GAAG,CAAC,EAC1B,CAAC;oBACD,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;oBAC7D,OAAO,CAAC,IAAI,CACV,4CAA4C,SAAS,8BAA8B;wBACjF,0BAA0B,CAC7B,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,IAAI,gBAAgB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC/C,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;wBAC3C,OAAO,CAAC,IAAI,CACV,8CAA8C,SAAS,6CAA6C;4BAClG,yBAAyB,CAC5B,CAAC;wBACF,SAAS;oBACX,CAAC;oBACD,mBAAmB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;oBAC7D,OAAO,CAAC,IAAI,CACV,4CAA4C,SAAS,8BAA8B;wBACjF,0BAA0B,CAC7B,CAAC;oBACF,SAAS;gBACX,CAAC;YACH,CAAC;YACD,MAAM,cAAc,GAClB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;gBACzC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;oBACxB,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YAErE,6CAA6C;YAC7C,MAAM,eAAe,GAA8B;gBACjD,MAAM,EAAE,WAAW;gBACnB,SAAS;gBACT,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,OAAO;gBACP,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,OAAO,EAAE,gBAAgB;gBACzB,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;gBACvC,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,OAAO,EAAE,IAAI;aACd,CAAC;YAEF,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;gBAChD,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;aACxC,CAAC,CAAC;YAEH,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAEhC,OAAO,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,MAAM,SAAS,SAAS,IAAI,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,8EAA8E;IAC9E,+BAA+B;IAC/B,8EAA8E;IAE9E,KAAK,CAAC,SAAS,CACb,UAAoB,EACpB,OAA0B;QAE1B,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAC/D,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;QAC9E,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,yBAAyB;gBAC1C,cAAc,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CACzE,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAElD,wBAAwB;QACxB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QAEzF,8EAA8E;QAC9E,eAAe;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAE9C,IAAI,KAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,4EAA4E;YAC5E,wEAAwE;YACxE,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE;oBACN;wBACE,IAAI,EAAE,8BAA8B;wBACpC,OAAO,EAAE,2CAA2C,OAAO,EAAE;wBAC7D,WAAW,EAAE,KAAK;qBACnB;iBACF;gBACD,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oBAC1C,SAAS;oBACT,MAAM,EAAE,QAAiB;iBAC1B,CAAC,CAAC;gBACH,gBAAgB,EAAE,SAAS;aAC5B,CAAC;QACJ,CAAC;QAED,oDAAoD;QACpD,kFAAkF;QAClF,MAAM,QAAQ,GAIT,EAAE,CAAC;QACR,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS;gBACT,UAAU,EAAE,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;gBACnE,cAAc;aACf,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC/B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,OAAO,kBAAkB,CAAC;YACxB,QAAQ;YACR,UAAU;YACV,aAAa;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,SAAS;IACT,8EAA8E;IAE9E,KAAK,CAAC,MAAM,CAAC,OAAgB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAoC,EAAE,CAAC;QAErD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,kEAAkE;YAClE,0DAA0D;YAC1D,MAAM,WAAW,GAAG,SAAS;gBAC3B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,WAAW,IAAI,SAAS,IAAK,WAAsC,IAAI,IAAI,CAAC;YAExF,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,GAAG;gBACH,IAAI,EAAE,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;gBACvD,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GACZ,aAAa,EAAE,IAAI,KAAK,MAAM;YAC5B,CAAC,CAAC,aAAa,CAAC,QAAQ;YACxB,CAAC,CAAC,aAAa,EAAE,IAAI,KAAK,SAAS;gBACjC,CAAC,CAAC,UAAU,aAAa,CAAC,UAAU,IAAI,gBAAgB,EAAE;gBAC1D,CAAC,CAAC,SAAS,CAAC;QAElB,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,GAAG;YACZ,WAAW,EAAE;gBACX,IAAI,EAAE,aAAa,EAAE,IAAI,IAAI,SAAS;gBACtC,SAAS,EAAE,aAAa,EAAE,OAAO,IAAI,SAAS;gBAC9C,QAAQ;aACT;YACD,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,QAAQ;SACT,CAAC;QAEF,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAE9E,iBAAiB,CAAC,OAAe;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACF"}
|