@brightchain/node-express-suite 0.25.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/MIGRATION.md +131 -0
- package/README.md +11 -0
- package/package.json +18 -0
- package/src/index.d.ts +46 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +73 -0
- package/src/index.js.map +1 -0
- package/src/lib/application.d.ts +35 -0
- package/src/lib/application.d.ts.map +1 -0
- package/src/lib/application.js +38 -0
- package/src/lib/application.js.map +1 -0
- package/src/lib/bright-db-model-registry.d.ts +56 -0
- package/src/lib/bright-db-model-registry.d.ts.map +1 -0
- package/src/lib/bright-db-model-registry.js +71 -0
- package/src/lib/bright-db-model-registry.js.map +1 -0
- package/src/lib/brightchain-lib.d.ts +7 -0
- package/src/lib/brightchain-lib.d.ts.map +1 -0
- package/src/lib/brightchain-lib.js +12 -0
- package/src/lib/brightchain-lib.js.map +1 -0
- package/src/lib/brightdb.d.ts +7 -0
- package/src/lib/brightdb.d.ts.map +1 -0
- package/src/lib/brightdb.js +11 -0
- package/src/lib/brightdb.js.map +1 -0
- package/src/lib/constants.d.ts +6 -0
- package/src/lib/constants.d.ts.map +1 -0
- package/src/lib/constants.js +12 -0
- package/src/lib/constants.js.map +1 -0
- package/src/lib/create-test-app.d.ts +22 -0
- package/src/lib/create-test-app.d.ts.map +1 -0
- package/src/lib/create-test-app.js +49 -0
- package/src/lib/create-test-app.js.map +1 -0
- package/src/lib/databaseInit.d.ts +53 -0
- package/src/lib/databaseInit.d.ts.map +1 -0
- package/src/lib/databaseInit.js +114 -0
- package/src/lib/databaseInit.js.map +1 -0
- package/src/lib/datastore/block-document-store-factory.d.ts +31 -0
- package/src/lib/datastore/block-document-store-factory.d.ts.map +1 -0
- package/src/lib/datastore/block-document-store-factory.js +35 -0
- package/src/lib/datastore/block-document-store-factory.js.map +1 -0
- package/src/lib/datastore/block-document-store.d.ts +201 -0
- package/src/lib/datastore/block-document-store.d.ts.map +1 -0
- package/src/lib/datastore/block-document-store.js +649 -0
- package/src/lib/datastore/block-document-store.js.map +1 -0
- package/src/lib/datastore/document-store.d.ts +83 -0
- package/src/lib/datastore/document-store.d.ts.map +1 -0
- package/src/lib/datastore/document-store.js +3 -0
- package/src/lib/datastore/document-store.js.map +1 -0
- package/src/lib/datastore/index.d.ts +6 -0
- package/src/lib/datastore/index.d.ts.map +1 -0
- package/src/lib/datastore/index.js +11 -0
- package/src/lib/datastore/index.js.map +1 -0
- package/src/lib/datastore/memory-document-store.d.ts +9 -0
- package/src/lib/datastore/memory-document-store.d.ts.map +1 -0
- package/src/lib/datastore/memory-document-store.js +218 -0
- package/src/lib/datastore/memory-document-store.js.map +1 -0
- package/src/lib/environment.d.ts +64 -0
- package/src/lib/environment.d.ts.map +1 -0
- package/src/lib/environment.js +165 -0
- package/src/lib/environment.js.map +1 -0
- package/src/lib/factories/blockStoreFactory.d.ts +10 -0
- package/src/lib/factories/blockStoreFactory.d.ts.map +1 -0
- package/src/lib/factories/blockStoreFactory.js +14 -0
- package/src/lib/factories/blockStoreFactory.js.map +1 -0
- package/src/lib/interfaces/bright-db-application.d.ts +34 -0
- package/src/lib/interfaces/bright-db-application.d.ts.map +1 -0
- package/src/lib/interfaces/bright-db-application.js +13 -0
- package/src/lib/interfaces/bright-db-application.js.map +1 -0
- package/src/lib/interfaces/environment.d.ts +34 -0
- package/src/lib/interfaces/environment.d.ts.map +1 -0
- package/src/lib/interfaces/environment.js +11 -0
- package/src/lib/interfaces/environment.js.map +1 -0
- package/src/lib/middleware/index.d.ts +2 -0
- package/src/lib/middleware/index.d.ts.map +1 -0
- package/src/lib/middleware/index.js +6 -0
- package/src/lib/middleware/index.js.map +1 -0
- package/src/lib/middleware/validateBody.d.ts +13 -0
- package/src/lib/middleware/validateBody.d.ts.map +1 -0
- package/src/lib/middleware/validateBody.js +35 -0
- package/src/lib/middleware/validateBody.js.map +1 -0
- package/src/lib/middlewares.d.ts +9 -0
- package/src/lib/middlewares.d.ts.map +1 -0
- package/src/lib/middlewares.js +21 -0
- package/src/lib/middlewares.js.map +1 -0
- package/src/lib/plugins/bright-db-database-plugin.d.ts +95 -0
- package/src/lib/plugins/bright-db-database-plugin.d.ts.map +1 -0
- package/src/lib/plugins/bright-db-database-plugin.js +143 -0
- package/src/lib/plugins/bright-db-database-plugin.js.map +1 -0
- package/src/lib/plugins/configure-bright-db-app.d.ts +25 -0
- package/src/lib/plugins/configure-bright-db-app.d.ts.map +1 -0
- package/src/lib/plugins/configure-bright-db-app.js +31 -0
- package/src/lib/plugins/configure-bright-db-app.js.map +1 -0
- package/src/lib/services/bright-db-authentication-provider.d.ts +31 -0
- package/src/lib/services/bright-db-authentication-provider.d.ts.map +1 -0
- package/src/lib/services/bright-db-authentication-provider.js +91 -0
- package/src/lib/services/bright-db-authentication-provider.js.map +1 -0
- package/src/lib/services/bright-db-base-service.d.ts +26 -0
- package/src/lib/services/bright-db-base-service.d.ts.map +1 -0
- package/src/lib/services/bright-db-base-service.js +30 -0
- package/src/lib/services/bright-db-base-service.js.map +1 -0
- package/src/lib/services/bright-db-collection.d.ts +50 -0
- package/src/lib/services/bright-db-collection.d.ts.map +1 -0
- package/src/lib/services/bright-db-collection.js +116 -0
- package/src/lib/services/bright-db-collection.js.map +1 -0
- package/src/lib/services/sessionAdapter.d.ts +62 -0
- package/src/lib/services/sessionAdapter.d.ts.map +1 -0
- package/src/lib/services/sessionAdapter.js +106 -0
- package/src/lib/services/sessionAdapter.js.map +1 -0
- package/src/lib/shared-types.d.ts +41 -0
- package/src/lib/shared-types.d.ts.map +1 -0
- package/src/lib/shared-types.js +3 -0
- package/src/lib/shared-types.js.map +1 -0
- package/src/lib/transactions/bright-db-transaction-manager.d.ts +46 -0
- package/src/lib/transactions/bright-db-transaction-manager.d.ts.map +1 -0
- package/src/lib/transactions/bright-db-transaction-manager.js +81 -0
- package/src/lib/transactions/bright-db-transaction-manager.js.map +1 -0
- package/src/lib/types/backend-id.d.ts +3 -0
- package/src/lib/types/backend-id.d.ts.map +1 -0
- package/src/lib/types/backend-id.js +3 -0
- package/src/lib/types/backend-id.js.map +1 -0
- package/src/lib/upstream.d.ts +8 -0
- package/src/lib/upstream.d.ts.map +1 -0
- package/src/lib/upstream.js +13 -0
- package/src/lib/upstream.js.map +1 -0
- package/src/lib/validation/userValidation.d.ts +44 -0
- package/src/lib/validation/userValidation.d.ts.map +1 -0
- package/src/lib/validation/userValidation.js +147 -0
- package/src/lib/validation/userValidation.js.map +1 -0
|
@@ -0,0 +1,649 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BlockDocumentStore = exports.CollectionHeadRegistry = void 0;
|
|
4
|
+
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
/**
|
|
7
|
+
* Simple in-memory registry for collection head pointers.
|
|
8
|
+
* This maps collection names to their latest index block IDs.
|
|
9
|
+
*
|
|
10
|
+
* In a production system, this would be persisted to a separate
|
|
11
|
+
* key-value store or database. For now, we use a static map
|
|
12
|
+
* that's shared across all BlockDocumentStore instances.
|
|
13
|
+
*/
|
|
14
|
+
class CollectionHeadRegistry {
|
|
15
|
+
static instance;
|
|
16
|
+
heads = new Map();
|
|
17
|
+
constructor() { }
|
|
18
|
+
static getInstance() {
|
|
19
|
+
if (!CollectionHeadRegistry.instance) {
|
|
20
|
+
CollectionHeadRegistry.instance = new CollectionHeadRegistry();
|
|
21
|
+
}
|
|
22
|
+
return CollectionHeadRegistry.instance;
|
|
23
|
+
}
|
|
24
|
+
getHead(collectionKey) {
|
|
25
|
+
return this.heads.get(collectionKey);
|
|
26
|
+
}
|
|
27
|
+
setHead(collectionKey, indexBlockId) {
|
|
28
|
+
this.heads.set(collectionKey, indexBlockId);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate a unique key for a collection based on store identity and collection name
|
|
32
|
+
*/
|
|
33
|
+
static makeKey(storeId, collectionName) {
|
|
34
|
+
return `${storeId}:${collectionName}`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Clear all heads (useful for testing)
|
|
38
|
+
*/
|
|
39
|
+
clear() {
|
|
40
|
+
this.heads.clear();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.CollectionHeadRegistry = CollectionHeadRegistry;
|
|
44
|
+
class BlockQuery {
|
|
45
|
+
resolveValue;
|
|
46
|
+
constructor(resolveValue) {
|
|
47
|
+
this.resolveValue = resolveValue;
|
|
48
|
+
}
|
|
49
|
+
self() {
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
select() {
|
|
53
|
+
return this.self();
|
|
54
|
+
}
|
|
55
|
+
populate() {
|
|
56
|
+
return this.self();
|
|
57
|
+
}
|
|
58
|
+
sort() {
|
|
59
|
+
return this.self();
|
|
60
|
+
}
|
|
61
|
+
limit() {
|
|
62
|
+
return this.self();
|
|
63
|
+
}
|
|
64
|
+
skip() {
|
|
65
|
+
return this.self();
|
|
66
|
+
}
|
|
67
|
+
lean() {
|
|
68
|
+
return this.self();
|
|
69
|
+
}
|
|
70
|
+
collation() {
|
|
71
|
+
return this.self();
|
|
72
|
+
}
|
|
73
|
+
session() {
|
|
74
|
+
return this.self();
|
|
75
|
+
}
|
|
76
|
+
where() {
|
|
77
|
+
return this.self();
|
|
78
|
+
}
|
|
79
|
+
distinct() {
|
|
80
|
+
return this.self();
|
|
81
|
+
}
|
|
82
|
+
async exec() {
|
|
83
|
+
return this.resolveValue();
|
|
84
|
+
}
|
|
85
|
+
then(onfulfilled, onrejected) {
|
|
86
|
+
return this.exec().then(onfulfilled, onrejected);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function matchFilter(doc, filter = {}) {
|
|
90
|
+
return Object.entries(filter).every(([key, value]) => {
|
|
91
|
+
if (value === undefined)
|
|
92
|
+
return true;
|
|
93
|
+
return doc[key] === value;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Calculate a content-addressable block ID using the same algorithm as the block store.
|
|
98
|
+
* This uses SHA3-512 via the ChecksumService to match how RawDataBlock computes its idChecksum.
|
|
99
|
+
*/
|
|
100
|
+
function calculateBlockId(data) {
|
|
101
|
+
const checksumService = (0, brightchain_lib_1.getGlobalServiceProvider)().checksumService;
|
|
102
|
+
const checksum = checksumService.calculateChecksum(data instanceof Buffer ? new Uint8Array(data) : data);
|
|
103
|
+
return checksum.toHex();
|
|
104
|
+
}
|
|
105
|
+
async function encodeDoc(doc) {
|
|
106
|
+
return Buffer.from(JSON.stringify(doc), 'utf8');
|
|
107
|
+
}
|
|
108
|
+
function decodeDoc(buf) {
|
|
109
|
+
return JSON.parse(buf.toString('utf8'));
|
|
110
|
+
}
|
|
111
|
+
class BlockCollection {
|
|
112
|
+
store;
|
|
113
|
+
collectionName;
|
|
114
|
+
quorumService;
|
|
115
|
+
storeId;
|
|
116
|
+
generateId;
|
|
117
|
+
index = new Map(); // _id -> blockId
|
|
118
|
+
registryKey; // key for looking up index block ID in registry
|
|
119
|
+
indexLoaded = false;
|
|
120
|
+
indexLoading;
|
|
121
|
+
constructor(store, collectionName, quorumService, storeId = 'default', generateId = () => (0, crypto_1.randomUUID)().replace(/-/g, '')) {
|
|
122
|
+
this.store = store;
|
|
123
|
+
this.collectionName = collectionName;
|
|
124
|
+
this.quorumService = quorumService;
|
|
125
|
+
this.storeId = storeId;
|
|
126
|
+
this.generateId = generateId;
|
|
127
|
+
// Registry key is used to look up the latest index block ID
|
|
128
|
+
this.registryKey = CollectionHeadRegistry.makeKey(storeId, collectionName);
|
|
129
|
+
}
|
|
130
|
+
async ensureIndexLoaded() {
|
|
131
|
+
if (this.indexLoaded)
|
|
132
|
+
return;
|
|
133
|
+
if (!this.indexLoading) {
|
|
134
|
+
this.indexLoading = (async () => {
|
|
135
|
+
const registry = CollectionHeadRegistry.getInstance();
|
|
136
|
+
const indexBlockId = registry.getHead(this.registryKey);
|
|
137
|
+
if (indexBlockId) {
|
|
138
|
+
try {
|
|
139
|
+
const indexBlock = await this.store.get(indexBlockId);
|
|
140
|
+
const indexData = indexBlock.data;
|
|
141
|
+
const parsed = JSON.parse(Buffer.from(indexData).toString('utf8'));
|
|
142
|
+
// Support both old format (ids array) and new format (mappings object)
|
|
143
|
+
if (parsed?.mappings) {
|
|
144
|
+
for (const [logicalId, blockId] of Object.entries(parsed.mappings)) {
|
|
145
|
+
this.index.set(logicalId, blockId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (parsed?.ids) {
|
|
149
|
+
// Legacy format: logical ID equals block ID
|
|
150
|
+
for (const id of parsed.ids) {
|
|
151
|
+
this.index.set(id, id);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
// Index block not found - start fresh
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
this.indexLoaded = true;
|
|
160
|
+
})().finally(() => {
|
|
161
|
+
this.indexLoading = undefined;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
return this.indexLoading;
|
|
165
|
+
}
|
|
166
|
+
async persistIndex() {
|
|
167
|
+
// Store the index as a mapping of logical IDs to block IDs
|
|
168
|
+
const indexData = {};
|
|
169
|
+
for (const [logicalId, blockId] of this.index.entries()) {
|
|
170
|
+
indexData[logicalId] = blockId;
|
|
171
|
+
}
|
|
172
|
+
const payload = Buffer.from(JSON.stringify({ mappings: indexData }), 'utf8');
|
|
173
|
+
if (payload.length > this.store.blockSize) {
|
|
174
|
+
throw new Error(`Index too large for block size (${payload.length} > ${this.store.blockSize}) in ${this.collectionName}`);
|
|
175
|
+
}
|
|
176
|
+
// Store the index under its content hash (content-addressable)
|
|
177
|
+
const indexBlockId = calculateBlockId(payload);
|
|
178
|
+
await this.store.put(indexBlockId, payload);
|
|
179
|
+
// Update the registry with the new index block ID
|
|
180
|
+
const registry = CollectionHeadRegistry.getInstance();
|
|
181
|
+
registry.setHead(this.registryKey, indexBlockId);
|
|
182
|
+
}
|
|
183
|
+
resolveBlockId(id) {
|
|
184
|
+
return id ?? this.generateId();
|
|
185
|
+
}
|
|
186
|
+
async writeDoc(doc, existingId) {
|
|
187
|
+
await this.ensureIndexLoaded();
|
|
188
|
+
// Use a logical ID for the document (either existing or generated)
|
|
189
|
+
const logicalId = existingId ?? this.resolveBlockId(doc._id);
|
|
190
|
+
// Encode the document with the logical ID
|
|
191
|
+
const docWithId = { ...doc, _id: logicalId };
|
|
192
|
+
const data = await encodeDoc(docWithId);
|
|
193
|
+
if (data.length > this.store.blockSize) {
|
|
194
|
+
throw new Error(`Document too large for block size (${data.length} > ${this.store.blockSize}) in ${this.collectionName}`);
|
|
195
|
+
}
|
|
196
|
+
// Use content hash as the block ID for content-addressable storage
|
|
197
|
+
const blockId = calculateBlockId(data);
|
|
198
|
+
// Check if block already exists (content-addressable deduplication)
|
|
199
|
+
const exists = await this.store.has(blockId);
|
|
200
|
+
if (!exists) {
|
|
201
|
+
await this.store.put(blockId, data);
|
|
202
|
+
}
|
|
203
|
+
// Map logical ID to content hash in the index
|
|
204
|
+
this.index.set(logicalId, blockId);
|
|
205
|
+
doc._id = logicalId;
|
|
206
|
+
await this.persistIndex();
|
|
207
|
+
return doc;
|
|
208
|
+
}
|
|
209
|
+
async readDoc(logicalId) {
|
|
210
|
+
await this.ensureIndexLoaded();
|
|
211
|
+
// Get the content hash from the index
|
|
212
|
+
const blockId = this.index.get(logicalId);
|
|
213
|
+
if (!blockId)
|
|
214
|
+
return null;
|
|
215
|
+
try {
|
|
216
|
+
const block = await this.store.get(blockId);
|
|
217
|
+
const blockData = block.data;
|
|
218
|
+
return decodeDoc(Buffer.from(blockData));
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Block not found in store
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
toSingleQuery(resolver) {
|
|
226
|
+
return new BlockQuery(resolver);
|
|
227
|
+
}
|
|
228
|
+
toManyQuery(resolver) {
|
|
229
|
+
return new BlockQuery(resolver);
|
|
230
|
+
}
|
|
231
|
+
find(filter) {
|
|
232
|
+
return this.toManyQuery(async () => {
|
|
233
|
+
await this.ensureIndexLoaded();
|
|
234
|
+
const docs = [];
|
|
235
|
+
for (const id of this.index.keys()) {
|
|
236
|
+
const doc = await this.readDoc(id);
|
|
237
|
+
if (doc && matchFilter(doc, filter))
|
|
238
|
+
docs.push(doc);
|
|
239
|
+
}
|
|
240
|
+
return docs;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
findOne(filter) {
|
|
244
|
+
return this.toSingleQuery(async () => {
|
|
245
|
+
await this.ensureIndexLoaded();
|
|
246
|
+
for (const id of this.index.keys()) {
|
|
247
|
+
const doc = await this.readDoc(id);
|
|
248
|
+
if (doc && matchFilter(doc, filter))
|
|
249
|
+
return doc;
|
|
250
|
+
}
|
|
251
|
+
return null;
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
findById(id) {
|
|
255
|
+
return this.toSingleQuery(() => this.readDoc(id));
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Retrieve a document by ID, decrypting if necessary
|
|
259
|
+
* @param id - The document ID
|
|
260
|
+
* @param options - Options for retrieving encrypted documents
|
|
261
|
+
* @returns The document (decrypted if it was encrypted)
|
|
262
|
+
*/
|
|
263
|
+
async findByIdDecrypted(id, options) {
|
|
264
|
+
const doc = await this.readDoc(id);
|
|
265
|
+
if (!doc) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
const internalDoc = doc;
|
|
269
|
+
if (internalDoc.__encryptionMetadata?.isEncrypted) {
|
|
270
|
+
if (!this.quorumService) {
|
|
271
|
+
throw new Error('QuorumService is required to decrypt encrypted documents');
|
|
272
|
+
}
|
|
273
|
+
if (!options?.membersWithPrivateKey ||
|
|
274
|
+
options.membersWithPrivateKey.length === 0) {
|
|
275
|
+
throw new Error('Members with private keys are required to decrypt encrypted documents');
|
|
276
|
+
}
|
|
277
|
+
const sealedDocId = internalDoc.__encryptionMetadata.sealedDocumentId;
|
|
278
|
+
if (!sealedDocId) {
|
|
279
|
+
throw new Error('Encrypted document is missing sealed document ID');
|
|
280
|
+
}
|
|
281
|
+
// Convert stored HexString back to TID via idProvider
|
|
282
|
+
const sp = brightchain_lib_1.ServiceProvider.getInstance();
|
|
283
|
+
const documentTid = sp.idProvider.idFromString(sealedDocId);
|
|
284
|
+
// Unseal the document using QuorumService
|
|
285
|
+
const unsealedDoc = await this.quorumService.unsealDocument(documentTid, options.membersWithPrivateKey);
|
|
286
|
+
// Return the unsealed document with the original _id
|
|
287
|
+
return {
|
|
288
|
+
...unsealedDoc,
|
|
289
|
+
_id: internalDoc._id,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return doc;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check if a document is encrypted
|
|
296
|
+
* @param id - The document ID
|
|
297
|
+
* @returns True if the document is encrypted
|
|
298
|
+
*/
|
|
299
|
+
async isEncrypted(id) {
|
|
300
|
+
const doc = await this.readDoc(id);
|
|
301
|
+
if (!doc) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
const internalDoc = doc;
|
|
305
|
+
return internalDoc.__encryptionMetadata?.isEncrypted ?? false;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get encryption metadata for a document
|
|
309
|
+
* @param id - The document ID
|
|
310
|
+
* @returns The encryption metadata, or null if not encrypted
|
|
311
|
+
*/
|
|
312
|
+
async getEncryptionMetadata(id) {
|
|
313
|
+
const doc = await this.readDoc(id);
|
|
314
|
+
if (!doc) {
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
const internalDoc = doc;
|
|
318
|
+
return internalDoc.__encryptionMetadata ?? null;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Check if a member has access to a document
|
|
322
|
+
* @param id - The document ID
|
|
323
|
+
* @param memberId - The member ID to check access for
|
|
324
|
+
* @returns True if the member has access (either unencrypted or member is in the encryption list)
|
|
325
|
+
*/
|
|
326
|
+
async hasAccess(id, memberId) {
|
|
327
|
+
const doc = await this.readDoc(id);
|
|
328
|
+
if (!doc) {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
const internalDoc = doc;
|
|
332
|
+
// Unencrypted documents are accessible to everyone
|
|
333
|
+
if (!internalDoc.__encryptionMetadata?.isEncrypted) {
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
// For encrypted documents, check if the member is in the member list
|
|
337
|
+
const memberIds = internalDoc.__encryptionMetadata.memberIds ?? [];
|
|
338
|
+
return memberIds.includes(memberId);
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Find all documents accessible by a specific member
|
|
342
|
+
* @param memberId - The member ID to filter by
|
|
343
|
+
* @param filter - Optional additional filter criteria
|
|
344
|
+
* @returns Array of documents the member has access to
|
|
345
|
+
*/
|
|
346
|
+
async findAccessibleBy(memberId, filter) {
|
|
347
|
+
await this.ensureIndexLoaded();
|
|
348
|
+
const docs = [];
|
|
349
|
+
for (const id of this.index.keys()) {
|
|
350
|
+
const doc = await this.readDoc(id);
|
|
351
|
+
if (doc && matchFilter(doc, filter)) {
|
|
352
|
+
const internalDoc = doc;
|
|
353
|
+
// Include unencrypted documents
|
|
354
|
+
if (!internalDoc.__encryptionMetadata?.isEncrypted) {
|
|
355
|
+
docs.push(doc);
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
// Include encrypted documents where the member has access
|
|
359
|
+
const memberIds = internalDoc.__encryptionMetadata.memberIds ?? [];
|
|
360
|
+
if (memberIds.includes(memberId)) {
|
|
361
|
+
docs.push(doc);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return docs;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Find one document accessible by a specific member
|
|
369
|
+
* @param memberId - The member ID to filter by
|
|
370
|
+
* @param filter - Optional additional filter criteria
|
|
371
|
+
* @returns The first document the member has access to, or null
|
|
372
|
+
*/
|
|
373
|
+
async findOneAccessibleBy(memberId, filter) {
|
|
374
|
+
await this.ensureIndexLoaded();
|
|
375
|
+
for (const id of this.index.keys()) {
|
|
376
|
+
const doc = await this.readDoc(id);
|
|
377
|
+
if (doc && matchFilter(doc, filter)) {
|
|
378
|
+
const internalDoc = doc;
|
|
379
|
+
// Include unencrypted documents
|
|
380
|
+
if (!internalDoc.__encryptionMetadata?.isEncrypted) {
|
|
381
|
+
return doc;
|
|
382
|
+
}
|
|
383
|
+
// Include encrypted documents where the member has access
|
|
384
|
+
const memberIds = internalDoc.__encryptionMetadata.memberIds ?? [];
|
|
385
|
+
if (memberIds.includes(memberId)) {
|
|
386
|
+
return doc;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Count documents accessible by a specific member
|
|
394
|
+
* @param memberId - The member ID to filter by
|
|
395
|
+
* @param filter - Optional additional filter criteria
|
|
396
|
+
* @returns The count of documents the member has access to
|
|
397
|
+
*/
|
|
398
|
+
async countAccessibleBy(memberId, filter) {
|
|
399
|
+
const docs = await this.findAccessibleBy(memberId, filter);
|
|
400
|
+
return docs.length;
|
|
401
|
+
}
|
|
402
|
+
findOneAndUpdate(filter, update) {
|
|
403
|
+
return this.toSingleQuery(async () => {
|
|
404
|
+
const doc = await this.findOne(filter).exec();
|
|
405
|
+
if (!doc)
|
|
406
|
+
return null;
|
|
407
|
+
Object.assign(doc, update);
|
|
408
|
+
const docId = doc._id;
|
|
409
|
+
if (docId) {
|
|
410
|
+
await this.writeDoc(doc, docId);
|
|
411
|
+
}
|
|
412
|
+
return doc;
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
findOneAndDelete(filter) {
|
|
416
|
+
return this.toSingleQuery(async () => {
|
|
417
|
+
const doc = await this.findOne(filter).exec();
|
|
418
|
+
if (!doc)
|
|
419
|
+
return null;
|
|
420
|
+
await this.deleteOne({ _id: doc._id });
|
|
421
|
+
return doc;
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
findByIdAndUpdate(id, update) {
|
|
425
|
+
return this.findOneAndUpdate({ _id: id }, update);
|
|
426
|
+
}
|
|
427
|
+
findByIdAndDelete(id) {
|
|
428
|
+
return this.findOneAndDelete({ _id: id });
|
|
429
|
+
}
|
|
430
|
+
async create(doc, options) {
|
|
431
|
+
await this.ensureIndexLoaded();
|
|
432
|
+
// Handle encryption if requested
|
|
433
|
+
if (options?.encrypt) {
|
|
434
|
+
if (!this.quorumService) {
|
|
435
|
+
throw new Error('QuorumService is required for encrypted documents');
|
|
436
|
+
}
|
|
437
|
+
if (!options.agent) {
|
|
438
|
+
throw new Error('Agent member is required for encrypted documents');
|
|
439
|
+
}
|
|
440
|
+
if (!options.memberIds || options.memberIds.length < 2) {
|
|
441
|
+
throw new Error('At least 2 member IDs are required for encrypted documents');
|
|
442
|
+
}
|
|
443
|
+
// Seal the document using QuorumService
|
|
444
|
+
const sealedResult = await this.quorumService.sealDocument(options.agent, doc, options.memberIds, options.sharesRequired);
|
|
445
|
+
// Store metadata about the encrypted document
|
|
446
|
+
const sp = brightchain_lib_1.ServiceProvider.getInstance();
|
|
447
|
+
const internalDoc = {
|
|
448
|
+
...doc,
|
|
449
|
+
__encryptionMetadata: {
|
|
450
|
+
isEncrypted: true,
|
|
451
|
+
sealedDocumentId: sp.idProvider.toString(sealedResult.documentId, 'hex'),
|
|
452
|
+
memberIds: sealedResult.memberIds.map((id) => sp.idProvider.toString(id, 'hex')),
|
|
453
|
+
sharesRequired: sealedResult.sharesRequired,
|
|
454
|
+
createdAt: sealedResult.createdAt.toISOString(),
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
return this.writeDoc(internalDoc);
|
|
458
|
+
}
|
|
459
|
+
return this.writeDoc({ ...doc });
|
|
460
|
+
}
|
|
461
|
+
async insertMany(docs) {
|
|
462
|
+
await this.ensureIndexLoaded();
|
|
463
|
+
const res = [];
|
|
464
|
+
for (const doc of docs) {
|
|
465
|
+
res.push(await this.create(doc));
|
|
466
|
+
}
|
|
467
|
+
return res;
|
|
468
|
+
}
|
|
469
|
+
async updateOne(filter, update) {
|
|
470
|
+
const doc = await this.findOne(filter).exec();
|
|
471
|
+
if (!doc)
|
|
472
|
+
return { modifiedCount: 0, matchedCount: 0 };
|
|
473
|
+
Object.assign(doc, update);
|
|
474
|
+
const docId = doc._id;
|
|
475
|
+
if (docId) {
|
|
476
|
+
await this.writeDoc(doc, docId);
|
|
477
|
+
}
|
|
478
|
+
return { modifiedCount: 1, matchedCount: 1 };
|
|
479
|
+
}
|
|
480
|
+
async updateMany(filter, update) {
|
|
481
|
+
const docs = await this.find(filter).exec();
|
|
482
|
+
let count = 0;
|
|
483
|
+
if (docs) {
|
|
484
|
+
for (const doc of docs) {
|
|
485
|
+
Object.assign(doc, update);
|
|
486
|
+
const docId = doc._id;
|
|
487
|
+
if (docId) {
|
|
488
|
+
await this.writeDoc(doc, docId);
|
|
489
|
+
}
|
|
490
|
+
count += 1;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return { modifiedCount: count, matchedCount: count };
|
|
494
|
+
}
|
|
495
|
+
async replaceOne(filter, doc) {
|
|
496
|
+
const existing = await this.findOne(filter).exec();
|
|
497
|
+
if (!existing)
|
|
498
|
+
return { modifiedCount: 0, matchedCount: 0 };
|
|
499
|
+
const existingId = existing._id;
|
|
500
|
+
if (existingId) {
|
|
501
|
+
await this.writeDoc(doc, existingId);
|
|
502
|
+
}
|
|
503
|
+
return { modifiedCount: 1, matchedCount: 1 };
|
|
504
|
+
}
|
|
505
|
+
async deleteOne(filter) {
|
|
506
|
+
await this.ensureIndexLoaded();
|
|
507
|
+
for (const [logicalId, blockId] of this.index.entries()) {
|
|
508
|
+
const doc = await this.readDoc(logicalId);
|
|
509
|
+
if (doc && matchFilter(doc, filter)) {
|
|
510
|
+
try {
|
|
511
|
+
await this.store.delete(blockId);
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
// Block might already be deleted or not exist
|
|
515
|
+
}
|
|
516
|
+
this.index.delete(logicalId);
|
|
517
|
+
await this.persistIndex();
|
|
518
|
+
return { deletedCount: 1 };
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return { deletedCount: 0 };
|
|
522
|
+
}
|
|
523
|
+
async deleteMany(filter) {
|
|
524
|
+
await this.ensureIndexLoaded();
|
|
525
|
+
let deleted = 0;
|
|
526
|
+
for (const [logicalId, blockId] of Array.from(this.index.entries())) {
|
|
527
|
+
const doc = await this.readDoc(logicalId);
|
|
528
|
+
if (doc && matchFilter(doc, filter)) {
|
|
529
|
+
try {
|
|
530
|
+
await this.store.delete(blockId);
|
|
531
|
+
}
|
|
532
|
+
catch {
|
|
533
|
+
// Block might already be deleted or not exist
|
|
534
|
+
}
|
|
535
|
+
this.index.delete(logicalId);
|
|
536
|
+
deleted += 1;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
if (deleted > 0) {
|
|
540
|
+
await this.persistIndex();
|
|
541
|
+
}
|
|
542
|
+
return { deletedCount: deleted };
|
|
543
|
+
}
|
|
544
|
+
async countDocuments(filter) {
|
|
545
|
+
const docs = await this.find(filter).exec();
|
|
546
|
+
return docs ? docs.length : 0;
|
|
547
|
+
}
|
|
548
|
+
async estimatedDocumentCount() {
|
|
549
|
+
return this.index.size;
|
|
550
|
+
}
|
|
551
|
+
aggregate(_pipeline) {
|
|
552
|
+
return new BlockQuery(async () => []);
|
|
553
|
+
}
|
|
554
|
+
distinct(field) {
|
|
555
|
+
return new BlockQuery(async () => {
|
|
556
|
+
const values = new Set();
|
|
557
|
+
for (const id of this.index.keys()) {
|
|
558
|
+
const doc = await this.readDoc(id);
|
|
559
|
+
if (doc && field in doc)
|
|
560
|
+
values.add(doc[field]);
|
|
561
|
+
}
|
|
562
|
+
return Array.from(values);
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
async exists(filter) {
|
|
566
|
+
await this.ensureIndexLoaded();
|
|
567
|
+
const doc = await this.findOne(filter).exec();
|
|
568
|
+
return doc ? { _id: doc._id } : null;
|
|
569
|
+
}
|
|
570
|
+
watch() {
|
|
571
|
+
/* noop */
|
|
572
|
+
}
|
|
573
|
+
startSession() {
|
|
574
|
+
return undefined;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
class BlockDocumentStore {
|
|
578
|
+
blockStore;
|
|
579
|
+
quorumService;
|
|
580
|
+
collections = new Map();
|
|
581
|
+
storeId;
|
|
582
|
+
generateId;
|
|
583
|
+
_connected = false;
|
|
584
|
+
constructor(blockStore, quorumService, idProvider) {
|
|
585
|
+
this.blockStore = blockStore;
|
|
586
|
+
this.quorumService = quorumService;
|
|
587
|
+
// Resolve the ID provider: use the injected one, fall back to ServiceProvider
|
|
588
|
+
const resolvedProvider = idProvider ?? this.resolveIdProvider();
|
|
589
|
+
if (resolvedProvider) {
|
|
590
|
+
this.generateId = () => resolvedProvider.serialize(resolvedProvider.generate());
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
this.generateId = () => (0, crypto_1.randomUUID)().replace(/-/g, '');
|
|
594
|
+
}
|
|
595
|
+
// Generate a unique store ID for this instance
|
|
596
|
+
this.storeId = this.generateId();
|
|
597
|
+
}
|
|
598
|
+
/**
|
|
599
|
+
* Attempt to resolve the ID provider from the global ServiceProvider.
|
|
600
|
+
* Returns undefined if the ServiceProvider is not yet initialized.
|
|
601
|
+
*/
|
|
602
|
+
resolveIdProvider() {
|
|
603
|
+
try {
|
|
604
|
+
return brightchain_lib_1.ServiceProvider.getInstance().idProvider;
|
|
605
|
+
}
|
|
606
|
+
catch {
|
|
607
|
+
return undefined;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
collection(name) {
|
|
611
|
+
if (!this.collections.has(name)) {
|
|
612
|
+
this.collections.set(name, new BlockCollection(this.blockStore, name, this.quorumService, this.storeId, this.generateId));
|
|
613
|
+
}
|
|
614
|
+
return this.collections.get(name);
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Get a collection with encryption support
|
|
618
|
+
* @param name - The collection name
|
|
619
|
+
* @returns The collection with encryption methods available
|
|
620
|
+
*/
|
|
621
|
+
encryptedCollection(name) {
|
|
622
|
+
if (!this.quorumService) {
|
|
623
|
+
throw new Error('QuorumService is required for encrypted collections');
|
|
624
|
+
}
|
|
625
|
+
if (!this.collections.has(name)) {
|
|
626
|
+
this.collections.set(name, new BlockCollection(this.blockStore, name, this.quorumService, this.storeId, this.generateId));
|
|
627
|
+
}
|
|
628
|
+
return this.collections.get(name);
|
|
629
|
+
}
|
|
630
|
+
// ── IBrightDbDocumentStore lifecycle methods ──────────────────────────
|
|
631
|
+
async connect() {
|
|
632
|
+
this._connected = true;
|
|
633
|
+
}
|
|
634
|
+
async disconnect() {
|
|
635
|
+
this._connected = false;
|
|
636
|
+
}
|
|
637
|
+
isConnected() {
|
|
638
|
+
return this._connected;
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Retrieve a collection by model name.
|
|
642
|
+
* Alias for collection() to match upstream's IDocumentStore.getModel() pattern.
|
|
643
|
+
*/
|
|
644
|
+
getModel(modelName) {
|
|
645
|
+
return this.collection(modelName);
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
exports.BlockDocumentStore = BlockDocumentStore;
|
|
649
|
+
//# sourceMappingURL=block-document-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-document-store.js","sourceRoot":"","sources":["../../../../../brightchain-node-express-suite/src/lib/datastore/block-document-store.ts"],"names":[],"mappings":";;;AAAA,kEAKsC;AAOtC,mCAAoC;AA6DpC;;;;;;;GAOG;AACH,MAAa,sBAAsB;IACzB,MAAM,CAAC,QAAQ,CAAyB;IAC/B,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEnD,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC;YACrC,sBAAsB,CAAC,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACjE,CAAC;QACD,OAAO,sBAAsB,CAAC,QAAQ,CAAC;IACzC,CAAC;IAED,OAAO,CAAC,aAAqB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,aAAqB,EAAE,YAAoB;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAe,EAAE,cAAsB;QACpD,OAAO,GAAG,OAAO,IAAI,cAAc,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAlCD,wDAkCC;AAED,MAAM,UAAU;IACe;IAA7B,YAA6B,YAAqC;QAArC,iBAAY,GAAZ,YAAY,CAAyB;IAAG,CAAC;IAE9D,IAAI;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,SAAS;QACP,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,CACF,WAGQ,EACR,UAGQ;QAER,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;CACF;AAED,SAAS,WAAW,CAClB,GAAM,EACN,SAAqB,EAAE;IAEvB,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACnD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAQ,GAA+B,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,IAAyB;IACjD,MAAM,eAAe,GAAG,IAAA,0CAAwB,GAAE,CAAC,eAAe,CAAC;IACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,iBAAiB,CAChD,IAAI,YAAY,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CACrD,CAAC;IACF,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAmB;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,SAAS,CAA2B,GAAW;IACtD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAM,CAAC;AAC/C,CAAC;AAED,MAAM,eAAe;IAWA;IACA;IACA;IACA;IACA;IAVF,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,iBAAiB;IACpD,WAAW,CAAS,CAAC,gDAAgD;IAC9E,WAAW,GAAG,KAAK,CAAC;IACpB,YAAY,CAA4B;IAEhD,YACmB,KAAkB,EAClB,cAAsB,EACtB,aAAmC,EACnC,UAAkB,SAAS,EAC3B,aAA2B,GAAG,EAAE,CAC/C,IAAA,mBAAU,GAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QALf,UAAK,GAAL,KAAK,CAAa;QAClB,mBAAc,GAAd,cAAc,CAAQ;QACtB,kBAAa,GAAb,aAAa,CAAsB;QACnC,YAAO,GAAP,OAAO,CAAoB;QAC3B,eAAU,GAAV,UAAU,CACK;QAEhC,4DAA4D;QAC5D,IAAI,CAAC,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC9B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,CAAC;gBACtD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAExD,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;wBACtD,MAAM,SAAS,GAAG,UAAU,CAAC,IAAkB,CAAC;wBAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAIxC,CAAC;wBACF,uEAAuE;wBACvE,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;4BACrB,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAC/C,MAAM,CAAC,QAAQ,CAChB,EAAE,CAAC;gCACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;4BACrC,CAAC;wBACH,CAAC;6BAAM,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;4BACvB,4CAA4C;4BAC5C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gCAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;4BACzB,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,sCAAsC;oBACxC,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC1B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,2DAA2D;QAC3D,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EACvC,MAAM,CACP,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,mCAAmC,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,QAAQ,IAAI,CAAC,cAAc,EAAE,CACzG,CAAC;QACJ,CAAC;QAED,+DAA+D;QAC/D,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAE5C,kDAAkD;QAClD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,WAAW,EAAE,CAAC;QACtD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc,CAAC,EAAe;QACpC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,GAAM,EAAE,UAAmB;QAChD,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,mEAAmE;QACnE,MAAM,SAAS,GACb,UAAU,IAAI,IAAI,CAAC,cAAc,CAAE,GAAsB,CAAC,GAAG,CAAC,CAAC;QAEjE,0CAA0C;QAC1C,MAAM,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,sCAAsC,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,QAAQ,IAAI,CAAC,cAAc,EAAE,CACzG,CAAC;QACJ,CAAC;QAED,mEAAmE;QACnE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEvC,oEAAoE;QACpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAClC,GAAsB,CAAC,GAAG,GAAG,SAAS,CAAC;QACxC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,SAAiB;QACrC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,sCAAsC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAkB,CAAC;YAC3C,OAAO,SAAS,CAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,QAAiC;QACrD,OAAO,IAAI,UAAU,CAAI,QAAQ,CAAoB,CAAC;IACxD,CAAC;IAEO,WAAW,CAAC,QAA4B;QAC9C,OAAO,IAAI,UAAU,CACnB,QAAqC,CACjB,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,MAAmB;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;YACjC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAQ,EAAE,CAAC;YACrB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAmB;QACzB,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;oBAAE,OAAO,GAAG,CAAC;YAClD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,EAAc;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,EAAc,EACd,OAAsC;QAEtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,GAA6B,CAAC;QAClD,IAAI,WAAW,CAAC,oBAAoB,EAAE,WAAW,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAC;YACJ,CAAC;YACD,IACE,CAAC,OAAO,EAAE,qBAAqB;gBAC/B,OAAO,CAAC,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAC1C,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,WAAW,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;YACtE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtE,CAAC;YAED,sDAAsD;YACtD,MAAM,EAAE,GAAG,iCAAe,CAAC,WAAW,EAAO,CAAC;YAC9C,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAE5D,0CAA0C;YAC1C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CACzD,WAAW,EACX,OAAO,CAAC,qBAAqB,CAC9B,CAAC;YAEF,qDAAqD;YACrD,OAAO;gBACL,GAAG,WAAW;gBACd,GAAG,EAAE,WAAW,CAAC,GAAG;aAChB,CAAC;QACT,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,EAAc;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,WAAW,GAAG,GAA6B,CAAC;QAClD,OAAO,WAAW,CAAC,oBAAoB,EAAE,WAAW,IAAI,KAAK,CAAC;IAChE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB,CACzB,EAAc;QAEd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,GAAG,GAA6B,CAAC;QAClD,OAAO,WAAW,CAAC,oBAAoB,IAAI,IAAI,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,EAAc,EAAE,QAAmB;QACjD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,WAAW,GAAG,GAA6B,CAAC;QAElD,mDAAmD;QACnD,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,WAAW,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qEAAqE;QACrE,MAAM,SAAS,GAAG,WAAW,CAAC,oBAAoB,CAAC,SAAS,IAAI,EAAE,CAAC;QACnE,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,gBAAgB,CACpB,QAAmB,EACnB,MAAmB;QAEnB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAQ,EAAE,CAAC;QACrB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,GAA6B,CAAC;gBAElD,gCAAgC;gBAChC,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,WAAW,EAAE,CAAC;oBACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACf,SAAS;gBACX,CAAC;gBAED,0DAA0D;gBAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,oBAAoB,CAAC,SAAS,IAAI,EAAE,CAAC;gBACnE,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,mBAAmB,CACvB,QAAmB,EACnB,MAAmB;QAEnB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,GAA6B,CAAC;gBAElD,gCAAgC;gBAChC,IAAI,CAAC,WAAW,CAAC,oBAAoB,EAAE,WAAW,EAAE,CAAC;oBACnD,OAAO,GAAG,CAAC;gBACb,CAAC;gBAED,0DAA0D;gBAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,oBAAoB,CAAC,SAAS,IAAI,EAAE,CAAC;gBACnE,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACjC,OAAO,GAAG,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAmB,EACnB,MAAmB;QAEnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,gBAAgB,CAAC,MAAkB,EAAE,MAAkB;QACrD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC3B,MAAM,KAAK,GAAI,GAAsB,CAAC,GAAG,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAQ,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,GAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,MAAkB;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAG,GAAsB,CAAC,GAAG,EAAgB,CAAC,CAAC;YACzE,OAAO,GAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,EAAc,EAAE,MAAkB;QAClD,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE,EAAgB,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,iBAAiB,CAAC,EAAc;QAC9B,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,EAAE,EAAgB,CAAC,CAAC;IAC1D,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,GAAM,EAAE,OAAoC;QACvD,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/B,iCAAiC;QACjC,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;YACJ,CAAC;YAED,wCAAwC;YACxC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CACxD,OAAO,CAAC,KAAK,EACb,GAAG,EACH,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,cAAc,CACvB,CAAC;YAEF,8CAA8C;YAC9C,MAAM,EAAE,GAAG,iCAAe,CAAC,WAAW,EAAO,CAAC;YAC9C,MAAM,WAAW,GAA2B;gBAC1C,GAAG,GAAG;gBACN,oBAAoB,EAAE;oBACpB,WAAW,EAAE,IAAI;oBACjB,gBAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CACtC,YAAY,CAAC,UAAU,EACvB,KAAK,CACO;oBACd,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC,GAAG,CACnC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAc,CACvD;oBACD,cAAc,EAAE,YAAY,CAAC,cAAc;oBAC3C,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE;iBAChD;aACF,CAAC;YAEF,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAgB,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAI,GAAsB,EAAO,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAS;QACxB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAQ,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAkB,EAAE,MAAkB;QACpD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAI,GAAsB,CAAC,GAAG,CAAC;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAQ,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAkB,EAAE,MAAkB;QACrD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAI,GAAsB,CAAC,GAAG,CAAC;gBAC1C,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAQ,EAAE,KAAK,CAAC,CAAC;gBACvC,CAAC;gBACD,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAkB,EAAE,GAAM;QACzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAI,QAA2B,CAAC,GAAG,CAAC;QACpD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAkB;QAChC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC7B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1B,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAkB;QACjC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAmB;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,SAAS,CAAc,SAAoB;QACzC,OAAO,IAAI,UAAU,CAAM,KAAK,IAAI,EAAE,CAAC,EAAE,CAAsB,CAAC;IAClE,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,OAAO,IAAI,UAAU,CAAe,KAAK,IAAI,EAAE;YAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAc,CAAC;YACrC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACnC,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAA+B,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAkB;QAC7B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAG,GAAsB,CAAC,GAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,CAAC;IAED,KAAK;QACH,UAAU;IACZ,CAAC;IAED,YAAY;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAGD,MAAa,kBAAkB;IAYV;IACA;IAVF,WAAW,GAAG,IAAI,GAAG,EAGnC,CAAC;IACa,OAAO,CAAS;IAChB,UAAU,CAAe;IAClC,UAAU,GAAG,KAAK,CAAC;IAE3B,YACmB,UAAuB,EACvB,aAAmC,EACpD,UAA6B;QAFZ,eAAU,GAAV,UAAU,CAAa;QACvB,kBAAa,GAAb,aAAa,CAAsB;QAGpD,8EAA8E;QAC9E,MAAM,gBAAgB,GAAG,UAAU,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChE,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CACrB,gBAAgB,CAAC,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,IAAA,mBAAU,GAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,+CAA+C;QAC/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACK,iBAAiB;QACvB,IAAI,CAAC;YACH,OAAO,iCAAe,CAAC,WAAW,EAAO,CAAC,UAAU,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,UAAU,CAA2B,IAAY;QAC/C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,IAAI,EACJ,IAAI,eAAe,CACjB,IAAI,CAAC,UAAU,EACf,IAAI,EACJ,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,CAChB,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAA4B,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CACjB,IAAY;QAEZ,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAClB,IAAI,EACJ,IAAI,eAAe,CACjB,IAAI,CAAC,UAAU,EACf,IAAI,EACJ,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,UAAU,CAChB,CACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAA4B,CAAC;IAC/D,CAAC;IAED,yEAAyE;IAEzE,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,QAAQ,CAA2B,SAAiB;QAClD,OAAO,IAAI,CAAC,UAAU,CAAI,SAAS,CAAC,CAAC;IACvC,CAAC;CACF;AAvGD,gDAuGC"}
|