@researchdatabox/sails-hook-redbox-storage-mongo 5.0.4 → 5.1.0-beta.12573
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/dist/config/storage.d.ts +52 -0
- package/dist/config/storage.js +18 -3
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/dist/migrations/index.d.ts +5 -0
- package/dist/migrations/index.js +26 -0
- package/dist/migrations/recordRevisionBackfill.d.ts +26 -0
- package/dist/migrations/recordRevisionBackfill.js +115 -0
- package/dist/models/DeletedRecord.d.ts +8 -0
- package/dist/models/DeletedRecord.js +55 -1
- package/dist/models/Record.d.ts +5 -0
- package/dist/models/Record.js +43 -1
- package/dist/models/RecordAudit.d.ts +2 -0
- package/dist/models/RecordAudit.js +11 -1
- package/dist/models/RecordSchemaArtifact.d.ts +14 -0
- package/dist/models/RecordSchemaArtifact.js +75 -0
- package/dist/models/RecordSchemaReference.d.ts +25 -0
- package/dist/models/RecordSchemaReference.js +128 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.js +7 -1
- package/dist/services/MongoStorageService.d.ts +174 -11
- package/dist/services/MongoStorageService.js +1901 -271
- package/dist/services/recordSchemaPersistence.d.ts +27 -0
- package/dist/services/recordSchemaPersistence.js +258 -0
- package/package.json +4 -3
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Services = void 0;
|
|
3
|
+
exports.Services = exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS = exports.RECORD_SCHEMA_REFERENCE_INDEXES = exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY = exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_NAME = exports.RECORD_SCHEMA_ARTIFACT_INDEXES = void 0;
|
|
4
4
|
const rxjs_1 = require("rxjs");
|
|
5
5
|
const rxjs_2 = require("rxjs");
|
|
6
6
|
const crypto_1 = require("crypto");
|
|
7
|
+
const node_util_1 = require("node:util");
|
|
7
8
|
const luxon_1 = require("luxon");
|
|
8
9
|
const mongodb = require("mongodb");
|
|
9
10
|
const stream = require("node:stream");
|
|
@@ -12,6 +13,8 @@ const json2csv_1 = require("json2csv");
|
|
|
12
13
|
const redbox_core_1 = require("@researchdatabox/redbox-core");
|
|
13
14
|
const redbox_core_2 = require("@researchdatabox/redbox-core");
|
|
14
15
|
const redbox_core_3 = require("@researchdatabox/redbox-core");
|
|
16
|
+
const RecordSchemaReference_1 = require("../models/RecordSchemaReference");
|
|
17
|
+
const recordSchemaPersistence_1 = require("./recordSchemaPersistence");
|
|
15
18
|
const { flatten } = json2csv_1.transforms;
|
|
16
19
|
const UTF8_BOM = '\uFEFF';
|
|
17
20
|
const CSV_DANGEROUS_PREFIX = /^[=+\-@\t\r\n]/;
|
|
@@ -36,23 +39,170 @@ function sanitizeCsvRecord(record) {
|
|
|
36
39
|
}
|
|
37
40
|
return sanitized;
|
|
38
41
|
}
|
|
42
|
+
const RECORD_IDENTITY_COLLECTION = 'recordidentity';
|
|
43
|
+
exports.RECORD_SCHEMA_ARTIFACT_INDEXES = [
|
|
44
|
+
{
|
|
45
|
+
key: { digest: 1 },
|
|
46
|
+
// Match the index Sails Mongo creates for `@Attr({ unique: true })` so
|
|
47
|
+
// native readiness initialization is idempotent after Waterline setup.
|
|
48
|
+
name: 'digest_1',
|
|
49
|
+
unique: true,
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_NAME = 'record_schema_reference_authorization_cursor_lookup';
|
|
53
|
+
exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY = {
|
|
54
|
+
digest: 1,
|
|
55
|
+
kind: 1,
|
|
56
|
+
brand: 1,
|
|
57
|
+
portal: 1,
|
|
58
|
+
schemaKind: 1,
|
|
59
|
+
recordType: 1,
|
|
60
|
+
operation: 1,
|
|
61
|
+
referenceKey: 1,
|
|
62
|
+
};
|
|
63
|
+
exports.RECORD_SCHEMA_REFERENCE_INDEXES = [
|
|
64
|
+
{
|
|
65
|
+
key: { referenceKey: 1 },
|
|
66
|
+
name: 'referenceKey_1',
|
|
67
|
+
unique: true,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
key: { digest: 1, kind: 1 },
|
|
71
|
+
name: 'record_schema_reference_digest_kind',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
key: { digest: 1, kind: 1, brand: 1, portal: 1, referenceKey: 1 },
|
|
75
|
+
name: 'record_schema_reference_grant_lookup',
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
key: { digest: 1, kind: 1, brand: 1, portal: 1, schemaKind: 1, recordType: 1, operation: 1, oid: 1 },
|
|
79
|
+
name: 'record_schema_reference_authorization_lookup',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
key: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY,
|
|
83
|
+
name: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_NAME,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
key: { oid: 1, kind: 1 },
|
|
87
|
+
name: 'record_schema_reference_oid_kind',
|
|
88
|
+
sparse: true,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
key: { kind: 1, expiresAt: 1 },
|
|
92
|
+
name: 'record_schema_reference_pin_expiry',
|
|
93
|
+
partialFilterExpression: { kind: 'pin' },
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
/**
|
|
97
|
+
* Authorization lookups fail as unavailable instead of consuming an
|
|
98
|
+
* unbounded database work budget. This is a time/availability boundary, not
|
|
99
|
+
* a result cap: a query that cannot complete is never reported as a denial.
|
|
100
|
+
*/
|
|
101
|
+
exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS = 1_000;
|
|
102
|
+
const PERSISTENT_INDEX_BOOLEAN_OPTIONS = ['unique', 'sparse', 'hidden'];
|
|
103
|
+
const PERSISTENT_INDEX_VALUE_OPTIONS = [
|
|
104
|
+
'partialFilterExpression',
|
|
105
|
+
'expireAfterSeconds',
|
|
106
|
+
'storageEngine',
|
|
107
|
+
'weights',
|
|
108
|
+
'default_language',
|
|
109
|
+
'language_override',
|
|
110
|
+
'textIndexVersion',
|
|
111
|
+
'2dsphereIndexVersion',
|
|
112
|
+
'bits',
|
|
113
|
+
'min',
|
|
114
|
+
'max',
|
|
115
|
+
'bucketSize',
|
|
116
|
+
'wildcardProjection',
|
|
117
|
+
'collation',
|
|
118
|
+
];
|
|
119
|
+
function indexKeyEntries(key) {
|
|
120
|
+
if (key instanceof Map)
|
|
121
|
+
return [...key.entries()];
|
|
122
|
+
return Object.keys(key).map(name => [name, key[name]]);
|
|
123
|
+
}
|
|
124
|
+
function indexKeysEqual(existing, required) {
|
|
125
|
+
return (0, node_util_1.isDeepStrictEqual)(indexKeyEntries(existing.key), indexKeyEntries(required.key));
|
|
126
|
+
}
|
|
127
|
+
function indexOptionsEqual(existing, required) {
|
|
128
|
+
for (const option of PERSISTENT_INDEX_BOOLEAN_OPTIONS) {
|
|
129
|
+
if (Boolean(existing[option]) !== Boolean(required[option]))
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
return PERSISTENT_INDEX_VALUE_OPTIONS.every(option => {
|
|
133
|
+
if (option === 'collation') {
|
|
134
|
+
// MongoDB 9 reports the default simple collation explicitly; earlier versions omit it.
|
|
135
|
+
return (0, node_util_1.isDeepStrictEqual)(existing.collation ?? { locale: 'simple' }, required.collation ?? { locale: 'simple' });
|
|
136
|
+
}
|
|
137
|
+
return (0, node_util_1.isDeepStrictEqual)(existing[option], required[option]);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function indexDisplayName(index) {
|
|
141
|
+
return typeof index.name === 'string' && index.name.trim() !== '' ? index.name : '<unnamed>';
|
|
142
|
+
}
|
|
143
|
+
function isMongoNamespaceNotFoundError(error) {
|
|
144
|
+
if (!(error instanceof Error))
|
|
145
|
+
return false;
|
|
146
|
+
return ('code' in error && error.code === 26) || ('codeName' in error && error.codeName === 'NamespaceNotFound');
|
|
147
|
+
}
|
|
39
148
|
// Unimported saves merged into a pending intent. An intent written before per-save tracking counts as one save.
|
|
40
|
-
const priorFigshareSaves = {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
149
|
+
const priorFigshareSaves = {
|
|
150
|
+
$cond: [
|
|
151
|
+
{ $eq: ['$figshareSyncIntent.pending', true] },
|
|
152
|
+
{
|
|
153
|
+
$ifNull: [
|
|
154
|
+
'$figshareSyncIntent.saves',
|
|
155
|
+
{
|
|
156
|
+
$cond: [
|
|
157
|
+
{ $in: ['$figshareSyncIntent.readiness', ['ready', 'initialising']] },
|
|
158
|
+
[
|
|
159
|
+
{
|
|
160
|
+
saveToken: '$figshareSyncIntent.saveToken',
|
|
161
|
+
readiness: '$figshareSyncIntent.readiness',
|
|
162
|
+
requestedAt: '$figshareSyncIntent.requestedAt',
|
|
163
|
+
intents: { $ifNull: ['$figshareSyncIntent.intents', []] },
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
[],
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
[],
|
|
172
|
+
],
|
|
173
|
+
};
|
|
44
174
|
// The intent carries the union of its saves' policies, and is ready only once no save is still initialising.
|
|
45
175
|
// Once every merged save is abandoned nothing remains to import, so the intent is no longer pending.
|
|
46
|
-
const deriveFigshareIntent = {
|
|
47
|
-
|
|
48
|
-
'figshareSyncIntent.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
176
|
+
const deriveFigshareIntent = {
|
|
177
|
+
$set: {
|
|
178
|
+
'figshareSyncIntent.intents': {
|
|
179
|
+
$reduce: {
|
|
180
|
+
input: '$figshareSyncIntent.saves',
|
|
181
|
+
initialValue: [],
|
|
182
|
+
in: { $setUnion: ['$$value', '$$this.intents'] },
|
|
183
|
+
},
|
|
184
|
+
},
|
|
185
|
+
'figshareSyncIntent.readiness': {
|
|
186
|
+
$cond: [
|
|
187
|
+
{ $eq: [{ $size: '$figshareSyncIntent.saves' }, 0] },
|
|
188
|
+
'abandoned',
|
|
189
|
+
{ $cond: [{ $in: ['initialising', '$figshareSyncIntent.saves.readiness'] }, 'initialising', 'ready'] },
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
'figshareSyncIntent.pending': { $gt: [{ $size: '$figshareSyncIntent.saves' }, 0] },
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
const figshareSaveFilter = (saveToken, readiness) => ({
|
|
196
|
+
'figshareSyncIntent.pending': true,
|
|
197
|
+
$or: [
|
|
53
198
|
{ 'figshareSyncIntent.saves': { $elemMatch: { saveToken, ...(readiness ? { readiness } : {}) } } },
|
|
54
|
-
{
|
|
55
|
-
|
|
199
|
+
{
|
|
200
|
+
'figshareSyncIntent.saves': { $exists: false },
|
|
201
|
+
'figshareSyncIntent.saveToken': saveToken,
|
|
202
|
+
...(readiness ? { 'figshareSyncIntent.readiness': readiness } : {}),
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
});
|
|
56
206
|
var Services;
|
|
57
207
|
(function (Services) {
|
|
58
208
|
class MongoStorageService extends redbox_core_1.Services.Core.Service {
|
|
@@ -60,11 +210,24 @@ var Services;
|
|
|
60
210
|
db;
|
|
61
211
|
recordCol;
|
|
62
212
|
deletedRecordCol;
|
|
213
|
+
recordIdentityCol;
|
|
214
|
+
recordSchemaArtifactCol;
|
|
215
|
+
recordSchemaReferenceCol;
|
|
63
216
|
_readyHookRegistered = false;
|
|
217
|
+
_requiredIndicesReady = false;
|
|
218
|
+
_initializationPromise;
|
|
64
219
|
_exportedMethods = [
|
|
65
220
|
'init',
|
|
66
221
|
'create',
|
|
67
222
|
'updateMeta',
|
|
223
|
+
'getCapabilities',
|
|
224
|
+
'removeActiveRecord',
|
|
225
|
+
'createTombstone',
|
|
226
|
+
'updateTombstone',
|
|
227
|
+
'removeTombstone',
|
|
228
|
+
'createActiveRecordFromTombstone',
|
|
229
|
+
'getTombstone',
|
|
230
|
+
'getLifecycleTombstones',
|
|
68
231
|
'getMeta',
|
|
69
232
|
'setRecordFields',
|
|
70
233
|
'scanFigshareRecords',
|
|
@@ -88,6 +251,7 @@ var Services;
|
|
|
88
251
|
'addDatastreams',
|
|
89
252
|
'updateDatastream',
|
|
90
253
|
'removeDatastream',
|
|
254
|
+
'removeStagedDatastream',
|
|
91
255
|
'addDatastream',
|
|
92
256
|
'addAndRemoveDatastreams',
|
|
93
257
|
'getDatastream',
|
|
@@ -97,6 +261,13 @@ var Services;
|
|
|
97
261
|
'getRecordAudit',
|
|
98
262
|
'getIntegrationAudit',
|
|
99
263
|
'countIntegrationAudit',
|
|
264
|
+
'putRecordSchemaArtifact',
|
|
265
|
+
'getRecordSchemaArtifact',
|
|
266
|
+
'listRecordSchemaArtifacts',
|
|
267
|
+
'touchRecordSchemaArtifact',
|
|
268
|
+
'putRecordSchemaReference',
|
|
269
|
+
'findRecordSchemaGrantForAuthorization',
|
|
270
|
+
'listRecordSchemaReferences',
|
|
100
271
|
'exists',
|
|
101
272
|
];
|
|
102
273
|
constructor() {
|
|
@@ -110,9 +281,7 @@ var Services;
|
|
|
110
281
|
getErrorMessage(err) {
|
|
111
282
|
if (err instanceof Error) {
|
|
112
283
|
const messageParts = [err.message];
|
|
113
|
-
const causeMessage = err.cause instanceof Error
|
|
114
|
-
? err.cause.message
|
|
115
|
-
: (typeof err.cause === 'string' ? err.cause : undefined);
|
|
284
|
+
const causeMessage = err.cause instanceof Error ? err.cause.message : typeof err.cause === 'string' ? err.cause : undefined;
|
|
116
285
|
if (causeMessage != null && causeMessage !== '' && causeMessage !== err.message) {
|
|
117
286
|
messageParts.push(`Cause: ${causeMessage}`);
|
|
118
287
|
}
|
|
@@ -120,9 +289,442 @@ var Services;
|
|
|
120
289
|
}
|
|
121
290
|
return String(err);
|
|
122
291
|
}
|
|
123
|
-
|
|
292
|
+
classifyStorageInitializationError(err) {
|
|
293
|
+
if (err instanceof recordSchemaPersistence_1.RecordSchemaPersistenceError)
|
|
294
|
+
return 'record-schema-persistence-error';
|
|
295
|
+
if (err instanceof mongodb.MongoNetworkError)
|
|
296
|
+
return 'mongo-network-error';
|
|
297
|
+
if (err instanceof mongodb.MongoError)
|
|
298
|
+
return 'mongo-driver-error';
|
|
299
|
+
return err instanceof Error ? 'unexpected-error' : 'non-error';
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Resolve the native driver collection behind a Waterline model. Strict
|
|
303
|
+
* concurrency needs `findOneAndUpdate`/`findOneAndDelete` facts that
|
|
304
|
+
* Waterline cannot certify, so the compare-and-set paths talk to the
|
|
305
|
+
* driver directly. Discovery never throws: an adapter that cannot supply a
|
|
306
|
+
* native collection is simply unsupported.
|
|
307
|
+
*/
|
|
308
|
+
getNativeCollection(model, cacheKey) {
|
|
309
|
+
const cached = this[cacheKey];
|
|
310
|
+
if (cached)
|
|
311
|
+
return cached;
|
|
312
|
+
try {
|
|
313
|
+
const manager = model.getDatastore()?.manager;
|
|
314
|
+
if (manager && typeof manager.collection === 'function') {
|
|
315
|
+
this.db = manager;
|
|
316
|
+
this[cacheKey] = manager.collection(model.tableName);
|
|
317
|
+
return this[cacheKey];
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
// Capability discovery is deliberately non-throwing and fail-closed.
|
|
322
|
+
}
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
getNativeRecordCollection() {
|
|
326
|
+
return this.getNativeCollection(Record, 'recordCol');
|
|
327
|
+
}
|
|
328
|
+
getNativeTombstoneCollection() {
|
|
329
|
+
return this.getNativeCollection(DeletedRecord, 'deletedRecordCol');
|
|
330
|
+
}
|
|
331
|
+
getNativeRecordIdentityCollection() {
|
|
332
|
+
if (this.recordIdentityCol)
|
|
333
|
+
return this.recordIdentityCol;
|
|
334
|
+
try {
|
|
335
|
+
const manager = (this.db ?? Record.getDatastore()?.manager);
|
|
336
|
+
if (manager && typeof manager.collection === 'function') {
|
|
337
|
+
this.db = manager;
|
|
338
|
+
this.recordIdentityCol = manager.collection(RECORD_IDENTITY_COLLECTION);
|
|
339
|
+
return this.recordIdentityCol;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Capability discovery is deliberately non-throwing and fail-closed.
|
|
344
|
+
}
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
supportsAtomicMutation(collection) {
|
|
348
|
+
return (typeof collection?.findOneAndUpdate === 'function' &&
|
|
349
|
+
typeof collection?.findOneAndDelete === 'function' &&
|
|
350
|
+
typeof collection?.findOne === 'function');
|
|
351
|
+
}
|
|
352
|
+
getCapabilities() {
|
|
353
|
+
const supported = this._requiredIndicesReady &&
|
|
354
|
+
this.supportsAtomicMutation(this.getNativeRecordCollection()) &&
|
|
355
|
+
this.supportsAtomicMutation(this.getNativeTombstoneCollection()) &&
|
|
356
|
+
typeof this.getNativeRecordIdentityCollection()?.findOne === 'function' &&
|
|
357
|
+
typeof this.getNativeRecordIdentityCollection()?.insertOne === 'function' &&
|
|
358
|
+
typeof this.getNativeRecordIdentityCollection()?.deleteOne === 'function' &&
|
|
359
|
+
typeof this.getNativeRecordCollection()?.insertOne === 'function' &&
|
|
360
|
+
typeof this.getNativeTombstoneCollection()?.insertOne === 'function' &&
|
|
361
|
+
typeof this.getNativeTombstoneCollection()?.find === 'function';
|
|
362
|
+
return supported ? { recordConcurrency: redbox_core_1.RECORD_STORAGE_CONCURRENCY_CAPABILITY_VERSION } : {};
|
|
363
|
+
}
|
|
364
|
+
createMutationResponse(oid, options) {
|
|
365
|
+
const response = new redbox_core_1.StorageMutationResponse();
|
|
366
|
+
response.oid = oid;
|
|
367
|
+
if ((0, redbox_core_1.isCanonicalSaveRequestId)(options?.requestId))
|
|
368
|
+
response.requestId = options.requestId;
|
|
369
|
+
if ((0, redbox_core_1.isRecordConcurrencyResolution)(options?.resolution))
|
|
370
|
+
response.resolution = options.resolution;
|
|
371
|
+
return response;
|
|
372
|
+
}
|
|
373
|
+
notApplied(response, reason, message = 'Record mutation was not applied') {
|
|
374
|
+
response.success = false;
|
|
375
|
+
response.applicationState = 'not-applied';
|
|
376
|
+
response.nonApplicationReason = reason;
|
|
377
|
+
response.message = message;
|
|
378
|
+
return response;
|
|
379
|
+
}
|
|
380
|
+
unknownMutation(response, message) {
|
|
381
|
+
response.success = false;
|
|
382
|
+
response.applicationState = 'unknown';
|
|
383
|
+
response.message = message;
|
|
384
|
+
return response;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Normalize the caller's precondition. Returning `null` means the response
|
|
388
|
+
* already carries a certified non-application: a malformed precondition is
|
|
389
|
+
* a caller defect, and answering it with a definite no-write is safer than
|
|
390
|
+
* guessing which revision was meant.
|
|
391
|
+
*/
|
|
392
|
+
expectedRevision(options, response) {
|
|
393
|
+
const precondition = options?.precondition;
|
|
394
|
+
if (!precondition)
|
|
395
|
+
return undefined;
|
|
396
|
+
const { expectedRevision, requireRevision } = precondition;
|
|
397
|
+
if (typeof requireRevision !== 'boolean' ||
|
|
398
|
+
(expectedRevision === undefined ? requireRevision : !(0, redbox_core_1.isRecordRevision)(expectedRevision))) {
|
|
399
|
+
sails.log.error(`${this.logHeader} refusing a mutation for oid ${response.oid}: the supplied revision precondition is invalid`);
|
|
400
|
+
this.notApplied(response, 'capability-unavailable', 'A valid record revision is required');
|
|
401
|
+
return null;
|
|
402
|
+
}
|
|
403
|
+
return expectedRevision;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* The lazy compatibility clause matches only a genuinely absent revision.
|
|
407
|
+
* An explicit null is corrupt state: `$inc` cannot advance it and must not
|
|
408
|
+
* be made to look like a safe first revision.
|
|
409
|
+
*/
|
|
410
|
+
revisionSelector(expectedRevision) {
|
|
411
|
+
if (expectedRevision === redbox_core_1.INITIAL_RECORD_REVISION) {
|
|
412
|
+
// Atomic lazy compatibility for a legacy record that escaped the
|
|
413
|
+
// single-lift migration. The winning $inc makes a second match fail.
|
|
414
|
+
return { $or: [{ revision: redbox_core_1.INITIAL_RECORD_REVISION }, { revision: { $exists: false } }] };
|
|
415
|
+
}
|
|
416
|
+
if (expectedRevision !== undefined)
|
|
417
|
+
return { revision: expectedRevision };
|
|
418
|
+
// Tokenless compatibility: match anything that can still be advanced.
|
|
419
|
+
return { $or: [{ revision: { $lt: Number.MAX_SAFE_INTEGER } }, { revision: { $exists: false } }] };
|
|
420
|
+
}
|
|
421
|
+
mutationSelector(identity, expectedRevision) {
|
|
422
|
+
return { $and: [identity, this.revisionSelector(expectedRevision)] };
|
|
423
|
+
}
|
|
424
|
+
lifecycleMutationSelector(identity, expectedRevision, options) {
|
|
425
|
+
const selector = this.mutationSelector(identity, expectedRevision);
|
|
426
|
+
const predicates = selector.$and;
|
|
427
|
+
if (options?.lifecycle?.expectedState) {
|
|
428
|
+
predicates.push({ lifecycleState: options.lifecycle.expectedState });
|
|
429
|
+
}
|
|
430
|
+
if (options?.lifecycle?.operationId) {
|
|
431
|
+
predicates.push({ 'lifecycleOperation.operationId': options.lifecycle.operationId });
|
|
432
|
+
}
|
|
433
|
+
return selector;
|
|
434
|
+
}
|
|
435
|
+
isDuplicateKeyError(error) {
|
|
436
|
+
return Boolean(error && typeof error === 'object' && Number(error.code) === 11000);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Whether the driver fact proves that `insertOne` did not commit. Local
|
|
440
|
+
* argument rejection and a server command error without retry/write-
|
|
441
|
+
* concern ambiguity are definitive. Network, selection, timeout, and
|
|
442
|
+
* write-concern failures retain the reservation for later reconciliation.
|
|
443
|
+
*/
|
|
444
|
+
isCertifiedCreateNonApplication(error) {
|
|
445
|
+
if (error instanceof mongodb.MongoInvalidArgumentError)
|
|
446
|
+
return true;
|
|
447
|
+
if (!(error instanceof mongodb.MongoServerError) || error instanceof mongodb.MongoWriteConcernError) {
|
|
448
|
+
return false;
|
|
449
|
+
}
|
|
450
|
+
const serverError = error;
|
|
451
|
+
if (serverError.writeConcernError)
|
|
452
|
+
return false;
|
|
453
|
+
if (serverError.hasErrorLabel?.('RetryableWriteError'))
|
|
454
|
+
return false;
|
|
455
|
+
if (serverError.hasErrorLabel?.('UnknownTransactionCommitResult'))
|
|
456
|
+
return false;
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
storedIncarnationId(record) {
|
|
460
|
+
const value = String(record?.incarnationId ?? '').trim();
|
|
461
|
+
return (0, redbox_core_1.isCanonicalSaveRequestId)(value) ? value : undefined;
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Establish the permanent OID owner for a state that already exists. The
|
|
465
|
+
* ledger outlives active records and tombstones, so purge cannot reopen a
|
|
466
|
+
* revision-zero alias. Duplicate insertion is an ordinary concurrent
|
|
467
|
+
* winner; its durable identity is re-read and adopted.
|
|
468
|
+
*/
|
|
469
|
+
async ensureRecordIdentity(oid, source) {
|
|
470
|
+
const identities = this.getNativeRecordIdentityCollection();
|
|
471
|
+
if (typeof identities?.findOne !== 'function' || typeof identities?.insertOne !== 'function')
|
|
472
|
+
return undefined;
|
|
473
|
+
const existing = this.mutationDocument(await identities.findOne({ redboxOid: oid }));
|
|
474
|
+
if (existing === undefined)
|
|
475
|
+
return undefined;
|
|
476
|
+
const existingId = this.storedIncarnationId(existing);
|
|
477
|
+
if (existing !== null)
|
|
478
|
+
return existingId;
|
|
479
|
+
const incarnationId = this.storedIncarnationId(source) ?? (0, crypto_1.randomUUID)();
|
|
480
|
+
try {
|
|
481
|
+
await identities.insertOne({ redboxOid: oid, incarnationId, createdAt: new Date().toISOString() });
|
|
482
|
+
return incarnationId;
|
|
483
|
+
}
|
|
484
|
+
catch (error) {
|
|
485
|
+
if (!this.isDuplicateKeyError(error))
|
|
486
|
+
return undefined;
|
|
487
|
+
const winner = this.mutationDocument(await identities.findOne({ redboxOid: oid }));
|
|
488
|
+
return winner === undefined ? undefined : this.storedIncarnationId(winner);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
/** Claim a never-before-used OID. Any durable owner or active/tombstone state is a collision. */
|
|
492
|
+
async claimNewRecordIdentity(oid) {
|
|
493
|
+
const identities = this.getNativeRecordIdentityCollection();
|
|
494
|
+
if (typeof identities?.findOne !== 'function' ||
|
|
495
|
+
typeof identities?.insertOne !== 'function' ||
|
|
496
|
+
typeof identities?.deleteOne !== 'function')
|
|
497
|
+
return undefined;
|
|
498
|
+
const existingOwner = this.mutationDocument(await identities.findOne({ redboxOid: oid }));
|
|
499
|
+
if (existingOwner === undefined)
|
|
500
|
+
return undefined;
|
|
501
|
+
if (existingOwner !== null)
|
|
502
|
+
return { collision: true };
|
|
503
|
+
// Legacy state may predate the ledger. Seed its owner before returning a
|
|
504
|
+
// collision so a concurrent purge cannot make the OID reusable.
|
|
505
|
+
const current = await this.readCurrentState(oid);
|
|
506
|
+
if (!current)
|
|
507
|
+
return undefined;
|
|
508
|
+
const existingState = current.active ?? current.tombstone;
|
|
509
|
+
if (existingState) {
|
|
510
|
+
return (await this.ensureRecordIdentity(oid, existingState)) ? { collision: true } : undefined;
|
|
511
|
+
}
|
|
512
|
+
const incarnationId = (0, crypto_1.randomUUID)();
|
|
513
|
+
try {
|
|
514
|
+
await identities.insertOne({ redboxOid: oid, incarnationId, createdAt: new Date().toISOString() });
|
|
515
|
+
return { incarnationId };
|
|
516
|
+
}
|
|
517
|
+
catch (error) {
|
|
518
|
+
return this.isDuplicateKeyError(error) ? { collision: true } : undefined;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Compensate an ownership claim this call made but never used.
|
|
523
|
+
*
|
|
524
|
+
* The ledger is otherwise permanent, and deliberately so: a purge must not
|
|
525
|
+
* let an old revision-zero tag alias a recreated incarnation. Releasing is
|
|
526
|
+
* only safe — and only necessary — for a row that still carries the
|
|
527
|
+
* incarnation this call minted and that no active record or tombstone
|
|
528
|
+
* refers to. That is exactly the state a create leaves behind when its
|
|
529
|
+
* insert never reached the collection, and without this the caller-selected
|
|
530
|
+
* OID would be permanently unusable with no operator recovery path. While
|
|
531
|
+
* this row exists its unique index prevents another ordinary create from
|
|
532
|
+
* becoming owner; the exact incarnation selector also cannot remove a row
|
|
533
|
+
* replaced during an operator recovery race.
|
|
534
|
+
*/
|
|
535
|
+
async releaseUnusedRecordIdentity(oid, incarnationId) {
|
|
536
|
+
const identities = this.getNativeRecordIdentityCollection();
|
|
537
|
+
if (typeof identities?.deleteOne !== 'function')
|
|
538
|
+
return;
|
|
539
|
+
try {
|
|
540
|
+
const current = await this.readCurrentState(oid);
|
|
541
|
+
// Unobservable or still-owned state keeps the claim: a permanent row is
|
|
542
|
+
// always safer than one released while something still refers to it.
|
|
543
|
+
if (!current || current.active || current.tombstone)
|
|
544
|
+
return;
|
|
545
|
+
await identities.deleteOne({ redboxOid: oid, incarnationId });
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
sails.log.error(`${this.logHeader} record_identity_reservation_release_failed`, {
|
|
549
|
+
event: 'record_identity_reservation_release_failed',
|
|
550
|
+
outcome: 'unknown',
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Interpret a `findOneAndUpdate`/`findOneAndDelete` result issued with
|
|
556
|
+
* `includeResultMetadata: false`: `null` is a certified no-match and a
|
|
557
|
+
* document is the committed state. Anything else is an unrecognized driver
|
|
558
|
+
* fact that must stay `unknown` rather than being certified either way.
|
|
559
|
+
*/
|
|
560
|
+
mutationDocument(result) {
|
|
561
|
+
if (result === null)
|
|
562
|
+
return null;
|
|
563
|
+
if (result === undefined)
|
|
564
|
+
return undefined;
|
|
565
|
+
if (typeof result !== 'object' || Array.isArray(result))
|
|
566
|
+
return undefined;
|
|
567
|
+
return result;
|
|
568
|
+
}
|
|
569
|
+
committed(response, document, kind, expectedRevision) {
|
|
570
|
+
// A removal returns the pre-removal document, which may predate the
|
|
571
|
+
// revision backfill; an update always returns the incremented value.
|
|
572
|
+
const normalizedRevision = (0, redbox_core_1.isRecordRevision)(document.revision)
|
|
573
|
+
? document.revision
|
|
574
|
+
: document.revision == null && kind === 'removed'
|
|
575
|
+
? redbox_core_1.INITIAL_RECORD_REVISION
|
|
576
|
+
: undefined;
|
|
577
|
+
if (normalizedRevision === undefined) {
|
|
578
|
+
return this.unknownMutation(response, 'Storage returned an invalid committed revision');
|
|
579
|
+
}
|
|
580
|
+
const expectedCommittedRevision = expectedRevision === undefined
|
|
581
|
+
? undefined
|
|
582
|
+
: kind === 'updated'
|
|
583
|
+
? (0, redbox_core_1.nextRecordRevision)(expectedRevision)
|
|
584
|
+
: expectedRevision;
|
|
585
|
+
if (expectedCommittedRevision !== undefined && normalizedRevision !== expectedCommittedRevision) {
|
|
586
|
+
return this.unknownMutation(response, 'Storage returned an inconsistent committed revision');
|
|
587
|
+
}
|
|
588
|
+
const normalized = { ...document, revision: normalizedRevision };
|
|
589
|
+
response.success = true;
|
|
590
|
+
response.applicationState = 'applied';
|
|
591
|
+
response.committedRevision = normalizedRevision;
|
|
592
|
+
if (kind === 'removed')
|
|
593
|
+
response.removedRecord = normalized;
|
|
594
|
+
else
|
|
595
|
+
response.committedRecord = normalized;
|
|
596
|
+
return response;
|
|
597
|
+
}
|
|
598
|
+
brandIdOf(brand) {
|
|
599
|
+
return String(brand?.id ?? '').trim();
|
|
600
|
+
}
|
|
601
|
+
activeIdentity(brand, oid) {
|
|
602
|
+
const brandId = this.brandIdOf(brand);
|
|
603
|
+
return brandId ? { redboxOid: oid, 'metaMetadata.brandId': brandId } : { redboxOid: oid };
|
|
604
|
+
}
|
|
605
|
+
tombstoneIdentity(brand, oid) {
|
|
606
|
+
const brandId = this.brandIdOf(brand);
|
|
607
|
+
// Tombstones written before the lifecycle wrapper existed only carry the
|
|
608
|
+
// brand inside the embedded snapshot. A present wrapper brand remains
|
|
609
|
+
// authoritative: an inconsistent snapshot must never widen brand scope.
|
|
610
|
+
return brandId
|
|
611
|
+
? {
|
|
612
|
+
redboxOid: oid,
|
|
613
|
+
$or: [
|
|
614
|
+
{ brandId },
|
|
615
|
+
{
|
|
616
|
+
$and: [{ brandId: { $exists: false } }, { 'deletedRecordMetadata.metaMetadata.brandId': brandId }],
|
|
617
|
+
},
|
|
618
|
+
],
|
|
619
|
+
}
|
|
620
|
+
: { redboxOid: oid };
|
|
621
|
+
}
|
|
622
|
+
static BRAND_ID_PATHS = [
|
|
623
|
+
'brandId',
|
|
624
|
+
'metaMetadata.brandId',
|
|
625
|
+
'deletedRecordMetadata.metaMetadata.brandId',
|
|
626
|
+
];
|
|
627
|
+
storedBrandId(record) {
|
|
628
|
+
for (const path of MongoStorageService.BRAND_ID_PATHS) {
|
|
629
|
+
const brandId = String(_.get(record, path, '') ?? '').trim();
|
|
630
|
+
if (brandId)
|
|
631
|
+
return brandId;
|
|
632
|
+
}
|
|
633
|
+
return '';
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* Reject candidate keys the driver would read as update operators or
|
|
637
|
+
* dotted paths. Waterline rejected them before the compare-and-set paths
|
|
638
|
+
* started building `$set` documents directly, and honouring them would let
|
|
639
|
+
* a candidate reach fields — such as the stored brand — that the explicit
|
|
640
|
+
* checks above deliberately guard.
|
|
641
|
+
*/
|
|
642
|
+
unsafeCandidateField(candidate) {
|
|
643
|
+
return Object.keys(candidate).find(key => key.startsWith('$') || key.includes('.'));
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Read the current state behind a certified no-match so the caller can be
|
|
647
|
+
* told why nothing was written. Cross-brand state is never returned: the
|
|
648
|
+
* reason alone is bounded, and callers outside the brand map it onto the
|
|
649
|
+
* same not-found answer an absent record produces.
|
|
650
|
+
*/
|
|
651
|
+
async readCurrentState(oid) {
|
|
652
|
+
const records = this.getNativeRecordCollection();
|
|
653
|
+
const tombstones = this.getNativeTombstoneCollection();
|
|
654
|
+
if (typeof records?.findOne !== 'function' || typeof tombstones?.findOne !== 'function') {
|
|
655
|
+
return undefined;
|
|
656
|
+
}
|
|
657
|
+
const [activeResult, tombstoneResult] = await Promise.all([
|
|
658
|
+
records.findOne({ redboxOid: oid }),
|
|
659
|
+
tombstones.findOne({ redboxOid: oid }),
|
|
660
|
+
]);
|
|
661
|
+
const active = this.mutationDocument(activeResult);
|
|
662
|
+
const tombstone = this.mutationDocument(tombstoneResult);
|
|
663
|
+
if (active === undefined || tombstone === undefined)
|
|
664
|
+
return undefined;
|
|
665
|
+
return { active, tombstone };
|
|
666
|
+
}
|
|
667
|
+
isRequestedBrand(record, requestedBrandId) {
|
|
668
|
+
return record !== null && (!requestedBrandId || this.storedBrandId(record) === requestedBrandId);
|
|
669
|
+
}
|
|
670
|
+
async classifyActiveNoMatch(brand, oid, expectedRevision) {
|
|
671
|
+
const current = await this.readCurrentState(oid);
|
|
672
|
+
if (!current)
|
|
673
|
+
return 'capability-unavailable';
|
|
674
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
675
|
+
if (current.active) {
|
|
676
|
+
if (!this.isRequestedBrand(current.active, requestedBrandId))
|
|
677
|
+
return 'brand-mismatch';
|
|
678
|
+
// A tokenless selector matches every advanceable revision, so a
|
|
679
|
+
// present in-brand record that still did not match cannot be advanced.
|
|
680
|
+
return expectedRevision !== undefined ? 'stale-revision' : 'capability-unavailable';
|
|
681
|
+
}
|
|
682
|
+
if (this.isRequestedBrand(current.tombstone, requestedBrandId))
|
|
683
|
+
return 'deleted';
|
|
684
|
+
return 'not-found';
|
|
685
|
+
}
|
|
686
|
+
async classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options) {
|
|
687
|
+
const current = await this.readCurrentState(oid);
|
|
688
|
+
if (!current)
|
|
689
|
+
return 'capability-unavailable';
|
|
690
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
691
|
+
if (current.tombstone) {
|
|
692
|
+
if (!this.isRequestedBrand(current.tombstone, requestedBrandId))
|
|
693
|
+
return 'brand-mismatch';
|
|
694
|
+
const currentRevision = (0, redbox_core_1.isRecordRevision)(current.tombstone.revision)
|
|
695
|
+
? current.tombstone.revision
|
|
696
|
+
: redbox_core_1.INITIAL_RECORD_REVISION;
|
|
697
|
+
if (expectedRevision !== undefined && currentRevision !== expectedRevision)
|
|
698
|
+
return 'stale-revision';
|
|
699
|
+
if ((options?.lifecycle?.expectedState && current.tombstone.lifecycleState !== options.lifecycle.expectedState) ||
|
|
700
|
+
(options?.lifecycle?.operationId &&
|
|
701
|
+
_.get(current.tombstone, 'lifecycleOperation.operationId') !== options.lifecycle.operationId)) {
|
|
702
|
+
return 'lifecycle-conflict';
|
|
703
|
+
}
|
|
704
|
+
return 'capability-unavailable';
|
|
705
|
+
}
|
|
706
|
+
if (this.isRequestedBrand(current.active, requestedBrandId))
|
|
707
|
+
return 'lifecycle-conflict';
|
|
708
|
+
return 'not-found';
|
|
709
|
+
}
|
|
710
|
+
async init() {
|
|
124
711
|
this.registerReadyHook();
|
|
125
|
-
|
|
712
|
+
const initialization = this._initializationPromise ?? this.performInit();
|
|
713
|
+
this._initializationPromise = initialization;
|
|
714
|
+
try {
|
|
715
|
+
await initialization;
|
|
716
|
+
}
|
|
717
|
+
catch (error) {
|
|
718
|
+
if (this._initializationPromise === initialization) {
|
|
719
|
+
this._initializationPromise = undefined;
|
|
720
|
+
sails.log.error(`${this.logHeader} storage_initialization_failed`, {
|
|
721
|
+
event: 'storage_initialization_failed',
|
|
722
|
+
outcome: 'not-ready',
|
|
723
|
+
error_classification: this.classifyStorageInitializationError(error),
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
throw error;
|
|
727
|
+
}
|
|
126
728
|
}
|
|
127
729
|
registerReadyHook() {
|
|
128
730
|
if (this._readyHookRegistered) {
|
|
@@ -130,8 +732,8 @@ var Services;
|
|
|
130
732
|
}
|
|
131
733
|
this._readyHookRegistered = true;
|
|
132
734
|
const that = this;
|
|
133
|
-
this.registerSailsHook('on', 'ready', function () {
|
|
134
|
-
|
|
735
|
+
this.registerSailsHook('on', 'ready', async function () {
|
|
736
|
+
await that.init();
|
|
135
737
|
});
|
|
136
738
|
}
|
|
137
739
|
async collectionExists(collectionName) {
|
|
@@ -155,7 +757,13 @@ var Services;
|
|
|
155
757
|
}
|
|
156
758
|
}
|
|
157
759
|
async performInit() {
|
|
158
|
-
if (this.
|
|
760
|
+
if (this._requiredIndicesReady &&
|
|
761
|
+
this.recordCol &&
|
|
762
|
+
this.deletedRecordCol &&
|
|
763
|
+
this.recordIdentityCol &&
|
|
764
|
+
this.recordSchemaArtifactCol &&
|
|
765
|
+
this.recordSchemaReferenceCol &&
|
|
766
|
+
this.gridFsBucket) {
|
|
159
767
|
return;
|
|
160
768
|
}
|
|
161
769
|
this.db = Record.getDatastore().manager;
|
|
@@ -168,9 +776,18 @@ var Services;
|
|
|
168
776
|
}
|
|
169
777
|
this.gridFsBucket = new mongodb.GridFSBucket(this.db);
|
|
170
778
|
this.recordCol = this.db.collection(Record.tableName);
|
|
171
|
-
await this.recordCol.createIndex({
|
|
779
|
+
await this.recordCol.createIndex({
|
|
780
|
+
'figshareSyncIntent.pending': 1,
|
|
781
|
+
'figshareSyncIntent.readiness': 1,
|
|
782
|
+
'figshareSyncIntent.requestedAt': 1,
|
|
783
|
+
});
|
|
172
784
|
this.deletedRecordCol = this.db.collection(DeletedRecord.tableName);
|
|
785
|
+
this.recordIdentityCol = this.db.collection(RECORD_IDENTITY_COLLECTION);
|
|
786
|
+
this.recordSchemaArtifactCol = this.db.collection(RecordSchemaArtifact.tableName);
|
|
787
|
+
this.recordSchemaReferenceCol = this.db.collection(RecordSchemaReference.tableName);
|
|
173
788
|
await this.createIndices(this.db);
|
|
789
|
+
await this.createRecordSchemaIndices();
|
|
790
|
+
this._requiredIndicesReady = true;
|
|
174
791
|
sails.emit('hook:redbox:storage:ready');
|
|
175
792
|
sails.emit('hook:redbox:datastream:ready');
|
|
176
793
|
sails.log.verbose(`${this.logHeader} Ready!`);
|
|
@@ -179,16 +796,10 @@ var Services;
|
|
|
179
796
|
sails.log.verbose(`${this.logHeader} Existing indices:`);
|
|
180
797
|
const currentIndices = await db.collection(Record.tableName).indexes();
|
|
181
798
|
sails.log.verbose(JSON.stringify(currentIndices));
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
await db.collection(Record.tableName).createIndexes(indices);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
catch (err) {
|
|
190
|
-
sails.log.error(`Failed to create indices:`);
|
|
191
|
-
sails.log.error(JSON.stringify(err));
|
|
799
|
+
const storageConfig = sails.config.storage;
|
|
800
|
+
const indices = storageConfig.mongodb?.indices ?? [];
|
|
801
|
+
if (_.size(indices) > 0) {
|
|
802
|
+
await db.collection(Record.tableName).createIndexes(indices);
|
|
192
803
|
}
|
|
193
804
|
try {
|
|
194
805
|
await db.collection(RecordAudit.tableName).createIndex({ redboxOid: 1, createdAt: 1 });
|
|
@@ -197,91 +808,1015 @@ var Services;
|
|
|
197
808
|
sails.log.error(`Failed to create record audit index:`);
|
|
198
809
|
sails.log.error(JSON.stringify(err));
|
|
199
810
|
}
|
|
811
|
+
const deletedRecordIndices = storageConfig.mongodb?.deletedRecordIndices ?? [];
|
|
812
|
+
if (_.size(deletedRecordIndices) > 0) {
|
|
813
|
+
await db.collection(DeletedRecord.tableName).createIndexes(deletedRecordIndices);
|
|
814
|
+
}
|
|
815
|
+
const recordIdentityIndices = storageConfig.mongodb?.recordIdentityIndices ?? [
|
|
816
|
+
{ key: { redboxOid: 1 }, unique: true },
|
|
817
|
+
];
|
|
818
|
+
await db.collection(RECORD_IDENTITY_COLLECTION).createIndexes(recordIdentityIndices);
|
|
200
819
|
}
|
|
201
|
-
async
|
|
202
|
-
|
|
820
|
+
async createRecordSchemaIndices() {
|
|
821
|
+
await this.createRequiredIndexes(this.recordSchemaArtifactCol, exports.RECORD_SCHEMA_ARTIFACT_INDEXES);
|
|
822
|
+
await this.createRequiredIndexes(this.recordSchemaReferenceCol, exports.RECORD_SCHEMA_REFERENCE_INDEXES);
|
|
823
|
+
}
|
|
824
|
+
async createRequiredIndexes(collection, requiredIndexes) {
|
|
825
|
+
let existingIndexes;
|
|
826
|
+
try {
|
|
827
|
+
existingIndexes = await collection.indexes();
|
|
828
|
+
}
|
|
829
|
+
catch (error) {
|
|
830
|
+
if (!isMongoNamespaceNotFoundError(error)) {
|
|
831
|
+
throw error;
|
|
832
|
+
}
|
|
833
|
+
existingIndexes = [];
|
|
834
|
+
}
|
|
835
|
+
const missingIndexes = [];
|
|
836
|
+
for (const required of requiredIndexes) {
|
|
837
|
+
const matchingKeys = existingIndexes.filter(existing => indexKeysEqual(existing, required));
|
|
838
|
+
if (matchingKeys.some(existing => indexOptionsEqual(existing, required)))
|
|
839
|
+
continue;
|
|
840
|
+
if (matchingKeys.length > 0) {
|
|
841
|
+
throw new Error(`Existing index ${indexDisplayName(matchingKeys[0])} has options that do not match required index ${indexDisplayName(required)}.`);
|
|
842
|
+
}
|
|
843
|
+
const matchingName = existingIndexes.find(existing => existing.name === required.name);
|
|
844
|
+
if (matchingName) {
|
|
845
|
+
throw new Error(`Existing index ${indexDisplayName(matchingName)} has keys that do not match the required definition.`);
|
|
846
|
+
}
|
|
847
|
+
missingIndexes.push(required);
|
|
848
|
+
}
|
|
849
|
+
if (missingIndexes.length > 0) {
|
|
850
|
+
await collection.createIndexes(missingIndexes);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
recordSchemaSuccess(data) {
|
|
203
854
|
const response = new redbox_core_1.StorageServiceResponse();
|
|
204
|
-
|
|
205
|
-
response.
|
|
855
|
+
response.success = true;
|
|
856
|
+
response.data = data;
|
|
857
|
+
return response;
|
|
858
|
+
}
|
|
859
|
+
recordSchemaFailure(code, message, action, error) {
|
|
860
|
+
const response = new redbox_core_1.StorageServiceResponse();
|
|
861
|
+
response.success = false;
|
|
862
|
+
response.message = message;
|
|
863
|
+
response.details = { code };
|
|
864
|
+
const errorType = error instanceof Error ? error.name : typeof error;
|
|
865
|
+
sails.log.error(`${this.logHeader} ${action} failed (${code}; ${errorType})`);
|
|
866
|
+
return response;
|
|
867
|
+
}
|
|
868
|
+
recordSchemaFailureFromError(action, error) {
|
|
869
|
+
if (error instanceof recordSchemaPersistence_1.RecordSchemaPersistenceError) {
|
|
870
|
+
return this.recordSchemaFailure(error.code, error.message, action, error);
|
|
871
|
+
}
|
|
872
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, 'Record schema storage operation failed.', action, error);
|
|
873
|
+
}
|
|
874
|
+
throwRecordSchemaReadFailure(action, error) {
|
|
875
|
+
if (error instanceof recordSchemaPersistence_1.RecordSchemaPersistenceError) {
|
|
876
|
+
throw error;
|
|
877
|
+
}
|
|
878
|
+
const errorType = error instanceof Error ? error.name : typeof error;
|
|
879
|
+
sails.log.error(`${this.logHeader} ${action} failed (${errorType})`);
|
|
880
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, 'Record schema storage read failed.');
|
|
881
|
+
}
|
|
882
|
+
artifactCollection() {
|
|
883
|
+
if (!this.recordSchemaArtifactCol) {
|
|
884
|
+
this.db = this.db ?? RecordSchemaArtifact.getDatastore().manager;
|
|
885
|
+
this.recordSchemaArtifactCol = this.db.collection(RecordSchemaArtifact.tableName);
|
|
886
|
+
}
|
|
887
|
+
return this.recordSchemaArtifactCol;
|
|
888
|
+
}
|
|
889
|
+
referenceCollection() {
|
|
890
|
+
if (!this.recordSchemaReferenceCol) {
|
|
891
|
+
this.db = this.db ?? RecordSchemaReference.getDatastore().manager;
|
|
892
|
+
this.recordSchemaReferenceCol = this.db.collection(RecordSchemaReference.tableName);
|
|
893
|
+
}
|
|
894
|
+
return this.recordSchemaReferenceCol;
|
|
895
|
+
}
|
|
896
|
+
recordSchemaReferenceDocument(reference, now) {
|
|
897
|
+
const document = {
|
|
898
|
+
referenceKey: reference.referenceKey,
|
|
899
|
+
digest: reference.digest,
|
|
900
|
+
kind: reference.kind,
|
|
901
|
+
brand: reference.brand,
|
|
902
|
+
portal: reference.portal,
|
|
903
|
+
schemaKind: reference.schemaKind,
|
|
904
|
+
recordType: reference.recordType,
|
|
905
|
+
operation: reference.operation,
|
|
906
|
+
createdAt: now,
|
|
907
|
+
updatedAt: now,
|
|
908
|
+
};
|
|
909
|
+
if (reference.kind === 'save' || (reference.kind === 'grant' && reference.schemaKind === 'update')) {
|
|
910
|
+
document.oid = reference.oid;
|
|
911
|
+
}
|
|
912
|
+
if (reference.kind === 'pin') {
|
|
913
|
+
document.owner = reference.owner;
|
|
914
|
+
document.purpose = reference.purpose;
|
|
915
|
+
if (reference.expiresAt !== undefined) {
|
|
916
|
+
document.expiresAt = reference.expiresAt;
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
return document;
|
|
920
|
+
}
|
|
921
|
+
async existingArtifactMatches(existing, artifact) {
|
|
922
|
+
return (0, recordSchemaPersistence_1.artifactContentIdentity)((0, recordSchemaPersistence_1.artifactModelFromDocument)(existing)) === (0, recordSchemaPersistence_1.artifactContentIdentity)(artifact);
|
|
923
|
+
}
|
|
924
|
+
async putRecordSchemaArtifact(artifact) {
|
|
206
925
|
try {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
if (
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
926
|
+
const validated = (0, recordSchemaPersistence_1.validateRecordSchemaArtifactInput)(artifact);
|
|
927
|
+
const collection = this.artifactCollection();
|
|
928
|
+
const existing = await collection.findOne({ digest: validated.digest });
|
|
929
|
+
if (existing) {
|
|
930
|
+
if (await this.existingArtifactMatches(existing, validated)) {
|
|
931
|
+
return this.recordSchemaSuccess({ digest: validated.digest });
|
|
932
|
+
}
|
|
933
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.DIGEST_COLLISION, 'Record schema artifact integrity check failed.', 'putRecordSchemaArtifact');
|
|
214
934
|
}
|
|
215
|
-
|
|
216
|
-
|
|
935
|
+
const now = new Date();
|
|
936
|
+
try {
|
|
937
|
+
await collection.insertOne({
|
|
938
|
+
digest: validated.digest,
|
|
939
|
+
document: validated.document,
|
|
940
|
+
contractFormat: validated.contractFormat,
|
|
941
|
+
completeness: validated.completeness,
|
|
942
|
+
byteLength: validated.byteLength,
|
|
943
|
+
createdAt: now,
|
|
944
|
+
updatedAt: now,
|
|
945
|
+
});
|
|
946
|
+
}
|
|
947
|
+
catch (error) {
|
|
948
|
+
if (!(0, recordSchemaPersistence_1.isDuplicateKeyError)(error)) {
|
|
949
|
+
throw error;
|
|
950
|
+
}
|
|
951
|
+
const racedArtifact = await collection.findOne({ digest: validated.digest });
|
|
952
|
+
if (!racedArtifact || !(await this.existingArtifactMatches(racedArtifact, validated))) {
|
|
953
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.DIGEST_COLLISION, 'Record schema artifact integrity check failed.', 'putRecordSchemaArtifact', error);
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
return this.recordSchemaSuccess({ digest: validated.digest });
|
|
957
|
+
}
|
|
958
|
+
catch (error) {
|
|
959
|
+
return this.recordSchemaFailureFromError('putRecordSchemaArtifact', error);
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
async getRecordSchemaArtifact(digest) {
|
|
963
|
+
const validatedDigest = (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(digest);
|
|
964
|
+
try {
|
|
965
|
+
const document = await this.artifactCollection().findOne({ digest: validatedDigest });
|
|
966
|
+
return document ? (0, recordSchemaPersistence_1.artifactModelFromDocument)(document) : null;
|
|
967
|
+
}
|
|
968
|
+
catch (error) {
|
|
969
|
+
const errorType = error instanceof Error ? error.name : typeof error;
|
|
970
|
+
sails.log.error(`${this.logHeader} getRecordSchemaArtifact failed (${errorType})`);
|
|
971
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, 'Record schema artifact read failed.');
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
async listRecordSchemaArtifacts(query) {
|
|
975
|
+
try {
|
|
976
|
+
if (!query || typeof query !== 'object') {
|
|
977
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_ARTIFACT, 'Record schema artifact query is required.');
|
|
978
|
+
}
|
|
979
|
+
const limit = this.recordSchemaQueryLimit(query.limit);
|
|
980
|
+
const criteria = {};
|
|
981
|
+
if (query.afterDigest !== undefined) {
|
|
982
|
+
criteria.digest = { $gt: (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(query.afterDigest) };
|
|
983
|
+
}
|
|
984
|
+
const documents = await this.artifactCollection()
|
|
985
|
+
.find(criteria, { projection: { _id: 0, digest: 1, createdAt: 1 } })
|
|
986
|
+
.sort({ digest: 1 })
|
|
987
|
+
.limit(limit)
|
|
988
|
+
.toArray();
|
|
989
|
+
return documents.map(document => ({
|
|
990
|
+
digest: (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(document.digest),
|
|
991
|
+
createdAt: this.storedRecordSchemaDate(document.createdAt, 'artifact createdAt'),
|
|
992
|
+
}));
|
|
993
|
+
}
|
|
994
|
+
catch (error) {
|
|
995
|
+
return this.throwRecordSchemaReadFailure('listRecordSchemaArtifacts', error);
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
async touchRecordSchemaArtifact(digest) {
|
|
999
|
+
try {
|
|
1000
|
+
const validatedDigest = (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(digest);
|
|
1001
|
+
const result = await this.artifactCollection().updateOne({ digest: validatedDigest }, { $set: { lastAccessedAt: new Date() } });
|
|
1002
|
+
if (result.matchedCount !== 1) {
|
|
1003
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.ARTIFACT_NOT_FOUND, 'Record schema artifact was not found.', 'touchRecordSchemaArtifact');
|
|
1004
|
+
}
|
|
1005
|
+
return this.recordSchemaSuccess({ digest: validatedDigest });
|
|
1006
|
+
}
|
|
1007
|
+
catch (error) {
|
|
1008
|
+
return this.recordSchemaFailureFromError('touchRecordSchemaArtifact', error);
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
async storeRecordSchemaReference(reference, now) {
|
|
1012
|
+
const collection = this.referenceCollection();
|
|
1013
|
+
const existing = await collection.findOne({ referenceKey: reference.referenceKey });
|
|
1014
|
+
if (existing) {
|
|
1015
|
+
if ((0, recordSchemaPersistence_1.referenceContentIdentity)((0, recordSchemaPersistence_1.referenceModelFromDocument)(existing)) !== (0, recordSchemaPersistence_1.referenceContentIdentity)(reference)) {
|
|
1016
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.REFERENCE_KEY_COLLISION, 'Record schema reference integrity check failed.', 'putRecordSchemaReference');
|
|
1017
|
+
}
|
|
1018
|
+
await collection.updateOne({ referenceKey: reference.referenceKey }, { $set: { updatedAt: now } });
|
|
1019
|
+
return this.recordSchemaSuccess({ referenceKey: reference.referenceKey });
|
|
1020
|
+
}
|
|
1021
|
+
try {
|
|
1022
|
+
await collection.insertOne(this.recordSchemaReferenceDocument(reference, now));
|
|
1023
|
+
}
|
|
1024
|
+
catch (error) {
|
|
1025
|
+
if (!(0, recordSchemaPersistence_1.isDuplicateKeyError)(error)) {
|
|
1026
|
+
throw error;
|
|
1027
|
+
}
|
|
1028
|
+
const racedReference = await collection.findOne({ referenceKey: reference.referenceKey });
|
|
1029
|
+
if (!racedReference ||
|
|
1030
|
+
(0, recordSchemaPersistence_1.referenceContentIdentity)((0, recordSchemaPersistence_1.referenceModelFromDocument)(racedReference)) !== (0, recordSchemaPersistence_1.referenceContentIdentity)(reference)) {
|
|
1031
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.REFERENCE_KEY_COLLISION, 'Record schema reference integrity check failed.', 'putRecordSchemaReference', error);
|
|
1032
|
+
}
|
|
1033
|
+
await collection.updateOne({ referenceKey: reference.referenceKey }, { $set: { updatedAt: now } });
|
|
1034
|
+
}
|
|
1035
|
+
return this.recordSchemaSuccess({ referenceKey: reference.referenceKey });
|
|
1036
|
+
}
|
|
1037
|
+
async putRecordSchemaReference(reference) {
|
|
1038
|
+
try {
|
|
1039
|
+
const validated = (0, recordSchemaPersistence_1.validateRecordSchemaReferenceInput)(reference);
|
|
1040
|
+
const now = new Date();
|
|
1041
|
+
const artifactCriteria = { digest: validated.digest };
|
|
1042
|
+
const artifact = await this.artifactCollection().findOne(artifactCriteria, {
|
|
1043
|
+
projection: { _id: 1 },
|
|
1044
|
+
});
|
|
1045
|
+
if (!artifact) {
|
|
1046
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.ARTIFACT_NOT_FOUND, 'Record schema reference target was not found.', 'putRecordSchemaReference');
|
|
1047
|
+
}
|
|
1048
|
+
const response = await this.storeRecordSchemaReference(validated, now);
|
|
1049
|
+
if (!response.success) {
|
|
1050
|
+
return response;
|
|
1051
|
+
}
|
|
1052
|
+
// Reference writes and retention deletion share this lock protocol.
|
|
1053
|
+
// A writer that raced with deletion removes its own temporary row and
|
|
1054
|
+
// fails, so no successful reference can become orphaned.
|
|
1055
|
+
const artifactAfterWrite = await this.artifactCollection().findOne({ digest: validated.digest }, { projection: { _id: 1 } });
|
|
1056
|
+
if (!artifactAfterWrite) {
|
|
1057
|
+
await this.referenceCollection().deleteOne({
|
|
1058
|
+
referenceKey: validated.referenceKey,
|
|
1059
|
+
digest: validated.digest,
|
|
1060
|
+
});
|
|
1061
|
+
return this.recordSchemaFailure(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.ARTIFACT_NOT_FOUND, 'Record schema reference target was not found.', 'putRecordSchemaReference');
|
|
1062
|
+
}
|
|
1063
|
+
return response;
|
|
1064
|
+
}
|
|
1065
|
+
catch (error) {
|
|
1066
|
+
return this.recordSchemaFailureFromError('putRecordSchemaReference', error);
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
recordSchemaQueryString(value, field, maximumLength = 512) {
|
|
1070
|
+
if (typeof value !== 'string' || value.length === 0 || value !== value.trim() || value.length > maximumLength) {
|
|
1071
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, `Record schema reference query ${field} is invalid.`);
|
|
1072
|
+
}
|
|
1073
|
+
return value;
|
|
1074
|
+
}
|
|
1075
|
+
recordSchemaQueryLimit(value) {
|
|
1076
|
+
if (typeof value !== 'number' ||
|
|
1077
|
+
!Number.isSafeInteger(value) ||
|
|
1078
|
+
value <= 0 ||
|
|
1079
|
+
value > recordSchemaPersistence_1.RECORD_SCHEMA_REFERENCE_QUERY_LIMIT_MAX) {
|
|
1080
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, `Record schema reference query limit must be between 1 and ${recordSchemaPersistence_1.RECORD_SCHEMA_REFERENCE_QUERY_LIMIT_MAX}.`);
|
|
1081
|
+
}
|
|
1082
|
+
return value;
|
|
1083
|
+
}
|
|
1084
|
+
async findRecordSchemaGrantForAuthorization(query) {
|
|
1085
|
+
try {
|
|
1086
|
+
if (!query || typeof query !== 'object') {
|
|
1087
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query is required.');
|
|
1088
|
+
}
|
|
1089
|
+
const schemaKind = query.schemaKind;
|
|
1090
|
+
if (schemaKind !== 'create' && schemaKind !== 'update') {
|
|
1091
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query schemaKind is invalid.');
|
|
1092
|
+
}
|
|
1093
|
+
if (!Array.isArray(query.roleNames)) {
|
|
1094
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query roleNames is invalid.');
|
|
1095
|
+
}
|
|
1096
|
+
const roleNames = [
|
|
1097
|
+
...new Set(query.roleNames.map(role => this.recordSchemaQueryString(role, 'roleNames'))),
|
|
1098
|
+
].sort();
|
|
1099
|
+
const criteria = {
|
|
1100
|
+
digest: (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(query.digest),
|
|
1101
|
+
kind: 'grant',
|
|
1102
|
+
brand: this.recordSchemaQueryString(query.brand, 'brand'),
|
|
1103
|
+
portal: this.recordSchemaQueryString(query.portal, 'portal'),
|
|
1104
|
+
schemaKind,
|
|
1105
|
+
recordType: this.recordSchemaQueryString(query.recordType, 'recordType'),
|
|
1106
|
+
operation: this.recordSchemaQueryString(query.operation, 'operation', 64),
|
|
1107
|
+
};
|
|
1108
|
+
if (query.afterReferenceKey !== undefined) {
|
|
1109
|
+
const afterReferenceKey = this.recordSchemaQueryString(query.afterReferenceKey, 'afterReferenceKey');
|
|
1110
|
+
if (!RecordSchemaReference_1.RECORD_SCHEMA_REFERENCE_KEY_PATTERN.test(afterReferenceKey)) {
|
|
1111
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema authorization query afterReferenceKey is invalid.');
|
|
1112
|
+
}
|
|
1113
|
+
criteria.referenceKey = { $gt: afterReferenceKey };
|
|
1114
|
+
}
|
|
1115
|
+
if (schemaKind === 'create') {
|
|
1116
|
+
const grant = await this.referenceCollection().findOne(criteria, {
|
|
1117
|
+
sort: { referenceKey: 1 },
|
|
1118
|
+
hint: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY,
|
|
1119
|
+
maxTimeMS: exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS,
|
|
1120
|
+
});
|
|
1121
|
+
return grant ? (0, recordSchemaPersistence_1.referenceModelFromDocument)(grant) : null;
|
|
1122
|
+
}
|
|
1123
|
+
const username = this.recordSchemaQueryString(query.username, 'username');
|
|
1124
|
+
const recordBrandId = this.recordSchemaQueryString(query.recordBrandId, 'recordBrandId');
|
|
1125
|
+
const editConditions = [{ 'authorization.edit': username }];
|
|
1126
|
+
if (roleNames.length > 0) {
|
|
1127
|
+
editConditions.push({ 'authorization.editRoles': { $in: roleNames } });
|
|
1128
|
+
}
|
|
1129
|
+
const grants = await this.referenceCollection()
|
|
1130
|
+
.aggregate([
|
|
1131
|
+
{ $match: criteria },
|
|
1132
|
+
{
|
|
1133
|
+
$lookup: {
|
|
1134
|
+
from: Record.tableName,
|
|
1135
|
+
localField: 'oid',
|
|
1136
|
+
foreignField: 'redboxOid',
|
|
1137
|
+
pipeline: [
|
|
1138
|
+
{
|
|
1139
|
+
$match: {
|
|
1140
|
+
'metaMetadata.brandId': recordBrandId,
|
|
1141
|
+
$or: editConditions,
|
|
1142
|
+
},
|
|
1143
|
+
},
|
|
1144
|
+
],
|
|
1145
|
+
as: 'authorizedRecords',
|
|
1146
|
+
},
|
|
1147
|
+
},
|
|
1148
|
+
{ $match: { 'authorizedRecords.0': { $exists: true } } },
|
|
1149
|
+
{ $sort: { referenceKey: 1 } },
|
|
1150
|
+
{ $limit: 1 },
|
|
1151
|
+
], { hint: exports.RECORD_SCHEMA_AUTHORIZATION_CURSOR_INDEX_KEY })
|
|
1152
|
+
.maxTimeMS(exports.RECORD_SCHEMA_AUTHORIZATION_LOOKUP_MAX_TIME_MS)
|
|
1153
|
+
.toArray();
|
|
1154
|
+
return grants[0] ? (0, recordSchemaPersistence_1.referenceModelFromDocument)(grants[0]) : null;
|
|
1155
|
+
}
|
|
1156
|
+
catch (error) {
|
|
1157
|
+
return this.throwRecordSchemaReadFailure('findRecordSchemaGrantForAuthorization', error);
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
async listRecordSchemaReferences(query) {
|
|
1161
|
+
try {
|
|
1162
|
+
if (!query || typeof query !== 'object') {
|
|
1163
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query is required.');
|
|
1164
|
+
}
|
|
1165
|
+
const limit = this.recordSchemaQueryLimit(query.limit);
|
|
1166
|
+
const criteria = {};
|
|
1167
|
+
if (query.digest !== undefined) {
|
|
1168
|
+
criteria.digest = (0, recordSchemaPersistence_1.validateRecordSchemaDigest)(query.digest);
|
|
1169
|
+
}
|
|
1170
|
+
if (query.kind !== undefined) {
|
|
1171
|
+
if (!['grant', 'save', 'pin'].includes(query.kind)) {
|
|
1172
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query kind is invalid.');
|
|
1173
|
+
}
|
|
1174
|
+
criteria.kind = query.kind;
|
|
1175
|
+
}
|
|
1176
|
+
if (query.schemaKind !== undefined) {
|
|
1177
|
+
if (query.schemaKind !== 'create' && query.schemaKind !== 'update') {
|
|
1178
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query schemaKind is invalid.');
|
|
1179
|
+
}
|
|
1180
|
+
criteria.schemaKind = query.schemaKind;
|
|
1181
|
+
}
|
|
1182
|
+
for (const [field, value] of [
|
|
1183
|
+
['brand', query.brand],
|
|
1184
|
+
['portal', query.portal],
|
|
1185
|
+
['recordType', query.recordType],
|
|
1186
|
+
['oid', query.oid],
|
|
1187
|
+
['operation', query.operation],
|
|
1188
|
+
['owner', query.owner],
|
|
1189
|
+
]) {
|
|
1190
|
+
if (value !== undefined) {
|
|
1191
|
+
criteria[field] = this.recordSchemaQueryString(value, field);
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
if (query.includeExpiredPins !== undefined && typeof query.includeExpiredPins !== 'boolean') {
|
|
1195
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query includeExpiredPins must be boolean.');
|
|
1196
|
+
}
|
|
1197
|
+
if (query.includeExpiredPins !== true) {
|
|
1198
|
+
criteria.$and = [
|
|
1199
|
+
{
|
|
1200
|
+
$or: [{ kind: { $ne: 'pin' } }, { expiresAt: { $exists: false } }, { expiresAt: { $gt: new Date() } }],
|
|
1201
|
+
},
|
|
1202
|
+
];
|
|
1203
|
+
}
|
|
1204
|
+
if (query.afterReferenceKey !== undefined) {
|
|
1205
|
+
const afterReferenceKey = this.recordSchemaQueryString(query.afterReferenceKey, 'afterReferenceKey');
|
|
1206
|
+
if (!RecordSchemaReference_1.RECORD_SCHEMA_REFERENCE_KEY_PATTERN.test(afterReferenceKey)) {
|
|
1207
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, 'Record schema reference query afterReferenceKey is invalid.');
|
|
1208
|
+
}
|
|
1209
|
+
criteria.referenceKey = { $gt: afterReferenceKey };
|
|
1210
|
+
}
|
|
1211
|
+
const documents = await this.referenceCollection()
|
|
1212
|
+
.find(criteria)
|
|
1213
|
+
.sort({ referenceKey: 1 })
|
|
1214
|
+
.limit(limit)
|
|
1215
|
+
.toArray();
|
|
1216
|
+
return documents.map(recordSchemaPersistence_1.referenceModelFromDocument);
|
|
1217
|
+
}
|
|
1218
|
+
catch (error) {
|
|
1219
|
+
return this.throwRecordSchemaReadFailure('listRecordSchemaReferences', error);
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
storedRecordSchemaDate(value, field) {
|
|
1223
|
+
const date = value instanceof Date ? value : new Date(String(value ?? ''));
|
|
1224
|
+
if (Number.isNaN(date.getTime())) {
|
|
1225
|
+
throw new recordSchemaPersistence_1.RecordSchemaPersistenceError(recordSchemaPersistence_1.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, `Stored record schema ${field} is invalid.`);
|
|
1226
|
+
}
|
|
1227
|
+
return date;
|
|
1228
|
+
}
|
|
1229
|
+
async create(_brand, record, _recordType, _user, options) {
|
|
1230
|
+
sails.log.verbose(`${this.logHeader} create() -> Begin`);
|
|
1231
|
+
// RecordsService may pre-assign the OID so attachment journal rows can
|
|
1232
|
+
// be prepared before the primary metadata commit. Preserve it when
|
|
1233
|
+
// supplied, while retaining the historical generated-OID behavior.
|
|
1234
|
+
record.redboxOid = record.redboxOid ?? this.getUuid();
|
|
1235
|
+
const response = this.createMutationResponse(String(record.redboxOid), options);
|
|
1236
|
+
const precondition = options?.precondition;
|
|
1237
|
+
// A create has no prior revision to compare, so a caller asserting one is
|
|
1238
|
+
// addressing a record that this call cannot be. An empty precondition is
|
|
1239
|
+
// accepted so callers can pass one normalized options object everywhere.
|
|
1240
|
+
if (precondition && (precondition.requireRevision || precondition.expectedRevision !== undefined)) {
|
|
1241
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Record creation does not accept an existing revision');
|
|
1242
|
+
}
|
|
1243
|
+
const serverRecord = _.cloneDeep(record);
|
|
1244
|
+
// The storage boundary owns creation revision regardless of anything a
|
|
1245
|
+
// request candidate supplied.
|
|
1246
|
+
serverRecord.revision = redbox_core_1.INITIAL_RECORD_REVISION;
|
|
1247
|
+
serverRecord.recordVersion = 1;
|
|
1248
|
+
delete serverRecord.figshareSyncIntent;
|
|
1249
|
+
if (options?.figshareIntent) {
|
|
1250
|
+
const { saveToken, readiness, intents } = options.figshareIntent;
|
|
1251
|
+
const requestedAt = new Date().toISOString();
|
|
1252
|
+
serverRecord.figshareSyncIntent = {
|
|
1253
|
+
...options.figshareIntent,
|
|
1254
|
+
generation: 1,
|
|
1255
|
+
pending: true,
|
|
1256
|
+
requestedAt,
|
|
1257
|
+
saves: [{ saveToken, readiness, requestedAt, intents }],
|
|
1258
|
+
};
|
|
1259
|
+
}
|
|
1260
|
+
_.unset(serverRecord, '_id');
|
|
1261
|
+
_.unset(serverRecord, 'id');
|
|
1262
|
+
_.unset(serverRecord, 'incarnationId');
|
|
1263
|
+
_.unset(serverRecord, 'lifecycleOperationId');
|
|
1264
|
+
const records = this.getNativeRecordCollection();
|
|
1265
|
+
if (typeof records?.insertOne !== 'function') {
|
|
1266
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic active record creation is unavailable');
|
|
1267
|
+
}
|
|
1268
|
+
let identity;
|
|
1269
|
+
try {
|
|
1270
|
+
identity = await this.claimNewRecordIdentity(String(record.redboxOid));
|
|
1271
|
+
}
|
|
1272
|
+
catch {
|
|
1273
|
+
return this.unknownMutation(response, 'Durable record identity ownership could not be confirmed');
|
|
1274
|
+
}
|
|
1275
|
+
if (!identity) {
|
|
1276
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1277
|
+
}
|
|
1278
|
+
if ('collision' in identity) {
|
|
1279
|
+
return this.notApplied(response, 'lifecycle-conflict', 'The record OID already has a durable incarnation');
|
|
1280
|
+
}
|
|
1281
|
+
const now = new Date().toISOString();
|
|
1282
|
+
const claimedIncarnationId = identity.incarnationId;
|
|
1283
|
+
serverRecord.incarnationId = claimedIncarnationId;
|
|
1284
|
+
serverRecord.dateCreated = serverRecord.dateCreated ?? now;
|
|
1285
|
+
serverRecord.lastSaveDate = now;
|
|
1286
|
+
try {
|
|
1287
|
+
sails.log.verbose(`${this.logHeader} Saving to DB...`);
|
|
1288
|
+
await records.insertOne(serverRecord);
|
|
1289
|
+
this.committed(response, serverRecord, 'updated');
|
|
217
1290
|
sails.log.verbose(`${this.logHeader} Record created...`);
|
|
218
1291
|
}
|
|
219
1292
|
catch (err) {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
1293
|
+
if (this.isDuplicateKeyError(err)) {
|
|
1294
|
+
// Another writer owns this OID's state, so its ledger row is correct.
|
|
1295
|
+
return this.notApplied(response, 'lifecycle-conflict', 'The record OID already exists');
|
|
1296
|
+
}
|
|
1297
|
+
sails.log.error(`${this.logHeader} record_create_outcome_unknown`, {
|
|
1298
|
+
event: 'record_create_outcome_unknown',
|
|
1299
|
+
error_type: err instanceof Error ? err.name : 'unknown',
|
|
1300
|
+
});
|
|
1301
|
+
let observed;
|
|
1302
|
+
try {
|
|
1303
|
+
observed = await this.readCurrentState(String(record.redboxOid));
|
|
1304
|
+
}
|
|
1305
|
+
catch {
|
|
1306
|
+
observed = undefined;
|
|
1307
|
+
}
|
|
1308
|
+
if (observed?.active && this.storedIncarnationId(observed.active) === claimedIncarnationId) {
|
|
1309
|
+
return this.committed(response, observed.active, 'updated');
|
|
1310
|
+
}
|
|
1311
|
+
// A dispatched/ambiguous failure may still materialize later, so only
|
|
1312
|
+
// a definitive driver rejection is eligible for compensating release.
|
|
1313
|
+
if (this.isCertifiedCreateNonApplication(err)) {
|
|
1314
|
+
await this.releaseUnusedRecordIdentity(String(record.redboxOid), claimedIncarnationId);
|
|
1315
|
+
}
|
|
1316
|
+
this.unknownMutation(response, 'Record creation could not be confirmed');
|
|
224
1317
|
return response;
|
|
225
1318
|
}
|
|
226
|
-
sails.log.verbose(JSON.stringify(response));
|
|
227
1319
|
sails.log.verbose(`${this.logHeader} create() -> End`);
|
|
228
1320
|
return response;
|
|
229
1321
|
}
|
|
230
|
-
async updateMeta(brand, oid, record, user, options
|
|
231
|
-
const response =
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
1322
|
+
async updateMeta(brand, oid, record, user, options) {
|
|
1323
|
+
const response = this.createMutationResponse(oid, options);
|
|
1324
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1325
|
+
if (expectedRevision === null)
|
|
1326
|
+
return response;
|
|
1327
|
+
if (expectedRevision === Number.MAX_SAFE_INTEGER) {
|
|
1328
|
+
return this.notApplied(response, 'capability-unavailable', 'The record revision cannot be advanced safely');
|
|
1329
|
+
}
|
|
1330
|
+
const collection = this.getNativeRecordCollection();
|
|
1331
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1332
|
+
return this.notApplied(response, 'capability-unavailable', 'The storage adapter cannot perform an atomic record revision update');
|
|
1333
|
+
}
|
|
1334
|
+
const candidate = _.cloneDeep(record);
|
|
1335
|
+
// Identity, creation, and revision are owned by storage, never by the
|
|
1336
|
+
// candidate; lastSaveDate is reissued with the committing write.
|
|
1337
|
+
for (const field of [
|
|
1338
|
+
'_id',
|
|
1339
|
+
'id',
|
|
1340
|
+
'redboxOid',
|
|
1341
|
+
'revision',
|
|
1342
|
+
'recordVersion',
|
|
1343
|
+
'figshareSyncIntent',
|
|
1344
|
+
'incarnationId',
|
|
1345
|
+
'lifecycleOperationId',
|
|
1346
|
+
'dateCreated',
|
|
1347
|
+
'lastSaveDate',
|
|
1348
|
+
]) {
|
|
1349
|
+
_.unset(candidate, field);
|
|
1350
|
+
}
|
|
1351
|
+
if (this.unsafeCandidateField(candidate) !== undefined) {
|
|
1352
|
+
sails.log.error(`${this.logHeader} refusing an update for oid ${oid}: unsupported candidate field name`);
|
|
1353
|
+
return this.notApplied(response, 'capability-unavailable', 'Record candidate contains an unsupported field');
|
|
1354
|
+
}
|
|
1355
|
+
const activeBrandId = this.brandIdOf(brand);
|
|
1356
|
+
const candidateSuppliesMetaMetadata = Object.prototype.hasOwnProperty.call(candidate, 'metaMetadata');
|
|
1357
|
+
const candidateBrandId = String(_.get(candidate, 'metaMetadata.brandId', '') ?? '').trim();
|
|
1358
|
+
if (activeBrandId && candidateSuppliesMetaMetadata && candidateBrandId !== activeBrandId) {
|
|
1359
|
+
return this.notApplied(response, 'brand-mismatch', 'Record was not found');
|
|
1360
|
+
}
|
|
1361
|
+
const update = options?.figshareIntent
|
|
1362
|
+
? (() => {
|
|
247
1363
|
const intent = options.figshareIntent;
|
|
248
1364
|
const requestedAt = new Date().toISOString();
|
|
249
|
-
const save = {
|
|
1365
|
+
const save = {
|
|
1366
|
+
saveToken: intent.saveToken,
|
|
1367
|
+
readiness: intent.readiness,
|
|
1368
|
+
requestedAt,
|
|
1369
|
+
intents: intent.intents,
|
|
1370
|
+
};
|
|
1371
|
+
const assignments = Object.fromEntries(Object.entries(candidate).map(([key, value]) => [key, { $literal: value }]));
|
|
1372
|
+
assignments.lastSaveDate = { $literal: requestedAt };
|
|
1373
|
+
assignments.revision = { $add: [{ $ifNull: ['$revision', redbox_core_1.INITIAL_RECORD_REVISION] }, 1] };
|
|
1374
|
+
assignments.recordVersion = { $add: [{ $ifNull: ['$recordVersion', 0] }, 1] };
|
|
250
1375
|
assignments.figshareSyncIntent = {
|
|
251
1376
|
$mergeObjects: [
|
|
252
1377
|
{ $literal: { ...intent, pending: true, requestedAt } },
|
|
253
|
-
{
|
|
254
|
-
|
|
255
|
-
|
|
1378
|
+
{
|
|
1379
|
+
generation: { $add: [{ $ifNull: ['$figshareSyncIntent.generation', 0] }, 1] },
|
|
1380
|
+
saves: { $concatArrays: [priorFigshareSaves, [{ $literal: save }]] },
|
|
1381
|
+
},
|
|
1382
|
+
],
|
|
256
1383
|
};
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
1384
|
+
return [{ $set: assignments }, deriveFigshareIntent];
|
|
1385
|
+
})()
|
|
1386
|
+
: {
|
|
1387
|
+
$set: { ...candidate, lastSaveDate: new Date().toISOString() },
|
|
1388
|
+
$inc: { revision: 1, recordVersion: 1 },
|
|
1389
|
+
};
|
|
1390
|
+
const selector = this.mutationSelector(this.activeIdentity(brand, oid), expectedRevision);
|
|
1391
|
+
if (options?.expectedVersion != null)
|
|
1392
|
+
selector.recordVersion = options.expectedVersion === 0 ? { $in: [0, null] } : options.expectedVersion;
|
|
1393
|
+
const result = await this.commitConditionalMutation({
|
|
1394
|
+
response,
|
|
1395
|
+
kind: 'updated',
|
|
1396
|
+
dispatch: () => collection.findOneAndUpdate(selector, update, { returnDocument: 'after', includeResultMetadata: false }),
|
|
1397
|
+
classify: () => this.classifyActiveNoMatch(brand, oid, expectedRevision),
|
|
1398
|
+
expectedRevision,
|
|
1399
|
+
onDispatchError: err => {
|
|
1400
|
+
sails.log.error(`${this.logHeader} updateMeta() failed for oid ${oid}: ${this.getErrorMessage(err)}`);
|
|
1401
|
+
sails.log.error(`${this.logHeader} Failed to save update to MongoDB: ${JSON.stringify({
|
|
1402
|
+
error: err,
|
|
1403
|
+
response,
|
|
1404
|
+
brand,
|
|
1405
|
+
oid,
|
|
1406
|
+
user,
|
|
1407
|
+
})}`);
|
|
1408
|
+
},
|
|
1409
|
+
});
|
|
1410
|
+
if (options?.expectedVersion != null && result.applicationState === 'not-applied')
|
|
1411
|
+
throw new redbox_core_1.RecordWriteConflict();
|
|
1412
|
+
return result;
|
|
1413
|
+
}
|
|
1414
|
+
/**
|
|
1415
|
+
* Dispatch one atomic conditional mutation and turn its single driver fact
|
|
1416
|
+
* into a mutation response.
|
|
1417
|
+
*
|
|
1418
|
+
* The three outcomes are deliberately distinct: a returned document is an
|
|
1419
|
+
* applied commit, `null` certifies that the selector matched nothing and
|
|
1420
|
+
* therefore that no write happened, and anything else — including a throw
|
|
1421
|
+
* after dispatch — stays `unknown`. A failed follow-up classification only
|
|
1422
|
+
* costs the precise reason; it never turns a certified no-match into a
|
|
1423
|
+
* write, and it never issues one.
|
|
1424
|
+
*/
|
|
1425
|
+
async commitConditionalMutation(operation) {
|
|
1426
|
+
const { response, kind, dispatch, classify, expectedRevision, onDispatchError } = operation;
|
|
1427
|
+
let document;
|
|
1428
|
+
try {
|
|
1429
|
+
document = this.mutationDocument(await dispatch());
|
|
264
1430
|
}
|
|
265
1431
|
catch (err) {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
const errorMessage = this.getErrorMessage(err);
|
|
269
|
-
sails.log.error(`${this.logHeader} updateMeta() failed for oid ${oid}: ${errorMessage}`);
|
|
270
|
-
sails.log.error(`${this.logHeader} Failed to save update to MongoDB: ${JSON.stringify({
|
|
271
|
-
error: err,
|
|
272
|
-
response,
|
|
273
|
-
brand,
|
|
274
|
-
oid,
|
|
275
|
-
record,
|
|
276
|
-
user,
|
|
277
|
-
})}`);
|
|
278
|
-
response.success = false;
|
|
279
|
-
response.message = errorMessage;
|
|
1432
|
+
onDispatchError?.(err);
|
|
1433
|
+
return this.unknownMutation(response, this.getErrorMessage(err));
|
|
280
1434
|
}
|
|
281
|
-
|
|
1435
|
+
if (document === undefined) {
|
|
1436
|
+
return this.unknownMutation(response, 'Storage returned an unrecognized mutation result');
|
|
1437
|
+
}
|
|
1438
|
+
if (document !== null) {
|
|
1439
|
+
return this.committed(response, document, kind, expectedRevision);
|
|
1440
|
+
}
|
|
1441
|
+
try {
|
|
1442
|
+
return this.notApplied(response, await classify());
|
|
1443
|
+
}
|
|
1444
|
+
catch (err) {
|
|
1445
|
+
sails.log.error(`${this.logHeader} could not classify a certified no-match for oid ${response.oid}: ` +
|
|
1446
|
+
this.getErrorMessage(err));
|
|
1447
|
+
return this.notApplied(response, 'capability-unavailable');
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
async removeActiveRecord(brand, oid, options) {
|
|
1451
|
+
const response = this.createMutationResponse(oid, options);
|
|
1452
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1453
|
+
if (expectedRevision === null)
|
|
1454
|
+
return response;
|
|
1455
|
+
const collection = this.getNativeRecordCollection();
|
|
1456
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1457
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic active record removal is unavailable');
|
|
1458
|
+
}
|
|
1459
|
+
let current;
|
|
1460
|
+
try {
|
|
1461
|
+
current = this.mutationDocument(await collection.findOne(this.mutationSelector(this.activeIdentity(brand, oid), expectedRevision)));
|
|
1462
|
+
if (current && !(await this.ensureRecordIdentity(oid, current))) {
|
|
1463
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
catch (error) {
|
|
1467
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1468
|
+
}
|
|
1469
|
+
return this.commitConditionalMutation({
|
|
1470
|
+
response,
|
|
1471
|
+
kind: 'removed',
|
|
1472
|
+
dispatch: () => collection.findOneAndDelete(this.mutationSelector(this.activeIdentity(brand, oid), expectedRevision), {
|
|
1473
|
+
includeResultMetadata: false,
|
|
1474
|
+
}),
|
|
1475
|
+
classify: () => this.classifyActiveNoMatch(brand, oid, expectedRevision),
|
|
1476
|
+
expectedRevision,
|
|
1477
|
+
});
|
|
1478
|
+
}
|
|
1479
|
+
async createTombstone(brand, oid, record, options) {
|
|
1480
|
+
const response = this.createMutationResponse(oid, options);
|
|
1481
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1482
|
+
if (expectedRevision === null)
|
|
1483
|
+
return response;
|
|
1484
|
+
if (expectedRevision === undefined || !(0, redbox_core_1.isCanonicalSaveRequestId)(options?.lifecycle?.operationId)) {
|
|
1485
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact lifecycle intent ownership is required');
|
|
1486
|
+
}
|
|
1487
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1488
|
+
if (!this.supportsAtomicMutation(collection) || typeof collection.insertOne !== 'function') {
|
|
1489
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic tombstone creation is unavailable');
|
|
1490
|
+
}
|
|
1491
|
+
const candidate = _.cloneDeep(record);
|
|
1492
|
+
for (const field of ['_id', 'id'])
|
|
1493
|
+
_.unset(candidate, field);
|
|
1494
|
+
const operation = candidate.lifecycleOperation;
|
|
1495
|
+
const targetRevision = (0, redbox_core_1.nextRecordRevision)(expectedRevision);
|
|
1496
|
+
const expectedState = options.lifecycle.expectedState;
|
|
1497
|
+
if (candidate.redboxOid !== oid ||
|
|
1498
|
+
candidate.revision !== targetRevision ||
|
|
1499
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleState)(candidate.lifecycleState) ||
|
|
1500
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(operation) ||
|
|
1501
|
+
(expectedState !== 'delete-pending' && expectedState !== 'purge-pending') ||
|
|
1502
|
+
candidate.lifecycleState !== expectedState ||
|
|
1503
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(candidate.lifecycleState, operation.kind) ||
|
|
1504
|
+
operation.operationId !== options.lifecycle.operationId ||
|
|
1505
|
+
operation.sourceRevision !== expectedRevision ||
|
|
1506
|
+
operation.targetRevision !== targetRevision) {
|
|
1507
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone lifecycle intent is invalid');
|
|
1508
|
+
}
|
|
1509
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
1510
|
+
const candidateBrandId = String(candidate.brandId ?? '').trim();
|
|
1511
|
+
const snapshotBrandId = String(_.get(candidate, 'deletedRecordMetadata.metaMetadata.brandId', '') ?? '').trim();
|
|
1512
|
+
if (requestedBrandId && (candidateBrandId !== requestedBrandId || snapshotBrandId !== requestedBrandId)) {
|
|
1513
|
+
return this.notApplied(response, 'brand-mismatch', 'Tombstone was not found');
|
|
1514
|
+
}
|
|
1515
|
+
if (!candidate.deletedRecordMetadata ||
|
|
1516
|
+
typeof candidate.deletedRecordMetadata !== 'object' ||
|
|
1517
|
+
Array.isArray(candidate.deletedRecordMetadata) ||
|
|
1518
|
+
_.get(candidate, 'deletedRecordMetadata.redboxOid') !== oid) {
|
|
1519
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone record snapshot is invalid');
|
|
1520
|
+
}
|
|
1521
|
+
_.unset(candidate, 'deletedRecordMetadata.revision');
|
|
1522
|
+
let incarnationId;
|
|
1523
|
+
try {
|
|
1524
|
+
incarnationId = await this.ensureRecordIdentity(oid, candidate.deletedRecordMetadata);
|
|
1525
|
+
}
|
|
1526
|
+
catch (error) {
|
|
1527
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1528
|
+
}
|
|
1529
|
+
if (!incarnationId) {
|
|
1530
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1531
|
+
}
|
|
1532
|
+
const suppliedIncarnationId = this.storedIncarnationId(candidate) ?? this.storedIncarnationId(candidate.deletedRecordMetadata);
|
|
1533
|
+
if (suppliedIncarnationId && suppliedIncarnationId !== incarnationId) {
|
|
1534
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone incarnation identity diverged');
|
|
1535
|
+
}
|
|
1536
|
+
candidate.incarnationId = incarnationId;
|
|
1537
|
+
candidate.deletedRecordMetadata.incarnationId = incarnationId;
|
|
1538
|
+
try {
|
|
1539
|
+
await collection.insertOne(candidate);
|
|
1540
|
+
return this.committed(response, candidate, 'updated', expectedRevision);
|
|
1541
|
+
}
|
|
1542
|
+
catch (error) {
|
|
1543
|
+
if (!this.isDuplicateKeyError(error)) {
|
|
1544
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1545
|
+
}
|
|
1546
|
+
try {
|
|
1547
|
+
const existing = this.mutationDocument(await collection.findOne({ redboxOid: oid }));
|
|
1548
|
+
if (existing === undefined)
|
|
1549
|
+
return this.unknownMutation(response, 'Tombstone ownership could not be observed');
|
|
1550
|
+
if (existing === null)
|
|
1551
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1552
|
+
if (!this.isRequestedBrand(existing, requestedBrandId))
|
|
1553
|
+
return this.notApplied(response, 'brand-mismatch');
|
|
1554
|
+
const existingOperation = existing.lifecycleOperation;
|
|
1555
|
+
if (!(0, redbox_core_1.isRecordRevision)(existing.revision) ||
|
|
1556
|
+
existing.revision < targetRevision ||
|
|
1557
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleState)(existing.lifecycleState) ||
|
|
1558
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(existingOperation) ||
|
|
1559
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(existing.lifecycleState, existingOperation.kind) ||
|
|
1560
|
+
existingOperation.operationId !== options.lifecycle.operationId ||
|
|
1561
|
+
existingOperation.kind !== operation.kind) {
|
|
1562
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1563
|
+
}
|
|
1564
|
+
return this.committed(response, existing, 'updated');
|
|
1565
|
+
}
|
|
1566
|
+
catch (readError) {
|
|
1567
|
+
return this.unknownMutation(response, this.getErrorMessage(readError));
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
async updateTombstone(brand, oid, record, options) {
|
|
1572
|
+
const response = this.createMutationResponse(oid, options);
|
|
1573
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1574
|
+
if (expectedRevision === null)
|
|
1575
|
+
return response;
|
|
1576
|
+
if (expectedRevision === Number.MAX_SAFE_INTEGER) {
|
|
1577
|
+
return this.notApplied(response, 'capability-unavailable', 'The tombstone revision cannot be advanced safely');
|
|
1578
|
+
}
|
|
1579
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1580
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1581
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic tombstone update is unavailable');
|
|
1582
|
+
}
|
|
1583
|
+
if (expectedRevision === undefined || !options?.lifecycle?.expectedState) {
|
|
1584
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact lifecycle state and revision are required');
|
|
1585
|
+
}
|
|
1586
|
+
const candidate = _.cloneDeep(record);
|
|
1587
|
+
for (const field of ['_id', 'id', 'redboxOid', 'revision', 'incarnationId', 'dateDeleted'])
|
|
1588
|
+
_.unset(candidate, field);
|
|
1589
|
+
if (this.unsafeCandidateField(candidate) !== undefined) {
|
|
1590
|
+
sails.log.error(`${this.logHeader} refusing a tombstone update for oid ${oid}: unsupported candidate field`);
|
|
1591
|
+
return this.notApplied(response, 'capability-unavailable', 'Tombstone candidate contains an unsupported field');
|
|
1592
|
+
}
|
|
1593
|
+
if (!(0, redbox_core_1.isDeletedRecordLifecycleState)(candidate.lifecycleState)) {
|
|
1594
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone lifecycle state is invalid');
|
|
1595
|
+
}
|
|
1596
|
+
const operation = candidate.lifecycleOperation;
|
|
1597
|
+
if (!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(operation) ||
|
|
1598
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(candidate.lifecycleState, operation.kind) ||
|
|
1599
|
+
operation.sourceRevision > expectedRevision ||
|
|
1600
|
+
operation.targetRevision !== (0, redbox_core_1.nextRecordRevision)(expectedRevision) ||
|
|
1601
|
+
(options.lifecycle.operationId !== undefined && operation.operationId !== options.lifecycle.operationId)) {
|
|
1602
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone lifecycle operation is invalid');
|
|
1603
|
+
}
|
|
1604
|
+
if (candidate.deletedRecordMetadata !== undefined &&
|
|
1605
|
+
(candidate.deletedRecordMetadata === null ||
|
|
1606
|
+
typeof candidate.deletedRecordMetadata !== 'object' ||
|
|
1607
|
+
Array.isArray(candidate.deletedRecordMetadata))) {
|
|
1608
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Tombstone record snapshot is invalid');
|
|
1609
|
+
}
|
|
1610
|
+
if (candidate.deletedRecordMetadata && typeof candidate.deletedRecordMetadata === 'object') {
|
|
1611
|
+
// The wrapper is the sole current lifecycle revision authority. Source
|
|
1612
|
+
// lineage lives in lifecycleOperation.sourceRevision.
|
|
1613
|
+
_.unset(candidate, 'deletedRecordMetadata.revision');
|
|
1614
|
+
}
|
|
1615
|
+
try {
|
|
1616
|
+
const current = this.mutationDocument(await collection.findOne(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options)));
|
|
1617
|
+
if (current) {
|
|
1618
|
+
const incarnationId = await this.ensureRecordIdentity(oid, current);
|
|
1619
|
+
if (!incarnationId) {
|
|
1620
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1621
|
+
}
|
|
1622
|
+
if (candidate.deletedRecordMetadata && typeof candidate.deletedRecordMetadata === 'object') {
|
|
1623
|
+
candidate.deletedRecordMetadata.incarnationId = incarnationId;
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
catch (error) {
|
|
1628
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1629
|
+
}
|
|
1630
|
+
const activeBrandId = this.brandIdOf(brand);
|
|
1631
|
+
const candidateBrandId = String(candidate.brandId ?? '').trim();
|
|
1632
|
+
const candidateSuppliesBrandId = Object.prototype.hasOwnProperty.call(candidate, 'brandId');
|
|
1633
|
+
const candidateSuppliesSnapshot = Object.prototype.hasOwnProperty.call(candidate, 'deletedRecordMetadata');
|
|
1634
|
+
const candidateSnapshotBrandId = String(_.get(candidate, 'deletedRecordMetadata.metaMetadata.brandId', '') ?? '').trim();
|
|
1635
|
+
if (activeBrandId &&
|
|
1636
|
+
((candidateSuppliesBrandId && candidateBrandId !== activeBrandId) ||
|
|
1637
|
+
(candidateSuppliesSnapshot && candidateSnapshotBrandId !== activeBrandId))) {
|
|
1638
|
+
return this.notApplied(response, 'brand-mismatch', 'Tombstone was not found');
|
|
1639
|
+
}
|
|
1640
|
+
return this.commitConditionalMutation({
|
|
1641
|
+
response,
|
|
1642
|
+
kind: 'updated',
|
|
1643
|
+
dispatch: () => collection.findOneAndUpdate(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options), { $set: candidate, $inc: { revision: 1 } }, { returnDocument: 'after', includeResultMetadata: false }),
|
|
1644
|
+
classify: () => this.classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options),
|
|
1645
|
+
expectedRevision,
|
|
1646
|
+
});
|
|
1647
|
+
}
|
|
1648
|
+
async removeTombstone(brand, oid, options) {
|
|
1649
|
+
const response = this.createMutationResponse(oid, options);
|
|
1650
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1651
|
+
if (expectedRevision === null)
|
|
1652
|
+
return response;
|
|
1653
|
+
if (expectedRevision === undefined ||
|
|
1654
|
+
!options?.lifecycle?.expectedState ||
|
|
1655
|
+
!(0, redbox_core_1.isCanonicalSaveRequestId)(options.lifecycle.operationId)) {
|
|
1656
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact lifecycle removal ownership is required');
|
|
1657
|
+
}
|
|
1658
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1659
|
+
if (!this.supportsAtomicMutation(collection)) {
|
|
1660
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic tombstone removal is unavailable');
|
|
1661
|
+
}
|
|
1662
|
+
try {
|
|
1663
|
+
const current = this.mutationDocument(await collection.findOne(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options)));
|
|
1664
|
+
if (current && !(await this.ensureRecordIdentity(oid, current))) {
|
|
1665
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1666
|
+
}
|
|
1667
|
+
}
|
|
1668
|
+
catch (error) {
|
|
1669
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1670
|
+
}
|
|
1671
|
+
return this.commitConditionalMutation({
|
|
1672
|
+
response,
|
|
1673
|
+
kind: 'removed',
|
|
1674
|
+
dispatch: () => collection.findOneAndDelete(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options), { includeResultMetadata: false }),
|
|
1675
|
+
classify: () => this.classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options),
|
|
1676
|
+
expectedRevision,
|
|
1677
|
+
});
|
|
1678
|
+
}
|
|
1679
|
+
async createActiveRecordFromTombstone(brand, oid, record, options) {
|
|
1680
|
+
const response = this.createMutationResponse(oid, options);
|
|
1681
|
+
const expectedRevision = this.expectedRevision(options, response);
|
|
1682
|
+
const operationId = options?.lifecycle?.operationId;
|
|
1683
|
+
if (expectedRevision === null ||
|
|
1684
|
+
expectedRevision === undefined ||
|
|
1685
|
+
!(0, redbox_core_1.isCanonicalSaveRequestId)(operationId) ||
|
|
1686
|
+
(options?.lifecycle?.expectedState !== 'restore-pending' &&
|
|
1687
|
+
options?.lifecycle?.expectedState !== 'recovery-required')) {
|
|
1688
|
+
return this.notApplied(response, 'capability-unavailable', 'Exact restore ownership is required');
|
|
1689
|
+
}
|
|
1690
|
+
const records = this.getNativeRecordCollection();
|
|
1691
|
+
const tombstones = this.getNativeTombstoneCollection();
|
|
1692
|
+
if (!this.supportsAtomicMutation(records) ||
|
|
1693
|
+
!this.supportsAtomicMutation(tombstones) ||
|
|
1694
|
+
typeof records.insertOne !== 'function') {
|
|
1695
|
+
return this.notApplied(response, 'capability-unavailable', 'Atomic restore creation is unavailable');
|
|
1696
|
+
}
|
|
1697
|
+
let claimed;
|
|
1698
|
+
try {
|
|
1699
|
+
claimed = this.mutationDocument(await tombstones.findOne(this.lifecycleMutationSelector(this.tombstoneIdentity(brand, oid), expectedRevision, options)));
|
|
1700
|
+
}
|
|
1701
|
+
catch (error) {
|
|
1702
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1703
|
+
}
|
|
1704
|
+
if (claimed === undefined)
|
|
1705
|
+
return this.unknownMutation(response, 'Restore ownership could not be observed');
|
|
1706
|
+
if (claimed === null) {
|
|
1707
|
+
const reason = await this.classifyLifecycleTombstoneNoMatch(brand, oid, expectedRevision, options).catch(() => 'capability-unavailable');
|
|
1708
|
+
return this.notApplied(response, reason);
|
|
1709
|
+
}
|
|
1710
|
+
const targetRevision = (0, redbox_core_1.nextRecordRevision)(expectedRevision);
|
|
1711
|
+
const claimedOperation = claimed.lifecycleOperation;
|
|
1712
|
+
const claimedSnapshot = claimed.deletedRecordMetadata;
|
|
1713
|
+
if (!(0, redbox_core_1.isDeletedRecordLifecycleState)(claimed.lifecycleState) ||
|
|
1714
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperation)(claimedOperation) ||
|
|
1715
|
+
!(0, redbox_core_1.isDeletedRecordLifecycleOperationForState)(claimed.lifecycleState, claimedOperation.kind) ||
|
|
1716
|
+
claimedOperation.kind !== 'restore' ||
|
|
1717
|
+
claimedOperation.operationId !== operationId ||
|
|
1718
|
+
claimedOperation.targetRevision !== expectedRevision ||
|
|
1719
|
+
!claimedSnapshot ||
|
|
1720
|
+
typeof claimedSnapshot !== 'object' ||
|
|
1721
|
+
Array.isArray(claimedSnapshot)) {
|
|
1722
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Claimed restore state is invalid');
|
|
1723
|
+
}
|
|
1724
|
+
let incarnationId;
|
|
1725
|
+
try {
|
|
1726
|
+
incarnationId = await this.ensureRecordIdentity(oid, claimed);
|
|
1727
|
+
}
|
|
1728
|
+
catch (error) {
|
|
1729
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1730
|
+
}
|
|
1731
|
+
if (!incarnationId) {
|
|
1732
|
+
return this.notApplied(response, 'capability-unavailable', 'Durable record identity ownership is unavailable');
|
|
1733
|
+
}
|
|
1734
|
+
const claimedIncarnationId = this.storedIncarnationId(claimed) ?? this.storedIncarnationId(claimedSnapshot);
|
|
1735
|
+
if (claimedIncarnationId && claimedIncarnationId !== incarnationId) {
|
|
1736
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Restore incarnation identity diverged');
|
|
1737
|
+
}
|
|
1738
|
+
const restoredInput = _.cloneDeep(record);
|
|
1739
|
+
const restored = _.cloneDeep(claimedSnapshot);
|
|
1740
|
+
for (const field of ['_id', 'id', 'revision', 'incarnationId', 'lifecycleOperationId', 'lastSaveDate']) {
|
|
1741
|
+
_.unset(restored, field);
|
|
1742
|
+
}
|
|
1743
|
+
const requestedBrandId = this.brandIdOf(brand);
|
|
1744
|
+
if (restoredInput.redboxOid !== oid ||
|
|
1745
|
+
restored.redboxOid !== oid ||
|
|
1746
|
+
(requestedBrandId &&
|
|
1747
|
+
(String(_.get(restoredInput, 'metaMetadata.brandId', '') ?? '').trim() !== requestedBrandId ||
|
|
1748
|
+
String(_.get(restored, 'metaMetadata.brandId', '') ?? '').trim() !== requestedBrandId))) {
|
|
1749
|
+
return this.notApplied(response, 'brand-mismatch', 'Record was not found');
|
|
1750
|
+
}
|
|
1751
|
+
if (this.unsafeCandidateField(restored) !== undefined) {
|
|
1752
|
+
return this.notApplied(response, 'lifecycle-conflict', 'Restored record contains an unsupported field');
|
|
1753
|
+
}
|
|
1754
|
+
const candidate = {
|
|
1755
|
+
...restored,
|
|
1756
|
+
redboxOid: oid,
|
|
1757
|
+
revision: targetRevision,
|
|
1758
|
+
incarnationId,
|
|
1759
|
+
lifecycleOperationId: operationId,
|
|
1760
|
+
lastSaveDate: new Date().toISOString(),
|
|
1761
|
+
};
|
|
1762
|
+
try {
|
|
1763
|
+
await records.insertOne(candidate);
|
|
1764
|
+
return this.committed(response, candidate, 'updated', expectedRevision);
|
|
1765
|
+
}
|
|
1766
|
+
catch (error) {
|
|
1767
|
+
if (!this.isDuplicateKeyError(error)) {
|
|
1768
|
+
return this.unknownMutation(response, this.getErrorMessage(error));
|
|
1769
|
+
}
|
|
1770
|
+
try {
|
|
1771
|
+
const existing = this.mutationDocument(await records.findOne({ redboxOid: oid }));
|
|
1772
|
+
if (existing === undefined)
|
|
1773
|
+
return this.unknownMutation(response, 'Restored active state could not be observed');
|
|
1774
|
+
if (existing === null)
|
|
1775
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1776
|
+
if (!this.isRequestedBrand(existing, requestedBrandId))
|
|
1777
|
+
return this.notApplied(response, 'brand-mismatch');
|
|
1778
|
+
if (existing.lifecycleOperationId !== operationId ||
|
|
1779
|
+
!(0, redbox_core_1.isRecordRevision)(existing.revision) ||
|
|
1780
|
+
existing.revision < targetRevision) {
|
|
1781
|
+
return this.notApplied(response, 'lifecycle-conflict');
|
|
1782
|
+
}
|
|
1783
|
+
return this.committed(response, existing, 'updated');
|
|
1784
|
+
}
|
|
1785
|
+
catch (readError) {
|
|
1786
|
+
return this.unknownMutation(response, this.getErrorMessage(readError));
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
async getTombstone(brand, oid) {
|
|
1791
|
+
if (!oid.trim())
|
|
1792
|
+
throw new Error(`${this.logHeader} getTombstone() -> refusing to search using an empty OID`);
|
|
1793
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1794
|
+
if (typeof collection?.findOne !== 'function')
|
|
1795
|
+
throw new Error('Tombstone reads are unavailable');
|
|
1796
|
+
const result = this.mutationDocument(await collection.findOne(this.tombstoneIdentity(brand, oid)));
|
|
1797
|
+
if (result === undefined)
|
|
1798
|
+
throw new Error('Storage returned an unrecognized tombstone result');
|
|
1799
|
+
return result;
|
|
1800
|
+
}
|
|
1801
|
+
async getLifecycleTombstones(states, limit = 100) {
|
|
1802
|
+
const normalizedStates = states.filter(redbox_core_1.isDeletedRecordLifecycleState);
|
|
1803
|
+
if (normalizedStates.length === 0)
|
|
1804
|
+
return [];
|
|
1805
|
+
const collection = this.getNativeTombstoneCollection();
|
|
1806
|
+
if (typeof collection?.find !== 'function')
|
|
1807
|
+
throw new Error('Lifecycle recovery scans are unavailable');
|
|
1808
|
+
const boundedLimit = Math.max(1, Math.min(Number.isSafeInteger(limit) ? limit : 100, 1000));
|
|
1809
|
+
return (await collection
|
|
1810
|
+
.find({ lifecycleState: { $in: normalizedStates } })
|
|
1811
|
+
.limit(boundedLimit)
|
|
1812
|
+
.toArray());
|
|
282
1813
|
}
|
|
283
1814
|
async scanFigshareRecords(afterOid, limit) {
|
|
284
|
-
return this.recordCol
|
|
1815
|
+
return this.recordCol
|
|
1816
|
+
.find({ redboxOid: { $gt: afterOid } })
|
|
1817
|
+
.sort({ redboxOid: 1 })
|
|
1818
|
+
.limit(limit)
|
|
1819
|
+
.toArray();
|
|
285
1820
|
}
|
|
286
1821
|
async findFigshareArticleRecords(path, articleId) {
|
|
287
1822
|
(0, redbox_core_1.assertRecordFieldPaths)({ [path]: articleId }, [path]);
|
|
@@ -289,35 +1824,104 @@ var Services;
|
|
|
289
1824
|
}
|
|
290
1825
|
async setRecordFields(oid, fields, expectedVersion, allowedPaths) {
|
|
291
1826
|
(0, redbox_core_1.assertRecordFieldPaths)(fields, allowedPaths);
|
|
292
|
-
const result = await this.recordCol.findOneAndUpdate({
|
|
293
|
-
|
|
1827
|
+
const result = await this.recordCol.findOneAndUpdate({
|
|
1828
|
+
...this.mutationSelector({ redboxOid: oid }, undefined),
|
|
1829
|
+
recordVersion: expectedVersion === 0 ? { $in: [0, null] } : expectedVersion,
|
|
1830
|
+
}, {
|
|
1831
|
+
$set: { ...fields, lastSaveDate: new Date().toISOString() },
|
|
1832
|
+
$inc: { recordVersion: 1, revision: 1 },
|
|
294
1833
|
}, { returnDocument: 'after', includeResultMetadata: false });
|
|
295
1834
|
return { updated: result != null, recordVersion: result?.recordVersion };
|
|
296
1835
|
}
|
|
297
1836
|
async readyFigshareIntent(oid, saveToken) {
|
|
298
|
-
const result = await this.recordCol.updateOne({ redboxOid: oid, ...figshareSaveFilter(saveToken) }, [
|
|
299
|
-
|
|
1837
|
+
const result = await this.recordCol.updateOne({ redboxOid: oid, ...figshareSaveFilter(saveToken) }, [
|
|
1838
|
+
{
|
|
1839
|
+
$set: {
|
|
1840
|
+
'figshareSyncIntent.saves': {
|
|
1841
|
+
$map: {
|
|
1842
|
+
input: priorFigshareSaves,
|
|
1843
|
+
as: 'save',
|
|
1844
|
+
in: {
|
|
1845
|
+
$cond: [
|
|
1846
|
+
{ $eq: ['$$save.saveToken', { $literal: saveToken }] },
|
|
1847
|
+
{ $mergeObjects: ['$$save', { readiness: 'ready' }] },
|
|
1848
|
+
'$$save',
|
|
1849
|
+
],
|
|
1850
|
+
},
|
|
1851
|
+
},
|
|
1852
|
+
},
|
|
1853
|
+
},
|
|
1854
|
+
},
|
|
1855
|
+
deriveFigshareIntent,
|
|
1856
|
+
]);
|
|
300
1857
|
return result.matchedCount === 1;
|
|
301
1858
|
}
|
|
302
1859
|
async pendingFigshareIntents(limit, afterOid = '') {
|
|
303
|
-
return this.recordCol
|
|
304
|
-
.
|
|
1860
|
+
return this.recordCol
|
|
1861
|
+
.find({
|
|
1862
|
+
redboxOid: { $gt: afterOid },
|
|
1863
|
+
'figshareSyncIntent.pending': true,
|
|
1864
|
+
'figshareSyncIntent.readiness': 'ready',
|
|
1865
|
+
})
|
|
1866
|
+
.sort({ redboxOid: 1 })
|
|
1867
|
+
.limit(limit)
|
|
1868
|
+
.toArray();
|
|
305
1869
|
}
|
|
306
1870
|
async abandonFigshareIntent(oid, saveToken) {
|
|
307
1871
|
// Drop only this save. Other merged saves keep their own policies and readiness.
|
|
308
|
-
const result = await this.recordCol.updateOne({ redboxOid: oid, ...figshareSaveFilter(saveToken, 'initialising') }, [
|
|
309
|
-
|
|
310
|
-
|
|
1872
|
+
const result = await this.recordCol.updateOne({ redboxOid: oid, ...figshareSaveFilter(saveToken, 'initialising') }, [
|
|
1873
|
+
{
|
|
1874
|
+
$set: {
|
|
1875
|
+
'figshareSyncIntent.saves': {
|
|
1876
|
+
$filter: {
|
|
1877
|
+
input: priorFigshareSaves,
|
|
1878
|
+
as: 'save',
|
|
1879
|
+
cond: { $ne: ['$$save.saveToken', { $literal: saveToken }] },
|
|
1880
|
+
},
|
|
1881
|
+
},
|
|
1882
|
+
},
|
|
1883
|
+
},
|
|
1884
|
+
deriveFigshareIntent,
|
|
1885
|
+
]);
|
|
311
1886
|
return result.matchedCount === 1;
|
|
312
1887
|
}
|
|
313
1888
|
async recoverStaleFigshareIntents(staleBefore) {
|
|
314
|
-
const result = await this.recordCol.updateMany({
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
1889
|
+
const result = await this.recordCol.updateMany({
|
|
1890
|
+
'figshareSyncIntent.pending': true,
|
|
1891
|
+
'figshareSyncIntent.readiness': 'initialising',
|
|
1892
|
+
$or: [
|
|
1893
|
+
{
|
|
1894
|
+
'figshareSyncIntent.saves': {
|
|
1895
|
+
$elemMatch: { readiness: 'initialising', requestedAt: { $lt: staleBefore } },
|
|
1896
|
+
},
|
|
1897
|
+
},
|
|
1898
|
+
{ 'figshareSyncIntent.saves': { $exists: false }, 'figshareSyncIntent.requestedAt': { $lt: staleBefore } },
|
|
1899
|
+
],
|
|
1900
|
+
}, [
|
|
1901
|
+
{
|
|
1902
|
+
$set: {
|
|
1903
|
+
'figshareSyncIntent.saves': {
|
|
1904
|
+
$map: {
|
|
1905
|
+
input: priorFigshareSaves,
|
|
1906
|
+
as: 'save',
|
|
1907
|
+
in: {
|
|
1908
|
+
$cond: [
|
|
1909
|
+
{
|
|
1910
|
+
$and: [
|
|
1911
|
+
{ $eq: ['$$save.readiness', 'initialising'] },
|
|
1912
|
+
{ $lt: ['$$save.requestedAt', { $literal: staleBefore }] },
|
|
1913
|
+
],
|
|
1914
|
+
},
|
|
1915
|
+
{ $mergeObjects: ['$$save', { readiness: 'ready' }] },
|
|
1916
|
+
'$$save',
|
|
1917
|
+
],
|
|
1918
|
+
},
|
|
1919
|
+
},
|
|
1920
|
+
},
|
|
1921
|
+
},
|
|
1922
|
+
},
|
|
1923
|
+
deriveFigshareIntent,
|
|
1924
|
+
]);
|
|
321
1925
|
return result.modifiedCount;
|
|
322
1926
|
}
|
|
323
1927
|
async acknowledgeFigshareIntent(oid, generation) {
|
|
@@ -345,60 +1949,56 @@ var Services;
|
|
|
345
1949
|
sails.log.verbose(`${this.logHeader} finding deleted record: `);
|
|
346
1950
|
sails.log.verbose(JSON.stringify(criteria));
|
|
347
1951
|
const deletedRecord = await DeletedRecord.findOne(criteria);
|
|
348
|
-
|
|
1952
|
+
if (!deletedRecord?.deletedRecordMetadata)
|
|
1953
|
+
return null;
|
|
1954
|
+
const revision = (0, redbox_core_1.isRecordRevision)(deletedRecord.revision) ? deletedRecord.revision : redbox_core_1.INITIAL_RECORD_REVISION;
|
|
1955
|
+
// Tombstone wrapper revision is authoritative even when a legacy
|
|
1956
|
+
// embedded snapshot still contains a historical active revision.
|
|
1957
|
+
return { ...deletedRecord.deletedRecordMetadata, revision };
|
|
349
1958
|
}
|
|
350
1959
|
async createBatch(type, data, harvestIdFldName) {
|
|
351
|
-
const response = new redbox_core_1.
|
|
352
|
-
|
|
353
|
-
let
|
|
354
|
-
|
|
1960
|
+
const response = new redbox_core_1.StorageMutationResponse();
|
|
1961
|
+
let notAppliedCount = 0;
|
|
1962
|
+
let unknownCount = 0;
|
|
1963
|
+
for (const [rowIndex, dataItem] of data.entries()) {
|
|
355
1964
|
dataItem.harvestId = _.get(dataItem, harvestIdFldName, '');
|
|
356
1965
|
_.set(dataItem, 'metaMetadata.type', type);
|
|
357
1966
|
try {
|
|
358
|
-
await this.create(null, dataItem, null, null);
|
|
1967
|
+
const rowResponse = await this.create(null, dataItem, null, null);
|
|
1968
|
+
if (rowResponse.applicationState === 'applied' && rowResponse.success === true) {
|
|
1969
|
+
continue;
|
|
1970
|
+
}
|
|
1971
|
+
if (rowResponse.applicationState === 'not-applied') {
|
|
1972
|
+
notAppliedCount += 1;
|
|
1973
|
+
sails.log.error(`${this.logHeader} createBatch row was not applied`, {
|
|
1974
|
+
event: 'record_batch_create_row_not_applied',
|
|
1975
|
+
row_index: rowIndex,
|
|
1976
|
+
});
|
|
1977
|
+
continue;
|
|
1978
|
+
}
|
|
1979
|
+
unknownCount += 1;
|
|
1980
|
+
sails.log.error(`${this.logHeader} createBatch row outcome is unknown`, {
|
|
1981
|
+
event: 'record_batch_create_row_unknown',
|
|
1982
|
+
row_index: rowIndex,
|
|
1983
|
+
});
|
|
359
1984
|
}
|
|
360
|
-
catch
|
|
361
|
-
|
|
362
|
-
sails.log.error(`${this.logHeader}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
response.message = `${response.message}, ${err.message}`;
|
|
1985
|
+
catch {
|
|
1986
|
+
unknownCount += 1;
|
|
1987
|
+
sails.log.error(`${this.logHeader} createBatch row outcome is unknown`, {
|
|
1988
|
+
event: 'record_batch_create_row_unknown',
|
|
1989
|
+
row_index: rowIndex,
|
|
1990
|
+
});
|
|
367
1991
|
}
|
|
368
|
-
}
|
|
369
|
-
response.success =
|
|
1992
|
+
}
|
|
1993
|
+
response.success = notAppliedCount === 0 && unknownCount === 0;
|
|
1994
|
+
response.applicationState = unknownCount > 0 ? 'unknown' : notAppliedCount > 0 ? 'not-applied' : 'applied';
|
|
1995
|
+
response.message = response.success
|
|
1996
|
+
? ''
|
|
1997
|
+
: `Batch create incomplete (${notAppliedCount} not applied, ${unknownCount} unknown).`;
|
|
370
1998
|
return response;
|
|
371
1999
|
}
|
|
372
|
-
provideUserAccessAndRemovePendingAccess(oid,
|
|
373
|
-
|
|
374
|
-
const metadata = (await this.getMeta(oid));
|
|
375
|
-
const pendingEditArray = _.get(metadata, 'authorization.editPending', []);
|
|
376
|
-
const editArray = _.get(metadata, 'authorization.edit', []);
|
|
377
|
-
const pendingEditArrayFiltered = pendingEditArray.filter(value => value !== pendingValue);
|
|
378
|
-
const pendingEditFound = pendingEditArray.length > pendingEditArrayFiltered.length;
|
|
379
|
-
if (pendingEditFound && !editArray.includes(userid)) {
|
|
380
|
-
editArray.push(userid);
|
|
381
|
-
}
|
|
382
|
-
_.set(metadata, 'authorization.editPending', pendingEditArrayFiltered);
|
|
383
|
-
_.set(metadata, 'authorization.edit', editArray);
|
|
384
|
-
const pendingViewArray = _.get(metadata, 'authorization.viewPending', []);
|
|
385
|
-
const viewArray = _.get(metadata, 'authorization.view', []);
|
|
386
|
-
const pendingViewArrayFiltered = pendingViewArray.filter(value => value !== pendingValue);
|
|
387
|
-
const pendingViewFound = pendingViewArray.length > pendingViewArrayFiltered.length;
|
|
388
|
-
if (pendingViewFound && !viewArray.includes(userid)) {
|
|
389
|
-
viewArray.push(userid);
|
|
390
|
-
}
|
|
391
|
-
_.set(metadata, 'authorization.viewPending', pendingViewArrayFiltered);
|
|
392
|
-
_.set(metadata, 'authorization.view', viewArray);
|
|
393
|
-
try {
|
|
394
|
-
await this.updateMeta(null, oid, metadata);
|
|
395
|
-
}
|
|
396
|
-
catch (err) {
|
|
397
|
-
sails.log.error(`${this.logHeader} Failed to update on 'provideUserAccessAndRemovePendingAccess': `);
|
|
398
|
-
sails.log.error(JSON.stringify(err));
|
|
399
|
-
}
|
|
400
|
-
};
|
|
401
|
-
batchFn();
|
|
2000
|
+
async provideUserAccessAndRemovePendingAccess(oid, _userid, _pendingValue) {
|
|
2001
|
+
return this.notApplied(this.createMutationResponse(oid), 'capability-unavailable', 'Permission rewrites require the authoritative RecordsService mutation pipeline');
|
|
402
2002
|
}
|
|
403
2003
|
async getRelatedRecords(oid, brand, options = {}) {
|
|
404
2004
|
const mappingContext = await this.walkRelatedRecords(String(oid ?? ''), brand, options);
|
|
@@ -417,8 +2017,8 @@ var Services;
|
|
|
417
2017
|
const record = (await this.getMeta(normalizedOid));
|
|
418
2018
|
const currentRecordTypeName = String(recordTypeName ?? _.get(record, 'metaMetadata.type', '')).trim();
|
|
419
2019
|
const maxDepth = typeof options.depth === 'number' && options.depth >= 0 ? options.depth : Number.POSITIVE_INFINITY;
|
|
420
|
-
const includeRecordTypes = new Set((options.includeRecordTypes ?? []).map(
|
|
421
|
-
const includeRelationIds = new Set((options.includeRelationIds ?? []).map(
|
|
2020
|
+
const includeRecordTypes = new Set((options.includeRecordTypes ?? []).map(value => String(value ?? '').trim()).filter(Boolean));
|
|
2021
|
+
const includeRelationIds = new Set((options.includeRelationIds ?? []).map(value => String(value ?? '').trim()).filter(Boolean));
|
|
422
2022
|
if (_.isEmpty(mappingContext)) {
|
|
423
2023
|
mappingContext = {
|
|
424
2024
|
rootOid: normalizedOid,
|
|
@@ -513,17 +2113,13 @@ var Services;
|
|
|
513
2113
|
extractRelationshipLocalValues(record, relationship) {
|
|
514
2114
|
const rawValue = _.get(record, relationship.localField, relationship.localField === 'redboxOid' ? record.redboxOid : undefined);
|
|
515
2115
|
const values = Array.isArray(rawValue) ? rawValue : [rawValue];
|
|
516
|
-
return values
|
|
517
|
-
.map((value) => String(value ?? '').trim())
|
|
518
|
-
.filter((value) => value !== '');
|
|
2116
|
+
return values.map(value => String(value ?? '').trim()).filter(value => value !== '');
|
|
519
2117
|
}
|
|
520
2118
|
buildRelationshipCriteria(relationship, localValues) {
|
|
521
2119
|
const criteria = {
|
|
522
2120
|
'metaMetadata.type': relationship.recordType,
|
|
523
2121
|
};
|
|
524
|
-
criteria[relationship.foreignField] = localValues.length === 1
|
|
525
|
-
? localValues[0]
|
|
526
|
-
: { in: localValues };
|
|
2122
|
+
criteria[relationship.foreignField] = localValues.length === 1 ? localValues[0] : { in: localValues };
|
|
527
2123
|
return criteria;
|
|
528
2124
|
}
|
|
529
2125
|
async findRelatedRecords(relationship, criteria) {
|
|
@@ -531,8 +2127,9 @@ var Services;
|
|
|
531
2127
|
if (relationship.cardinality === 'one' && typeof query.sort === 'function' && typeof query.limit === 'function') {
|
|
532
2128
|
const chainedQuery = query.sort('redboxOid ASC');
|
|
533
2129
|
if (typeof chainedQuery.limit === 'function') {
|
|
534
|
-
return await chainedQuery.limit(1)
|
|
535
|
-
|
|
2130
|
+
return await chainedQuery.limit(1).meta({
|
|
2131
|
+
enableExperimentalDeepTargets: true,
|
|
2132
|
+
});
|
|
536
2133
|
}
|
|
537
2134
|
}
|
|
538
2135
|
const relatedRecords = await query.meta({ enableExperimentalDeepTargets: true });
|
|
@@ -563,46 +2160,14 @@ var Services;
|
|
|
563
2160
|
targetRecordType: relationship.recordType,
|
|
564
2161
|
};
|
|
565
2162
|
}
|
|
566
|
-
async delete(oid,
|
|
567
|
-
|
|
568
|
-
try {
|
|
569
|
-
if (permanentlyDelete) {
|
|
570
|
-
const datastreams = await this.listDatastreams(oid, null);
|
|
571
|
-
if (_.size(datastreams) > 0) {
|
|
572
|
-
_.each(datastreams, async (file) => {
|
|
573
|
-
sails.log.verbose(`Deleting:`);
|
|
574
|
-
sails.log.verbose(JSON.stringify(file));
|
|
575
|
-
try {
|
|
576
|
-
await this.gridFsBucket.delete(file['_id']);
|
|
577
|
-
}
|
|
578
|
-
catch (err) {
|
|
579
|
-
sails.log.error(`Error deleting: ${file['_id']}`);
|
|
580
|
-
sails.log.error(JSON.stringify(err));
|
|
581
|
-
}
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
else {
|
|
586
|
-
const record = (await this.getMeta(oid));
|
|
587
|
-
const deletedRecord = {
|
|
588
|
-
redboxOid: record.redboxOid,
|
|
589
|
-
deletedRecordMetadata: record,
|
|
590
|
-
};
|
|
591
|
-
await DeletedRecord.create(deletedRecord);
|
|
592
|
-
}
|
|
593
|
-
await Record.destroyOne({ redboxOid: oid });
|
|
594
|
-
response.success = true;
|
|
595
|
-
}
|
|
596
|
-
catch (err) {
|
|
597
|
-
sails.log.error(`${this.logHeader} Failed to delete record: ${oid}`);
|
|
598
|
-
sails.log.error(JSON.stringify(err));
|
|
599
|
-
response.success = false;
|
|
600
|
-
response.message = err.message;
|
|
601
|
-
}
|
|
602
|
-
return response;
|
|
2163
|
+
async delete(oid, _permanentlyDelete = false, options) {
|
|
2164
|
+
return this.notApplied(this.createMutationResponse(oid, options), 'capability-unavailable', 'Record deletion requires staged lifecycle orchestration');
|
|
603
2165
|
}
|
|
604
2166
|
async updateNotificationLog(oid, record, options) {
|
|
605
2167
|
if (super.metTriggerCondition(oid, record, options) == 'true') {
|
|
2168
|
+
if (_.get(options, 'saveRecord', false)) {
|
|
2169
|
+
return this.notApplied(this.createMutationResponse(oid), 'capability-unavailable', 'Notification writes require the authoritative RecordsService mutation pipeline');
|
|
2170
|
+
}
|
|
606
2171
|
sails.log.verbose(`${this.logHeader} Updating notification log for oid: ${oid}`);
|
|
607
2172
|
const logName = _.get(options, 'logName', null);
|
|
608
2173
|
if (logName) {
|
|
@@ -623,16 +2188,6 @@ var Services;
|
|
|
623
2188
|
sails.log.verbose(`======== Notification log updates =========`);
|
|
624
2189
|
sails.log.verbose(JSON.stringify(record));
|
|
625
2190
|
sails.log.verbose(`======== End update =========`);
|
|
626
|
-
if (_.get(options, 'saveRecord', false)) {
|
|
627
|
-
try {
|
|
628
|
-
await this.updateMeta(null, oid, record, null);
|
|
629
|
-
}
|
|
630
|
-
catch (err) {
|
|
631
|
-
sails.log.error(`${this.logHeader} Failed to update notification log of ${oid}:`);
|
|
632
|
-
sails.log.error(JSON.stringify(err));
|
|
633
|
-
throw err;
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
2191
|
}
|
|
637
2192
|
else {
|
|
638
2193
|
sails.log.verbose(`Notification log name: '${options.name}', for oid: ${oid}, not running, condition not met: ${options.triggerCondition}`);
|
|
@@ -653,13 +2208,21 @@ var Services;
|
|
|
653
2208
|
return -1;
|
|
654
2209
|
}
|
|
655
2210
|
}
|
|
656
|
-
else if (direction !== null &&
|
|
657
|
-
|
|
2211
|
+
else if (direction !== null &&
|
|
2212
|
+
typeof direction === 'object' &&
|
|
2213
|
+
!Array.isArray(direction) &&
|
|
2214
|
+
'$meta' in direction &&
|
|
2215
|
+
typeof direction.$meta === 'string') {
|
|
658
2216
|
return { $meta: direction.$meta };
|
|
659
2217
|
}
|
|
660
2218
|
throw new redbox_core_1.RBValidationError({
|
|
661
2219
|
message: 'Invalid record sort direction',
|
|
662
|
-
displayErrors: [
|
|
2220
|
+
displayErrors: [
|
|
2221
|
+
{
|
|
2222
|
+
status: '400',
|
|
2223
|
+
detail: 'Sort direction must be 1, -1, asc, desc, ascending, descending, or a $meta expression.',
|
|
2224
|
+
},
|
|
2225
|
+
],
|
|
663
2226
|
});
|
|
664
2227
|
}
|
|
665
2228
|
getRecordSort(sort, secondarySort) {
|
|
@@ -679,21 +2242,27 @@ var Services;
|
|
|
679
2242
|
const [field, direction = '-1'] = parts;
|
|
680
2243
|
parsed = { [field]: direction };
|
|
681
2244
|
}
|
|
682
|
-
if (parsed === null ||
|
|
683
|
-
|
|
2245
|
+
if (parsed === null ||
|
|
2246
|
+
typeof parsed !== 'object' ||
|
|
2247
|
+
(Array.isArray(parsed) &&
|
|
2248
|
+
!parsed.every(entry => Array.isArray(entry) && entry.length === 2 && typeof entry[0] === 'string' && entry[0].length > 0))) {
|
|
684
2249
|
throw new redbox_core_1.RBValidationError({
|
|
685
2250
|
message: 'Invalid record sort expression',
|
|
686
2251
|
displayErrors: [{ status: '400', detail: 'Sort must be an object or an array of [field, direction] pairs.' }],
|
|
687
2252
|
});
|
|
688
2253
|
}
|
|
689
|
-
const fields = Object.fromEntries((Array.isArray(parsed) ? parsed : Object.entries(parsed))
|
|
690
|
-
|
|
2254
|
+
const fields = Object.fromEntries((Array.isArray(parsed) ? parsed : Object.entries(parsed)).map(([field, direction]) => [
|
|
2255
|
+
field,
|
|
2256
|
+
this.getSortDirection(direction),
|
|
2257
|
+
]));
|
|
691
2258
|
if (!_.isEmpty(secondarySort)) {
|
|
692
2259
|
const parts = secondarySort.split(':');
|
|
693
2260
|
if (parts.length !== 2 || parts.some(part => part.length === 0)) {
|
|
694
2261
|
throw new redbox_core_1.RBValidationError({
|
|
695
2262
|
message: 'Invalid secondary record sort expression',
|
|
696
|
-
displayErrors: [
|
|
2263
|
+
displayErrors: [
|
|
2264
|
+
{ status: '400', detail: 'Secondary sort must be field:direction with no empty segments.' },
|
|
2265
|
+
],
|
|
697
2266
|
});
|
|
698
2267
|
}
|
|
699
2268
|
const [field, direction] = parts;
|
|
@@ -721,8 +2290,10 @@ var Services;
|
|
|
721
2290
|
limit: _.toNumber(rows),
|
|
722
2291
|
skip: _.toNumber(start),
|
|
723
2292
|
sort: Object.fromEntries(Object.entries(this.getRecordSort(sort, secondarySort)).map(([field, direction]) => [
|
|
724
|
-
sortAliases.get(field) ??
|
|
725
|
-
|
|
2293
|
+
sortAliases.get(field) ??
|
|
2294
|
+
(directSortFields.includes(field) || field.startsWith('deletedRecordMetadata.')
|
|
2295
|
+
? field
|
|
2296
|
+
: `deletedRecordMetadata.${field}`),
|
|
726
2297
|
direction,
|
|
727
2298
|
])),
|
|
728
2299
|
};
|
|
@@ -964,7 +2535,7 @@ var Services;
|
|
|
964
2535
|
objectMode: true,
|
|
965
2536
|
transform(record, _encoding, callback) {
|
|
966
2537
|
callback(null, sanitizeCsvRecord(record));
|
|
967
|
-
}
|
|
2538
|
+
},
|
|
968
2539
|
});
|
|
969
2540
|
const json2csv = new json2csv_1.Transform({ fields, transforms: [flatten()] }, { objectMode: true });
|
|
970
2541
|
await (0, promises_1.pipeline)(stream.Readable.from(this.fetchAllRecords(query, { ...options })), sanitize, json2csv, passThrough);
|
|
@@ -1094,6 +2665,15 @@ var Services;
|
|
|
1094
2665
|
sails.log.verbose(`${this.logHeader} removeDatastream() -> File not found: ${fileName}`);
|
|
1095
2666
|
}
|
|
1096
2667
|
}
|
|
2668
|
+
async removeStagedDatastream(fileId) {
|
|
2669
|
+
const normalizedFileId = (0, redbox_core_1.normalizeAttachmentStagingFileId)(fileId);
|
|
2670
|
+
if (!normalizedFileId)
|
|
2671
|
+
throw new Error('Invalid staged attachment identity.');
|
|
2672
|
+
const stagingDisk = StorageManagerService.stagingDisk();
|
|
2673
|
+
if (await stagingDisk.exists(normalizedFileId)) {
|
|
2674
|
+
await stagingDisk.delete(normalizedFileId);
|
|
2675
|
+
}
|
|
2676
|
+
}
|
|
1097
2677
|
async addDatastream(oid, datastream, stagingDisk) {
|
|
1098
2678
|
const fileId = datastream.fileId;
|
|
1099
2679
|
sails.log.verbose(`${this.logHeader} addDatastream() -> Meta: ${fileId}`);
|
|
@@ -1177,6 +2757,94 @@ var Services;
|
|
|
1177
2757
|
return undefined;
|
|
1178
2758
|
}
|
|
1179
2759
|
}
|
|
2760
|
+
sanitizeRecordHookExecutionSummary(value) {
|
|
2761
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
2762
|
+
return undefined;
|
|
2763
|
+
}
|
|
2764
|
+
const source = value;
|
|
2765
|
+
if (source.schemaVersion !== 1 || source.trigger !== 'record-hook') {
|
|
2766
|
+
return undefined;
|
|
2767
|
+
}
|
|
2768
|
+
const safeStatuses = new Set(['succeeded', 'failed', 'timed_out', 'interrupted', 'skipped', 'dispatched']);
|
|
2769
|
+
const safeKinds = new Set([
|
|
2770
|
+
'configuration',
|
|
2771
|
+
'validation',
|
|
2772
|
+
'domain',
|
|
2773
|
+
'transient',
|
|
2774
|
+
'timeout',
|
|
2775
|
+
'interrupted',
|
|
2776
|
+
'unexpected',
|
|
2777
|
+
]);
|
|
2778
|
+
const safeReasons = new Set([
|
|
2779
|
+
'prior_action_failed',
|
|
2780
|
+
'phase_not_reached',
|
|
2781
|
+
'save_not_persisted',
|
|
2782
|
+
'trigger_disabled',
|
|
2783
|
+
]);
|
|
2784
|
+
const actions = Array.isArray(source.actions)
|
|
2785
|
+
? source.actions.slice(0, 100).flatMap(item => {
|
|
2786
|
+
if (!item || typeof item !== 'object' || Array.isArray(item))
|
|
2787
|
+
return [];
|
|
2788
|
+
const action = item;
|
|
2789
|
+
if (typeof action.actionId !== 'string' ||
|
|
2790
|
+
typeof action.mode !== 'string' ||
|
|
2791
|
+
typeof action.phase !== 'string' ||
|
|
2792
|
+
typeof action.status !== 'string' ||
|
|
2793
|
+
!safeStatuses.has(action.status))
|
|
2794
|
+
return [];
|
|
2795
|
+
const result = {
|
|
2796
|
+
actionId: action.actionId.slice(0, 128),
|
|
2797
|
+
mode: action.mode,
|
|
2798
|
+
phase: action.phase,
|
|
2799
|
+
status: action.status,
|
|
2800
|
+
attempts: Number.isInteger(action.attempts) && Number(action.attempts) >= 0 ? Number(action.attempts) : 0,
|
|
2801
|
+
durationMs: Number.isInteger(action.durationMs) && Number(action.durationMs) >= 0 ? Number(action.durationMs) : 0,
|
|
2802
|
+
};
|
|
2803
|
+
if (typeof action.failureKind === 'string' && safeKinds.has(action.failureKind))
|
|
2804
|
+
result.failureKind = action.failureKind;
|
|
2805
|
+
if (typeof action.failureCode === 'string' && action.failureCode.length <= 128)
|
|
2806
|
+
result.failureCode = action.failureCode;
|
|
2807
|
+
if (typeof action.skippedReason === 'string' && safeReasons.has(action.skippedReason))
|
|
2808
|
+
result.skippedReason = action.skippedReason;
|
|
2809
|
+
return [result];
|
|
2810
|
+
})
|
|
2811
|
+
: [];
|
|
2812
|
+
const counts = {};
|
|
2813
|
+
if (source.counts && typeof source.counts === 'object' && !Array.isArray(source.counts)) {
|
|
2814
|
+
for (const [key, count] of Object.entries(source.counts)) {
|
|
2815
|
+
if (safeStatuses.has(key) && Number.isInteger(count) && Number(count) >= 0)
|
|
2816
|
+
counts[key] = Number(count);
|
|
2817
|
+
}
|
|
2818
|
+
}
|
|
2819
|
+
const summary = {
|
|
2820
|
+
schemaVersion: 1,
|
|
2821
|
+
executionId: typeof source.executionId === 'string' ? source.executionId.slice(0, 128) : '',
|
|
2822
|
+
trigger: 'record-hook',
|
|
2823
|
+
operation: ['create', 'update', 'delete', 'transition'].includes(String(source.operation))
|
|
2824
|
+
? source.operation
|
|
2825
|
+
: 'update',
|
|
2826
|
+
partial: source.partial === true,
|
|
2827
|
+
durationMs: Number.isInteger(source.durationMs) && Number(source.durationMs) >= 0 ? Number(source.durationMs) : 0,
|
|
2828
|
+
totalActions: Number.isInteger(source.totalActions) && Number(source.totalActions) >= 0
|
|
2829
|
+
? Number(source.totalActions)
|
|
2830
|
+
: actions.length,
|
|
2831
|
+
counts,
|
|
2832
|
+
actions,
|
|
2833
|
+
truncated: source.truncated === true,
|
|
2834
|
+
};
|
|
2835
|
+
if (typeof source.requestId === 'string' && source.requestId.length <= 128)
|
|
2836
|
+
summary.requestId = source.requestId;
|
|
2837
|
+
if (['pre', 'persistence', 'postSync', 'post-dispatch'].includes(String(source.completedThrough))) {
|
|
2838
|
+
summary.completedThrough = source.completedThrough;
|
|
2839
|
+
}
|
|
2840
|
+
if (['complete', 'grace-expired'].includes(String(source.detachedFinalization))) {
|
|
2841
|
+
summary.detachedFinalization = source.detachedFinalization;
|
|
2842
|
+
}
|
|
2843
|
+
if (Number.isInteger(source.detachedPending) && Number(source.detachedPending) > 0) {
|
|
2844
|
+
summary.detachedPending = Number(source.detachedPending);
|
|
2845
|
+
}
|
|
2846
|
+
return summary;
|
|
2847
|
+
}
|
|
1180
2848
|
sanitizeRecordAudit(recordAudit) {
|
|
1181
2849
|
const payload = {
|
|
1182
2850
|
redboxOid: recordAudit.redboxOid,
|
|
@@ -1184,6 +2852,7 @@ var Services;
|
|
|
1184
2852
|
...(recordAudit.occurredAt ? { occurredAt: recordAudit.occurredAt } : {}),
|
|
1185
2853
|
user: this.toJsonSafe(recordAudit.user),
|
|
1186
2854
|
record: this.toJsonSafe(recordAudit.record),
|
|
2855
|
+
executionSummary: this.sanitizeRecordHookExecutionSummary(recordAudit.executionSummary),
|
|
1187
2856
|
};
|
|
1188
2857
|
if (_.isUndefined(payload.user)) {
|
|
1189
2858
|
delete payload.user;
|
|
@@ -1191,6 +2860,9 @@ var Services;
|
|
|
1191
2860
|
if (_.isUndefined(payload.record)) {
|
|
1192
2861
|
delete payload.record;
|
|
1193
2862
|
}
|
|
2863
|
+
if (_.isUndefined(payload.executionSummary)) {
|
|
2864
|
+
delete payload.executionSummary;
|
|
2865
|
+
}
|
|
1194
2866
|
return payload;
|
|
1195
2867
|
}
|
|
1196
2868
|
sanitizeIntegrationAudit(audit) {
|
|
@@ -1366,53 +3038,11 @@ var Services;
|
|
|
1366
3038
|
sails.log.verbose(JSON.stringify(criteria));
|
|
1367
3039
|
return await IntegrationAudit.count(criteria);
|
|
1368
3040
|
}
|
|
1369
|
-
async restoreRecord(oid) {
|
|
1370
|
-
|
|
1371
|
-
if (_.isEmpty(oid)) {
|
|
1372
|
-
const msg = `${this.logHeader} restoreRecord() -> refusing to search using an empty OID`;
|
|
1373
|
-
sails.log.error(msg);
|
|
1374
|
-
throw new Error(msg);
|
|
1375
|
-
}
|
|
1376
|
-
try {
|
|
1377
|
-
sails.log.verbose(`${this.logHeader} Restoring record ${oid} to DB...`);
|
|
1378
|
-
const deletedRecord = await DeletedRecord.findOne({ redboxOid: oid });
|
|
1379
|
-
delete deletedRecord.deletedRecordMetadata._id;
|
|
1380
|
-
const record = await Record.create(deletedRecord.deletedRecordMetadata);
|
|
1381
|
-
response.metadata = record;
|
|
1382
|
-
await DeletedRecord.destroyOne({ redboxOid: oid });
|
|
1383
|
-
response.success = true;
|
|
1384
|
-
sails.log.verbose(`${this.logHeader} Record restored...`);
|
|
1385
|
-
return response;
|
|
1386
|
-
}
|
|
1387
|
-
catch (err) {
|
|
1388
|
-
sails.log.error(`${this.logHeader} Failed to create Record:`);
|
|
1389
|
-
sails.log.error(JSON.stringify(err));
|
|
1390
|
-
response.success = false;
|
|
1391
|
-
response.message = this.getErrorMessage(err);
|
|
1392
|
-
return response;
|
|
1393
|
-
}
|
|
3041
|
+
async restoreRecord(oid, options) {
|
|
3042
|
+
return this.notApplied(this.createMutationResponse(oid, options), 'capability-unavailable', 'Record restoration requires staged lifecycle orchestration');
|
|
1394
3043
|
}
|
|
1395
|
-
async destroyDeletedRecord(oid) {
|
|
1396
|
-
|
|
1397
|
-
if (_.isEmpty(oid)) {
|
|
1398
|
-
const msg = `${this.logHeader} destroyRecord() -> refusing to search using an empty OID`;
|
|
1399
|
-
sails.log.error(msg);
|
|
1400
|
-
throw new Error(msg);
|
|
1401
|
-
}
|
|
1402
|
-
try {
|
|
1403
|
-
sails.log.verbose(`${this.logHeader} destroying deleted record ${oid} to DB...`);
|
|
1404
|
-
await DeletedRecord.destroyOne({ redboxOid: oid });
|
|
1405
|
-
response.success = true;
|
|
1406
|
-
sails.log.verbose(`${this.logHeader} deleted record destroyed...`);
|
|
1407
|
-
return response;
|
|
1408
|
-
}
|
|
1409
|
-
catch (err) {
|
|
1410
|
-
sails.log.error(`${this.logHeader} Failed to create Record:`);
|
|
1411
|
-
sails.log.error(JSON.stringify(err));
|
|
1412
|
-
response.success = false;
|
|
1413
|
-
response.message = this.getErrorMessage(err);
|
|
1414
|
-
return response;
|
|
1415
|
-
}
|
|
3044
|
+
async destroyDeletedRecord(oid, options) {
|
|
3045
|
+
return this.notApplied(this.createMutationResponse(oid, options), 'capability-unavailable', 'Tombstone destruction requires staged lifecycle orchestration');
|
|
1416
3046
|
}
|
|
1417
3047
|
getFileWithName(fileName, options = { limit: 1 }) {
|
|
1418
3048
|
return this.gridFsBucket.find({ filename: fileName }, options);
|
|
@@ -1423,4 +3053,4 @@ var Services;
|
|
|
1423
3053
|
}
|
|
1424
3054
|
Services.MongoStorageService = MongoStorageService;
|
|
1425
3055
|
})(Services || (exports.Services = Services = {}));
|
|
1426
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uZ29TdG9yYWdlU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9Nb25nb1N0b3JhZ2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFzRDtBQUN0RCwrQkFBZ0M7QUFDaEMsbUNBQW9DO0FBR3BDLGlDQUFpQztBQUVqQyxtQ0FBb0M7QUFFcEMsc0NBQXVDO0FBQ3ZDLG1EQUFnRDtBQUNoRCx1Q0FBaUQ7QUFDakQsOERBd0JzQztBQUN0Qyw4REFBcUU7QUFDckUsOERBQWtHO0FBRWxHLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBVSxDQUFDO0FBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUUxQixNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0FBQzlDLFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQ0UsS0FBSyxJQUFJLElBQUk7UUFDYixPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQzVGLENBQUM7UUFDRCxPQUFPLGlCQUFpQixDQUFDLEtBQWdDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FB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
|
|
3056
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uZ29TdG9yYWdlU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9Nb25nb1N0b3JhZ2VTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUFzRDtBQUN0RCwrQkFBZ0M7QUFDaEMsbUNBQW9DO0FBQ3BDLHlDQUE4QztBQUc5QyxpQ0FBaUM7QUFFakMsbUNBQW9DO0FBYXBDLHNDQUF1QztBQUN2QyxtREFBZ0Q7QUFDaEQsdUNBQWlEO0FBQ2pELDhEQXNDc0M7QUFXdEMsOERBQXFFO0FBQ3JFLDhEQUFrRztBQUNsRywyRUFBc0Y7QUFDdEYsdUVBWW1DO0FBRW5DLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxxQkFBVSxDQUFDO0FBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUUxQixNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0FBQzlDLFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELElBQ0UsS0FBSyxJQUFJLElBQUk7UUFDYixPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQzVGLENBQUM7UUFDRCxPQUFPLGlCQUFpQixDQUFDLEtBQWdDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUErQjtJQUN4RCxNQUFNLFNBQVMsR0FBNEIsRUFBRSxDQUFDO0lBQzlDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFnQkQsTUFBTSwwQkFBMEIsR0FBRyxnQkFBZ0IsQ0FBQztBQVN2QyxRQUFBLDhCQUE4QixHQUErQjtJQUN4RTtRQUNFLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDbEIsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSxJQUFJLEVBQUUsVUFBVTtRQUNoQixNQUFNLEVBQUUsSUFBSTtLQUNiO0NBQ0YsQ0FBQztBQUVXLFFBQUEsNkNBQTZDLEdBQUcscURBQXFELENBQUM7QUFDdEcsUUFBQSw0Q0FBNEMsR0FBRztJQUMxRCxNQUFNLEVBQUUsQ0FBQztJQUNULElBQUksRUFBRSxDQUFDO0lBQ1AsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixTQUFTLEVBQUUsQ0FBQztJQUNaLFlBQVksRUFBRSxDQUFDO0NBQ1AsQ0FBQztBQUVFLFFBQUEsK0JBQStCLEdBQStCO0lBQ3pFO1FBQ0UsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRTtRQUN4QixJQUFJLEVBQUUsZ0JBQWdCO1FBQ3RCLE1BQU0sRUFBRSxJQUFJO0tBQ2I7SUFDRDtRQUNFLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRTtRQUMzQixJQUFJLEVBQUUscUNBQXFDO0tBQzVDO0lBQ0Q7UUFDRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUU7UUFDakUsSUFBSSxFQUFFLHNDQUFzQztLQUM3QztJQUNEO1FBQ0UsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1FBQ3BHLElBQUksRUFBRSw4Q0FBOEM7S0FDckQ7SUFDRDtRQUNFLEdBQUcsRUFBRSxvREFBNEM7UUFDakQsSUFBSSxFQUFFLHFEQUE2QztLQUNwRDtJQUNEO1FBQ0UsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO1FBQ3hCLElBQUksRUFBRSxrQ0FBa0M7UUFDeEMsTUFBTSxFQUFFLElBQUk7S0FDYjtJQUNEO1FBQ0UsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFO1FBQzlCLElBQUksRUFBRSxvQ0FBb0M7UUFDMUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO0tBQ3pDO0NBQ0YsQ0FBQztBQUVGOzs7O0dBSUc7QUFDVSxRQUFBLDhDQUE4QyxHQUFHLEtBQUssQ0FBQztBQW1CcEUsTUFBTSxnQ0FBZ0MsR0FBNEMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2pILE1BQU0sOEJBQThCLEdBQTBDO0lBQzVFLHlCQUF5QjtJQUN6QixvQkFBb0I7SUFDcEIsZUFBZTtJQUNmLFNBQVM7SUFDVCxrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixzQkFBc0I7SUFDdEIsTUFBTTtJQUNOLEtBQUs7SUFDTCxLQUFLO0lBQ0wsWUFBWTtJQUNaLG9CQUFvQjtJQUNwQixXQUFXO0NBQ1osQ0FBQztBQUVGLFNBQVMsZUFBZSxDQUN0QixHQUFrRTtJQUVsRSxJQUFJLEdBQUcsWUFBWSxHQUFHO1FBQUUsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBVSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLFFBQThCLEVBQUUsUUFBa0M7SUFDeEYsT0FBTyxJQUFBLDZCQUFpQixFQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3pGLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFFBQThCLEVBQUUsUUFBa0M7SUFDM0YsS0FBSyxNQUFNLE1BQU0sSUFBSSxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3RELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1RSxDQUFDO0lBQ0QsT0FBTyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbkQsSUFBSSxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDM0IsdUZBQXVGO1lBQ3ZGLE9BQU8sSUFBQSw2QkFBaUIsRUFBQyxRQUFRLENBQUMsU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxTQUFTLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNuSCxDQUFDO1FBQ0QsT0FBTyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQXNEO0lBQzlFLE9BQU8sT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0FBQy9GLENBQUM7QUFFRCxTQUFTLDZCQUE2QixDQUFDLEtBQWM7SUFDbkQsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVDLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssbUJBQW1CLENBQUMsQ0FBQztBQUNuSCxDQUFDO0FBbUJELGdIQUFnSDtBQUNoSCxNQUFNLGtCQUFrQixHQUFHO0lBQ3pCLEtBQUssRUFBRTtRQUNMLEVBQUUsR0FBRyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFDOUM7WUFDRSxPQUFPLEVBQUU7Z0JBQ1AsMkJBQTJCO2dCQUMzQjtvQkFDRSxLQUFLLEVBQUU7d0JBQ0wsRUFBRSxHQUFHLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFO3dCQUNyRTs0QkFDRTtnQ0FDRSxTQUFTLEVBQUUsK0JBQStCO2dDQUMxQyxTQUFTLEVBQUUsK0JBQStCO2dDQUMxQyxXQUFXLEVBQUUsaUNBQWlDO2dDQUM5QyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLENBQUMsRUFBRTs2QkFDMUQ7eUJBQ0Y7d0JBQ0QsRUFBRTtxQkFDSDtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxFQUFFO0tBQ0g7Q0FDRixDQUFDO0FBQ0YsNkdBQTZHO0FBQzdHLHFHQUFxRztBQUNyRyxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLElBQUksRUFBRTtRQUNKLDRCQUE0QixFQUFFO1lBQzVCLE9BQU8sRUFBRTtnQkFDUCxLQUFLLEVBQUUsMkJBQTJCO2dCQUNsQyxZQUFZLEVBQUUsRUFBRTtnQkFDaEIsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7YUFDakQ7U0FDRjtRQUNELDhCQUE4QixFQUFFO1lBQzlCLEtBQUssRUFBRTtnQkFDTCxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BELFdBQVc7Z0JBQ1gsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLGNBQWMsRUFBRSxxQ0FBcUMsQ0FBQyxFQUFFLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxFQUFFO2FBQ3ZHO1NBQ0Y7UUFDRCw0QkFBNEIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLDJCQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7S0FDbkY7Q0FDRixDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFNBQWlCLEVBQUUsU0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RSw0QkFBNEIsRUFBRSxJQUFJO0lBQ2xDLEdBQUcsRUFBRTtRQUNILEVBQUUsMEJBQTBCLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFO1FBQ2xHO1lBQ0UsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO1lBQzlDLDhCQUE4QixFQUFFLFNBQVM7WUFDekMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSw4QkFBOEIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3BFO0tBQ0Y7Q0FDRixDQUFDLENBQUM7QUFFSCxJQUFpQixRQUFRLENBZzFHeEI7QUFoMUdELFdBQWlCLFFBQVE7SUFDdkIsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUSxDQUFDLElBQUksQ0FBQyxPQUFPO1FBQzVELFlBQVksQ0FBd0I7UUFDcEMsRUFBRSxDQUFNO1FBQ1IsU0FBUyxDQUFtQztRQUM1QyxnQkFBZ0IsQ0FBbUM7UUFDbkQsaUJBQWlCLENBQW1DO1FBQ3BELHVCQUF1QixDQUFtQztRQUMxRCx3QkFBd0IsQ0FBbUM7UUFDbkQsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQzdCLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixzQkFBc0IsQ0FBaUI7UUFFckMsZ0JBQWdCLEdBQWE7WUFDckMsTUFBTTtZQUNOLFFBQVE7WUFDUixZQUFZO1lBQ1osaUJBQWlCO1lBQ2pCLG9CQUFvQjtZQUNwQixpQkFBaUI7WUFDakIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQixpQ0FBaUM7WUFDakMsY0FBYztZQUNkLHdCQUF3QjtZQUN4QixTQUFTO1lBQ1QsaUJBQWlCO1lBQ2pCLHFCQUFxQjtZQUNyQiw0QkFBNEI7WUFDNUIscUJBQXFCO1lBQ3JCLHdCQUF3QjtZQUN4Qiw2QkFBNkI7WUFDN0IsdUJBQXVCO1lBQ3ZCLDJCQUEyQjtZQUMzQixhQUFhO1lBQ2IseUNBQXlDO1lBQ3pDLG1CQUFtQjtZQUNuQixRQUFRO1lBQ1IsdUJBQXVCO1lBQ3ZCLFlBQVk7WUFDWixlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLG1CQUFtQjtZQUNuQixzQkFBc0I7WUFDdEIsZ0JBQWdCO1lBQ2hCLGdCQUFnQjtZQUNoQixrQkFBa0I7WUFDbEIsa0JBQWtCO1lBQ2xCLHdCQUF3QjtZQUN4QixlQUFlO1lBQ2YseUJBQXlCO1lBQ3pCLGVBQWU7WUFDZixpQkFBaUI7WUFDakIsbUJBQW1CO1lBQ25CLHdCQUF3QjtZQUN4QixnQkFBZ0I7WUFDaEIscUJBQXFCO1lBQ3JCLHVCQUF1QjtZQUN2Qix5QkFBeUI7WUFDekIseUJBQXlCO1lBQ3pCLDJCQUEyQjtZQUMzQiwyQkFBMkI7WUFDM0IsMEJBQTBCO1lBQzFCLHVDQUF1QztZQUN2Qyw0QkFBNEI7WUFDNUIsUUFBUTtTQUNULENBQUM7UUFFRjtZQUNFLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztZQUN6QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBRU8sT0FBTztZQUNiLE9BQU8sSUFBQSxtQkFBVSxHQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRU8sZUFBZSxDQUFDLEdBQVk7WUFDbEMsSUFBSSxHQUFHLFlBQVksS0FBSyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLFlBQVksR0FDaEIsR0FBRyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pHLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLEtBQUssRUFBRSxJQUFJLFlBQVksS0FBSyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2hGLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO2dCQUNELE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUVPLGtDQUFrQyxDQUFDLEdBQVk7WUFDckQsSUFBSSxHQUFHLFlBQVksc0RBQTRCO2dCQUFFLE9BQU8saUNBQWlDLENBQUM7WUFDMUYsSUFBSSxHQUFHLFlBQVksT0FBTyxDQUFDLGlCQUFpQjtnQkFBRSxPQUFPLHFCQUFxQixDQUFDO1lBQzNFLElBQUksR0FBRyxZQUFZLE9BQU8sQ0FBQyxVQUFVO2dCQUFFLE9BQU8sb0JBQW9CLENBQUM7WUFDbkUsT0FBTyxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ2pFLENBQUM7UUFFRDs7Ozs7O1dBTUc7UUFDSyxtQkFBbUIsQ0FDekIsS0FBcUIsRUFDckIsUUFBMEM7WUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlCLElBQUksTUFBTTtnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUMxQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLE9BQXlCLENBQUM7Z0JBQ2hFLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUM7b0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFzQixLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QixDQUFDO1lBQ0gsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxxRUFBcUU7WUFDdkUsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFTyx5QkFBeUI7WUFDL0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFTyw0QkFBNEI7WUFDbEMsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVPLGlDQUFpQztZQUN2QyxJQUFJLElBQUksQ0FBQyxpQkFBaUI7Z0JBQUUsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDMUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsT0FBMEIsQ0FBbUIsQ0FBQztnQkFDbEcsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUN4RCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztvQkFDbEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQXNCLDBCQUEwQixDQUFDLENBQUM7b0JBQzdGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO2dCQUNoQyxDQUFDO1lBQ0gsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxxRUFBcUU7WUFDdkUsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFTyxzQkFBc0IsQ0FDNUIsVUFBdUQ7WUFFdkQsT0FBTyxDQUNMLE9BQU8sVUFBVSxFQUFFLGdCQUFnQixLQUFLLFVBQVU7Z0JBQ2xELE9BQU8sVUFBVSxFQUFFLGdCQUFnQixLQUFLLFVBQVU7Z0JBQ2xELE9BQU8sVUFBVSxFQUFFLE9BQU8sS0FBSyxVQUFVLENBQzFDLENBQUM7UUFDSixDQUFDO1FBRU0sZUFBZTtZQUNwQixNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMscUJBQXFCO2dCQUMxQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7Z0JBQzdELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDaEUsT0FBTyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxPQUFPLEtBQUssVUFBVTtnQkFDdkUsT0FBTyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxTQUFTLEtBQUssVUFBVTtnQkFDekUsT0FBTyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxTQUFTLEtBQUssVUFBVTtnQkFDekUsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxTQUFTLEtBQUssVUFBVTtnQkFDakUsT0FBTyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxTQUFTLEtBQUssVUFBVTtnQkFDcEUsT0FBTyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxJQUFJLEtBQUssVUFBVSxDQUFDO1lBQ2xFLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLDJEQUE2QyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRixDQUFDO1FBRU8sc0JBQXNCLENBQUMsR0FBVyxFQUFFLE9BQXNDO1lBQ2hGLE1BQU0sUUFBUSxHQUFHLElBQUkscUNBQXVCLEVBQUUsQ0FBQztZQUMvQyxRQUFRLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNuQixJQUFJLElBQUEsc0NBQXdCLEVBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztnQkFBRSxRQUFRLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDekYsSUFBSSxJQUFBLDJDQUE2QixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7Z0JBQUUsUUFBUSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pHLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTyxVQUFVLENBQ2hCLFFBQWlDLEVBQ2pDLE1BQTJDLEVBQzNDLE9BQU8sR0FBRyxpQ0FBaUM7WUFFM0MsUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDekIsUUFBUSxDQUFDLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztZQUMxQyxRQUFRLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQzNCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTyxlQUFlLENBQUMsUUFBaUMsRUFBRSxPQUFlO1lBQ3hFLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7WUFDdEMsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDM0IsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVEOzs7OztXQUtHO1FBQ0ssZ0JBQWdCLENBQ3RCLE9BQWlELEVBQ2pELFFBQWlDO1lBRWpDLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxZQUFZLENBQUM7WUFDM0MsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDcEMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxHQUFHLFlBQVksQ0FBQztZQUMzRCxJQUNFLE9BQU8sZUFBZSxLQUFLLFNBQVM7Z0JBQ3BDLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSw4QkFBZ0IsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQ3hGLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsR0FBRyxJQUFJLENBQUMsU0FBUyxnQ0FBZ0MsUUFBUSxDQUFDLEdBQUcsaURBQWlELENBQy9HLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUscUNBQXFDLENBQUMsQ0FBQztnQkFDM0YsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztRQUMxQixDQUFDO1FBRUQ7Ozs7V0FJRztRQUNLLGdCQUFnQixDQUFDLGdCQUFvQztZQUMzRCxJQUFJLGdCQUFnQixLQUFLLHFDQUF1QixFQUFFLENBQUM7Z0JBQ2pELGlFQUFpRTtnQkFDakUscUVBQXFFO2dCQUNyRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUscUNBQXVCLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1RixDQUFDO1lBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTO2dCQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxRSxzRUFBc0U7WUFDdEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckcsQ0FBQztRQUVPLGdCQUFnQixDQUFDLFFBQWlCLEVBQUUsZ0JBQW9DO1lBQzlFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBaUMsQ0FBQztRQUN0RyxDQUFDO1FBRU8seUJBQXlCLENBQy9CLFFBQWlCLEVBQ2pCLGdCQUFvQyxFQUNwQyxPQUFzQztZQUV0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFZLENBQUM7WUFDOUUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLElBQWlCLENBQUM7WUFDOUMsSUFBSSxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBQ0QsSUFBSSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUNwQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0NBQWdDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7WUFDRCxPQUFPLFFBQXVDLENBQUM7UUFDakQsQ0FBQztRQUVPLG1CQUFtQixDQUFDLEtBQWM7WUFDeEMsT0FBTyxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUUsS0FBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQztRQUNsRyxDQUFDO1FBRUQ7Ozs7O1dBS0c7UUFDSywrQkFBK0IsQ0FBQyxLQUFjO1lBQ3BELElBQUksS0FBSyxZQUFZLE9BQU8sQ0FBQyx5QkFBeUI7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDcEUsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssWUFBWSxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDcEcsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsS0FHbkIsQ0FBQztZQUNGLElBQUksV0FBVyxDQUFDLGlCQUFpQjtnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNoRCxJQUFJLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNyRSxJQUFJLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUNoRixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFTyxtQkFBbUIsQ0FBQyxNQUFrQztZQUM1RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN6RCxPQUFPLElBQUEsc0NBQXdCLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdELENBQUM7UUFFRDs7Ozs7V0FLRztRQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxHQUFXLEVBQUUsTUFBdUI7WUFDckUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7WUFDNUQsSUFBSSxPQUFPLFVBQVUsRUFBRSxPQUFPLEtBQUssVUFBVSxJQUFJLE9BQU8sVUFBVSxFQUFFLFNBQVMsS0FBSyxVQUFVO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQy9HLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLElBQUksUUFBUSxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RELElBQUksUUFBUSxLQUFLLElBQUk7Z0JBQUUsT0FBTyxVQUFVLENBQUM7WUFFekMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUEsbUJBQVUsR0FBRSxDQUFDO1lBQ3ZFLElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25HLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO29CQUFFLE9BQU8sU0FBUyxDQUFDO2dCQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkYsT0FBTyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0gsQ0FBQztRQUVELGlHQUFpRztRQUN6RixLQUFLLENBQUMsc0JBQXNCLENBQ2xDLEdBQVc7WUFFWCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUM1RCxJQUNFLE9BQU8sVUFBVSxFQUFFLE9BQU8sS0FBSyxVQUFVO2dCQUN6QyxPQUFPLFVBQVUsRUFBRSxTQUFTLEtBQUssVUFBVTtnQkFDM0MsT0FBTyxVQUFVLEVBQUUsU0FBUyxLQUFLLFVBQVU7Z0JBRTNDLE9BQU8sU0FBUyxDQUFDO1lBQ25CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksYUFBYSxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDbEQsSUFBSSxhQUFhLEtBQUssSUFBSTtnQkFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO1lBRXZELHlFQUF5RTtZQUN6RSxnRUFBZ0U7WUFDaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU87Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDL0IsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQzFELElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNqRyxDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBQSxtQkFBVSxHQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDO2dCQUNILE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDO1FBRUQ7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNLLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxHQUFXLEVBQUUsYUFBcUI7WUFDMUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7WUFDNUQsSUFBSSxPQUFPLFVBQVUsRUFBRSxTQUFTLEtBQUssVUFBVTtnQkFBRSxPQUFPO1lBQ3hELElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakQsd0VBQXdFO2dCQUN4RSxxRUFBcUU7Z0JBQ3JFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUztvQkFBRSxPQUFPO2dCQUM1RCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLDZDQUE2QyxFQUFFO29CQUM5RSxLQUFLLEVBQUUsNENBQTRDO29CQUNuRCxPQUFPLEVBQUUsU0FBUztpQkFDbkIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRDs7Ozs7V0FLRztRQUNLLGdCQUFnQixDQUFDLE1BQWU7WUFDdEMsSUFBSSxNQUFNLEtBQUssSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUNqQyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQzNDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBQzFFLE9BQU8sTUFBaUIsQ0FBQztRQUMzQixDQUFDO1FBRU8sU0FBUyxDQUNmLFFBQWlDLEVBQ2pDLFFBQWlCLEVBQ2pCLElBQTJCLEVBQzNCLGdCQUF5QjtZQUV6QixvRUFBb0U7WUFDcEUscUVBQXFFO1lBQ3JFLE1BQU0sa0JBQWtCLEdBQUcsSUFBQSw4QkFBZ0IsRUFBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUM1RCxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVE7Z0JBQ25CLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLElBQUksSUFBSSxJQUFJLEtBQUssU0FBUztvQkFDL0MsQ0FBQyxDQUFDLHFDQUF1QjtvQkFDekIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNoQixJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLGdEQUFnRCxDQUFDLENBQUM7WUFDMUYsQ0FBQztZQUNELE1BQU0seUJBQXlCLEdBQzdCLGdCQUFnQixLQUFLLFNBQVM7Z0JBQzVCLENBQUMsQ0FBQyxTQUFTO2dCQUNYLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUztvQkFDbEIsQ0FBQyxDQUFDLElBQUEsZ0NBQWtCLEVBQUMsZ0JBQWdCLENBQUM7b0JBQ3RDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUN6QixJQUFJLHlCQUF5QixLQUFLLFNBQVMsSUFBSSxrQkFBa0IsS0FBSyx5QkFBeUIsRUFBRSxDQUFDO2dCQUNoRyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLHFEQUFxRCxDQUFDLENBQUM7WUFDL0YsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFLENBQUM7WUFDakUsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDeEIsUUFBUSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztZQUN0QyxRQUFRLENBQUMsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUM7WUFDaEQsSUFBSSxJQUFJLEtBQUssU0FBUztnQkFBRSxRQUFRLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQzs7Z0JBQ3ZELFFBQVEsQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDO1lBQzNDLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTyxTQUFTLENBQUMsS0FBdUM7WUFDdkQsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxDQUFDO1FBRU8sY0FBYyxDQUFDLEtBQXVDLEVBQUUsR0FBVztZQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQzVGLENBQUM7UUFFTyxpQkFBaUIsQ0FBQyxLQUF1QyxFQUFFLEdBQVc7WUFDNUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0Qyx5RUFBeUU7WUFDekUsc0VBQXNFO1lBQ3RFLHdFQUF3RTtZQUN4RSxPQUFPLE9BQU87Z0JBQ1osQ0FBQyxDQUFDO29CQUNFLFNBQVMsRUFBRSxHQUFHO29CQUNkLEdBQUcsRUFBRTt3QkFDSCxFQUFFLE9BQU8sRUFBRTt3QkFDWDs0QkFDRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsNENBQTRDLEVBQUUsT0FBTyxFQUFFLENBQUM7eUJBQ25HO3FCQUNGO2lCQUNGO2dCQUNILENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRU8sTUFBTSxDQUFVLGNBQWMsR0FBRztZQUN2QyxTQUFTO1lBQ1Qsc0JBQXNCO1lBQ3RCLDRDQUE0QztTQUM3QyxDQUFDO1FBRU0sYUFBYSxDQUFDLE1BQWtDO1lBQ3RELEtBQUssTUFBTSxJQUFJLElBQUksbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzdELElBQUksT0FBTztvQkFBRSxPQUFPLE9BQU8sQ0FBQztZQUM5QixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQ7Ozs7OztXQU1HO1FBQ0ssb0JBQW9CLENBQUMsU0FBa0I7WUFDN0MsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFFRDs7Ozs7V0FLRztRQUNLLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUIsR0FBVztZQUVYLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3ZELElBQUksT0FBTyxPQUFPLEVBQUUsT0FBTyxLQUFLLFVBQVUsSUFBSSxPQUFPLFVBQVUsRUFBRSxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3hGLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxNQUFNLENBQUMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDeEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztnQkFDbkMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQzthQUN2QyxDQUFDLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pELElBQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxTQUFTLEtBQUssU0FBUztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUN0RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFFTyxnQkFBZ0IsQ0FBQyxNQUFzQixFQUFFLGdCQUF3QjtZQUN2RSxPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssZ0JBQWdCLENBQUMsQ0FBQztRQUNuRyxDQUFDO1FBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxLQUF1QyxFQUN2QyxHQUFXLEVBQ1gsZ0JBQW9DO1lBRXBDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sd0JBQXdCLENBQUM7WUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7b0JBQUUsT0FBTyxnQkFBZ0IsQ0FBQztnQkFDdEYsZ0VBQWdFO2dCQUNoRSx1RUFBdUU7Z0JBQ3ZFLE9BQU8sZ0JBQWdCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUM7WUFDdEYsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7Z0JBQUUsT0FBTyxTQUFTLENBQUM7WUFDakYsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUVPLEtBQUssQ0FBQyxpQ0FBaUMsQ0FDN0MsS0FBdUMsRUFDdkMsR0FBVyxFQUNYLGdCQUFvQyxFQUNwQyxPQUFzQztZQUV0QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLHdCQUF3QixDQUFDO1lBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDO29CQUFFLE9BQU8sZ0JBQWdCLENBQUM7Z0JBQ3pGLE1BQU0sZUFBZSxHQUFHLElBQUEsOEJBQWdCLEVBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7b0JBQ2xFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVE7b0JBQzVCLENBQUMsQ0FBQyxxQ0FBdUIsQ0FBQztnQkFDNUIsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLGdCQUFnQjtvQkFBRSxPQUFPLGdCQUFnQixDQUFDO2dCQUNwRyxJQUNFLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7b0JBQzNHLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXO3dCQUM5QixDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDLENBQUMsS0FBSyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUMvRixDQUFDO29CQUNELE9BQU8sb0JBQW9CLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsT0FBTyx3QkFBd0IsQ0FBQztZQUNsQyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQztnQkFBRSxPQUFPLG9CQUFvQixDQUFDO1lBQ3pGLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFTSxLQUFLLENBQUMsSUFBSTtZQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGNBQWMsQ0FBQztZQUM3QyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxjQUFjLENBQUM7WUFDdkIsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQ25ELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7b0JBQ3hDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsZ0NBQWdDLEVBQUU7d0JBQ2pFLEtBQUssRUFBRSwrQkFBK0I7d0JBQ3RDLE9BQU8sRUFBRSxXQUFXO3dCQUNwQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDO3FCQUNyRSxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRU8saUJBQWlCO1lBQ3ZCLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzlCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSztnQkFDekMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUFDLGNBQXNCO1lBQ25ELElBQUksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3RyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO29CQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLGdCQUFnQixjQUFjLFNBQVMsQ0FBQyxDQUFDO29CQUM1RSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQStCLENBQUMsQ0FBQztnQkFDekcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsY0FBYyxTQUFTLENBQUMsQ0FBQztnQkFDNUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFBQyxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUNkLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFTyxLQUFLLENBQUMsV0FBVztZQUN2QixJQUNFLElBQUksQ0FBQyxxQkFBcUI7Z0JBQzFCLElBQUksQ0FBQyxTQUFTO2dCQUNkLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQ3JCLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3RCLElBQUksQ0FBQyx1QkFBdUI7Z0JBQzVCLElBQUksQ0FBQyx3QkFBd0I7Z0JBQzdCLElBQUksQ0FBQyxZQUFZLEVBQ2pCLENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFhLENBQUM7WUFDOUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDckQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sT0FBTyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNwQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBc0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7Z0JBQy9CLDRCQUE0QixFQUFFLENBQUM7Z0JBQy9CLDhCQUE4QixFQUFFLENBQUM7Z0JBQ2pDLGdDQUFnQyxFQUFFLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFzQixhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFzQiwwQkFBMEIsQ0FBQyxDQUFDO1lBQzdGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBc0Isb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkcsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFzQixxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6RyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztZQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQzNDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsU0FBUyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVPLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBTTtZQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLG9CQUFvQixDQUFDLENBQUM7WUFDekQsTUFBTSxjQUFjLEdBQUcsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFzQixNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FNbEMsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBc0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwRixDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUN4RCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkMsQ0FBQztZQUNELE1BQU0sb0JBQW9CLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxvQkFBb0IsSUFBSSxFQUFFLENBQUM7WUFDL0UsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBc0IsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3hHLENBQUM7WUFDRCxNQUFNLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLElBQUk7Z0JBQzVFLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7YUFDeEMsQ0FBQztZQUNGLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBc0IsMEJBQTBCLENBQUMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM1RyxDQUFDO1FBRU8sS0FBSyxDQUFDLHlCQUF5QjtZQUNyQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsc0NBQThCLENBQUMsQ0FBQztZQUMvRixNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsdUNBQStCLENBQUMsQ0FBQztRQUNuRyxDQUFDO1FBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxVQUEyQyxFQUMzQyxlQUFvRDtZQUVwRCxJQUFJLGVBQXVDLENBQUM7WUFDNUMsSUFBSSxDQUFDO2dCQUNILGVBQWUsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxNQUFNLGNBQWMsR0FBK0IsRUFBRSxDQUFDO1lBRXRELEtBQUssTUFBTSxRQUFRLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzVGLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFBRSxTQUFTO2dCQUVuRixJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0JBQWtCLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxpREFBaUQsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FDbEksQ0FBQztnQkFDSixDQUFDO2dCQUVELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkYsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYixrQkFBa0IsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLHNEQUFzRCxDQUN2RyxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLFVBQVUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7UUFFTyxtQkFBbUIsQ0FBUSxJQUFXO1lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUksb0NBQXNCLEVBQVMsQ0FBQztZQUNyRCxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN4QixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNyQixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRU8sbUJBQW1CLENBQ3pCLElBQVksRUFDWixPQUFlLEVBQ2YsTUFBYyxFQUNkLEtBQWU7WUFFZixNQUFNLFFBQVEsR0FBRyxJQUFJLG9DQUFzQixFQUFTLENBQUM7WUFDckQsUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDekIsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDM0IsUUFBUSxDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzVCLE1BQU0sU0FBUyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDO1lBQ3JFLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLFlBQVksSUFBSSxLQUFLLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDOUUsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVPLDRCQUE0QixDQUFRLE1BQWMsRUFBRSxLQUFjO1lBQ3hFLElBQUksS0FBSyxZQUFZLHNEQUE0QixFQUFFLENBQUM7Z0JBQ2xELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixxREFBMkIsQ0FBQyxjQUFjLEVBQzFDLHlDQUF5QyxFQUN6QyxNQUFNLEVBQ04sS0FBSyxDQUNOLENBQUM7UUFDSixDQUFDO1FBRU8sNEJBQTRCLENBQUMsTUFBYyxFQUFFLEtBQWM7WUFDakUsSUFBSSxLQUFLLFlBQVksc0RBQTRCLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7WUFDckUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sWUFBWSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxzREFBNEIsQ0FDcEMscURBQTJCLENBQUMsY0FBYyxFQUMxQyxvQ0FBb0MsQ0FDckMsQ0FBQztRQUNKLENBQUM7UUFFTyxrQkFBa0I7WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUssb0JBQW9CLENBQUMsWUFBWSxFQUFFLENBQUMsT0FBYyxDQUFDO2dCQUN6RSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQXNCLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pHLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUN0QyxDQUFDO1FBRU8sbUJBQW1CO1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFLLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDLE9BQWMsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFzQixxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRyxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7UUFDdkMsQ0FBQztRQUVPLDZCQUE2QixDQUFDLFNBQXFDLEVBQUUsR0FBUztZQUNwRixNQUFNLFFBQVEsR0FBYTtnQkFDekIsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZO2dCQUNwQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3hCLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSTtnQkFDcEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO2dCQUN0QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3hCLFVBQVUsRUFBRSxTQUFTLENBQUMsVUFBVTtnQkFDaEMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO2dCQUNoQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7Z0JBQzlCLFNBQVMsRUFBRSxHQUFHO2dCQUNkLFNBQVMsRUFBRSxHQUFHO2FBQ2YsQ0FBQztZQUNGLElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxTQUFTLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25HLFFBQVEsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUMvQixDQUFDO1lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUM3QixRQUFRLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztnQkFDckMsSUFBSSxTQUFTLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN0QyxRQUFRLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7Z0JBQzNDLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxRQUFrQixFQUFFLFFBQW1DO1lBQzNGLE9BQU8sSUFBQSxpREFBdUIsRUFBQyxJQUFBLG1EQUF5QixFQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssSUFBQSxpREFBdUIsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUM1RyxDQUFDO1FBRU0sS0FBSyxDQUFDLHVCQUF1QixDQUFDLFFBQW1DO1lBQ3RFLElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsR0FBRyxJQUFBLDJEQUFpQyxFQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNiLElBQUksTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0JBQzVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO29CQUNoRSxDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixxREFBMkIsQ0FBQyxnQkFBZ0IsRUFDNUMsZ0RBQWdELEVBQ2hELHlCQUF5QixDQUMxQixDQUFDO2dCQUNKLENBQUM7Z0JBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDO29CQUNILE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQzt3QkFDekIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO3dCQUN4QixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7d0JBQzVCLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYzt3QkFDeEMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZO3dCQUNwQyxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVU7d0JBQ2hDLFNBQVMsRUFBRSxHQUFHO3dCQUNkLFNBQVMsRUFBRSxHQUFHO3FCQUNmLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsSUFBSSxDQUFDLElBQUEsNkNBQW1CLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxLQUFLLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxNQUFNLGFBQWEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7b0JBQzdFLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3RGLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixxREFBMkIsQ0FBQyxnQkFBZ0IsRUFDNUMsZ0RBQWdELEVBQ2hELHlCQUF5QixFQUN6QixLQUFLLENBQ04sQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDaEUsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0UsQ0FBQztRQUNILENBQUM7UUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBYztZQUNqRCxNQUFNLGVBQWUsR0FBRyxJQUFBLG9EQUEwQixFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBQSxtREFBeUIsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQy9ELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sU0FBUyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDO2dCQUNyRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLG9DQUFvQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLElBQUksc0RBQTRCLENBQ3BDLHFEQUEyQixDQUFDLGNBQWMsRUFDMUMscUNBQXFDLENBQ3RDLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxLQUFnQztZQUNyRSxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxJQUFJLHNEQUE0QixDQUNwQyxxREFBMkIsQ0FBQyxnQkFBZ0IsRUFDNUMsMkNBQTJDLENBQzVDLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDcEMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFBLG9EQUEwQixFQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUMzRSxDQUFDO2dCQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFO3FCQUM5QyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO3FCQUNuRSxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7cUJBQ25CLEtBQUssQ0FBQyxLQUFLLENBQUM7cUJBQ1osT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEMsTUFBTSxFQUFFLElBQUEsb0RBQTBCLEVBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztvQkFDbkQsU0FBUyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLG9CQUFvQixDQUFDO2lCQUNqRixDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9FLENBQUM7UUFDSCxDQUFDO1FBRU0sS0FBSyxDQUFDLHlCQUF5QixDQUFDLE1BQWM7WUFDbkQsSUFBSSxDQUFDO2dCQUNILE1BQU0sZUFBZSxHQUFHLElBQUEsb0RBQTBCLEVBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUN0RCxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsRUFDM0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQ3pDLENBQUM7Z0JBQ0YsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM5QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FDN0IscURBQTJCLENBQUMsa0JBQWtCLEVBQzlDLHVDQUF1QyxFQUN2QywyQkFBMkIsQ0FDNUIsQ0FBQztnQkFDSixDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0UsQ0FBQztRQUNILENBQUM7UUFFTyxLQUFLLENBQUMsMEJBQTBCLENBQ3RDLFNBQXFDLEVBQ3JDLEdBQVM7WUFFVCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDcEYsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLElBQUEsa0RBQXdCLEVBQUMsSUFBQSxvREFBMEIsRUFBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLElBQUEsa0RBQXdCLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDM0csT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLHFEQUEyQixDQUFDLHVCQUF1QixFQUNuRCxpREFBaUQsRUFDakQsMEJBQTBCLENBQzNCLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkcsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDNUUsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFBLDZDQUFtQixFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sS0FBSyxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRixJQUNFLENBQUMsY0FBYztvQkFDZixJQUFBLGtEQUF3QixFQUFDLElBQUEsb0RBQTBCLEVBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxJQUFBLGtEQUF3QixFQUFDLFNBQVMsQ0FBQyxFQUM1RyxDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUM3QixxREFBMkIsQ0FBQyx1QkFBdUIsRUFDbkQsaURBQWlELEVBQ2pELDBCQUEwQixFQUMxQixLQUFLLENBQ04sQ0FBQztnQkFDSixDQUFDO2dCQUNELE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRU0sS0FBSyxDQUFDLHdCQUF3QixDQUFDLFNBQXFDO1lBQ3pFLElBQUksQ0FBQztnQkFDSCxNQUFNLFNBQVMsR0FBRyxJQUFBLDREQUFrQyxFQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN2QixNQUFNLGdCQUFnQixHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3pFLFVBQVUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7aUJBQ3ZCLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLHFEQUEyQixDQUFDLGtCQUFrQixFQUM5QywrQ0FBK0MsRUFDL0MsMEJBQTBCLENBQzNCLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sUUFBUSxDQUFDO2dCQUNsQixDQUFDO2dCQUVELG9FQUFvRTtnQkFDcEUsc0VBQXNFO2dCQUN0RSx5REFBeUQ7Z0JBQ3pELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFPLENBQ2hFLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFDNUIsRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDM0IsQ0FBQztnQkFDRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUM7d0JBQ3pDLFlBQVksRUFBRSxTQUFTLENBQUMsWUFBWTt3QkFDcEMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO3FCQUN6QixDQUFDLENBQUM7b0JBQ0gsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQzdCLHFEQUEyQixDQUFDLGtCQUFrQixFQUM5QywrQ0FBK0MsRUFDL0MsMEJBQTBCLENBQzNCLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQywwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5RSxDQUFDO1FBQ0gsQ0FBQztRQUVPLHVCQUF1QixDQUFDLEtBQWMsRUFBRSxLQUFhLEVBQUUsYUFBYSxHQUFHLEdBQUc7WUFDaEYsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO2dCQUM5RyxNQUFNLElBQUksc0RBQTRCLENBQ3BDLHFEQUEyQixDQUFDLGlCQUFpQixFQUM3QyxpQ0FBaUMsS0FBSyxjQUFjLENBQ3JELENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRU8sc0JBQXNCLENBQUMsS0FBYztZQUMzQyxJQUNFLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQ3pCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQzVCLEtBQUssSUFBSSxDQUFDO2dCQUNWLEtBQUssR0FBRyxpRUFBdUMsRUFDL0MsQ0FBQztnQkFDRCxNQUFNLElBQUksc0RBQTRCLENBQ3BDLHFEQUEyQixDQUFDLGlCQUFpQixFQUM3Qyw2REFBNkQsaUVBQXVDLEdBQUcsQ0FDeEcsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFTSxLQUFLLENBQUMscUNBQXFDLENBQ2hELEtBQTBDO1lBRTFDLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN4QyxNQUFNLElBQUksc0RBQTRCLENBQ3BDLHFEQUEyQixDQUFDLGlCQUFpQixFQUM3QyxnREFBZ0QsQ0FDakQsQ0FBQztnQkFDSixDQUFDO2dCQUNELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ3BDLElBQUksVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3ZELE1BQU0sSUFBSSxzREFBNEIsQ0FDcEMscURBQTJCLENBQUMsaUJBQWlCLEVBQzdDLDBEQUEwRCxDQUMzRCxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sSUFBSSxzREFBNEIsQ0FDcEMscURBQTJCLENBQUMsaUJBQWlCLEVBQzdDLHlEQUF5RCxDQUMxRCxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsTUFBTSxTQUFTLEdBQUc7b0JBQ2hCLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7aUJBQ3pGLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1QsTUFBTSxRQUFRLEdBQWE7b0JBQ3pCLE1BQU0sRUFBRSxJQUFBLG9EQUEwQixFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQ2hELElBQUksRUFBRSxPQUFPO29CQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7b0JBQ3pELE1BQU0sRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7b0JBQzVELFVBQVU7b0JBQ1YsVUFBVSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztvQkFDeEUsU0FBUyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7aUJBQzFFLENBQUM7Z0JBQ0YsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUNyRyxJQUFJLENBQUMsMkRBQW1DLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQzt3QkFDakUsTUFBTSxJQUFJLHNEQUE0QixDQUNwQyxxREFBMkIsQ0FBQyxpQkFBaUIsRUFDN0MsaUVBQWlFLENBQ2xFLENBQUM7b0JBQ0osQ0FBQztvQkFDRCxRQUFRLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JELENBQUM7Z0JBRUQsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTt3QkFDL0QsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRTt3QkFDekIsSUFBSSxFQUFFLG9EQUE0Qzt3QkFDbEQsU0FBUyxFQUFFLHNEQUE4QztxQkFDMUQsQ0FBQyxDQUFDO29CQUNILE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFBLG9EQUEwQixFQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzFELENBQUM7Z0JBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzFFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUN6RixNQUFNLGNBQWMsR0FBZSxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDeEUsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6QixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RSxDQUFDO2dCQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFO3FCQUM1QyxTQUFTLENBQ1I7b0JBQ0UsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO29CQUNwQjt3QkFDRSxPQUFPLEVBQUU7NEJBQ1AsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTOzRCQUN0QixVQUFVLEVBQUUsS0FBSzs0QkFDakIsWUFBWSxFQUFFLFdBQVc7NEJBQ3pCLFFBQVEsRUFBRTtnQ0FDUjtvQ0FDRSxNQUFNLEVBQUU7d0NBQ04sc0JBQXNCLEVBQUUsYUFBYTt3Q0FDckMsR0FBRyxFQUFFLGNBQWM7cUNBQ3BCO2lDQUNGOzZCQUNGOzRCQUNELEVBQUUsRUFBRSxtQkFBbUI7eUJBQ3hCO3FCQUNGO29CQUNELEVBQUUsTUFBTSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtvQkFDeEQsRUFBRSxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzlCLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtpQkFDZCxFQUNELEVBQUUsSUFBSSxFQUFFLG9EQUE0QyxFQUFFLENBQ3ZEO3FCQUNBLFNBQVMsQ0FBQyxzREFBOEMsQ0FBQztxQkFDekQsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsb0RBQTBCLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNsRSxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyx1Q0FBdUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzRixDQUFDO1FBQ0gsQ0FBQztRQUVNLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxLQUFpQztZQUN2RSxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxJQUFJLHNEQUE0QixDQUNwQyxxREFBMkIsQ0FBQyxpQkFBaUIsRUFDN0MsNENBQTRDLENBQzdDLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7Z0JBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDL0IsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFBLG9EQUEwQixFQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3dCQUNuRCxNQUFNLElBQUksc0RBQTRCLENBQ3BDLHFEQUEyQixDQUFDLGlCQUFpQixFQUM3QyxnREFBZ0QsQ0FDakQsQ0FBQztvQkFDSixDQUFDO29CQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDN0IsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ25DLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDbkUsTUFBTSxJQUFJLHNEQUE0QixDQUNwQyxxREFBMkIsQ0FBQyxpQkFBaUIsRUFDN0Msc0RBQXNELENBQ3ZELENBQUM7b0JBQ0osQ0FBQztvQkFDRCxRQUFRLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0QsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUMzQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO29CQUN0QixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO29CQUN4QixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDO29CQUNoQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDO29CQUNsQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDO29CQUM5QixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO2lCQUNkLEVBQUUsQ0FBQztvQkFDWCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEIsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQy9ELENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzVGLE1BQU0sSUFBSSxzREFBNEIsQ0FDcEMscURBQTJCLENBQUMsaUJBQWlCLEVBQzdDLG1FQUFtRSxDQUNwRSxDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsa0JBQWtCLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3RDLFFBQVEsQ0FBQyxJQUFJLEdBQUc7d0JBQ2Q7NEJBQ0UsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO3lCQUN2RztxQkFDRixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQzFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO29CQUNyRyxJQUFJLENBQUMsMkRBQW1DLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQzt3QkFDakUsTUFBTSxJQUFJLHNEQUE0QixDQUNwQyxxREFBMkIsQ0FBQyxpQkFBaUIsRUFDN0MsNkRBQTZELENBQzlELENBQUM7b0JBQ0osQ0FBQztvQkFDRCxRQUFRLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3JELENBQUM7Z0JBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7cUJBQy9DLElBQUksQ0FBQyxRQUFRLENBQUM7cUJBQ2QsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDO3FCQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDO3FCQUNaLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxvREFBMEIsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hGLENBQUM7UUFDSCxDQUFDO1FBRU8sc0JBQXNCLENBQUMsS0FBYyxFQUFFLEtBQWE7WUFDMUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxzREFBNEIsQ0FDcEMscURBQTJCLENBQUMsY0FBYyxFQUMxQyx3QkFBd0IsS0FBSyxjQUFjLENBQzVDLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FDakIsTUFBcUIsRUFDckIsTUFBZSxFQUNmLFdBQW9CLEVBQ3BCLEtBQWUsRUFDZixPQUFzQztZQUV0QyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLG9CQUFvQixDQUFDLENBQUM7WUFDekQsdUVBQXVFO1lBQ3ZFLG1FQUFtRTtZQUNuRSxtRUFBbUU7WUFDbkUsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRixNQUFNLFlBQVksR0FBRyxPQUFPLEVBQUUsWUFBWSxDQUFDO1lBQzNDLDBFQUEwRTtZQUMxRSx5RUFBeUU7WUFDekUseUVBQXlFO1lBQ3pFLElBQUksWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsSUFBSSxZQUFZLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDbEcsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1lBQ2pILENBQUM7WUFDRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLHVFQUF1RTtZQUN2RSw4QkFBOEI7WUFDOUIsWUFBWSxDQUFDLFFBQVEsR0FBRyxxQ0FBdUIsQ0FBQztZQUNoRCxZQUFZLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztZQUMvQixPQUFPLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztZQUN2QyxJQUFJLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztnQkFDakUsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDN0MsWUFBWSxDQUFDLGtCQUFrQixHQUFHO29CQUNoQyxHQUFHLE9BQU8sQ0FBQyxjQUFjO29CQUN6QixVQUFVLEVBQUUsQ0FBQztvQkFDYixPQUFPLEVBQUUsSUFBSTtvQkFDYixXQUFXO29CQUNYLEtBQUssRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7aUJBQ3hELENBQUM7WUFDSixDQUFDO1lBQ0QsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDdkMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUU5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLE9BQU8sT0FBTyxFQUFFLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzdHLENBQUM7WUFFRCxJQUFJLFFBQXFFLENBQUM7WUFDMUUsSUFBSSxDQUFDO2dCQUNILFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDekUsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLDBEQUEwRCxDQUFDLENBQUM7WUFDcEcsQ0FBQztZQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLGtEQUFrRCxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUNELElBQUksV0FBVyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixFQUFFLGtEQUFrRCxDQUFDLENBQUM7WUFDN0csQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckMsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3BELFlBQVksQ0FBQyxhQUFhLEdBQUcsb0JBQW9CLENBQUM7WUFDbEQsWUFBWSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQztZQUMzRCxZQUFZLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztZQUVoQyxJQUFJLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDbEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ2xDLHNFQUFzRTtvQkFDdEUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO2dCQUMxRixDQUFDO2dCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsZ0NBQWdDLEVBQUU7b0JBQ2pFLEtBQUssRUFBRSwrQkFBK0I7b0JBQ3RDLFVBQVUsRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO2lCQUN4RCxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxRQUEyRSxDQUFDO2dCQUNoRixJQUFJLENBQUM7b0JBQ0gsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsUUFBUSxHQUFHLFNBQVMsQ0FBQztnQkFDdkIsQ0FBQztnQkFDRCxJQUFJLFFBQVEsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxvQkFBb0IsRUFBRSxDQUFDO29CQUMzRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzlELENBQUM7Z0JBQ0Qsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLElBQUksSUFBSSxDQUFDLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzlDLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFDekYsQ0FBQztnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO2dCQUN6RSxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTSxLQUFLLENBQUMsVUFBVSxDQUNyQixLQUF1QyxFQUN2QyxHQUFXLEVBQ1gsTUFBZSxFQUNmLElBQWdCLEVBQ2hCLE9BQXNDO1lBRXRDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLElBQUksZ0JBQWdCLEtBQUssSUFBSTtnQkFBRSxPQUFPLFFBQVEsQ0FBQztZQUMvQyxJQUFJLGdCQUFnQixLQUFLLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLCtDQUErQyxDQUFDLENBQUM7WUFDOUcsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNwQixRQUFRLEVBQ1Isd0JBQXdCLEVBQ3hCLHFFQUFxRSxDQUN0RSxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEMsc0VBQXNFO1lBQ3RFLGlFQUFpRTtZQUNqRSxLQUFLLE1BQU0sS0FBSyxJQUFJO2dCQUNsQixLQUFLO2dCQUNMLElBQUk7Z0JBQ0osV0FBVztnQkFDWCxVQUFVO2dCQUNWLGVBQWU7Z0JBQ2Ysb0JBQW9CO2dCQUNwQixlQUFlO2dCQUNmLHNCQUFzQjtnQkFDdEIsYUFBYTtnQkFDYixjQUFjO2FBQ2YsRUFBRSxDQUFDO2dCQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdkQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywrQkFBK0IsR0FBRyxvQ0FBb0MsQ0FBQyxDQUFDO2dCQUN6RyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLGdEQUFnRCxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUVELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLHNCQUFzQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNGLElBQUksYUFBYSxJQUFJLDZCQUE2QixJQUFJLGdCQUFnQixLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUN6RixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDN0UsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUF3QixPQUFPLEVBQUUsY0FBYztnQkFDekQsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUNKLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7b0JBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzdDLE1BQU0sSUFBSSxHQUFHO3dCQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUzt3QkFDM0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO3dCQUMzQixXQUFXO3dCQUNYLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztxQkFDeEIsQ0FBQztvQkFDRixNQUFNLFdBQVcsR0FBWSxNQUFNLENBQUMsV0FBVyxDQUM3QyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQzVFLENBQUM7b0JBQ0YsV0FBVyxDQUFDLFlBQVksR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQztvQkFDckQsV0FBVyxDQUFDLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsV0FBVyxFQUFFLHFDQUF1QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMxRixXQUFXLENBQUMsYUFBYSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzlFLFdBQVcsQ0FBQyxrQkFBa0IsR0FBRzt3QkFDL0IsYUFBYSxFQUFFOzRCQUNiLEVBQUUsUUFBUSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsRUFBRTs0QkFDdkQ7Z0NBQ0UsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dDQUM3RSxLQUFLLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRTs2QkFDckU7eUJBQ0Y7cUJBQ0YsQ0FBQztvQkFDRixPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztnQkFDdkQsQ0FBQyxDQUFDLEVBQUU7Z0JBQ04sQ0FBQyxDQUFDO29CQUNFLElBQUksRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUM5RCxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUU7aUJBQ3hDLENBQUM7WUFFTixNQUFNLFFBQVEsR0FBWSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNuRyxJQUFJLE9BQU8sRUFBRSxlQUFlLElBQUksSUFBSTtnQkFDbEMsUUFBUSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsZUFBZSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUN4RyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDbEQsUUFBUTtnQkFDUixJQUFJLEVBQUUsU0FBUztnQkFDZixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQ2IsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUMxRyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7Z0JBQ3hFLGdCQUFnQjtnQkFDaEIsZUFBZSxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUNyQixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLGdDQUFnQyxHQUFHLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUNiLEdBQUcsSUFBSSxDQUFDLFNBQVMsc0NBQXNDLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ3BFLEtBQUssRUFBRSxHQUFHO3dCQUNWLFFBQVE7d0JBQ1IsS0FBSzt3QkFDTCxHQUFHO3dCQUNILElBQUk7cUJBQ0wsQ0FBQyxFQUFFLENBQ0wsQ0FBQztnQkFDSixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxPQUFPLEVBQUUsZUFBZSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssYUFBYTtnQkFDL0UsTUFBTSxJQUFJLGlDQUFtQixFQUFFLENBQUM7WUFDbEMsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVEOzs7Ozs7Ozs7O1dBVUc7UUFDSyxLQUFLLENBQUMseUJBQXlCLENBQUMsU0FPdkM7WUFDQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUM1RixJQUFJLFFBQW9DLENBQUM7WUFDekMsSUFBSSxDQUFDO2dCQUNILFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNuRSxDQUFDO1lBQ0QsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsa0RBQWtELENBQUMsQ0FBQztZQUM1RixDQUFDO1lBQ0QsSUFBSSxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxNQUFNLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsR0FBRyxJQUFJLENBQUMsU0FBUyxvREFBb0QsUUFBUSxDQUFDLEdBQUcsSUFBSTtvQkFDbkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FDNUIsQ0FBQztnQkFDRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixDQUFDLENBQUM7WUFDN0QsQ0FBQztRQUNILENBQUM7UUFFTSxLQUFLLENBQUMsa0JBQWtCLENBQzdCLEtBQXVDLEVBQ3ZDLEdBQVcsRUFDWCxPQUFzQztZQUV0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNsRSxJQUFJLGdCQUFnQixLQUFLLElBQUk7Z0JBQUUsT0FBTyxRQUFRLENBQUM7WUFDL0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLDZDQUE2QyxDQUFDLENBQUM7WUFDNUcsQ0FBQztZQUVELElBQUksT0FBbUMsQ0FBQztZQUN4QyxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FDN0IsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQ25HLENBQUM7Z0JBQ0YsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FDcEIsUUFBUSxFQUNSLHdCQUF3QixFQUN4QixrREFBa0QsQ0FDbkQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDO2dCQUNwQyxRQUFRO2dCQUNSLElBQUksRUFBRSxTQUFTO2dCQUNmLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FDYixVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7b0JBQ3BHLHFCQUFxQixFQUFFLEtBQUs7aUJBQzdCLENBQUM7Z0JBQ0osUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixDQUFDO2dCQUN4RSxnQkFBZ0I7YUFDakIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVNLEtBQUssQ0FBQyxlQUFlLENBQzFCLEtBQXVDLEVBQ3ZDLEdBQVcsRUFDWCxNQUFlLEVBQ2YsT0FBc0M7WUFFdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEUsSUFBSSxnQkFBZ0IsS0FBSyxJQUFJO2dCQUFFLE9BQU8sUUFBUSxDQUFDO1lBQy9DLElBQUksZ0JBQWdCLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBQSxzQ0FBd0IsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsOENBQThDLENBQUMsQ0FBQztZQUM3RyxDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLFVBQVUsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzNGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUN6RyxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztnQkFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3RCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUM7WUFDL0MsTUFBTSxjQUFjLEdBQUcsSUFBQSxnQ0FBa0IsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBQ3RELElBQ0UsU0FBUyxDQUFDLFNBQVMsS0FBSyxHQUFHO2dCQUMzQixTQUFTLENBQUMsUUFBUSxLQUFLLGNBQWM7Z0JBQ3JDLENBQUMsSUFBQSwyQ0FBNkIsRUFBQyxTQUFTLENBQUMsY0FBYyxDQUFDO2dCQUN4RCxDQUFDLElBQUEsK0NBQWlDLEVBQUMsU0FBUyxDQUFDO2dCQUM3QyxDQUFDLGFBQWEsS0FBSyxnQkFBZ0IsSUFBSSxhQUFhLEtBQUssZUFBZSxDQUFDO2dCQUN6RSxTQUFTLENBQUMsY0FBYyxLQUFLLGFBQWE7Z0JBQzFDLENBQUMsSUFBQSx1REFBeUMsRUFBQyxTQUFTLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BGLFNBQVMsQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXO2dCQUN2RCxTQUFTLENBQUMsY0FBYyxLQUFLLGdCQUFnQjtnQkFDN0MsU0FBUyxDQUFDLGNBQWMsS0FBSyxjQUFjLEVBQzNDLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7WUFDRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsNENBQTRDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEgsSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLGdCQUFnQixLQUFLLGdCQUFnQixJQUFJLGVBQWUsS0FBSyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUMsQ0FBQztZQUNoRixDQUFDO1lBQ0QsSUFDRSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUI7Z0JBQ2hDLE9BQU8sU0FBUyxDQUFDLHFCQUFxQixLQUFLLFFBQVE7Z0JBQ25ELEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDO2dCQUM5QyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxpQ0FBaUMsQ0FBQyxLQUFLLEdBQUcsRUFDM0QsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixFQUFFLHNDQUFzQyxDQUFDLENBQUM7WUFDakcsQ0FBQztZQUNELENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7WUFDckQsSUFBSSxhQUFpQyxDQUFDO1lBQ3RDLElBQUksQ0FBQztnQkFDSCxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxxQkFBZ0MsQ0FBQyxDQUFDO1lBQ25HLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsa0RBQWtELENBQUMsQ0FBQztZQUNqSCxDQUFDO1lBQ0QsTUFBTSxxQkFBcUIsR0FDekIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMscUJBQWdDLENBQUMsQ0FBQztZQUM5RyxJQUFJLHFCQUFxQixJQUFJLHFCQUFxQixLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUNyRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDcEcsQ0FBQztZQUNELFNBQVMsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ3ZDLFNBQVMsQ0FBQyxxQkFBaUMsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBRTNFLElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLENBQUM7Z0JBQ0QsSUFBSSxDQUFDO29CQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNyRixJQUFJLFFBQVEsS0FBSyxTQUFTO3dCQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLDJDQUEyQyxDQUFDLENBQUM7b0JBQ3JGLElBQUksUUFBUSxLQUFLLElBQUk7d0JBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQzt3QkFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzNHLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixDQUFDO29CQUN0RCxJQUNFLENBQUMsSUFBQSw4QkFBZ0IsRUFBQyxRQUFRLENBQUMsUUFBUSxDQUFDO3dCQUNwQyxRQUFRLENBQUMsUUFBUSxHQUFHLGNBQWM7d0JBQ2xDLENBQUMsSUFBQSwyQ0FBNkIsRUFBQyxRQUFRLENBQUMsY0FBYyxDQUFDO3dCQUN2RCxDQUFDLElBQUEsK0NBQWlDLEVBQUMsaUJBQWlCLENBQUM7d0JBQ3JELENBQUMsSUFBQSx1REFBeUMsRUFBQyxRQUFRLENBQUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQzt3QkFDM0YsaUJBQWlCLENBQUMsV0FBVyxLQUFLLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVzt3QkFDL0QsaUJBQWlCLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQ3pDLENBQUM7d0JBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUN6RCxDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO2dCQUFDLE9BQU8sU0FBUyxFQUFFLENBQUM7b0JBQ25CLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFTSxLQUFLLENBQUMsZUFBZSxDQUMxQixLQUF1QyxFQUN2QyxHQUFXLEVBQ1gsTUFBZSxFQUNmLE9BQXNDO1lBRXRDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLElBQUksZ0JBQWdCLEtBQUssSUFBSTtnQkFBRSxPQUFPLFFBQVEsQ0FBQztZQUMvQyxJQUFJLGdCQUFnQixLQUFLLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNqRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLGtEQUFrRCxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1lBQ3ZHLENBQUM7WUFDRCxJQUFJLGdCQUFnQixLQUFLLFNBQVMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0JBQ3pFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsaURBQWlELENBQUMsQ0FBQztZQUNoSCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUM7Z0JBQ3hGLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVCLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN2RCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLHdDQUF3QyxHQUFHLCtCQUErQixDQUFDLENBQUM7Z0JBQzdHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsbURBQW1ELENBQUMsQ0FBQztZQUNsSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUEsMkNBQTZCLEVBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztZQUNqRyxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDO1lBQy9DLElBQ0UsQ0FBQyxJQUFBLCtDQUFpQyxFQUFDLFNBQVMsQ0FBQztnQkFDN0MsQ0FBQyxJQUFBLHVEQUF5QyxFQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDcEYsU0FBUyxDQUFDLGNBQWMsR0FBRyxnQkFBZ0I7Z0JBQzNDLFNBQVMsQ0FBQyxjQUFjLEtBQUssSUFBQSxnQ0FBa0IsRUFBQyxnQkFBZ0IsQ0FBQztnQkFDakUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsS0FBSyxTQUFTLElBQUksU0FBUyxDQUFDLFdBQVcsS0FBSyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUN4RyxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsMENBQTBDLENBQUMsQ0FBQztZQUNyRyxDQUFDO1lBQ0QsSUFDRSxTQUFTLENBQUMscUJBQXFCLEtBQUssU0FBUztnQkFDN0MsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEtBQUssSUFBSTtvQkFDdkMsT0FBTyxTQUFTLENBQUMscUJBQXFCLEtBQUssUUFBUTtvQkFDbkQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUNqRCxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztZQUNqRyxDQUFDO1lBQ0QsSUFBSSxTQUFTLENBQUMscUJBQXFCLElBQUksT0FBTyxTQUFTLENBQUMscUJBQXFCLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzNGLHVFQUF1RTtnQkFDdkUsc0RBQXNEO2dCQUN0RCxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUNuQyxNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQ3RCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUM5RixDQUNGLENBQUM7Z0JBQ0YsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ3BFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNwQixRQUFRLEVBQ1Isd0JBQXdCLEVBQ3hCLGtEQUFrRCxDQUNuRCxDQUFDO29CQUNKLENBQUM7b0JBQ0QsSUFBSSxTQUFTLENBQUMscUJBQXFCLElBQUksT0FBTyxTQUFTLENBQUMscUJBQXFCLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQzFGLFNBQVMsQ0FBQyxxQkFBaUMsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO29CQUM3RSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hFLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM1RixNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUMzRyxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FDckMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsNENBQTRDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUN6RSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFDRSxhQUFhO2dCQUNiLENBQUMsQ0FBQyx3QkFBd0IsSUFBSSxnQkFBZ0IsS0FBSyxhQUFhLENBQUM7b0JBQy9ELENBQUMseUJBQXlCLElBQUksd0JBQXdCLEtBQUssYUFBYSxDQUFDLENBQUMsRUFDNUUsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixDQUFDLENBQUM7WUFDaEYsQ0FBQztZQUVELE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDO2dCQUNwQyxRQUFRO2dCQUNSLElBQUksRUFBRSxTQUFTO2dCQUNmLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FDYixVQUFVLENBQUMsZ0JBQWdCLENBQ3pCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxFQUM3RixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQzFDLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsQ0FDMUQ7Z0JBQ0gsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQztnQkFDN0YsZ0JBQWdCO2FBQ2pCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTSxLQUFLLENBQUMsZUFBZSxDQUMxQixLQUF1QyxFQUN2QyxHQUFXLEVBQ1gsT0FBc0M7WUFFdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMzRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEUsSUFBSSxnQkFBZ0IsS0FBSyxJQUFJO2dCQUFFLE9BQU8sUUFBUSxDQUFDO1lBQy9DLElBQ0UsZ0JBQWdCLEtBQUssU0FBUztnQkFDOUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWE7Z0JBQ2xDLENBQUMsSUFBQSxzQ0FBd0IsRUFBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUN4RCxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsK0NBQStDLENBQUMsQ0FBQztZQUM5RyxDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDeEcsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQ25DLE1BQU0sVUFBVSxDQUFDLE9BQU8sQ0FDdEIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQzlGLENBQ0YsQ0FBQztnQkFDRixJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDaEUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNwQixRQUFRLEVBQ1Isd0JBQXdCLEVBQ3hCLGtEQUFrRCxDQUNuRCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUM7Z0JBQ3BDLFFBQVE7Z0JBQ1IsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUNiLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FDekIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLEVBQzdGLEVBQUUscUJBQXFCLEVBQUUsS0FBSyxFQUFFLENBQ2pDO2dCQUNILFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7Z0JBQzdGLGdCQUFnQjthQUNqQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRU0sS0FBSyxDQUFDLCtCQUErQixDQUMxQyxLQUF1QyxFQUN2QyxHQUFXLEVBQ1gsTUFBZSxFQUNmLE9BQXNDO1lBRXRDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sV0FBVyxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDO1lBQ3BELElBQ0UsZ0JBQWdCLEtBQUssSUFBSTtnQkFDekIsZ0JBQWdCLEtBQUssU0FBUztnQkFDOUIsQ0FBQyxJQUFBLHNDQUF3QixFQUFDLFdBQVcsQ0FBQztnQkFDdEMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsS0FBSyxpQkFBaUI7b0JBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxLQUFLLG1CQUFtQixDQUFDLEVBQzVELENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3BHLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUN2RCxJQUNFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQztnQkFDckMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDO2dCQUN4QyxPQUFPLE9BQU8sQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUN2QyxDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztZQUN2RyxDQUFDO1lBRUQsSUFBSSxPQUFtQyxDQUFDO1lBQ3hDLElBQUksQ0FBQztnQkFDSCxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUM3QixNQUFNLFVBQVUsQ0FBQyxPQUFPLENBQ3RCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUM5RixDQUNGLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsSUFBSSxPQUFPLEtBQUssU0FBUztnQkFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDNUcsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUN0RyxHQUFHLEVBQUUsQ0FBQyx3QkFBaUMsQ0FDeEMsQ0FBQztnQkFDRixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFBLGdDQUFrQixFQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7WUFDcEQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1lBQ3RELElBQ0UsQ0FBQyxJQUFBLDJDQUE2QixFQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQ3RELENBQUMsSUFBQSwrQ0FBaUMsRUFBQyxnQkFBZ0IsQ0FBQztnQkFDcEQsQ0FBQyxJQUFBLHVEQUF5QyxFQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO2dCQUN6RixnQkFBZ0IsQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFDbkMsZ0JBQWdCLENBQUMsV0FBVyxLQUFLLFdBQVc7Z0JBQzVDLGdCQUFnQixDQUFDLGNBQWMsS0FBSyxnQkFBZ0I7Z0JBQ3BELENBQUMsZUFBZTtnQkFDaEIsT0FBTyxlQUFlLEtBQUssUUFBUTtnQkFDbkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFDOUIsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFDN0YsQ0FBQztZQUNELElBQUksYUFBaUMsQ0FBQztZQUN0QyxJQUFJLENBQUM7Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNuQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLHdCQUF3QixFQUFFLGtEQUFrRCxDQUFDLENBQUM7WUFDakgsQ0FBQztZQUNELE1BQU0sb0JBQW9CLEdBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBMEIsQ0FBQyxDQUFDO1lBQzVGLElBQUksb0JBQW9CLElBQUksb0JBQW9CLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ25FLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztZQUNsRyxDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLGVBQTBCLENBQUMsQ0FBQztZQUN6RCxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZHLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzNCLENBQUM7WUFDRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsSUFDRSxhQUFhLENBQUMsU0FBUyxLQUFLLEdBQUc7Z0JBQy9CLFFBQVEsQ0FBQyxTQUFTLEtBQUssR0FBRztnQkFDMUIsQ0FBQyxnQkFBZ0I7b0JBQ2YsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssZ0JBQWdCO3dCQUN6RixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssZ0JBQWdCLENBQUMsQ0FBQyxFQUMzRixDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3RELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsK0NBQStDLENBQUMsQ0FBQztZQUMxRyxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLEdBQUcsUUFBUTtnQkFDWCxTQUFTLEVBQUUsR0FBRztnQkFDZCxRQUFRLEVBQUUsY0FBYztnQkFDeEIsYUFBYTtnQkFDYixvQkFBb0IsRUFBRSxXQUFXO2dCQUNqQyxZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7YUFDdkMsQ0FBQztZQUNGLElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDckMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLENBQUM7Z0JBQ0QsSUFBSSxDQUFDO29CQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNsRixJQUFJLFFBQVEsS0FBSyxTQUFTO3dCQUN4QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7b0JBQ3ZGLElBQUksUUFBUSxLQUFLLElBQUk7d0JBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQzt3QkFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzNHLElBQ0UsUUFBUSxDQUFDLG9CQUFvQixLQUFLLFdBQVc7d0JBQzdDLENBQUMsSUFBQSw4QkFBZ0IsRUFBQyxRQUFRLENBQUMsUUFBUSxDQUFDO3dCQUNwQyxRQUFRLENBQUMsUUFBUSxHQUFHLGNBQWMsRUFDbEMsQ0FBQzt3QkFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLG9CQUFvQixDQUFDLENBQUM7b0JBQ3pELENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7Z0JBQUMsT0FBTyxTQUFTLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVNLEtBQUssQ0FBQyxZQUFZLENBQ3ZCLEtBQXVDLEVBQ3ZDLEdBQVc7WUFFWCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsMERBQTBELENBQUMsQ0FBQztZQUM5RyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUN2RCxJQUFJLE9BQU8sVUFBVSxFQUFFLE9BQU8sS0FBSyxVQUFVO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztZQUNsRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25HLElBQUksTUFBTSxLQUFLLFNBQVM7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1lBQy9GLE9BQU8sTUFBOEMsQ0FBQztRQUN4RCxDQUFDO1FBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BQXlCLEVBQUUsS0FBSyxHQUFHLEdBQUc7WUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLDJDQUE2QixDQUFDLENBQUM7WUFDdEUsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUN2RCxJQUFJLE9BQU8sVUFBVSxFQUFFLElBQUksS0FBSyxVQUFVO2dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztZQUN4RyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUYsT0FBTyxDQUFDLE1BQU0sVUFBVTtpQkFDckIsSUFBSSxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsQ0FBQztpQkFDbkQsS0FBSyxDQUFDLFlBQVksQ0FBQztpQkFDbkIsT0FBTyxFQUFFLENBQW9DLENBQUM7UUFDbkQsQ0FBQztRQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFnQixFQUFFLEtBQWE7WUFDOUQsT0FBTyxJQUFJLENBQUMsU0FBUztpQkFDbEIsSUFBSSxDQUFjLEVBQUUsU0FBUyxFQUFFLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7aUJBQ25ELElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztpQkFDdEIsS0FBSyxDQUFDLEtBQUssQ0FBQztpQkFDWixPQUFPLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDTSxLQUFLLENBQUMsMEJBQTBCLENBQUMsSUFBWSxFQUFFLFNBQWlCO1lBQ3JFLElBQUEsb0NBQXNCLEVBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN6RyxDQUFDO1FBQ00sS0FBSyxDQUFDLGVBQWUsQ0FDMUIsR0FBVyxFQUNYLE1BQWUsRUFDZixlQUF1QixFQUN2QixZQUFzQjtZQUV0QixJQUFBLG9DQUFzQixFQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQ2xEO2dCQUNFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsQ0FBQztnQkFDdkQsYUFBYSxFQUFFLGVBQWUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWU7YUFDNUUsRUFDRDtnQkFDRSxJQUFJLEVBQUUsRUFBRSxHQUFHLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDM0QsSUFBSSxFQUFFLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFO2FBQ3hDLEVBQ0QsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxDQUMxRCxDQUFDO1lBQ0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLElBQUksSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDM0UsQ0FBQztRQUNNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxHQUFXLEVBQUUsU0FBaUI7WUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFO2dCQUNsRztvQkFDRSxJQUFJLEVBQUU7d0JBQ0osMEJBQTBCLEVBQUU7NEJBQzFCLElBQUksRUFBRTtnQ0FDSixLQUFLLEVBQUUsa0JBQWtCO2dDQUN6QixFQUFFLEVBQUUsTUFBTTtnQ0FDVixFQUFFLEVBQUU7b0NBQ0YsS0FBSyxFQUFFO3dDQUNMLEVBQUUsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRTt3Q0FDdEQsRUFBRSxhQUFhLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTt3Q0FDckQsUUFBUTtxQ0FDVDtpQ0FDRjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRCxvQkFBb0I7YUFDckIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUMsWUFBWSxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ00sS0FBSyxDQUFDLHNCQUFzQixDQUFDLEtBQWEsRUFBRSxRQUFRLEdBQUcsRUFBRTtZQUM5RCxPQUFPLElBQUksQ0FBQyxTQUFTO2lCQUNsQixJQUFJLENBQWM7Z0JBQ2pCLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7Z0JBQzVCLDRCQUE0QixFQUFFLElBQUk7Z0JBQ2xDLDhCQUE4QixFQUFFLE9BQU87YUFDeEMsQ0FBQztpQkFDRCxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7aUJBQ3RCLEtBQUssQ0FBQyxLQUFLLENBQUM7aUJBQ1osT0FBTyxFQUFFLENBQUM7UUFDZixDQUFDO1FBQ00sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEdBQVcsRUFBRSxTQUFpQjtZQUMvRCxpRkFBaUY7WUFDakYsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FDM0MsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxFQUFFLEVBQ3BFO2dCQUNFO29CQUNFLElBQUksRUFBRTt3QkFDSiwwQkFBMEIsRUFBRTs0QkFDMUIsT0FBTyxFQUFFO2dDQUNQLEtBQUssRUFBRSxrQkFBa0I7Z0NBQ3pCLEVBQUUsRUFBRSxNQUFNO2dDQUNWLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUU7NkJBQzdEO3lCQUNGO3FCQUNGO2lCQUNGO2dCQUNELG9CQUFvQjthQUNyQixDQUNGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDTSxLQUFLLENBQUMsMkJBQTJCLENBQUMsV0FBbUI7WUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FDNUM7Z0JBQ0UsNEJBQTRCLEVBQUUsSUFBSTtnQkFDbEMsOEJBQThCLEVBQUUsY0FBYztnQkFDOUMsR0FBRyxFQUFFO29CQUNIO3dCQUNFLDBCQUEwQixFQUFFOzRCQUMxQixVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRTt5QkFDN0U7cUJBQ0Y7b0JBQ0QsRUFBRSwwQkFBMEIsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxnQ0FBZ0MsRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRTtpQkFDM0c7YUFDRixFQUNEO2dCQUNFO29CQUNFLElBQUksRUFBRTt3QkFDSiwwQkFBMEIsRUFBRTs0QkFDMUIsSUFBSSxFQUFFO2dDQUNKLEtBQUssRUFBRSxrQkFBa0I7Z0NBQ3pCLEVBQUUsRUFBRSxNQUFNO2dDQUNWLEVBQUUsRUFBRTtvQ0FDRixLQUFLLEVBQUU7d0NBQ0w7NENBQ0UsSUFBSSxFQUFFO2dEQUNKLEVBQUUsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLEVBQUU7Z0RBQzdDLEVBQUUsR0FBRyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTs2Q0FDM0Q7eUNBQ0Y7d0NBQ0QsRUFBRSxhQUFhLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTt3Q0FDckQsUUFBUTtxQ0FDVDtpQ0FDRjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFDRCxvQkFBb0I7YUFDckIsQ0FDRixDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzlCLENBQUM7UUFDTSxLQUFLLENBQUMseUJBQXlCLENBQUMsR0FBVyxFQUFFLFVBQWtCO1lBQ3BFLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQzNDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSwrQkFBK0IsRUFBRSxVQUFVLEVBQUUsOEJBQThCLEVBQUUsT0FBTyxFQUFFLEVBQ3hHLEVBQUUsSUFBSSxFQUFFLEVBQUUsNEJBQTRCLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDbEQsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBVztZQUM5QixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxxREFBcUQsQ0FBQztnQkFDbkYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ3BDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUM7WUFDakQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQWdCLENBQUM7UUFDekQsQ0FBQztRQUVNLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxHQUFXO1lBQzNDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLGtFQUFrRSxDQUFDO2dCQUNoRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBQ0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywyQkFBMkIsQ0FBQyxDQUFDO1lBQ2hFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLGFBQWEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGFBQWEsRUFBRSxxQkFBcUI7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDdkQsTUFBTSxRQUFRLEdBQUcsSUFBQSw4QkFBZ0IsRUFBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHFDQUF1QixDQUFDO1lBQzdHLGlFQUFpRTtZQUNqRSxpRUFBaUU7WUFDakUsT0FBTyxFQUFFLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixFQUFFLFFBQVEsRUFBaUIsQ0FBQztRQUM3RSxDQUFDO1FBRU0sS0FBSyxDQUFDLFdBQVcsQ0FDdEIsSUFBWSxFQUNaLElBQWUsRUFDZixnQkFBd0I7WUFFeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxxQ0FBdUIsRUFBRSxDQUFDO1lBQy9DLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDckIsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNsRCxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDO29CQUNILE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQy9FLFNBQVM7b0JBQ1gsQ0FBQztvQkFDRCxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsS0FBSyxhQUFhLEVBQUUsQ0FBQzt3QkFDbkQsZUFBZSxJQUFJLENBQUMsQ0FBQzt3QkFDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxrQ0FBa0MsRUFBRTs0QkFDbkUsS0FBSyxFQUFFLHFDQUFxQzs0QkFDNUMsU0FBUyxFQUFFLFFBQVE7eUJBQ3BCLENBQUMsQ0FBQzt3QkFDSCxTQUFTO29CQUNYLENBQUM7b0JBQ0QsWUFBWSxJQUFJLENBQUMsQ0FBQztvQkFDbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxxQ0FBcUMsRUFBRTt3QkFDdEUsS0FBSyxFQUFFLGlDQUFpQzt3QkFDeEMsU0FBUyxFQUFFLFFBQVE7cUJBQ3BCLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxZQUFZLElBQUksQ0FBQyxDQUFDO29CQUNsQixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLHFDQUFxQyxFQUFFO3dCQUN0RSxLQUFLLEVBQUUsaUNBQWlDO3dCQUN4QyxTQUFTLEVBQUUsUUFBUTtxQkFDcEIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQ0QsUUFBUSxDQUFDLE9BQU8sR0FBRyxlQUFlLEtBQUssQ0FBQyxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUM7WUFDL0QsUUFBUSxDQUFDLGdCQUFnQixHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0csUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTztnQkFDakMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLDRCQUE0QixlQUFlLGlCQUFpQixZQUFZLFlBQVksQ0FBQztZQUN6RixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRU0sS0FBSyxDQUFDLHVDQUF1QyxDQUNsRCxHQUFXLEVBQ1gsT0FBZ0IsRUFDaEIsYUFBc0I7WUFFdEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNwQixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEVBQ2hDLHdCQUF3QixFQUN4QixnRkFBZ0YsQ0FDakYsQ0FBQztRQUNKLENBQUM7UUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQzVCLEdBQVcsRUFDWCxLQUFvQixFQUNwQixVQUEyQyxFQUFFO1lBRTdDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hGLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLGNBQWMsQ0FBQyxPQUFPO2dCQUMvQixLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUs7Z0JBQzNCLGNBQWMsRUFBRSxjQUFjLENBQUMsY0FBYztnQkFDN0MsZUFBZSxFQUFFLGNBQWMsQ0FBQyxlQUFlO2FBQ2hELENBQUM7UUFDSixDQUFDO1FBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUM5QixHQUFXLEVBQ1gsS0FBb0IsRUFDcEIsT0FBd0MsRUFDeEMsaUJBQWdDLElBQUksRUFDcEMsaUJBQStDLElBQUksRUFDbkQsWUFBWSxHQUFHLENBQUM7WUFFaEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUNyRSxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQVksQ0FBQztZQUM5RCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RyxNQUFNLFFBQVEsR0FDWixPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7WUFDckcsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FDaEMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FDNUYsQ0FBQztZQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQ2hDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQzVGLENBQUM7WUFFRixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsY0FBYyxHQUFHO29CQUNmLE9BQU8sRUFBRSxhQUFhO29CQUN0QixzQkFBc0IsRUFBRSxFQUFFO29CQUMxQixjQUFjLEVBQUUsRUFBRTtvQkFDbEIsS0FBSyxFQUFFLEVBQUU7b0JBQ1QsZUFBZSxFQUFFLEVBQUU7b0JBQ25CLG9CQUFvQixFQUFFLElBQUksR0FBRyxFQUFVO29CQUN2QyxlQUFlLEVBQUUsSUFBSSxHQUFHLEVBQVU7b0JBQ2xDLHdCQUF3QixFQUFFLElBQUksR0FBRyxFQUFVO2lCQUM1QyxDQUFDO1lBQ0osQ0FBQztZQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBNkIsQ0FBQyxDQUFDO1lBQzVGLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzlFLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBRUQsSUFBSSxZQUFZLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sY0FBYyxDQUFDO1lBQ3hCLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUEscUJBQWMsRUFBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUM5RixNQUFNLFNBQVMsR0FBRyxJQUFBLHNDQUF3QixFQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLHFDQUFxQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7Z0JBQ2pHLE9BQU8sY0FBYyxDQUFDO1lBQ3hCLENBQUM7WUFFRCxLQUFLLE1BQU0sWUFBWSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLGtCQUFrQixDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzVFLFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLGtCQUFrQixDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7b0JBQ3BGLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxNQUFNLFlBQVksR0FBRyxHQUFHLGFBQWEsS0FBSyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVELElBQUksY0FBYyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUMxRCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsY0FBYyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFFdEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywyQkFBMkIsQ0FBQyxDQUFDO2dCQUNoRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBRWhELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO29CQUMzQixTQUFTO2dCQUNYLENBQUM7Z0JBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDM0UsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxvQ0FBb0MsQ0FBQyxDQUFDO2dCQUN6RSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBRTVDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDN0UsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBRWxELEtBQUssTUFBTSxhQUFhLElBQUksY0FBMkIsRUFBRSxDQUFDO29CQUN4RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFDM0csSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQ2xCLFNBQVM7b0JBQ1gsQ0FBQztvQkFDRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztvQkFFL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLGFBQW9DLENBQUMsQ0FBQztvQkFDckcsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO3dCQUNoRixjQUFjLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDdEUsQ0FBQztvQkFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLFlBQVksQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzNFLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO3dCQUNqRCxjQUFjLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDNUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7NEJBQ3hCLFVBQVUsRUFBRSxZQUFZLENBQUMsRUFBRTs0QkFDM0IsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLOzRCQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7NEJBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzs0QkFDekIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjt5QkFDeEMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBRUQsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUM1QyxnQkFBZ0IsRUFDaEIsS0FBSyxFQUNMLE9BQU8sRUFDUCxJQUFJLEVBQ0osY0FBYyxFQUNkLFlBQVksR0FBRyxDQUFDLENBQ2pCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBRU8sZ0JBQWdCLENBQ3RCLGNBQXFDLEVBQ3JDLGNBQXNCLEVBQ3RCLE1BQTJCO1lBRTNCLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUUsTUFBa0IsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLHdCQUF3QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVDLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLHdCQUF3QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3JFLElBQUksY0FBYyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xFLE9BQU87WUFDVCxDQUFDO1lBQ0QsY0FBYyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRTlELElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2RSxjQUFjLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQy9ELENBQUM7WUFDRCxjQUFjLENBQUMsY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFFTyw4QkFBOEIsQ0FBQyxNQUFlLEVBQUUsWUFBc0M7WUFDNUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FDcEIsTUFBTSxFQUNOLFlBQVksQ0FBQyxVQUFVLEVBQ3ZCLFlBQVksQ0FBQyxVQUFVLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQ3ZFLENBQUM7WUFDRixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2RixDQUFDO1FBRU8seUJBQXlCLENBQUMsWUFBc0MsRUFBRSxXQUFxQjtZQUM3RixNQUFNLFFBQVEsR0FBWTtnQkFDeEIsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLFVBQVU7YUFDN0MsQ0FBQztZQUVGLFFBQVEsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7WUFFdEcsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxZQUFzQyxFQUFFLFFBQWlCO1lBQ3hGLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUlqQyxDQUFDO1lBRUYsSUFBSSxZQUFZLENBQUMsV0FBVyxLQUFLLEtBQUssSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDaEgsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBRzlDLENBQUM7Z0JBQ0YsSUFBSSxPQUFPLFlBQVksQ0FBQyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQzdDLE9BQU8sTUFBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBc0QsQ0FBQyxJQUFJLENBQUM7d0JBQzVGLDZCQUE2QixFQUFFLElBQUk7cUJBQ3BDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLDZCQUE2QixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDakYsSUFBSSxZQUFZLENBQUMsV0FBVyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUN2QyxPQUFPLGNBQWMsQ0FBQztZQUN4QixDQUFDO1lBRUQsT0FBTyxDQUFDLEdBQUcsY0FBYyxDQUFDO2lCQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDcEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDMUY7aUJBQ0EsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBRU8scUJBQXFCLENBQzNCLFlBQXNDLEVBQ3RDLHFCQUE2QixFQUM3QixVQUFrQixFQUNsQixhQUFzQjtZQUV0QixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdEIsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELElBQUksWUFBWSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekMsT0FBTztvQkFDTCxnQkFBZ0I7b0JBQ2hCLFNBQVMsRUFBRSxnQkFBZ0I7b0JBQzNCLFNBQVMsRUFBRSxVQUFVO29CQUNyQixnQkFBZ0IsRUFBRSxxQkFBcUI7aUJBQ3hDLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTztnQkFDTCxnQkFBZ0I7Z0JBQ2hCLFNBQVMsRUFBRSxVQUFVO2dCQUNyQixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixnQkFBZ0IsRUFBRSxZQUFZLENBQUMsVUFBVTthQUMxQyxDQUFDO1FBQ0osQ0FBQztRQUNNLEtBQUssQ0FBQyxNQUFNLENBQ2pCLEdBQVcsRUFDWCxxQkFBOEIsS0FBSyxFQUNuQyxPQUFzQztZQUV0QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQ3BCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQ3pDLHdCQUF3QixFQUN4Qix5REFBeUQsQ0FDMUQsQ0FBQztRQUNKLENBQUM7UUFFTSxLQUFLLENBQUMscUJBQXFCLENBQUMsR0FBVyxFQUFFLE1BQWUsRUFBRSxPQUFnQjtZQUMvRSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUM5RCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN4QyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQ3BCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsRUFDaEMsd0JBQXdCLEVBQ3hCLGdGQUFnRixDQUNqRixDQUFDO2dCQUNKLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyx1Q0FBdUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDdkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsZ0JBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDO29CQUN6RSxJQUFJLEdBQUcsRUFBRSxDQUFDO3dCQUNSLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEIsQ0FBQztvQkFDRCxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUNuQixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsNkNBQTZDLENBQUMsQ0FBQztnQkFDakUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ3JELENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FDZiwyQkFBMkIsT0FBTyxDQUFDLElBQUksZUFBZSxHQUFHLHFDQUFxQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FDekgsQ0FBQztnQkFDRixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFTyxnQkFBZ0IsQ0FBQyxTQUFrQjtZQUN6QyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDbkUsUUFBUSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDeEMsS0FBSyxHQUFHLENBQUM7b0JBQ1QsS0FBSyxLQUFLLENBQUM7b0JBQ1gsS0FBSyxXQUFXO3dCQUNkLE9BQU8sQ0FBQyxDQUFDO29CQUNYLEtBQUssSUFBSSxDQUFDO29CQUNWLEtBQUssTUFBTSxDQUFDO29CQUNaLEtBQUssWUFBWTt3QkFDZixPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQ0wsU0FBUyxLQUFLLElBQUk7Z0JBQ2xCLE9BQU8sU0FBUyxLQUFLLFFBQVE7Z0JBQzdCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLE9BQU8sSUFBSSxTQUFTO2dCQUNwQixPQUFPLFNBQVMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUNuQyxDQUFDO2dCQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BDLENBQUM7WUFDRCxNQUFNLElBQUksK0JBQWlCLENBQUM7Z0JBQzFCLE9BQU8sRUFBRSwrQkFBK0I7Z0JBQ3hDLGFBQWEsRUFBRTtvQkFDYjt3QkFDRSxNQUFNLEVBQUUsS0FBSzt3QkFDYixNQUFNLEVBQUUsd0ZBQXdGO3FCQUNqRztpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTyxhQUFhLENBQUMsSUFBYSxFQUFFLGFBQXNCO1lBQ3pELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkUsSUFBSSxNQUFlLENBQUM7WUFDcEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFBQyxPQUFPLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzlELE1BQU0sSUFBSSwrQkFBaUIsQ0FBQzt3QkFDMUIsT0FBTyxFQUFFLGdDQUFnQzt3QkFDekMsYUFBYSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSwrREFBK0QsRUFBRSxDQUFDO3FCQUM1RyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3hDLE1BQU0sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUM7WUFDbEMsQ0FBQztZQUNELElBQ0UsTUFBTSxLQUFLLElBQUk7Z0JBQ2YsT0FBTyxNQUFNLEtBQUssUUFBUTtnQkFDMUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztvQkFDcEIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNYLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQzNHLENBQUMsRUFDSixDQUFDO2dCQUNELE1BQU0sSUFBSSwrQkFBaUIsQ0FBQztvQkFDMUIsT0FBTyxFQUFFLGdDQUFnQztvQkFDekMsYUFBYSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpRUFBaUUsRUFBRSxDQUFDO2lCQUM5RyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQWtDLE1BQU0sQ0FBQyxXQUFXLENBQzlELENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNwRixLQUFLO2dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7YUFDakMsQ0FBQyxDQUNILENBQUM7WUFDRixJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2hFLE1BQU0sSUFBSSwrQkFBaUIsQ0FBQzt3QkFDMUIsT0FBTyxFQUFFLDBDQUEwQzt3QkFDbkQsYUFBYSxFQUFFOzRCQUNiLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0VBQWdFLEVBQUU7eUJBQzVGO3FCQUNGLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFDRCx1RUFBdUU7WUFDdkUsNEVBQTRFO1lBQzVFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNqQixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVNLEtBQUssQ0FBQyxpQkFBaUIsQ0FDNUIsYUFBcUIsRUFDckIsVUFBVSxHQUFHLFNBQVMsRUFDdEIsS0FBYSxFQUNiLElBQUksR0FBRyxFQUFFLEVBQ1QsUUFBZ0IsRUFDaEIsS0FBa0IsRUFDbEIsS0FBb0IsRUFDcEIsZUFBZSxHQUFHLFNBQVMsRUFDM0IsV0FBVyxHQUFHLFNBQVMsRUFDdkIsSUFBSSxHQUFHLFNBQVMsRUFDaEIsWUFBWSxHQUFHLFNBQVMsRUFDeEIsWUFBWSxHQUFHLFNBQVMsRUFDeEIsYUFBcUIsT0FBTyxFQUM1QixhQUFhLEdBQUcsU0FBUztZQUV6QixNQUFNLEtBQUssR0FBRztnQkFDWiw0Q0FBNEMsRUFBRSxLQUFLLENBQUMsRUFBRTthQUN2RCxDQUFDO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixDQUFDLENBQUM7WUFDdEYsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUM7Z0JBQzFCLENBQUMsT0FBTyxFQUFFLHNDQUFzQyxDQUFDO2dCQUNqRCxDQUFDLG9CQUFvQixFQUFFLG1DQUFtQyxDQUFDO2dCQUMzRCxDQUFDLHFCQUFxQixFQUFFLG9DQUFvQyxDQUFDO2dCQUM3RCxDQUFDLG9CQUFvQixFQUFFLGFBQWEsQ0FBQzthQUN0QyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ2xGLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO3dCQUNwQixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDOzRCQUM3RSxDQUFDLENBQUMsS0FBSzs0QkFDUCxDQUFDLENBQUMseUJBQXlCLEtBQUssRUFBRSxDQUFDO29CQUN2QyxTQUFTO2lCQUNWLENBQUMsQ0FDSDthQUNGLENBQUM7WUFFRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDcEIsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLEdBQUcsRUFBRTtvQkFDSCxFQUFFLDBDQUEwQyxFQUFFLFFBQVEsRUFBRTtvQkFDeEQsRUFBRSwwQ0FBMEMsRUFBRSxRQUFRLEVBQUU7b0JBQ3hELEVBQUUsK0NBQStDLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUU7b0JBQ3ZFLEVBQUUsK0NBQStDLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUU7aUJBQ3hFO2FBQ0YsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pELE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztnQkFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSx5Q0FBeUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDLENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFO29CQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0RBQWdELEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDOUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7WUFDRCxJQUFJLGFBQWEsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDL0IsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLEdBQUcsYUFBYSxDQUFDO1lBQ2hFLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNoRSxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO29CQUN2QyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7b0JBQ3ZCLElBQUksVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO3dCQUMxQixXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsWUFBWSxDQUFDO29CQUMxQyxDQUFDO3lCQUFNLElBQUksVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUFDO3dCQUNqQyxXQUFXLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxtQkFBbUIsSUFBSSxDQUFDLENBQUM7d0JBQ3BFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUNqQyxDQUFDO29CQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzdCLENBQUM7WUFDSCxDQUFDO1lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUV6QixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqRyxNQUFNLFFBQVEsR0FBRyxJQUFJLG9DQUFzQixFQUFFLENBQUM7WUFDOUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDeEIsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDdkIsUUFBUSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDakMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUVNLEtBQUssQ0FBQyxVQUFVLENBQ3JCLGFBQXFCLEVBQ3JCLGFBQXFCLFNBQVMsRUFDOUIsS0FBYSxFQUNiLE9BQWUsRUFBRSxFQUNqQixRQUFnQixFQUNoQixLQUFrQixFQUNsQixLQUFvQixFQUNwQixlQUFlLEdBQUcsU0FBUyxFQUMzQixXQUFXLEdBQUcsU0FBUyxFQUN2QixJQUFJLEdBQUcsU0FBUyxFQUNoQixZQUFZLEdBQUcsU0FBUyxFQUN4QixZQUFZLEdBQUcsU0FBUyxFQUN4QixVQUFVLEdBQUcsU0FBUyxFQUN0QixhQUFhLEdBQUcsU0FBUztZQUV6QixJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQy9FLFVBQVUsR0FBRyxPQUFPLENBQUM7WUFDdkIsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHO2dCQUNaLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxFQUFFO2FBQ2pDLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRztnQkFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQzthQUM5QyxDQUFDO1lBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixHQUFHLEVBQUU7b0JBQ0gsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUU7b0JBQ2xDLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFO29CQUNsQyxFQUFFLHlCQUF5QixFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFO29CQUNqRCxFQUFFLHlCQUF5QixFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFO2lCQUNsRDthQUNGLENBQUM7WUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztvQkFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUU7d0JBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxDQUFDLENBQUMsQ0FBQztvQkFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUMzQixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM5QixJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDbkQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsT0FBTyxDQUFDO29CQUN2QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksVUFBVSxJQUFJLFNBQVMsSUFBSSxVQUFVLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3ZELEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO29CQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTt3QkFDMUIsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLDBCQUEwQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ3hELENBQUMsQ0FBQyxDQUFDO29CQUNILEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDO2dCQUN6RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3QkFDckQsS0FBSyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsUUFBUSxDQUFDO29CQUMvQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksV0FBVyxJQUFJLFNBQVMsSUFBSSxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3pELEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxhQUFhLElBQUksU0FBUyxJQUFJLGFBQWEsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsYUFBYSxDQUFDO1lBQzFDLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDekQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUNoRSxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO29CQUN2QyxJQUFJLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDMUIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQztvQkFDcEMsQ0FBQzt5QkFBTSxJQUFJLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDakMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEtBQUssbUJBQW1CLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDckUsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7WUFFekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzFGLE1BQU0sUUFBUSxHQUFHLElBQUksb0NBQXNCLEVBQUUsQ0FBQztZQUM5QyxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN4QixRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUN2QixRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUNqQyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRU8sWUFBWSxDQUFDLE1BQU07WUFDekIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFUyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTztZQUNwRCxPQUFPO2dCQUNMLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFELFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUM5QyxDQUFDO1FBQ0osQ0FBQztRQUVTLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU87WUFDM0QsT0FBTztnQkFDTCxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pFLFVBQVUsRUFBRSxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ3JELENBQUM7UUFDSixDQUFDO1FBRU8sS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZ0JBQXlCLEtBQUs7WUFDM0UsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUM1QixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVqRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQzVCLElBQUksYUFBYSxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDL0IsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sTUFBTSxDQUFDO29CQUNmLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztnQkFDcEIsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQztRQUVNLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPO1lBQ2hGLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUNwQixNQUFNLEtBQUssR0FBRztnQkFDWixzQkFBc0IsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDaEMsbUJBQW1CLEVBQUUsT0FBTzthQUM3QixDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEQsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLEdBQUcsRUFBRTtvQkFDSCxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRTtvQkFDbEMsRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUU7b0JBQ2xDLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUU7b0JBQ2pELEVBQUUseUJBQXlCLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUU7aUJBQ2xEO2FBQ0YsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0IsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDeEQsSUFBSSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7YUFDM0IsQ0FBQztZQUNGLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osWUFBWSxFQUFFO3dCQUNaLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBRTtxQkFDcEI7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osWUFBWSxFQUFFO3dCQUNaLElBQUksRUFBRSxHQUFHLFNBQVMsRUFBRTtxQkFDckI7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDekIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNwQiwwRkFBMEY7Z0JBQzFGLHdGQUF3RjtnQkFDeEYsMEZBQTBGO2dCQUMxRiwwRkFBMEY7Z0JBQzFGLGlFQUFpRTtnQkFDakUsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzdDLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ1YsSUFBSSxDQUFDO3dCQUNILG1GQUFtRjt3QkFDbkYsc0ZBQXNGO3dCQUN0RiwwQ0FBMEM7d0JBQzFDLE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUM7d0JBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7d0JBQ3hFLElBQUksV0FBVyxFQUFFLEVBQUUsQ0FBQzs0QkFDbEIsT0FBTzt3QkFDVCxDQUFDO3dCQUNELElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDOzRCQUN0QixtRkFBbUY7NEJBQ25GLDhFQUE4RTs0QkFDOUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUNsQixPQUFPO3dCQUNULENBQUM7d0JBQ0QseUZBQXlGO3dCQUN6RixXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUM7NEJBQ3BDLFVBQVUsRUFBRSxJQUFJOzRCQUNoQixTQUFTLENBQUMsTUFBK0IsRUFBRSxTQUFTLEVBQUUsUUFBUTtnQ0FDNUQsUUFBUSxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzRCQUM1QyxDQUFDO3lCQUNGLENBQUMsQ0FBQzt3QkFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLG9CQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQzFGLE1BQU0sSUFBQSxtQkFBUSxFQUNaLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQ2pFLFFBQVEsRUFDUixRQUFRLEVBQ1IsV0FBVyxDQUNaLENBQUM7b0JBQ0osQ0FBQztvQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO3dCQUNiLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsbUNBQW1DLENBQUMsQ0FBQzt3QkFDdEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3JCLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBWSxDQUFDLENBQUM7b0JBQ3BDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDTCxPQUFPLFdBQVcsQ0FBQztZQUNyQixDQUFDO1lBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxtQ0FBcUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hGLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFFRCxnR0FBZ0c7UUFDaEcsNEZBQTRGO1FBQzVGLDZEQUE2RDtRQUNyRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxjQUE2QixHQUFHLEVBQUUsQ0FBQyxLQUFLO1lBQ3JGLE1BQU0sU0FBUyxHQUFHLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7WUFDakMsSUFBSSxLQUFLLEVBQUUsTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdkUscUZBQXFGO2dCQUNyRixrQ0FBa0M7Z0JBQ2xDLElBQUksV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDbEIsTUFBTTtnQkFDUixDQUFDO2dCQUNELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNuRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFUyxZQUFZLENBQUMsS0FBSyxFQUFFLEtBQUs7WUFDakMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBRXJCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDOUIsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVNLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBVyxFQUFFLE9BQXFCO1lBQzVELE1BQU0sUUFBUSxHQUFHLElBQUksdUNBQXlCLEVBQUUsQ0FBQztZQUNqRCxRQUFRLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDdkIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7b0JBQzNFLE1BQU0sY0FBYyxHQUFHLDBCQUEwQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzFFLFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUM3RyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsVUFBVSxHQUFHLElBQUksQ0FBQztvQkFDbEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyx5Q0FBeUMsR0FBRyxJQUFJLENBQUMsQ0FBQztvQkFDbkYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLE1BQU0sY0FBYyxHQUFHLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM5RyxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sS0FBSyxjQUFjLEVBQUUsQ0FBQztnQkFDN0csQ0FBQztZQUNILENBQUM7WUFDRCxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDO1lBQy9CLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTSxnQkFBZ0IsQ0FDckIsR0FBVyxFQUNYLE1BQXFCLEVBQ3JCLFdBQW9CLEVBQ3BCLFFBQW1FLEVBQ25FLFlBQTBCO1lBRTFCLElBQUksV0FBc0QsQ0FBQztZQUMzRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNqQyxXQUFXLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7aUJBQU0sSUFBSSxRQUFRLElBQUksT0FBTyxRQUFRLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNoRSxXQUFXLEdBQUcsUUFBcUQsQ0FBQztZQUN0RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixHQUFHLElBQUksQ0FBQyxTQUFTLDZGQUE2RixDQUMvRyxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQ2pHLElBQUEsZUFBUSxFQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNkLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUM1QixVQUFVLEVBQ1YsZ0NBQWdDLEVBQ2hDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUM5QixDQUFDO2dCQUNkLE1BQU0sSUFBSSxHQUF1QixFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ3hELENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFDLFFBQVEsRUFBQyxFQUFFO29CQUN4QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBdUMsQ0FBQztvQkFDdkYsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBdUMsQ0FBQztvQkFDbkYsTUFBTSxTQUFTLEdBQWlCLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO3dCQUM3RixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQzFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFOzRCQUMzQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7Z0NBQ25DLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSx3QkFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBQzVDLENBQUM7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztvQkFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQzt3QkFDaEUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUN2RSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRTs0QkFDckIsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO2dDQUNoQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksd0JBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzRCQUM1QyxDQUFDO3dCQUNILENBQUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDckYsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7Z0JBQ0QsT0FBTyxJQUFBLFNBQUUsRUFBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsVUFBc0I7WUFDdkQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxNQUFNLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3ZFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QyxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNsRCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywyQ0FBMkMsQ0FBQyxDQUFDO1lBQ2xGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLDBDQUEwQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzNGLENBQUM7UUFDSCxDQUFDO1FBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLE1BQWM7WUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFBLDhDQUFnQyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hELElBQUksTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxVQUFzQixFQUFFLFdBQXVEO1lBQzdHLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDakMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyw2QkFBNkIsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMxRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbEUsTUFBTSxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDcEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywrQkFBK0IsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUM5RSxNQUFNLG9CQUFvQixHQUFHLFdBQVcsSUFBSSxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoRixNQUFNLFFBQVEsR0FBRyxNQUFNLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5RCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzVELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsMkNBQTJDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVPLGtCQUFrQixDQUFDLFFBQStCLEVBQUUsUUFBZ0IsRUFBRSxRQUFpQjtZQUM3RixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDaEYsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU1QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQyxZQUFZLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQzdCLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUM3QixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLDhDQUE4QyxRQUFRLElBQUksQ0FBQyxDQUFDO29CQUM3RixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO2dCQUVILFFBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLHVEQUF1RCxRQUFRLElBQUksQ0FBQyxDQUFDO29CQUN0RyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRU0sS0FBSyxDQUFDLHVCQUF1QixDQUNsQyxHQUFHLEVBQ0gsTUFBb0IsRUFDcEIsU0FBdUIsRUFDdkIsV0FBdUQ7WUFFdkQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUNELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3BELENBQUM7WUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQVcsRUFBRSxNQUFjO1lBQ3BELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxNQUFjO1lBQzFELE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLHdCQUFVLEVBQW9DLENBQUM7WUFDcEUsUUFBUSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNFLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTSxLQUFLLENBQUMsZUFBZSxDQUFDLEdBQVcsRUFBRSxNQUFzQjtZQUM5RCxJQUFJLEtBQUssR0FBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNwQyxLQUFLLEdBQUcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMscURBQXFELEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDL0YsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBeUMsQ0FBQztRQUNyRyxDQUFDO1FBRU8sVUFBVSxDQUFDLEtBQWM7WUFDL0IsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUN4QixPQUFPLFNBQVMsQ0FBQztnQkFDbkIsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsQ0FBQztZQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFFTyxrQ0FBa0MsQ0FBQyxLQUFjO1lBQ3ZELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLEtBQWdDLENBQUM7WUFDaEQsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUNuRSxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDM0csTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUM7Z0JBQ3hCLGVBQWU7Z0JBQ2YsWUFBWTtnQkFDWixRQUFRO2dCQUNSLFdBQVc7Z0JBQ1gsU0FBUztnQkFDVCxhQUFhO2dCQUNiLFlBQVk7YUFDYixDQUFDLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQztnQkFDMUIscUJBQXFCO2dCQUNyQixtQkFBbUI7Z0JBQ25CLG9CQUFvQjtnQkFDcEIsa0JBQWtCO2FBQ25CLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDM0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUFFLE9BQU8sRUFBRSxDQUFDO29CQUN4RSxNQUFNLE1BQU0sR0FBRyxJQUErQixDQUFDO29CQUMvQyxJQUNFLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRO3dCQUNuQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTt3QkFDL0IsT0FBTyxNQUFNLENBQUMsS0FBSyxLQUFLLFFBQVE7d0JBQ2hDLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRO3dCQUNqQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3QkFFaEMsT0FBTyxFQUFFLENBQUM7b0JBQ1osTUFBTSxNQUFNLEdBQTRCO3dCQUN0QyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQzt3QkFDdkMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO3dCQUNqQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7d0JBQ25CLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTt3QkFDckIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN6RyxVQUFVLEVBQ1IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3hHLENBQUM7b0JBQ0YsSUFBSSxPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQzt3QkFDN0UsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO29CQUMxQyxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksR0FBRzt3QkFDNUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO29CQUMxQyxJQUFJLE9BQU8sTUFBTSxDQUFDLGFBQWEsS0FBSyxRQUFRLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO3dCQUNuRixNQUFNLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7b0JBQzlDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxNQUFNLE1BQU0sR0FBMkIsRUFBRSxDQUFDO1lBQzFDLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDeEYsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQWlDLENBQUMsRUFBRSxDQUFDO29CQUNwRixJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQzt3QkFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRyxDQUFDO1lBQ0gsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUE0QjtnQkFDdkMsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzNGLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixTQUFTLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDeEYsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTO29CQUNsQixDQUFDLENBQUMsUUFBUTtnQkFDWixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJO2dCQUNoQyxVQUFVLEVBQ1IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZHLFlBQVksRUFDVixNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7b0JBQ3ZFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDN0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUNwQixNQUFNO2dCQUNOLE9BQU87Z0JBQ1AsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEtBQUssSUFBSTthQUNyQyxDQUFDO1lBQ0YsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLEdBQUc7Z0JBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQ2pILElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbEcsT0FBTyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNyRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsT0FBTyxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuRixPQUFPLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFTyxtQkFBbUIsQ0FBQyxXQUE2QjtZQUN2RCxNQUFNLE9BQU8sR0FBcUI7Z0JBQ2hDLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztnQkFDaEMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO2dCQUMxQixHQUFHLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQXdDO2dCQUM5RSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUF3QztnQkFDbEYsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGtDQUFrQyxDQUN2RCxXQUFXLENBQUMsZ0JBQWdCLENBQ3NCO2FBQ3JELENBQUM7WUFFRixJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztZQUN0QixDQUFDO1lBRUQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDeEIsQ0FBQztZQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsQyxDQUFDO1lBRUQsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUVPLHdCQUF3QixDQUFDLEtBQTRCO1lBQzNELE1BQU0sT0FBTyxHQUFtQztnQkFDOUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3RCLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZTtnQkFDdEMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtnQkFDMUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07Z0JBQ3BCLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7Z0JBQ3BDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7Z0JBQ2hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUM5QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQXdDO2dCQUM1RixlQUFlLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUF3QzthQUMvRixDQUFDO1lBRUYsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3pCLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM3QixDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDekIsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQzdCLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQzdCLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUM1QixDQUFDO1lBQ0QsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUM7WUFDakMsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBNkI7WUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxvQ0FBc0IsRUFBRSxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0QsUUFBUSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRCxRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDeEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUywwQkFBMEIsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsaUNBQWlDLENBQUMsQ0FBQztnQkFDcEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxRQUFRLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDekIsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QyxPQUFPLFFBQVEsQ0FBQztZQUNsQixDQUFDO1lBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsa0JBQWtCLENBQUMsQ0FBQztZQUN2RCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUF5QjtZQUNuRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDakMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUU3QixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxxREFBcUQsQ0FBQztnQkFDbkYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBRXBDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUN2QixRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQy9DLENBQUM7WUFFRCxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQzdCLENBQUM7Z0JBQ0QsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztnQkFDckMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUM7WUFDakQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRU0sS0FBSyxDQUFDLHNCQUFzQixDQUFDLEtBQTRCO1lBQzlELE1BQU0sUUFBUSxHQUFHLElBQUksb0NBQXNCLEVBQUUsQ0FBQztZQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDO2dCQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsb0NBQW9DLENBQUMsQ0FBQztnQkFDekUsTUFBTSxVQUFVLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzFELFFBQVEsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLCtCQUErQixDQUFDLENBQUM7WUFDdEUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUN6RSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixRQUFRLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzdDLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFTyxzQ0FBc0MsQ0FDNUMsTUFBOEI7WUFFOUIsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pELENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9DLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDakUsQ0FBQztRQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUE4QjtZQUM3RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLGlFQUFpRSxDQUFDO2dCQUMvRixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQTRCLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM5QixRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsc0NBQXNDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsaUJBQWlCLENBQUM7WUFDNUMsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RSxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEYsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBRW5DLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsOEJBQThCLENBQUMsQ0FBQztZQUNuRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFNUMsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQixLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUE4QjtZQUMvRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLG1FQUFtRSxDQUFDO2dCQUNqRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQTRCLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM5QixRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNyQyxDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsc0NBQXNDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsaUJBQWlCLENBQUM7WUFDNUMsQ0FBQztZQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsK0JBQStCLENBQUMsQ0FBQztZQUNwRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDNUMsT0FBTyxNQUFNLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFXLEVBQUUsT0FBc0M7WUFDckUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUNwQixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUN6Qyx3QkFBd0IsRUFDeEIsNERBQTRELENBQzdELENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEdBQVcsRUFBRSxPQUFzQztZQUM1RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQ3BCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQ3pDLHdCQUF3QixFQUN4QiwrREFBK0QsQ0FDaEUsQ0FBQztRQUNKLENBQUM7UUFFUyxlQUFlLENBQUMsUUFBZ0IsRUFBRSxVQUF1QixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7WUFDN0UsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RCxDQUFDOztJQTcwR1UsNEJBQW1CLHNCQTgwRy9CLENBQUE7QUFDSCxDQUFDLEVBaDFHZ0IsUUFBUSx3QkFBUixRQUFRLFFBZzFHeEIifQ==
|